From 068eddefd868623974abdfd7fd6f54239387b4db Mon Sep 17 00:00:00 2001 From: evgeny Date: Mon, 26 Oct 2026 15:20:31 +0100 Subject: [PATCH] Flag db_sync data loss on verification errors and invalid duplicate input --- src/chat/db_sync.h | 4 ++++ src/chat/db_sync_arch.md | 13 ++++++++++++- 2 files changed, 16 insertions(+), 1 deletion(-) diff --git a/src/chat/db_sync.h b/src/chat/db_sync.h index 47d9be4b..c0d3f228 100644 --- a/src/chat/db_sync.h +++ b/src/chat/db_sync.h @@ -82,6 +82,10 @@ uint64_t db_sync_instance_group_id(struct DB_SYNC_INSTANCE* si); // db_sync_insert_signed: sig MUST be non-NULL, 64 bytes. // sig = Ed25519(ts[8] || json); ts записан в порядке байтов хоста. // ts — call db_sync_next_timestamp(si) before signing to reserve monotonically increasing timestamp. +// Возвращает 0 (вставлено), 1 (повтор), -1 (ошибка), -2 (отказ проверки). +// Известный дефект: операционный отказ проверки либо битый входящий дубликат могут удалить +// корректную сохранённую строку с тем же ключом. Удалять допустимо только доказанно битые +// сохранённые данные (формат/подпись); см. doc/member_merkle_audit_findings.txt, раздел10. int db_sync_insert_signed(struct DB_SYNC_INSTANCE* si, const char* json_data, size_t len, const uint8_t* sig, size_t sig_len, uint64_t ts, const char* local_attrs); diff --git a/src/chat/db_sync_arch.md b/src/chat/db_sync_arch.md index 9a736242..aedc785e 100644 --- a/src/chat/db_sync_arch.md +++ b/src/chat/db_sync_arch.md @@ -1,5 +1,11 @@ # db_sync — децентрализованная реплицируемая таблица с цепным хешированием +Аудит 26.10.2026 частичный. Подтверждён дефект: отказ инициализации OpenSSL при +повторной вставке удаляет корректную историю. Испорченный входящий дубликат также +может удалить корректную сохранённую копию. Runtime-код не исправлялся; +продолжение остановлено по AGENTS.md. Условия удаления и воспроизведение — +[отчёт, раздел10](../../doc/member_merkle_audit_findings.txt). + ## 1. Архитектура ### 1.1 Обзор @@ -518,7 +524,12 @@ tp=10 → entry[0]: pos=9 (tp - 1) ## 5. Безопасность -1. **Ed25519-подписи:** каждая запись подписана `Ed25519(timestamp || json_data)`. Проверяется всегда — и при локальной вставке, и при приёме от пира. Невалидные записи отбрасываются и удаляются из БД. +1. **Ed25519-подписи:** каждая запись подписана `Ed25519(timestamp || json_data)`. Проверяется при локальной вставке и при приёме от пира. + Требуемый контракт удаления: завершённая проверка установила неверность подписи самих сохранённых байтов + либо доказан повреждённый формат этой записи. Отсутствие ключа, отказ OpenSSL/памяти/SQL не доказывают порчу. + Неверная входящая копия не доказывает неверность корректной строки с тем же ключом. + Текущий db_verify_author_sig объединяет эти причины, а db_record_insert и si_send_data_batch используют отказ для DELETE; + это подтверждённый неисправленный дефект, а не реализованный требуемый контракт. 2. **Цепной хеш:** SHA256-цепочка защищает от вставки/удаления записей в середине истории. При проверке (`db_sync_chain_verify`) или при обнаружении расхождения во время отправки — запускается пересчёт с позиции ошибки. 3. **Публичные ключи:** Ed25519 публичный ключ пира получается из трёх источников (по приоритету): - Локальный `inst->my_ed25519_pubkey` (для своих записей)