Перейти к содержимому
getnextpdf.com

Редактирование — это не чёрный прямоугольник

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

Чёрный прямоугольник, нарисованный поверх имени, ничего не скрывает. Страница выглядит отредактированной, но текст под ним всё ещё там, всё ещё выделяемый, всё ещё копируемый. Настоящее редактирование не накрывает содержимое. Оно удаляет его.

На этой странице объясняется зазор между косметическим наложением и настоящим удалением содержимого, почему метаданные и встроенные файлы переживают наивную работу и как корпоративный RedactionEngine в NextPDF отказывается притворяться, что область исчезла, когда не может действительно её удалить.

Самые цитируемые утечки данных из PDF не были хитрыми атаками. Это были чёрные прямоугольники. Кто-то нарисовал заполненный прямоугольник поверх конфиденциального абзаца, экспортировал файл и отправил. Получатель нажал на прямоугольник, провёл по нему, и исходные слова скопировались прямо из документа в буфер обмена.

Причина структурна. Страница PDF — это набор операторов рисования, наложенных по порядку. Рисование непрозрачного прямоугольника добавляет ещё один оператор сверху; оно не удаляет оператор показа текста под ним. Для глаза текст скрыт. Для машины он ровно там, где всегда был. Наложение — это костюм, а костюм снимается.

Это дорого, потому что сбой тих и окончателен. Документ выглядит правильно, проходит визуальную проверку и публикуется. Утечку обнаруживает позже тот, кто выделил текст, и к тому моменту каждая копия уже снаружи.

  • Чёрный прямоугольник — это операция рисования, наложенная поверх текста, а не его удаление. Байты переживают.
  • Выделяемый текст переживает, потому что поток содержимого страницы по-прежнему несёт глифы, которые рисуют слова.
  • Метаданные документа переживают, потому что они живут в отдельном месте — словаре document information и пакете XMP, — до которого никакой прямоугольник на странице не дотягивается.
  • Встроенные файлы переживают, потому что PDF может нести внутри себя целые файлы как потоки встроенных файлов. Spec: ISO 32000-2, §7.11 Отметка на странице никогда не касается вложения.
  • Настоящее редактирование разрушающее. Оно удаляет содержимое из потока байтов, а не из картинки. Что ушло — ушло, и поверхности остатка тоже очищены.

Косметическое против разрушающего, точно

Заголовок раздела «Косметическое против разрушающего, точно»

Косметическое наложение меняет то, как страница выглядит. Разрушающее редактирование меняет то, что документ содержит. Первое обратимо любым, у кого есть текстовый курсор. Второе не оставляет ничего для восстановления.

Корпоративный RedactionEngine в NextPDF построен для разрушающего случая на уровне текстового содержимого. Его метод redact() принимает содержимое, RedactionPolicy, описывающую, что найти и как это заменить, и возвращает RedactionResult. Внутри он обнаруживает конфиденциальные диапазоны, объединяет любые пересекающиеся в непересекающиеся покрывающие диапазоны, а затем переписывает строку содержимого с помощью substr_replace, так что каждый покрытый байт удаляется ровно один раз. Конфиденциальный текст не закрашен. Он ушёл из буфера, который несёт результат назад.

Результат честен о том, что произошло: он записывает хеш SHA-256 исходного содержимого, переписанное redactedContent, отчёт аудита по каждой находке и флаг wasModified. Вы можете доказать, что байты изменились, и можете доказать, какие именно.

Остаток, который приходится преследовать

Заголовок раздела «Остаток, который приходится преследовать»

Удаление видимого текста необходимо, но недостаточно. Те же слова, и слова, которых вы на странице никогда не видели, прячутся в местах, до которых правка на уровне страницы никогда не дотягивается.

Документ несёт метаданные дважды: устаревший словарь information и пакет XMP, любой из которых может держать имя автора, заголовок или отпечаток инструмента. Он может нести целые файлы как потоки встроенных файлов. Spec: ISO 32000-2, §7.11 Он может привязывать эти нагрузки к структуре страницы как связанные файлы, канал связанного артефакта, который страница не отрисовывает, но документ всё равно держит. Spec: ISO 32000-2, §14.13.5 Ничего из этого нет на странице, которую вы отредактировали, так что ничего из этого не затронуто прямоугольником. Классическое руководство на этот счёт — отчёт АНБ «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.
Что удаляет полное разрушающее редактирование, по порядку: обнаружить конфиденциальное содержимое, удалить байты из потока содержимого, а не рисовать поверх них, затем очистить поверхности остатка — метаданные и встроенные нагрузки, — до которых отметка на уровне страницы никогда не дотягивается, и наконец проверить, что ничего копируемого не уцелело.

Есть два способа редактировать: по содержимому (найти это имя, удалить его) и по зоне (закрасить этот прямоугольник страницы, что бы под ним ни было). Корпоративный движок делает первое правдиво. Он намеренно не притворяется, что делает второе.

Метод redact() принимает третий аргумент — список координатных областей ZoneRedaction. У движка текстового содержимого нет приёмника наложения на содержимое страницы — нет способа действительно удалить то, что находится внутри координатного прямоугольника. Поэтому, когда этот список непуст, он не рисует прямоугольник и не называет зону «отредактированной». Он бросает типизированное RuntimeException и говорит вам направить зону через конвейер редактирования содержимого страницы.

Этот отказ — весь смысл этой страницы, превращённый в код. Движок предпочтёт остановиться и назвать то, чего он не может, чем вернуть находку «отредактировано» для области, которую он оставил полностью нетронутой. Тихое косметическое наложение, отчитанное как удаление, — это ровно та ложная гарантия, которая порождает утечку. Сбой закрыто превращает эту утечку в сообщение об ошибке, которое вы видите до отправки.

«Я нарисовал чёрный прямоугольник поверх, значит, оно отредактировано».

Это ловушка, и самая распространённая во всём формате. Заполненный прямоугольник — это инструкция рисования, наложенная поверх текста. Операторы показа текста по-прежнему в потоке содержимого, глифы по-прежнему рисуются, а выделение или копирование считывает их неизменными. Вы скрыли картинку; вы не изменили документ.

Вторая, более тонкая ловушка: «Я удалил текст на странице, значит, документ чист». Пока нет. То же содержимое, и содержимое, которое вы никогда не отображали, может сохраняться в метаданных и во встроенных файлах. Редактирование завершено, только когда каждая поверхность — содержимое страницы, метаданные и вложения — очищена от того, что вы намеревались удалить.

Честная область того, что NextPDF здесь делает, по изданиям:

  • В ядре вовсе нет редактирования документов. Оно поставляет санитайзер приватности для PII журнала аудита — чтобы держать конфиденциальные значения вне ваших собственных диагностических записей, — и это совершенно иное, чем редактирование доставленного PDF. Если вы на Core и вам нужно отредактировать документ, нужной вам возможности нет. Не рисуйте прямоугольник и не предполагайте, что движок что-то удалил.
  • Корпоративный RedactionEngine редактирует текстовое содержимое, разрушающе. Он переписывает буфер содержимого, чтобы удалить конфиденциальные байты, и сообщает хеш, отчёт аудита и флаг wasModified, так что удаление доказуемо.
  • Редактирование координатной зоны даёт сбой закрыто. Передайте непустой список ZoneRedaction, и движок бросает, а не подделывает наложение. Это намеренное свойство безопасности, а не отсутствующая функция: область, которую он не может действительно очистить, — это та, которую он отказывается назвать чистой.
  • Очистка каждой поверхности остатка тоже ответственность оператора. Удаление видимого текста — один шаг. Полная работа также снимает словарь information, пакет XMP и любые встроенные или связанные файлы (Spec: ISO 32000-2, §7.11, Spec: ISO 32000-2, §14.13.5), которые несут ту же нагрузку вне страницы.
Document redaction — edition availability
EditionAvailability
Core

Не в этом издании. В Core нет редактирования документов. Оно предоставляет только санитайзер PII журнала аудита, который держит конфиденциальные значения вне ваших собственных диагностических записей, — он не редактирует доставленный PDF.

ProNot in this edition
Enterprise

Доступно. Корпоративный RedactionEngine выполняет разрушающее редактирование текстового содержимого и даёт сбой закрыто — он бросает типизированное исключение — на редактировании координатной зоны, которое он не может действительно выполнить, вместо того чтобы рисовать косметическое наложение и отчитывать область как удалённую.

  • Косметическое наложение — операция рисования, такая как заполненный прямоугольник, наложенная поверх содержимого, чтобы скрыть его визуально. Оно не удаляет содержимое под ним, которое остаётся выделяемым и копируемым.
  • Разрушающее редактирование — удаление содержимого из потока байтов документа, а не из картинки. Раз сделано, под ним нет ничего для восстановления.
  • Поток содержимого — упорядоченный список операторов рисования, которые отрисовывают страницу, включая операторы показа текста, которые рисуют глифы. Прямоугольник сверху не удаляет операторы текста под ним.
  • Поверхность остатка — место, где документ держит содержимое, которое страница не отображает: словарь information, пакет метаданных XMP и встроенные или связанные файлы. Полное редактирование очищает их все.
  • Поток встроенного файла — целый файл, несомый внутри PDF (ISO 32000-2 §7.11). Отметка на странице никогда не касается вложения.
  • Сбой закрыто — остановиться с типизированной ошибкой, когда операцию нельзя выполнить правдиво, вместо того чтобы произвести правдоподобно выглядящий результат, который неверен. Корпоративный движок делает это для редактирования координатной зоны, которое он не может выполнить.