앱 개발자 측에서 해야 할 일이 많아...소비자는 소비 습관 바꿔야
[보안뉴스 문가용 기자] 중간자 공격이라는 해커들의 전략은 예전부터 자주 보도되어 온 것이라 그런지 익숙하고, 어딘지 모르게 방어가 쉬울 것 같은 느낌을 준다. 예전 중간자 공격이라면 그럴지도 모른다. 하지만 공격자들은 계속해서 변했고, 점점 더 고급진 기술력을 선보이고 있다. 특히 모바일 장비들을 겨냥하면서 이들의 ‘중간자 공격’은 더 정교해지는 중이다.

[이미지 = utoimage]
중간자 공격의 기본 원리 자체는 간단한 편이다. 공격자가 모바일 사용자와 서버 사이에 끼어들어가 둘 사이의 통신을 가로채는 것이다. 이 때 공격자가 취할 수 있는 ‘모드’는 두 가지다. 능동적인 모드와 수동적인 모드가 바로 그것인데, 전자는 정보를 조작하거나 멀웨어를 주입하는 것 등을 말하고 후자는 사용자의 통신 내용이나 민감한 데이터를 관찰 및 훔쳐보는 것을 말한다.
모바일 환경에서 중간자 공격을 실행하기 위해 해커들이 가장 많이 사용하는 방법은 ‘에빌 트윈(evil twin)’이다. 가짜 와이파이 핫스팟을 개설해 사용자가 진짜 와이파이망인 것처럼 착각하도록 유도하는 것이다. 사용자는 진짜 와이파이에 연결한 것으로 여기고, 인터넷 서핑을 하거나 이메일을 열람하거나 은행 업무를 보게 되는데, 이런 모든 행위들이 공격자들에게 노출된다.
물론 방법은 여러 가지가 있다. 예를 들어 SSL 스트리핑(SSL stripping)이라는 기법은 피해자가 특정 서버와 암호화로 보호된 HTTPS 세션을 시작하기 위해 HTTP로 요청을 보낼 때 발동된다. 공격자가 이 HTTP 요청을 중간에서 가로채 자신들은 해당 서버와 안전하게 HTTPS로 연결하고, 피해자와 자신들은 HTTP로 연결한다. 그러므로 피해자가 보내는 모든 정보를 평문으로 열람할 수 있게 된다.
그렇다면 중간자 공격을 막으려면 어떻게 해야 할까? 일단 모바일 앱 개발자들이 중간자 공격을 불가능하게 만들 수 있다. 그러나 대다수 앱들에 이런 보안 장치들이 구축되지 않고 있는 게 현실이다. 마감에 좇기는 개발자들 입장에서 당장 가시적인 성과로서 드러나지 않는 보안 기능은 간과되기 일쑤이기 때문이다. 또한 항간의 인식과 다르게 ‘보안’과 ‘개발’은 전혀 다른 영역이라 최고의 프로그래머라고 할지라도 보안에 대해서는 잘 모를 수 있다. 심지어 비용 절감을 위해 일부러 보안 기능을 빼는 경우도 수두룩하다.
모바일 기기에 대한 의존도가 점점 높아지는 상황에서 개발자 수준에서의 조치가 좀처럼 취해지지 않는다는 건 대단히 치명적으로 작용할 것이다. 사용자가 아무리 보안 실천 사항을 준수한다고 해도, 처음부터 부실하게 개발된 앱을 어찌할 수는 없다. 그렇기 때문에 ‘중간자 공격 방어’를 말할 때 개발자를 얘기하지 않을 수 없다.
제일 먼저 개발자들은 중간자 공격 탐지와 보호라는 것이 여러 수준과 층위에서 행해질 수 있다는 것을 인지해야 한다. 가장 기본적으로는 인증서가 정상적인 인증 기관에서 발행한 것인지 아니면 가짜 인증서인지 확인해주는 도구들이 있다. 인증서가 가짜라는 게 확인되는 순간 연결은 끊기고 만다. 최소한 이런 정도는 개발자가 포함해주는 것이 맞는다고 필자는 생각한다.
그 외에 앱 개발 시 꼭 필요하다고 생각되는 방어 조치들은 다음과 같다.
1) TLS(전송 계층 보안) 사이퍼 알고리즘들과 버전들을 확인하라 : TLS 연결을 안전하게 보호하기 위한 사이퍼 알고리즘들은 수백 가지가 존재한다. 당연하게도 보안 수준에 있어서 다양함을 보여준다. 어떤 건 꽤나 불안하고 어떤 건 상당한 강력함을 보여준다. 앱을 만들 때 안전한 사이퍼 알고리즘과 버전들만 사용하고 있는지 확인할 필요가 있다. 오래된 TLS 버전들은 이미 취약하다고 알려져 있다는 것도 기억하고 사용 시 주의해야 한다.
2) 인증서 : 인증서에도 역할(role)이란 게 있다. 어떤 인증서는 높은 권한을 가지고 있고, 따라서 그에 맞는 역할을 해야 한다. 반면 또 다른 인증서들은 권한이 높지 않아, 제한적인 역할만을 할 수 있다. 서버가 최종 사용자에게 제시하는 인증서의 경우 리프 인증서(leaf certificate)라고 부르는데, 인증 기관과 같은 역할을 한다. 즉 낮은 권한의 인증서들을 인증하는 게 리프 인증서의 역할인 것이다. 이 역할은 ‘서명’이라는 기능을 통해 발휘된다.
인증서 생태계는 수직적인 구조로 이뤄져 있다. 앞서 말한 것처럼 권한이 높은 것과 낮은 것들이 있고, 신뢰는 위에서 아래 방향으로, 마치 물이 흐르는 것처럼 형성된다. 즉, 높은 권한의 인증서가 낮은 권한의 인증서를 서명함으로써 인증하고, 이를 통해 신뢰 관계가 만들어진다는 것이다. 거꾸로 낮은 권한의 인증서가 높은 권한의 인증서를 서명함으로써 ‘응, 너 인정’ 이렇게 할 수 없다. 예의범절이 뚜렷한 세계다.
만약 이 역할이 제대로 지정되지 않으면 해커들이 모바일 장비를 속여 ‘이 인증서가 있으니 지금 연결은 안전하다’고 파악하도록 만들 수 있다. 문제는, 역할이 무엇이든 인증서가 가진 본연의 기능인 ‘서명’ 자체는 인증서마다 가지고 있다는 것이다. 즉, 공격자가 ‘신뢰의 흐름’을 무시하고 인증서 서명 기능을 악용해 자신들만의 인증서를 만들어 신뢰의 생태계 안에 우겨넣는 게 가능하다. 실제 이런 방법은 공격자들 사이에서 애용된다. 예의범절이 뚜렷한 세계라지만 누구나 인사를 바르게 하는 건 동일하고, 누군가 이런 상황을 이용해 은밀히 하극상을 저지르고 있다고 보면 설명이 되려나.
좀 더 직접적으로 보자면 다음과 같다. 평소의 ‘신뢰의 흐름’은 다음과 같을 수 있다.
1) 애플/구글이 신뢰하는 고대디 최고 인증기관(Go Daddy Root Certificate Authority) -> 2) 그 고 대디 최고 인증기관이 신뢰하고 서명한 고대디 보안 인증기관(Go Daddy Secure Certificate Authority) -> 3) 그 고대디 보안 인증기관이 신뢰하고 서명한 당신 회사의 도메인.
위에서 아래로, 착실하고 예의바르게 신뢰가 전달되는 걸 볼 수 있다.
그런데 악성 행위자가 가짜 인증서를 만들고 끼어들면 어떻게 될까? 다음과 같은 ‘신뢰의 흐름’이 만들어진다.
1) 애플/구글이 신뢰하는 고대디 최고 인증기관(Go Daddy Root Certificate Authority) -> 2) 그 고 대디 최고 인증기관이 신뢰하고 서명한 고대디 보안 인증기관(Go Daddy Secure Certificate Authority) -> 3) 그 고대디 보안 인증기관이 신뢰하고 서명한 악성 도메인 -> 4) 그 악성 도메인이 서명한 당신 회사 도메인.
이런 연결이 성립되면 공격자는 모든 트래픽을 점령할 수 있게 된다.
이런 방식의 공격을 막으려면 모든 인증서들에 ‘역할’에 대한 명확한 정보가 저장되어 있어야 한다. 이런 정보는 Basic-Constraints라는 확장자에 저장된다. 인증서의 ‘신뢰 흐름도’에 포함된 모든 인증서들에 이 확장자가 있고, 알맞은 역할 정보가 포함되도록 하는 것이 중간자 공격을 막는 앱 개발에 있어 대단히 중요하다.
이 두 가지는 중간자 공격을 막기 위한 기본 중 기본 수단이다. 개발자들이 이 정도는 보장해줘야 모바일 사용자들이 안심하고 앱을 사용할 수 있고, 모바일 생태계가 건강해진다. 또한 앱과 개발사의 명성에 금이 가는 사태를 미리부터 막을 수 있게 된다. 보안 사고가 터진 앱들이 소비자들로부터 어떤 취급을 받는가? 출시부터 앞당기는 게 과연 그러한 리스크를 짊어질 가치가 있는지 잘 계산해보라.
또한 사용자들은 사고가 난 앱들에 대해 철저한 불신의 태도를 보여주어야 한다. 그래야 불완전한 앱이라도 무조건 빠르게 출시하고 시장을 선점하는 것이, 미리부터 보안에 투자를 하는 것보다 더 큰 손해가 된다는 걸 개발자와 기업들이 느끼게 할 수 있다. 보안에 아랑곳하지 않는 소비 습관이, 보안에 투자하지 않는 회사들을 만든다.
[국제부 문가용 기자(globoan@boannews.com)]
<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>