Flag db_sync data loss on verification errors and invalid duplicate input

This commit is contained in:
evgeny committed 2026-10-26 18:26:31 +01:00
1 parent b0bf27de61
commit 068eddefd8
2 files changed
+16 -1

No files matched your search

+4
View File
@@ -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);
+12 -1
View File
@@ -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` (для своих записей)