콘텐츠로 이동
getnextpdf.com

리댁션은 검은 사각형이 아닙니다

Spec: ISO 32000-2, §7.11Spec: ISO 32000-2, §14.13.5

이름 위에 그린 검은 사각형은 아무것도 숨기지 않습니다. 페이지는 리댁션된 것처럼 보이지만, 그 아래의 텍스트는 여전히 거기에 있고, 여전히 선택 가능하며, 여전히 복사 가능합니다. 진짜 리댁션은 콘텐츠를 덮지 않습니다. 그것을 삭제합니다.

이 페이지는 겉치레 오버레이와 진짜 콘텐츠 제거 사이의 간극, 왜 메타데이터와 임베디드 파일이 순진한 작업을 살아남는지, 그리고 NextPDF 엔터프라이즈 RedactionEngine이 영역을 실제로 제거할 수 없을 때 그것이 사라졌다고 꾸며 내기를 거부하는 방식을 설명합니다.

가장 많이 인용되는 PDF 데이터 유출은 영리한 공격이 아니었습니다. 그것들은 검은 사각형이었습니다. 누군가 민감한 단락 위에 채워진 상자를 그리고, 파일을 내보내고, 배포했습니다. 수신자가 그 상자를 누르고, 그 위로 드래그하자, 원래의 단어가 문서에서 곧장 클립보드로 복사되었습니다.

그 이유는 구조적입니다. PDF 페이지는 순서대로 쌓인 드로잉 연산자의 집합입니다. 불투명한 사각형을 칠하는 것은 그 위에 연산자 하나를 더 추가할 뿐입니다. 그것은 아래에 있는 텍스트 표시 연산자를 제거하지 않습니다. 눈에는 텍스트가 숨겨진 것처럼 보입니다. 기계에게 그것은 늘 있던 바로 그 자리에 있습니다. 오버레이는 변장이고, 변장은 벗겨집니다.

이것이 비싼 이유는 그 실패가 조용하고 최종적이기 때문입니다. 문서는 올바르게 보이고, 시각적 검토를 통과하며, 발행됩니다. 유출은 나중에 텍스트를 선택한 누군가에 의해 발견되고, 그때쯤이면 모든 사본은 이미 밖으로 나가 있습니다.

  • 검은 상자는 텍스트 위에 층으로 쌓인 드로잉 연산이지, 텍스트의 삭제가 아닙니다. 바이트는 살아남습니다.
  • 선택 가능한 텍스트가 살아남는 것은 페이지 콘텐츠 스트림이 여전히 단어를 그리는 글리프를 나르기 때문입니다.
  • 문서 메타데이터가 살아남는 것은 그것이 별도의 장소 — 문서 정보 딕셔너리와 XMP 패킷 — 에 살기 때문이며, 페이지 위의 어떤 사각형도 그곳에 닿을 수 없습니다.
  • 임베디드 파일이 살아남는 것은 PDF가 통째의 파일을 임베디드 파일 스트림으로 안에 나를 수 있기 때문입니다. Spec: ISO 32000-2, §7.11 페이지 위의 표시는 첨부 파일에 결코 닿지 않습니다.
  • 진짜 리댁션은 파괴적입니다. 그것은 그림이 아니라 바이트 스트림에서 콘텐츠를 제거합니다. 사라진 것은 사라진 것이며, 잔류 표면도 함께 정리됩니다.

겉치레 오버레이는 페이지가 어떻게 보이는지를 바꿉니다. 파괴적 리댁션은 문서가 무엇을 담고 있는지를 바꿉니다. 전자는 텍스트 커서를 가진 누구나 되돌릴 수 있습니다. 후자는 복구할 것을 아무것도 남기지 않습니다.

NextPDF 엔터프라이즈 RedactionEngine은 텍스트 콘텐츠 수준에서 파괴적인 경우를 위해 만들어졌습니다. 그 redact() 메서드는 콘텐츠, 무엇을 찾고 그것을 어떻게 대체할지를 기술하는 RedactionPolicy를 받아 RedactionResult를 반환합니다. 내부에서 그것은 민감한 스팬을 탐지하고, 겹치는 것들을 서로소인 포괄 범위로 합친 다음, substr_replace콘텐츠 문자열을 다시 작성하여 포괄된 각 바이트가 정확히 한 번 제거되도록 합니다. 민감한 텍스트는 덧칠되지 않습니다. 그것은 결과가 되돌려 나르는 버퍼에서 사라집니다.

결과는 무슨 일이 일어났는지에 대해 정직합니다. 그것은 원본 콘텐츠의 SHA-256 해시, 다시 작성된 redactedContent, 모든 발견 사항의 감사 보고서, 그리고 wasModified 플래그를 기록합니다. 바이트가 바뀌었음을 증명할 수 있고, 어떤 바이트가 바뀌었는지도 증명할 수 있습니다.

보이는 텍스트를 제거하는 것은 필요하지만 충분하지 않습니다. 같은 단어, 그리고 페이지에서 한 번도 본 적 없는 단어가, 페이지 수준 편집이 결코 닿지 못하는 곳에 숨어 있습니다.

문서는 메타데이터를 이중으로 나릅니다. 레거시 정보 딕셔너리와 XMP 패킷이며, 둘 중 어느 쪽이든 저자 이름, 제목, 또는 도구 지문을 담을 수 있습니다. 그것은 통째의 파일을 임베디드 파일 스트림으로 나를 수 있습니다. Spec: ISO 32000-2, §7.11 그것은 그 페이로드를 페이지 구조에 연관 파일로 결속할 수 있는데, 이는 페이지가 렌더링하지 않지만 문서는 여전히 보유하는 관련 아티팩트 채널입니다. Spec: ISO 32000-2, §14.13.5 이들 중 어느 것도 여러분이 리댁션한 페이지 위에 있지 않으므로, 어느 것도 사각형에 닿지 않습니다. 이에 관한 고전적 지침 — NSA “Hidden Data and Metadata in Adobe PDF Files” 보고서 — 은 정확히 그토록 많은 실제 유출이 보이는 페이지가 아니라 잔류물에서 비롯되었기 때문에 존재합니다.

페이지 위의 단어는 삭제하지만 XMP 패킷에 저자 이름을 남기고 원본 스프레드시트를 첨부 파일로 남기는 리댁션은 문서를 리댁션한 것이 아닙니다. 그것은 문서의 한 가지 뷰를 리댁션한 것입니다.

  1. DetectFind every sensitive span — visible text, and the entity types a policy targets — not just the region you happen to see.
  2. Delete, do not coverRewrite the content stream so the glyphs are removed from the bytes. An opaque box on top leaves the text underneath intact.
  3. Clear the residueStrip the information dictionary and XMP metadata, and remove embedded and associated files that carry the same payload off-page.
  4. VerifyConfirm no selectable text, metadata field, or attachment reproduces the redacted content before the file leaves the building.
What a complete destructive redaction removes, in order: detect the sensitive content, delete the bytes from the content stream rather than draw over them, then clear the residue surfaces — metadata and embedded payloads — that a page-level mark never reaches, and finally verify nothing copyable survived.

리댁션에는 두 가지 방식이 있습니다. 콘텐츠로(이 이름을 찾아 삭제하라) 그리고 으로(이 페이지의 사각형을, 그 아래 무엇이 있든, 칠해 없애라). 엔터프라이즈 엔진은 전자를 진실하게 수행합니다. 그것은 의도적으로 후자를 하는 척 하지 않습니다.

redact() 메서드는 세 번째 인자, ZoneRedaction 좌표 영역의 목록을 받습니다. 텍스트 콘텐츠 엔진에는 페이지 콘텐츠 오버레이 싱크가 없습니다 — 좌표 상자 안에 있는 것을 실제로 제거할 방법이 없습니다. 그래서 그 목록이 비어 있지 않을 때, 그것은 사각형을 그리고 그 존을 “리댁션됨”이라 부르지 않습니다. 그것은 타입이 지정된 RuntimeException을 던지고, 그 존을 대신 페이지 콘텐츠 리댁션 파이프라인을 통해 보내라고 말해 줍니다.

그 거부가 이 페이지의 요점 전체를 코드로 만든 것입니다. 엔진은 자신이 손도 대지 않은 영역에 대해 “리댁션됨” 발견 사항을 반환하느니, 차라리 멈추고 자신이 할 수 없는 것을 이름 붙이려 합니다. 제거로 보고된 조용한 겉치레 오버레이는 유출을 낳는 바로 그 거짓된 보증입니다. Fail closed 는 그 유출을, 배포하기 전에 보는 오류 메시지로 바꿉니다.

“그 위에 검은 상자를 그렸으니, 리댁션된 거야.”

이것이 함정이고, 포맷 전체에서 가장 흔한 함정입니다. 채워진 사각형은 텍스트 위에 쌓인 드로잉 명령입니다. 텍스트 표시 연산자는 여전히 콘텐츠 스트림 안에 있고, 글리프는 여전히 그려지며, 선택이나 복사는 그것들을 변함없이 읽어 냅니다. 여러분은 그림을 숨겼을 뿐, 문서를 바꾸지는 않았습니다.

두 번째의, 더 미묘한 함정이 있습니다. “페이지의 텍스트를 삭제했으니, 문서는 깨끗해.” 아직 아닙니다. 같은 콘텐츠, 그리고 여러분이 한 번도 표시한 적 없는 콘텐츠가 메타데이터와 임베디드 파일에 남아 있을 수 있습니다. 리댁션은 모든 표면 — 페이지 콘텐츠, 메타데이터, 첨부 파일 — 이 여러분이 제거하려던 것으로부터 깨끗할 때에만 완료됩니다.

NextPDF가 여기서 하는 일의 정직한 범위를, 에디션별로 정리합니다.

  • 코어에는 문서 리댁션이 전혀 없습니다. 그것은 감사 로그 PII를 위한 프라이버시 새니타이저를 제공하는데 — 민감한 값을 여러분 자신의 진단 기록 밖에 두는 것 — 이는 전달된 PDF를 리댁션하는 것과는 전혀 다른 일입니다. 코어를 쓰고 있고 문서를 리댁션해야 한다면, 여러분이 원하는 기능은 존재하지 않습니다. 상자를 그리고 엔진이 무언가 제거했다고 가정하지 마십시오.
  • 엔터프라이즈 RedactionEngine은 텍스트 콘텐츠를 파괴적으로 리댁션합니다. 그것은 민감한 바이트를 제거하기 위해 콘텐츠 버퍼를 다시 작성하고, 제거가 증명 가능하도록 해시, 감사 보고서, 그리고 wasModified 플래그를 보고합니다.
  • 좌표 존 리댁션은 fail closed 합니다. 비어 있지 않은 ZoneRedaction 목록을 넘기면 엔진은 오버레이를 흉내 내느니 던집니다. 그것은 누락된 기능이 아니라 의도적인 안전 속성입니다. 진정으로 정리할 수 없는 영역은, 깨끗하다고 부르기를 거부하는 영역입니다.
  • 모든 잔류 표면을 정리하는 것 또한 운영자의 책임입니다. 보이는 텍스트를 제거하는 것은 한 단계입니다. 완전한 작업은 정보 딕셔너리, XMP 패킷, 그리고 같은 페이로드를 페이지 밖으로 나르는 임베디드 또는 연관 파일 (Spec: ISO 32000-2, §7.11, Spec: ISO 32000-2, §14.13.5)까지 함께 제거합니다.
Document redaction — edition availability
EditionAvailability
Core

이 에디션에는 없습니다. 코어에는 문서 리댁션이 없습니다. 그것은 감사 로그 PII 새니타이저만 제공하며, 이는 민감한 값을 여러분 자신의 진단 기록 밖에 둘 뿐 — 전달된 PDF를 리댁션하지는 않습니다.

ProNot in this edition
Enterprise

사용 가능합니다. 엔터프라이즈 RedactionEngine은 파괴적 텍스트 콘텐츠 리댁션을 수행하며, 진정으로 완수할 수 없는 좌표 존 리댁션에 대해서는 — 겉치레 오버레이를 칠하고 영역을 제거됨으로 보고하는 대신 — fail closed 합니다(타입이 지정된 예외를 던집니다).

  • 겉치레 오버레이(cosmetic overlay) — 채워진 사각형 같은 드로잉 연산으로, 콘텐츠를 시각적으로 숨기기 위해 그 위에 층으로 쌓인 것입니다. 그것은 아래의 콘텐츠를 제거하지 않으며, 그 콘텐츠는 선택 가능하고 복사 가능한 채로 남습니다.
  • 파괴적 리댁션(destructive redaction) — 그림이 아니라 문서의 바이트 스트림에서 콘텐츠를 제거하는 것입니다. 일단 수행되면, 아래에 복구할 것이 아무것도 없습니다.
  • 콘텐츠 스트림(content stream) — 페이지를 렌더링하는 드로잉 연산자의 순서 있는 목록으로, 글리프를 그리는 텍스트 표시 연산자를 포함합니다. 위에 놓인 상자는 그 아래의 텍스트 연산자를 삭제하지 않습니다.
  • 잔류 표면(residue surface) — 문서가 페이지에 표시하지 않는 콘텐츠를 보유하는 곳입니다. 정보 딕셔너리, XMP 메타데이터 패킷, 그리고 임베디드 또는 연관 파일입니다. 완전한 리댁션은 그것들을 모두 정리합니다.
  • 임베디드 파일 스트림(embedded file stream) — PDF 안에 나르는 통째의 파일 (ISO 32000-2 §7.11). 페이지 위의 표시는 첨부 파일에 결코 닿지 않습니다.
  • Fail closed — 어떤 연산을 진실하게 수행할 수 없을 때, 그럴듯해 보이지만 틀린 결과를 내는 대신 타입이 지정된 오류로 멈추는 것입니다. 엔터프라이즈 엔진은 완수할 수 없는 좌표 존 리댁션에 대해 이렇게 합니다.