PDF 보안 – 동전의 뒷면
업데이트: 2010년 2월 15일
들어가며
PDF 보안은 다소 생소하게 들리는 주제입니다. 실제로 그렇기도 하죠. 대부분의 컴퓨터 사용자에게 PDF 문서는 단순히 정보를 전달하는 매체일 뿐입니다. 그러나 안타깝게도 PDF는 그 이상의 존재로 발전했습니다.
오늘날 PDF 문서는 스크립트와 각종 요소가 탑재된 인터랙티브 애플릿 수준으로 진화했습니다. 이는 사용자 경험을 크게 향상시키지만, 악용될 경우 심각한 문제를 일으킬 수 있습니다. 여기에 늘 공격 표적이 되어온 대중적인 PDF 소프트웨어가 결합되면, PDF 파일을 여는 행위 자체가 보안 문제가 될 수 있습니다.

앞선 글에서 PDF 취약점과 그에 대한 완화 방법을 다룬 바 있습니다. 솔직히 말해, 조금만 미리 신경 쓰면 문제는 충분히 피할 수 있습니다. 운영체제를 제한된 권한으로 실행하고, 대체 프로그램을 사용하며, 신뢰할 수 있는 출처의 파일만 다루면 됩니다. 패닉에 빠를 필요는 전혀 없습니다.
그렇다면 왜 이 글을 또 쓰는 걸까요? 첫 번째 글에서 소개한 방법들은 모두 '기본 거부(default-deny)' 방식의 일반적인 기술이라, 어떤 상황에서도 잘 작동하지만 정작 눈앞의 파일 자체에 대해서는 아무것도 알려주지 못합니다. 즉, 우리는 '나쁜' 파일을 다루고 있으면서도 그 사실조차 모른 채 지나칠 수 있습니다. 시스템에는 위협이 없더라도 사회공학적 공격의 가능성은 남습니다.
또 하나 생각해볼 점이 있습니다. 잘 설정된 시스템을 쓰는 사용자라면 어떤 파일을 열든 크게 개의치 않겠지만, 그 나쁜 파일을 무심코 지인들에게 전달한다면 어떻게 될까요? 리눅스 사용자를 예로 들어보죠. 자신의 시스템에서는 어떤 파일을 열어도 별 문제가 없지만, 감염 가능성이 있는 파일을 윈도우를 쓰는 친구들에게 보낸다면 꽤 곤란한 순간을 맞이하게 됩니다.
가장 확실한 해결책은 친구를 두지 않는 것이지만, 현실적으로 사람은 친구가 있는 법이니, 오늘은 좀 더 분석적인 접근 방식을 이야기해 보겠습니다. 이 글의 내용은 첫 번째 글의 교훈을 대체하는 것이 아니라 보완하는 것임을 미리 밝힙니다.
건강한 사용 습관
'안전한 웹 사용 습관' 글에서 일반 사용자가 다운로드한 파일의 안전성을 가늠하는 몇 가지 방법을 소개했습니다. 온라인 멀티 스캐너 활용, 포럼에서 도움 요청, 검색 엔진을 통한 정보 확인 등이 그것입니다. 물론 완벽한 방법은 아니지만, 때로는 이것이 유일한 방법이기도 합니다. 파일을 실행하고 싶어 하는 사람은 결국 실행하기 마련이고, 할 수 있는 최선은 실행 전에 최소한의 확인 절차를 거치도록 설득하는 것뿐입니다.
스캐닝의 가장 큰 문제는 파일을 '나쁘다'고 표시할 수는 있어도, 결코 '좋다'고 보증할 수 없다는 점입니다. 많은 사람들이 이를 이해하지 못한 채 백신 프로그램을 만능 해결책으로 여깁니다. 강조하지만, 백신이 파일을 악성으로 판정했다면 그것은 차악 중 최선이며, 의심스러우면 의심되는 것입니다. 반대로 백신이 파일을 깨끗하다고 판정했다면? 그것은 '안전하다'는 뜻이 아니라 단지 '악성으로 표시되지 않았다'는 의미일 뿐입니다.
바로 이런 이유로 화이트리스트, 즉 '기본 거부' 방식이 모든 종류의 위협에 대응하는 최선의 방법입니다. 소수의 선택된 친구를 제외한 모두를 적으로 간주하고, 모든 것을 위험물로 취급한 뒤 신중하게 신뢰의 원 안으로 들여보내는 것이죠.
앞선 PDF 취약점 글이 곧 화이트리스트에 관한 이야기였습니다. 다만 화이트리스트의 한계는 존재할지도 모르는 문제에 대해 우리가 아무것도 알지 못한다는 것입니다. 남들이 겪을 고생을 모른 채 흥얼거리며 지나갈 뿐이죠.
그래서 필요한 것이 블랙리스트입니다. '기본 허용(default-allow)'이라고도 불리는 이 방식은 나쁜 것들의 데이터베이스를 구축하고 주기적으로 갱신하는 방식입니다. 백신 스캐너 같은 도구가 이 데이터베이스를 활용해 실행 코드에서 시그니처 패턴을 탐지하고 사용자에게 보고합니다. 다소 돈키호테식 발상이지만 이미 업계 표준이 되었고, 사람들은 표준이라면 무엇이든 따르는 법입니다.
비유하자면 블랙리스트는 법 집행과 같습니다. 대부분의 사람은 유죄가 입증되기 전까지는 무죄로 간주되죠. 반면 화이트리스트는 소설 '1984년'에 가깝습니다. 이 주제에 대해 철학적인 글을 읽어보셔도 좋습니다.
소프트웨어 세계에서는 화이트리스트가 승자입니다. 그러나 두 방식을 결합하면 꽤 흥미로운 결과를 얻을 수 있습니다. 차가운 화이트리스트 케이크 위에 블랙리스트 체리를 올리면, 아주 유용한 공식이 완성됩니다.
화이트리스트는 당신을 행복하게 하고, 블랙리스트는 당신의 친구들을 행복하게 합니다. 내 컴퓨터를 안전하게 유지하면서 스팸과 악성코드의 악순환을 끊는 것이죠. 마치 슈퍼맨처럼 남들을 위해 스스로 백신을 시험해 보는 셈입니다.
PDF 취약점
이 주제는 이전에 충분히 다루었습니다. 가장 흔한 공격 벡터와 그에 대한 간단한 완화 방법, 무엇보다도 신중함과 인내를 강조한 글을 먼저 확인해 보시길 권합니다.

그럼에도 불구하고 기술적인 접근, 즉 블랙리스트 방식을 직접 활용하고 싶다면, 아래의 도구들이 도움이 될 것입니다.
PDF 스캐너란 무엇인가?
실제로 대부분의 사람들은 PDF 파일 전용으로 동작하는 도구를 들어본 적이 없습니다. 일반적인 백신·안티 스파이웨어 제품이 어느 정도 도움을 줄 수 있지만, PDF 전문 도구는 드뭅니다.
얼마 전까지 PDF 파일은 공격 대상으로 큰 관심을 받지 못했습니다. 그러나 강력한 스크립팅 기능과 플래시(Flash)가 PDF와 결합하면서 악용 가능한 통로가 만들어졌습니다. 더 심각한 것은, 가장 널리 쓰이는 PDF와 플래시 소프트웨어가 모두 Adobe라는 같은 회사 제품이라는 점입니다. 한쪽에 문제가 생기면 다른 쪽에도 문제가 생길 가능성이 높습니다.
PDF 위협의 완화는 파노이드 성향의 윈도우 사용자들에게 공포만 안겨줄 뿐 뾰족한 대책이 없어 보였습니다. 제한된 계정 사용과 대체 소프트웨어 활용이 해결책이지만, 놀랍도록 단순한 이 개념조차 시도하려는 사람은 드뭅니다.
최근에는 PDF 보안 도구가 여럿 등장해 윈도우 사용자에게 악성 파일을 식별할 수단을 제공하기 시작했습니다. 다시 말하지만, 화이트리스트 방식이 여전히 가장 바람직합니다. 이제 이 도구들을 살펴보겠습니다.
Wepawet
홈페이지
Wepawet은 웹 기반 악성코드를 분석하는 서비스입니다. 플래시, 자바스크립트, PDF 파일을 처리할 수 있으며, 파일을 업로드하거나 URL을 지정하는 방식으로 간편하게 이용할 수 있습니다.

샘플 리포트는 아래와 같습니다.


완벽한 도구는 아니지만, 파일의 성격을 가늠하는 데 유용한 단서를 줍니다. 기억하세요. 의심스러우면 의심되는 것입니다.
PDFiD
홈페이지 (관련 글)
PDFiD는 PDF 파일 내부의 자바스크립트를 비활성화하는 도구입니다. 함수 이름의 대소문자를 서로 뒤바꾸는 방식으로 동작하는데, PDF 언어는 대소문자를 구분하므로 이 과정을 거친 스크립트는 무의미하고 실행 불가능한 상태가 됩니다. 다만 리더 프로그램이 본문을 정상적으로 표시하는 데는 지장이 없으며, 리더는 손상된 명령어를 무시하고 건너뛸 뿐입니다.
단, PDFiD는 명령줄 방식의 파이썬 스크립트이므로 Python이 설치되어 있어야 하고 명령줄에서 실행해야 합니다. 화려한 GUI는 없습니다. Wepawet과 마찬가지로 역사가 짧아 버그가 있을 수 있지만, 필요한 일은 해냅니다.
사용 명령은 다음과 같습니다.
PDFiD -d <파일명>.pdf
이 명령은 PDF 파일의 자바스크립트를 제거해 '무장 해제(disarm)'하고, <파일명>.disarmed.pdf라는 복사본을 생성합니다. 이후 새 파일을 실행해 실제로 어떻게 동작하는지 확인하면 됩니다.

제가 아는 한(틀릴 수도 있습니다) PDFiD는 VirusTotal 스캐너 목록에 포함되어 있습니다. 따라서 의심스러운 파일을 온라인으로 스캔하면 PDFiD를 포함해 20개 이상의 도구가 업로드된 파일의 무결성을 검증해 줍니다.
추가 자료
오늘의 내용은 대략 여기까지입니다. 초보를 넘어선 분들을 위해 추가로 읽을 거리를 남깁니다.
Is this PDF malicious?
결론
이 글을 읽는다고 해서 PDF 특수부대 요원이 되는 것은 아닙니다. 하지만 원치 않는 파일을 식별하려 시도해볼 수 있는 기본적인 도구를 손에 넣게 될 것입니다. 이 도구들은 완벽하지 않고 대규모 사용을 위한 것도 아니지만, 이 글까지 읽고 계신 분이라면 평범한 사용자는 아닐 테니까요.
백 번을 강조해도 지나치지 않습니다. 마음에 들지 않는 파일이라면 실행하지 마세요. 무엇보다, 가려운 손가락으로 저지르는 실수를 막으려면 대체 프로그램을 사용하고 최소 권한 원칙을 지키세요. 그래야 혹시 나쁜 파일을 실행하더라도 피해 범위를 크게 줄일 수 있습니다.
컴퓨터 사용 습관이 좋지 못한 지인들에게 어쩔 수 없이 파일을 보내야 한다면, Wepawet과 PDFiD를 활용해 보시길 권합니다. 장기적으로 큰 변화를 만들지는 못하더라도, 최소한 최선을 다한 것은 될 테니까요.
평소에는 화이트리스트를 고수하고, 의심스러운 파일을 전송할 때만큼은 블랙리스트를 활용하세요. 이 글이 도움이 되었기를 바랍니다. 덧붙일 지혜가 있다면 망설이지 말고 메일로 알려주세요. 그럼 다음에 만납시다.
Cheers.