From e33d51a34a224245cd81f90e3a091ebc8d6d6dd9 Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 26 Oct 2026 21:29:41 +0100 Subject: [PATCH] Document attachment key persistence failure during chat audit --- doc/encrypted_attachments.md | 10 +++++++++- src/chat/chat_attachment.h | 5 ++++- 2 files changed, 13 insertions(+), 2 deletions(-) diff --git a/doc/encrypted_attachments.md b/doc/encrypted_attachments.md index 29efd459..5d26c828 100644 --- a/doc/encrypted_attachments.md +++ b/doc/encrypted_attachments.md @@ -14,7 +14,15 @@ Android показывает зашифрованное вложение отд Список чатов сохраняет общее название зашифрованного вложения вместо manifest. Автор генерирует независимые случайные crypto_UUID и ключ AES-256 на каждую -подготовку. Ключ записывается в локальную SQLite до шифрования. Готовый контейнер +подготовку. Штатно ключ записывается в локальную SQLite до шифрования. При аудите +26.10.2026 подтверждено исключение: отказ `sqlite3_bind_blob` ключа не проверяется, +и подготовка запускается со строкой `key=NULL`, несмотря на сообщение «key saved». +Контейнер создаётся, переданный исходник удаляется; последующая проверка +`chat_attachment_bind` запрещает публикацию, и отправка завершается событием ошибки. +Это открытый дефект сохранения ключа; аудит модуля остаётся частичным. +Стенд, точная граница проверки и план исправления — в +[chat_audit_findings.txt](chat_audit_findings.txt), продолжение chat_attachment. +Готовый контейнер передаётся через обычные media_index/media_delivery. UUID транспортного медиа и crypto_UUID имеют разные назначения: первый идентифицирует сетевые блоки, второй — контейнер и ключ. Повтор доставки передаёт прежний контейнер. diff --git a/src/chat/chat_attachment.h b/src/chat/chat_attachment.h index 74da8663..a1353071 100644 --- a/src/chat/chat_attachment.h +++ b/src/chat/chat_attachment.h @@ -27,7 +27,10 @@ void chat_attachment_destroy(struct UTUN_INSTANCE* inst); /* Асинхронно отправить подготовленный файл; channel — десятичный ID, reply — 32 байта ID ответа либо нули. * Аргументы копируются. 0 — задача принята, source передан задаче и будет удалён даже при ошибке подготовки. - * -1 — отказ запуска, source остаётся у вызывающего. Ненулевой request возвращается в CHAT_EVT_MSG_SUBMITTED. */ + * -1 — отказ запуска, source остаётся у вызывающего. Ненулевой request возвращается в CHAT_EVT_MSG_SUBMITTED. + * Ошибка media_async_submit может дать событие синхронно, до возврата 0 из send. + * Известный дефект: отказ SQL bind ключа не проверяется; 0 пока не гарантирует сохранение ключа перед worker. + * Подробности и локальная проверка: doc/chat_audit_findings.txt, продолжение chat_attachment. */ /* type проверяется encrypted_file_validate_type до выделения задачи, генерации UUID/ключа и записи в БД. */ int chat_attachment_send(struct UTUN_INSTANCE* inst, const char* channel, const char* source, const struct attachment_info* info, const char* type, const uint8_t reply[32], uint64_t request);