PDF 메타데이터와 숨은 데이터
마지막 업데이트:
문서 메타데이터는 파일이 페이지 내용 너머에 자신에 대해 싣고 다니는 정보입니다. 필드가 말하는 작성자가 누구인지, 어떤 애플리케이션이 만들었는지, 언제 작성되고 바뀌었다고 말하는지, 그리고 어떤 이전 자료가 아직 안에 남아 있는지. PDF는 겹치는 두 개의 메타데이터 시스템, 이전 개정본의 체인, 완전한 내장 파일, 보이지 않게 그려지는 텍스트를 담을 수 있습니다. JPEG 사진은 카메라 일지를 담고, 단순한 PNG 스크린샷조차 그것을 만든 소프트웨어를 이름 댑니다. 이 글은 그 은신처들이 각각 어디에 있는지, 왜 그 데이터가 보통 편집에서 살아남는지, 실제 유출이 어떻게 일어났는지를 따라갑니다. 읽으면서 자신의 파일을 검사하려면 문서 포렌식 도구를 실행하세요 — 브라우저 안에서 로컬로 동작합니다. 같은 파일의 읽기 구조 측면은 여러분의 PDF는 웹사이트 접근성의 일부입니다를 보세요.
모든 PDF 안에는 두 개의 메타데이터 시스템이 함께 다닌다
더 오래된 쪽은 정보 사전으로, 파일 트레일러에 저장되는 작은 키–값 쌍의 집합입니다. Title, Author, Creator(원본 문서를 만든 애플리케이션), Producer(PDF를 만든 애플리케이션), CreationDate, ModDate. 이 필드들은 내보낼 때 자동으로 쓰이며, 문서 작성자 대부분은 그것들을 보여 주는 속성 대화 상자를 한 번도 열어 본 적이 없습니다 — 바로 그래서 새어 나갑니다. 개인 노트북에서 내보낸 보고서는 그 노트북 계정 이름을 작성자로 싣고 다닙니다. 작년 템플릿으로 시작한 문서는 여전히 작년 작성자를 이름 댑니다. 인쇄된 페이지에서는 아무것도 보이지 않지만, 파일의 모든 수신자에게는 속성 패널 하나 너머에 있습니다.
더 새로운 시스템은 XMP로, 문서에 내장된 XML 패킷이며 Adobe의 확장 가능 메타데이터 플랫폼 위에 구축되고 PDF 규격 자체인 ISO 32000-2와 함께 기술됩니다. XMP는 이름 공간 안에서 같은 영역의 많은 부분을 반복합니다. 제목에는 dc:title, pdf:Producer, xmp:CreateDate와 xmp:ModifyDate, 그리고 오래된 사전이 결코 갖지 못한 작성 도구 같은 필드들이 있습니다. 두 시스템이 있는 것 자체는 보조를 맞춰 유지된다면 무해하겠지만, 실제로는 그렇지 않습니다. 한 도구는 정보 사전을 갱신하고 XMP를 무시하고, 다른 도구는 XMP를 다시 쓰고 사전을 낡은 채로 두며, 세 번째 도구는 하나를 제거하고 다른 하나를 남깁니다. 결과적으로 하나의 파일이 자신에 대해 약간 다른 두 이야기를 일상적으로 하게 되며, 그 불일치 자체가 정보입니다. 하나 이상의 도구가 하나 이상의 시점에 그 문서를 만졌다는 것을 기록하기 때문입니다.
증분 업데이트: 삭제됐지만 결코 떠나지 않은 단락
PDF는 덧붙이기 전용 편집을 위해 설계되었습니다. 편집기가 변경을 증분적으로 저장할 때 파일을 다시 쓰지 않습니다. 변경된 객체, 새 상호 참조 섹션, 새 트레일러를 끝에 덧붙이고 /Prev 포인터로 이전 트레일러에 체인을 겁니다. 각 개정본은 자체 %%EOF 마커로 끝나므로, 그 마커들을 세면 그렇게 저장된 횟수의 하한을 알 수 있습니다 — 그리고 이전의 모든 개정본은 바이트 안에 물리적으로 남아 읽을 수 있습니다. 그런 파일을 일반 뷰어에서 열면 가장 최근 개정본만 보입니다. 바이트를 읽거나 체인을 거슬러 올라가면 문서의 이전 상태가 여전히 거기 있습니다. 표 안의 옛 숫자, 조항의 이전 문구, 게시 전에 삭제된 단락입니다.
이것이 뉴스가 되곤 하는 가림 실패 뒤의 메커니즘입니다. 팀은 이름이나 수치를 비공개로 한 보고서를 게시해야 해서, 누군가가 민감한 구절 위에 검은 사각형을 그립니다 — 페이지의 모습을 바꾸고 그 아래에는 아무것도 건드리지 않는 그리기 연산입니다 — 또는 나중에 증분 저장하는 편집기에서 텍스트를 지워, 지워진 객체를 이전 개정본에 남깁니다. 게시된 파일은 깨끗해 보입니다. 며칠 뒤, 한 독자가 “가려진” 영역을 선택하고 복사해 원래 단어를 텍스트 편집기에 붙여 넣습니다. 또는 한 연구자가 개정본 체인을 파싱해 제거된 것을 복구합니다. 진짜 가림은 덮기와는 다른 연산입니다. 바탕 내용은 콘텐츠 스트림에서 제거되어야 하고 파일은 완전히 다시 쓰여야 하며, 바이트 자체가 페이지가 더 이상 보여 주지 않는 것을 더 이상 담지 않게 됩니다. 게시하려는 파일이 여러 개의 %%EOF 마커를 싣고 있다면, 그 이력은 아직 안에 들어 있습니다. 동기 있는 독자가 그 이력을 읽을 것이라고 가정하세요.
내장 파일과 숨은 텍스트: 아무도 목록에 올리지 않는 화물
PDF는 완전한 파일을 자기 내부에 싣고 다닐 수 있습니다. 이 형식은 내장 파일 이름 트리를 정의하며, /EmbeddedFiles와 /Filespec 객체를 통해 도달합니다. 작성 도구들은 그것을 원본 스프레드시트, 데이터 부록, 포트폴리오 문서에 사용합니다. 그것들을 드러낼 첨부 파일 패널은 대부분의 독자가 결코 열지 않는 패널이므로, 내장 화물은 조용히 이동합니다. 다듬어진 PDF 요약을 게시하면, 그 뒤의 작업용 스프레드시트까지, 자체 메타데이터와 초안 시트, 주석과 함께 게시하게 될 수 있습니다. 수신자에게도 그 반대가 성립합니다. 받은 PDF 안의 첨부 파일은 주변 문서의 신뢰를 상속하므로, 내장 파일은 우연한 발견이 아니라 모든 검사 체크리스트의 한 줄에 값합니다.
텍스트는 별도 파일이 아니어도 숨을 수 있습니다. PDF는 렌더링 모드로 텍스트를 그리며, 모드 3 — 3 Tr 연산자로 설정됩니다 — 은 채우기도 선도 그리지 않습니다. 문자는 콘텐츠 스트림 안에 있고, 선택하고 검색하고 추출할 수 있으며, 페이지에서는 완전히 보이지 않습니다. 보이지 않는 텍스트의 일부는 정당하고 가치 있습니다. 스캔된 페이지 뒤의 OCR 레이어가 바로 그것으로, 이미지를 검색 가능하게 만드는 숨은 텍스트입니다. 문제는 모드 3이나 그 사촌들에 이르게 되는 그 밖의 모든 것입니다 — 흰 배경 위의 흰 텍스트, 보이는 페이지 밖으로 잘린 텍스트, 검색 엔진을 위해 추가된 키워드 레이어 — 텍스트 레이어를 추출하는 독자는 페이지가 결코 보여 주지 않은 단어를 받기 때문입니다. 숨은 레이어가 보이는 레이어와 어긋날 때, 파일은 동시에 두 가지를 말하고 있으며, 그중 하나만 교정을 받았습니다.
이미지도 일지를 싣는다: PNG 청크와 JPEG Exif
PNG 파일은 이름 있는 청크의 나열이며, 여러 청크 유형은 오직 텍스트를 싣기 위해 존재합니다. tEXt, 그 압축된 형제 zTXt, 국제화된 iTXt입니다. 내보내기 도구들은 습관적으로 그것들을 씁니다 — 편집기를 이름 대는 Software 키워드, 작성 도구 문자열, 때로는 내장된 XML 프로필 전체 — 그리고 청크 목록을 온전히 두는 모든 자르기와 크기 조정에서 살아남습니다. tIME 청크는 마지막 수정 타임스탬프를 더하고, eXIf 청크는 완전한 카메라 메타데이터 블록을 담을 수 있으며, 닫는 청크 IEND 뒤에 덧붙은 바이트는 파일 안에 남으면서 모든 뷰어에게 무시됩니다. 창의 중립적인 그림처럼 보이는 스크린샷은 따라서 그 기계의 소프트웨어를 이름 대고, 스스로 날짜를 새기고, 작성자가 결코 본 적 없는 데이터를 싣고 다닐 수 있습니다.
JPEG 사진은 더 나아갑니다. 파일은 마커 세그먼트의 체인입니다. APP0는 JFIF 헤더를 싣고, APP1은 Exif 블록이나 XMP 패킷 중 하나 — 때로는 둘 다 — 를 싣습니다. Exif의 IFD0 필드는 카메라 일지처럼 읽힙니다. 기기의 Make와 Model, 사진이 찍혔거나 마지막으로 수정된 DateTime, 그것을 처리한 Software, 그리고 확장 디렉터리 안의 GPS 좌표. 카메라 롤에서 직접 게시된 휴대전화 사진은, 사진 자체가 결코 보여 주지 않은 시간과 장소에 그 소유자를 정확히 위치시킴으로써 조직과 개인 모두를 곤란하게 했습니다. 주석(COM) 세그먼트는 파일을 마지막으로 저장한 도구의 자유 텍스트를 더하고, 남는 바이트가 이미지 끝 마커 뒤에 남을 수 있으며, 이 모든 것을 읽는 도구 — 출처에 든 Phil Harvey의 ExifTool — 는 무료 다운로드이므로 수신자도 그것을 읽을 수 있습니다.
타임스탬프를 교차 확인하고, 게시 전에 정리하라
타임스탬프 하나는 주장입니다. 타임스탬프 여럿은 그 자체와 교차 확인할 수 있는 이야기입니다. 수정 날짜보다 뒤에 오는 작성 날짜는 한 도구가 한 번의 처리로 만들어 낸 문서를 기술할 수 없습니다. 같은 사건에 대한 정보 사전 날짜와 XMP 날짜의 불일치는 두 개의 시계를 가진 두 도구를 기록합니다. 미래의 날짜는 잘못 설정된 시계, 손으로 편집된 필드, 또는 조각들로 조립된 파일을 기록합니다. PDF 날짜 형식 자체도 모호함을 부릅니다 — D: 문자열은 시간대를 생략할 수 있어, 숫자가 어느 시계에서 왔는지 독자가 추측하게 합니다. 각 불일치를 감사인이 원장 차이를 다루듯 다루세요. 대개는 죄 없는 설명이 있습니다 — 템플릿 재사용, 노트북 시계, 업로드 시 파일을 다시 쓴 최적화 도구 — 그리고 그것은 저울질할 증거이며, 그 자체만으로 결코 판정이 아닙니다. 메타데이터 필드는 무료 도구를 가진 누구나 편집할 수 있으므로, 이야기를 뒷받침하거나 모순시킬 수는 있지만 증명할 수는 없습니다.
그래서 정리는 버튼이 아니라 워크플로입니다. 첫째, 검사하세요: 파일을 문서 포렌식 도구에 통과시키고, 그것이 낯선 사람에게 무엇을 말할지 적어 두세요 — 작성자와 도구 이름, 개정본 수, 내장 파일, 숨은 텍스트, 서로 다투는 타임스탬프. 둘째, 가능한 곳에서는 원본에서 고치세요: 그 출력에 덧대지 말고 작성 애플리케이션 안에서 문서 속성을 바로잡으세요. 셋째, 새롭고 완전한 다시 쓰기를 내보내세요 — PDF로 인쇄, 전용 정리 도구, 이미지에 대해서는 ExifTool — 완전한 다시 쓰기는 증분 저장이 결코 하지 않을 방식으로 이전 개정본, 고아 객체, 남는 데이터를 버리기 때문입니다. 마지막으로, 보내려던 사본이 아니라 실제로 보내는 사본을 다시 확인하세요. 그리고 글 전체가 기대는 구분을 지키세요. 내부 원본은 그 메타데이터를 유지해야 합니다. 출처, 보존 가치, 심지어 접근성 — 문서 제목도 메타데이터입니다 — 이 그것에 의존하기 때문입니다. 게시하는 사본을 정리하고, 기록은 집에 온전히 보관하세요.