Przejdź do głównej zawartości
getnextpdf.com

Redakcja to nie czarny prostokąt

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

Czarny prostokąt narysowany nad nazwiskiem niczego nie ukrywa. Strona wygląda na zredagowaną, ale tekst pod spodem wciąż tam jest, wciąż zaznaczalny, wciąż kopiowalny. Prawdziwa redakcja nie zakrywa treści. Usuwa ją.

Ta strona wyjaśnia lukę między kosmetyczną nakładką a prawdziwym usunięciem treści, dlaczego metadane i pliki osadzone przeżywają naiwną robotę oraz jak enterprise’owy RedactionEngine NextPDF odmawia udawania, że region zniknął, gdy nie może go faktycznie usunąć.

Najczęściej cytowane wycieki danych z plików PDF nie były sprytnymi atakami. Były czarnymi prostokątami. Ktoś narysował wypełnione pudełko nad wrażliwym akapitem, wyeksportował plik i wysłał go. Odbiorca nacisnął pudełko, przeciągnął po nim, a oryginalne słowa skopiowały się wprost z dokumentu do schowka.

Powód jest strukturalny. Strona PDF to zbiór operatorów rysowania ułożonych w kolejności. Namalowanie nieprzezroczystego prostokąta dodaje jeszcze jeden operator na wierzch; nie usuwa operatora wyświetlania tekstu pod spodem. Dla oka tekst jest ukryty. Dla maszyny jest dokładnie tam, gdzie zawsze był. Nakładka to kostium, a kostium da się zdjąć.

To kosztowne, ponieważ niepowodzenie jest ciche i ostateczne. Dokument wygląda poprawnie, przechodzi przegląd wizualny i zostaje opublikowany. Wyciek jest odkrywany później przez kogoś, kto zaznaczył tekst, a do tego czasu każda kopia jest już na zewnątrz.

  • Czarne pudełko to operacja rysowania nałożona na tekst, a nie jego usunięcie. Bajty przeżywają.
  • Zaznaczalny tekst przeżywa, ponieważ strumień treści strony wciąż niesie glify, które rysują słowa.
  • Metadane dokumentu przeżywają, ponieważ żyją w osobnym miejscu — słowniku informacji o dokumencie oraz pakiecie XMP — którego żaden prostokąt na stronie nie sięga.
  • Pliki osadzone przeżywają, ponieważ PDF może nieść w sobie całe pliki jako strumienie plików osadzonych. Spec: ISO 32000-2, §7.11 Znak na stronie nigdy nie dotyka załącznika.
  • Prawdziwa redakcja jest destrukcyjna. Usuwa treść ze strumienia bajtów, a nie z obrazu. Co zniknęło, to zniknęło, a powierzchnie pozostałości też są oczyszczone.

Kosmetyczna nakładka zmienia to, jak strona wygląda. Destrukcyjna redakcja zmienia to, co dokument zawiera. Pierwszą może odwrócić każdy z kursorem tekstowym. Druga nie pozostawia niczego do odzyskania.

Enterprise’owy RedactionEngine NextPDF jest zbudowany dla przypadku destrukcyjnego na poziomie treści tekstowej. Jego metoda redact() bierze treść, RedactionPolicy opisującą, co znaleźć i jak to zastąpić, i zwraca RedactionResult. Wewnątrz wykrywa wrażliwe zakresy, scala wszelkie nakładające się w rozłączne pokrywające zakresy, a następnie przepisuje łańcuch treści za pomocą substr_replace, tak by każdy pokryty bajt został usunięty dokładnie raz. Wrażliwy tekst nie jest zamalowany. Zniknął z bufora, który niesie wynik.

Wynik jest uczciwy co do tego, co się stało: zapisuje skrót SHA-256 oryginalnej treści, przepisaną redactedContent, raport audytowy każdego znaleziska oraz flagę wasModified. Możesz dowieść, że bajty się zmieniły, i możesz dowieść, które.

Usunięcie widocznego tekstu jest konieczne, ale niewystarczające. Te same słowa, oraz słowa, których nigdy nie widziałeś na stronie, kryją się w miejscach, do których edycja na poziomie strony nigdy nie sięga.

Dokument niesie metadane podwójnie: przestarzały słownik informacji oraz pakiet XMP, z których każdy może trzymać nazwisko autora, tytuł lub odcisk narzędzia. Może nieść całe pliki jako strumienie plików osadzonych. Spec: ISO 32000-2, §7.11 Może wiązać te ładunki ze strukturą strony jako pliki powiązane — kanał powiązanego artefaktu, którego strona nie renderuje, ale dokument wciąż go trzyma. Spec: ISO 32000-2, §14.13.5 Żadna z tych rzeczy nie jest na stronie, którą zredagowałeś, więc żadnej z nich nie dotyka prostokąt. Klasyczna wytyczna w tej sprawie — raport NSA „Hidden Data and Metadata in Adobe PDF Files” — istnieje właśnie dlatego, że tak wiele rzeczywistych wycieków pochodziło z pozostałości, a nie z widocznej strony.

Redakcja, która usuwa słowa na stronie, ale pozostawia nazwisko autora w pakiecie XMP i oryginalny arkusz jako załącznik, nie zredagowała dokumentu. Zredagowała jeden jego widok.

  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.
Co usuwa kompletna destrukcyjna redakcja, w kolejności: wykryj wrażliwą treść, usuń bajty ze strumienia treści zamiast malować po nich, następnie oczyść powierzchnie pozostałości — metadane i osadzone ładunki — których znak na poziomie strony nigdy nie sięga, a na koniec zweryfikuj, że nie przetrwało nic kopiowalnego.

Są dwa sposoby redagowania: według treści (znajdź to nazwisko, usuń je) oraz według strefy (zamaluj ten prostokąt strony, cokolwiek pod nim jest). Enterprise’owy silnik robi pierwszy uczciwie. Celowo nie udaje, że robi drugi.

Metoda redact() przyjmuje trzeci argument, listę regionów współrzędnych ZoneRedaction. Silnik treści tekstowej nie ma ujścia do nakładki treści strony — żadnego sposobu, by naprawdę usunąć to, co siedzi wewnątrz pudełka współrzędnych. Więc gdy ta lista jest niepusta, nie rysuje prostokąta i nie nazywa strefy „zredagowaną”. Zgłasza typowany RuntimeException i mówi ci, byś poprowadził strefę przez potok redakcji treści strony.

Ta odmowa to cały sens tej strony zamieniony w kod. Silnik woli się zatrzymać i nazwać to, czego nie potrafi, niż zwrócić znalezisko „zredagowane” dla regionu, który pozostawił całkowicie nietknięty. Cicha kosmetyczna nakładka raportowana jako usunięcie to dokładnie ta fałszywa pewność, która wytwarza wyciek. Zawodzenie bezpiecznie zamienia ten wyciek w komunikat o błędzie, który widzisz, zanim wyślesz plik.

„Narysowałem nad tym czarne pudełko, więc to jest zredagowane.”

To pułapka i najczęstsza w całym formacie. Wypełniony prostokąt to instrukcja rysowania ułożona na wierzchu tekstu. Operatory wyświetlania tekstu wciąż są w strumieniu treści, glify wciąż rysują, a zaznaczenie lub kopia odczytuje je niezmienione. Ukryłeś obraz; nie zmieniłeś dokumentu.

Druga, subtelniejsza pułapka: „Usunąłem tekst na stronie, więc dokument jest czysty.” Jeszcze nie. Ta sama treść, oraz treść, której nigdy nie wyświetliłeś, może utrzymywać się w metadanych i w plikach osadzonych. Redakcja jest skończona dopiero wtedy, gdy każda powierzchnia — treść strony, metadane oraz załączniki — jest czysta z tego, co zamierzałeś usunąć.

Uczciwy zakres tego, co NextPDF tu robi, według edycji:

  • Edycja podstawowa (Core) nie ma redakcji dokumentu w ogóle. Dostarcza sanityzator prywatności dla danych osobowych (PII) w dzienniku audytu — trzymający wrażliwe wartości z dala od twoich własnych zapisów diagnostycznych — a to coś zupełnie innego niż redagowanie dostarczanego PDF. Jeśli jesteś na Core i musisz zredagować dokument, możliwości, której chcesz, nie ma. Nie rysuj pudełka i nie zakładaj, że silnik cokolwiek usunął.
  • Enterprise’owy RedactionEngine redaguje treść tekstową, destrukcyjnie. Przepisuje bufor treści, by usunąć wrażliwe bajty, i raportuje skrót, raport audytowy oraz flagę wasModified, dzięki czemu usunięcie jest dowiedlne.
  • Redakcja strefy współrzędnych zawodzi bezpiecznie. Podaj niepustą listę ZoneRedaction, a silnik zgłosi wyjątek, zamiast udawać nakładkę. To celowa właściwość bezpieczeństwa, a nie brakująca funkcja: region, którego nie potrafi naprawdę oczyścić, jest regionem, który odmawia nazwać czystym.
  • Oczyszczenie każdej powierzchni pozostałości to także odpowiedzialność operatora. Usunięcie widocznego tekstu to jeden krok. Kompletna robota zdejmuje też słownik informacji, pakiet XMP oraz wszelkie pliki osadzone lub powiązane (Spec: ISO 32000-2, §7.11, Spec: ISO 32000-2, §14.13.5), które niosą ten sam ładunek poza stroną.
Document redaction — edition availability
EditionAvailability
Core

Not in this edition. Core has no document redaction. It provides only an audit-log PII sanitiser, which keeps sensitive values out of your own diagnostic records — it does not redact a delivered PDF.

ProNot in this edition
Enterprise

Available. The enterprise RedactionEngine performs destructive text-content redaction and fails closed — it throws a typed exception — on coordinate-zone redaction it cannot truly fulfil, rather than painting a cosmetic overlay and reporting a region as removed.

  • Kosmetyczna nakładka — operacja rysowania, taka jak wypełniony prostokąt, nałożona na treść, by ukryć ją wizualnie. Nie usuwa treści pod spodem, która pozostaje zaznaczalna i kopiowalna.
  • Destrukcyjna redakcja — usunięcie treści ze strumienia bajtów dokumentu, a nie z obrazu. Gdy się dokona, nie ma pod spodem niczego do odzyskania.
  • Strumień treści — uporządkowana lista operatorów rysowania, które renderują stronę, w tym operatory wyświetlania tekstu, które rysują glify. Pudełko na wierzchu nie usuwa operatorów tekstu pod nim.
  • Powierzchnia pozostałości — miejsce, w którym dokument trzyma treść, której strona nie wyświetla: słownik informacji, pakiet metadanych XMP oraz pliki osadzone lub powiązane. Kompletna redakcja oczyszcza je wszystkie.
  • Strumień pliku osadzonego — cały plik niesiony wewnątrz PDF (ISO 32000-2 §7.11). Znak na stronie nigdy nie dotyka załącznika.
  • Zawodzić bezpiecznie (fail closed) — zatrzymać się z typowanym błędem, gdy operacji nie da się wykonać uczciwie, zamiast wytworzyć wiarygodnie wyglądający wynik, który jest błędny. Enterprise’owy silnik robi to dla redakcji strefy współrzędnych, której nie potrafi spełnić.