Content Credentials у PDF від ChatGPT: що виживає після перезбереження, друку й редагування
Ми попросили ChatGPT змінити дату в рахунку, який він сам згенерував. Він це зробив, і новий файл досі несе підписане OpenAI твердження, що його створив ChatGPT: той самий маніфест, байт у байт, який описує версію зі старою датою.
Цей рахунок був одним із десяти вигаданих документів, які ми згенерували, щоб заміряти, про що говорить ця мітка і що від неї лишається після перезбереження, друку чи скріншота. OpenAI публічно документує сигнали походження для зображень і аудіо (C2PA і SynthID для зображень, SynthID для аудіо), але її публічний API перевірки не приймає PDF.
| Крок | C2PA-маніфест | Що ми побачили |
|---|---|---|
| Оригінальний PDF | Є | Підпис і хеш проходять валідацію |
| Перезапис qpdf | Лишився | Стрім стиснуто; c2pa-python 0.38 повертає помилку |
| Перезапис pikepdf | Лишився | Та сама помилка |
| Перемальовування через Друк або Preview | Зник | Текстовий шар лишився |
| Растеризація | Зник | Текстового шару й структури PDF немає |
| Рахунок, відредагований у ChatGPT | Лишився | Старий маніфест більше не відповідає файлу |
Це спостереження на цих файлах; інші PDF можуть поводитися інакше.
Що таке ця мітка
Специфікація C2PA зберігає маніфест у PDF як вкладений файл, на який каталог документа вказує через запис /AF.
trainedAlgorithmicMedia — термін IPTC для «створено навченою моделлю». Це не рядок /Creator, який будь-хто може вписати; це підписане твердження самого інструмента. Криптографічний підпис робить зміну твердження помітною. Але підписаний маніфест можна скопіювати в інший PDF, і для того документа він не стане дійсним, тому й важливий хеш.
Незайманий файл проходить валідацію
Прочитаний через c2pa-python 0.38, офіційний читач, щойно завантажений файл повертає Valid з assertion.dataHash.match: це саме ті байти, які описує маніфест. Сертифікат читач називає недовіреним, бо ми не завантажували trust list. Дійсний підпис і хеш, що зійшовся, самі по собі не встановлюють довіреного підписанта: для цього потрібні визнаний ланцюжок сертифікатів і політика довіри.
Файл у публічному тестовому корпусі veraPDF теж несе справжній маніфест OpenAI, але повертає Invalid з assertion.dataHash.mismatch. Його Producer — власний збирач корпусу, а дата зміни на чотирнадцять хвилин пізніша за підпис: файл переписали навколо маніфесту.
Знайти маніфест означає дізнатися, що інструмент колись зробив якийсь документ. Провалідувати — дізнатися, чи зробив він саме цей.
Дві ревізії PDF і жодних видимих метаданих
У цих файлах ChatGPT зібрав PDF у ReportLab, а потім дописав маніфест як інкрементальне оновлення.
Тож лічильник ревізій бачить дві ревізії у файлі, який ніхто не редагував; тут друга і є підписанням. А в дописаному trailer немає запису /Info, тому pdfinfo і pikepdf показують порожні метадані, хоча Info першої ревізії досі лежить у байтах.
Десять файлів, одна форма
Дві версії банківської виписки, рахунок, чек, розрахунковий лист, резюме, лист, звіт і зображення на сторінці PDF: ці дев'ять незайманих файлів мають одну форму й проходять валідацію. Десятий — відредагований рахунок нижче. Усі десять зроблено з одного акаунта за два дні, тож це зразки, а не дослідження поведінки ChatGPT.
У більшості з них прихований Info каже лише «anonymous» або «ReportLab», тож маніфест — єдине, що називає інструмент.
Коли ми попросили PDF зі згенерованого зображення, власний маніфест картинки (gpt-image) у нього не перейшов. ChatGPT підписав PDF окремо, як чат-модель.
Що виживає після перезапису, друку і скріншота
Ми провели кожен файл через кожне перетворення й прочитали кожен результат трьома способами: пошук «ChatGPT» по сирих байтах, c2pa-python і читач, який спершу декодує вкладений стрім. Кроки на macOS викликають напряму системні API, що стоять за Друком і Preview.
Після перезапису qpdf або pikepdf мітка виживає, а два з трьох читачів її не бачать. Обидва інструменти стискають стріми, що лежали нестиснутими, тож «ChatGPT» зникає із сирих байтів, а c2pa-python 0.38 на цих файлах падав з «invalid JUMBF header», бо читав стрім без декодування. У наших тестах один прогін qpdf ховав мітку від обох, не видаляючи її. Лікування — декодувати стрім через PDF-парсер, перш ніж дивитися.
Це окрема проблема від тієї, яку PDF Association описала в PDF від ChatGPT: зайвий запис /F у вкладеному стрімі, через який Content Credentials стають непридатними. У наших десяти файлах такого запису немає.
У наших прогонах перемальовування сторінок через Друк або Preview викидало вкладений файл і зберігало текстовий шар. Растеризація прибирає текстовий шар PDF, шрифти, вкладення й маніфест. Отримане зображення може мати власні метадані чи сигнали походження, але вони окремі від Content Credentials самого PDF. Паперовий скан чи фото з телефона — той самий випадок.
Коли ChatGPT редагує власний PDF
Ми завантажили рахунок назад у чат і попросили змінити дату на 15 жовтня 2026.
Файл переписано, а старий маніфест перейшов разом із ним: той самий SHA-256, ні нового claim, ні нового підпису. Він досі каже «створено ChatGPT» під справжнім підписом OpenAI, про байти, яких уже немає. Інструмент, який лише шукає мітку, бачить те саме, що й на оригіналі, а офіційний читач файл узагалі не відкриває. Лише порівняння хешу з маніфесту з байтами файлу показує, що документ змінився після підписання. Одне редагування, один файл: так ChatGPT зробив тут, не обов'язково так він робить завжди.
Що це означає для перевірки документів
Наш підхід: на виданому документі мітка є тривожним сигналом. Банківські виписки, квитанції, розрахункові листи й дипломи надходять із власних систем установ, а не з чат-асистента, тож документ із міткою ШІ ми вважаємо не виданим установою, яку він називає, доки вона не підтвердить протилежне. На листі чи резюме мітка лише вказує, яким інструментом скористалися. Ми регулярно бачимо такі документи серед файлів, які нам надсилають на перевірку, і це лише ті, що досі несуть мітку.
Спершу валідуйте, потім довіряйте. Дійте на підставі стану валідації, із завантаженим trust list. Сам по собі хеш, що не зійшовся, не каже, чи документ переписали, чи маніфест пересадили.
Відсутність нічого не доводить. Мітка ловить того, хто не знав про її існування. Друк або скріншот прибирали її в кожному тесті, і для цього не потрібен намір; коли вам надіслали картинку, попросіть оригінальний PDF.
Перевіряйте ще й цифри. У дослідженні GPT4o-Receipt на 1 235 чеках головною ознакою була арифметика: позиції, що не сходяться в суму, податок, що не відповідає базі. Така перевірка переживає кожне перетворення вище.
Що наша перевірка робить із міткою
Знайдена мітка — це криміналістичний сигнал, а не підтверджене авторство. Наш звіт читає ту саму мітку й декодує стріми, тож повідомляє ChatGPT на оригіналі та перезаписаних копіях і нічого на перемальованих і растеризованих. Підпис і хеш він не перевіряє: пересаджений маніфест і відредагований рахунок читаються так само, як оригінал, і звіт називає знахідку маркером, а не доказом. Файл без мітки не отримує від цієї перевірки жодної знахідки. Деталі й межі: шахрайство з документами, згенерованими ШІ.
Content Credentials — лише одна частина криміналістики документів, а не повна перевірка на шахрайство. Банківська виписка може не мати жодної мітки ШІ і все одно містити текст, накладений поверх оригіналу, неузгоджені шрифти чи баланс, який не сходиться. Наш звіт шукає й такі ознаки.
Відтворити
Десять файлів, їхні контрольні суми і скрипт-читач публічні на github.com/atomara-io/chatgpt-pdf-provenance.