docs(media): record accepted but unreadable MIME containers
This commit is contained in:
1 parent
f331d177ca
commit
86b7f9cf44
2 files changed
+74
-2
No files matched your search
@@ -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.
|
||||
@@ -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.
|
||||
|
||||
Reference in new issue
Block a user