diff --git a/doc/media_async_audit_findings.txt b/doc/media_async_audit_findings.txt index 9cda97bd..6cd0b8c5 100644 --- a/doc/media_async_audit_findings.txt +++ b/doc/media_async_audit_findings.txt @@ -1,6 +1,6 @@ Аудит media_async / media_delivery — 2026-10-24 -Статус: encrypted_file, граница voice_file и переанонс записей SQLite исправлены. -Полный аудит двух каталогов ещё не завершён. Последнее продолжение и результаты исправления — в конце. +Статус: alias encrypted_file, граница voice_file и переанонс SQLite исправлены; подтверждено отдельное расхождение MIME write/read. +Полный аудит двух каталогов ещё не завершён. Последнее продолжение и проект нового исправления — в конце. Ниже сохранены исходное воспроизведение, согласованный проект и результаты исправления encrypted_file. Подтверждённый дефект: исходник уничтожается через другое имя того же файла @@ -405,3 +405,63 @@ media_crypto.h и file_transfer.h можно отметить [V]; media_deliver /tmp/media-announcement-sanitizer-tests-build.log, /tmp/media-announcement-sanitizer-results.log. Полный make check и Windows/FreeBSD не запускались. Завершение фикса не означает завершения сверки оставшихся заголовков и документов двух каталогов. + +Продолжение сверки описаний — 2026-10-24: MIME контейнера + +Сверены и уточнены attachment.h, attachment_send.h, voice_file.h, media_delivery_proto.h +и комментарий неиспользуемого HAVE_BLOCK timeout в media_delivery.h: +- attachment: UTF-8 и только ASCII C0/DEL, границы полей по kind, состояние выходов + при ошибке encode/decode, content_type не является валидатором kind. +- voice_file: собственное перезаписываемое назначение, поздняя ошибка close может + изменить info; native контейнер и отсутствие fsync/атомарной публикации. +- attachment_send: владение начинается при вызове trampoline, при отказе самого post + остаётся у caller; PCM/compressor, контекст освобождения, DM generation, канальные + request_id/reply, внутренний UUID подготовки и события подготовки вместо обещания доставки. +- proto: вне SYNC числа native-endian; SERVE_REG/LEAVE только вспомогательный учёт, + загрузчик их не посылает. SERVE_ACK не отправляется; приём SERVE_ACK/HAVE_BLOCK_ACK игнорируется, + ожидания ACK/его таймера нет. Не менялись команды, wire или runtime-поведение. +Коммиты описаний:08692fa4 и4e4c60ee. Из общего service_lifecycle повторно сверена +только media-секция111..196 по текущему порядку start/quiesce/destroy и прочитанным модулям; +за пределами media документ не считается полностью проверенным. + +Подтверждённый дефект MIME + +encrypted_file_write проверяет только ненулевой type и strlen(type)<32, затем шифрует строку. +encrypted_file_read требует непустую NUL-терминированную строку в32-байтном поле, +ASCII33..126 без '"' и '\\'. Поэтому write может успешно подготовить непригодный для read контейнер. +chat_attachment_send (chat_attachment.c:198..225) имеет такую же слабую входную проверку: +до сохранения ключа/старта worker проверяется лишь наличие указателя и длина. + +Реальный roundtrip, без подмены криптографии или файловых функций: +- Контроль application/octet-stream: write=0/read=0, hash расшифрованного temp равен исходному. +- Пустой MIME, перевод строки, двойная кавычка, обратная косая черта и не-ASCII UTF-8: + все пять write=0, после publish и вычисления точного внешнего hash соответствующий read=-1. + Ключ, author, UUID и контейнер при чтении те же. Ошибка — invalid metadata/type, + а не аутентификация или порча контейнера в опыте. +- При ошибке read прежние info/type сохранены, temp очищен; SHA256 исходника неизменен во всех6 случаях. + Это подтверждённый дефект принятия аргумента в API. Сквозная отправка/открытие карточки GUI не моделировалась. +- /tmp/media-content-type-audit.c и .mk, сборка через tests/Makefile и настоящие библиотеки; + /tmp/media-content-type-audit-build.log, /tmp/media-content-type-audit.log. + Артефакты: /tmp/media-content-type-audit-FdtMC3/. Лог содержит MIME как hex, без управляющих символов в тексте. + +Проект простого исправления + +1. Экспортировать encrypted_file_validate_type в encrypted_file.h: 0/-1, bounded strnlen(type,32), + непустая строка длиной1..31, ASCII33..126 кроме двойной кавычки и обратной косой черты. + Это ограничение существующего контейнера, не новый полноценный MIME parser и не правило для всех сообщений чата. + Диагностика показывает длину/позицию/hex ошибочного байта, не выводит сырую непроверенную строку. +2. Вызывать один валидатор в chat_attachment_send до выделения задачи/генерации ключа/записи в БД, + в encrypted_file_write до открытия source/temp и в read для расшифрованного32-байтного поля. + Существующие проверки длины расшифрованного блока сохраняются; правило MIME не дублируется в трёх местах. +3. Не менять формат, nonce, crypto, DB state machine или файловое владение. Reader остаётся строгим; + writer не должен выдавать успех для метаданных, которые этот же reader не принимает. +4. Регрессии: NULL/пустая строка/31/32 байта, каждый запрещённый символ, ASCII-границы + и валидные значения; writer на раннем отказе сохраняет source/target/output. + Для reader плохие metadata шифруются тестом с известным ключом и пересчитанным внешним hash: + отказ не теряет прежние info/type и не оставляет temp. Проверить send-отказ без строки ключа/worker/файлов. + +Аудит снова остановлен по AGENTS.md:10 после воспроизведения. Рабочий код нового MIME-фикса не менялся. +Предыдущий фикс SQLite полностью проверен: профиль12/12 и sanitizer4/4; после него в проекте менялись только описания. +attachment.h/attachment_send.h/voice_file.h и media_delivery.h/proto.h сверены; +encrypted_file.h возвращается в [~] до согласования MIME-контракта. Остаются общий _desc.txt, +полная сверка encrypted_attachments.md с chat/UI и части общего service_lifecycle за пределами media. diff --git a/doc/tasks.md b/doc/tasks.md index 8e54329e..1a980e6f 100644 --- a/doc/tasks.md +++ b/doc/tasks.md @@ -4,6 +4,18 @@ ## Текущие задачи +[ ] **encrypted_file: одинаково проверять MIME при записи и чтении контейнера** — подтверждено 24.10.2026. + write проверяет только strlen(type)<32 и принимает пустое значение/недопустимые символы, + тогда как read их отвергает. Пять реальных write/read с теми же ключом/UUID/подписанным hash: + write=0, read=-1; контрольный application/octet-stream проходит полный roundtrip. + chat_attachment_send также проверяет только длину и может принять такой MIME до записи ключа/запуска worker. + Воспроизведение: /tmp/media-content-type-audit.c и .mk, /tmp/media-content-type-audit.log; + исходники/контейнеры: /tmp/media-content-type-audit-FdtMC3/. Исходный файл не меняется. + План: один bounded encrypted_file_validate_type для send/write/read; 1..31 байт, + ASCII33..126 без двойной кавычки/обратной косой черты — действующие ограничения read. + Отказ до создания ключа/файлов; регрессии раннего отказа и чтения испорченных метаданных. + Подробности: [media_async_audit_findings.txt](media_async_audit_findings.txt). Новый фикс не внесён: остановлено по AGENTS.md:10. + [+] **media_delivery: проверять записи SQLite перед переанонсом локальных блоков** — исправлено 24.10.2026. Прежний announce_local_blocks не проверял длины media_id/block_id, диапазон chunk и полный chat_id. Реальный обработчик отправил все7 повреждённых записей: UUID длиной1/17 байт, chunk=-1/2^32, chat_id=111junk.