docs(media): record accepted but unreadable MIME containers

This commit is contained in:
evgeny committed 2026-10-24 17:26:11 +02:00
1 parent f331d177ca
commit 86b7f9cf44
2 files changed
+74 -2

No files matched your search

+62 -2
View File
@@ -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.
+12
View File
@@ -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.