Require a fresh responder token when reattaching Merkle sessions

This commit is contained in:
evgeny committed 2026-10-26 18:27:26 +01:00
1 parent d20f31c165
commit 137e30ec82
2 files changed
+34 -4

No files matched your search

+31 -4
View File
@@ -655,6 +655,15 @@ BAD_FORMAT, DEFERRED, ERROR), сохранение корректной суще
- Exit0, tracked allocations восстановлены. /tmp/db-sync-completion-design-build.log и
/tmp/db-sync-completion-design.log. Это диагностика существующего кода, не тест новой реализации.
Повторная проверка самого плана выявила обязательную предпосылку общего движка:
при merkle_sync_cancel сессия и её round освобождаются. Новый follower начинает с round0,
поэтому прежний BEGIN7 принимается как новый и получает READY. Локальный стенд
/tmp/merkle-reattach-design.c/.mk это подтвердил на штатной protocol-фикстуре после cancel/start:
round7,stateSERVE,READY в очереди. Применение старых PAGE или ложный MT_OK этим стендом
не проверялись и не заявляются. Логи /tmp/merkle-reattach-design-build.log и
/tmp/merkle-reattach-design.log,exit0,allocations восстановлены.
Значит, при переносе нельзя безусловно считать поле round достаточной защитой после пересоздания сессии.
Варианты:
А. Сохранить собственный bulk-протокол: потребуются канонический хеш без id, поиск настоящего общего
префикса либо полный fallback с0, устойчивый курсор, два явных прохода, round/request/state,
@@ -668,6 +677,19 @@ BAD_FORMAT, DEFERRED, ERROR), сохранение корректной суще
Конкретный план вариантаБ:
0. До подключения истории закрепить изоляцию пересозданных сессий общего Merkle.
В новой версии wire использовать двустороннее подтверждение попытки:
BEGIN несёт свежий round_id инициатора; READY добавляет свежий accept_id ответчика;
последующие QUERY/PAGE/TURN/CHECK/DONE/ERROR проверяют пару идентификаторов, request и фазу.
Идентификаторы — случайные128 бит с проверкой отказа генерации; каждый новый раунд/handshake
получает новые значения, отмена уничтожает действующий accept_id. Поля namespace/dataset/соединение
остаются частью области сессии. READY принимается только для ожидаемого текущего BEGIN.
Поздний BEGIN после cancel может получить свежий challenge; старые PAGE/DONE содержат прежний accept_id
и не могут примениться или завершить новый запрос. Дубликат BEGIN активной попытки не перезапускает
её применение; повтор WAKE может вызвать новый handshake, но не является успехом или применением данных.
Так не требуется хранить неограниченный архив отменённых сессий или надеяться на порядок доставки.
Проверить это для MEMBERS/FEEDBACK прежде, чем добавлять MESSAGES. Старая версия wire не поддерживается.
1. Канонический набор истории.
Namespace — числовой channel_id; dataset отдельный от MEMBERS/FEEDBACK.
Ключ — существующий message_id[32], проверяемый вычислением из group_id/timestamp/signature.
@@ -706,13 +728,15 @@ BAD_FORMAT, DEFERRED, ERROR), сохранение корректной суще
после закрытия курсора в проверяемой транзакции, обновляет индекс и запускает повтор.
4. Управление раундом и успехом.
Используются существующие round/request/state, два pull-прохода, CHECK/DONE, полный32-байтовый корень,
Используются общий request/state и усиленная пара идентификаторов из п.0, два pull-прохода,
CHECK/DONE, полный32-байтовый корень,
revision, deadline и очередь с waiter. Ошибка или повтор неизменной пары разных корней — не успех.
done для db_sync/media поступает только от MT_OK; постановка пакета в очередь и конец страницы
не подтверждают завершение истории. Последующие изменения вновь делают сессию dirty.
Успех означает подтверждённую контрольную точку данного раунда, не вечную глобальную синхронность
при продолжающейся записи. Старый round/request не изменяет данные/позиции, не продлевает deadline
и не завершает новый запрос. Эти свойства нужно проверить именно для подключённой модели истории.
при продолжающейся записи. PAGE/DONE/ERROR прежней пары идентификаторов не изменяет данные/позиции,
не продлевает deadline и не завершает новый запрос. BEGIN/WAKE рассматриваются отдельно как handshake,
а не как доказательство результата. Эти свойства проверяются и для подключённой модели истории.
5. Интеграция, права и владение.
Регистрировать MESSAGES после создания общего движка при chat startup; data_ctx — стабильный inst,
@@ -777,6 +801,8 @@ BAD_FORMAT, DEFERRED, ERROR), сохранение корректной суще
пакет заполнен раньше лимита записей, дубликаты и повтор последней страницы.
- PUSH/вставка до и после курсора; третий узел; удаление/TTL; изменения между CHECK и отправкой DONE.
- Старые round/request, неожиданные фазы, отмена/повтор, DOWN/REINIT/restart, старый UP без нового события.
- Cancel/start follower, затем прежний BEGIN и PAGE/DONE старого accept_id; новая попытка того же namespace
на том же UP-соединении; повторы BEGIN/READY/WAKE и старый ERROR. Никакой успех/запись от старой пары.
- SQL prepare/bind/step/commit, BLOB NOMEM, хеш/VerifyInit, очередь/таймер/waiter: нет частичных данных,
ложного MT_OK, потери корректных строк или callback после cancel/free.
- ACTIVE-допуск пира, отзыв/возврат, сохранение старых сообщений исключённого автора; различие sound_on/off
@@ -789,6 +815,7 @@ BAD_FORMAT, DEFERRED, ERROR), сохранение корректной суще
callback отписывает себя/следующий callback и удаляет канал без UAF.
- Общий check.sh со STUN и целевые ASAN/UBSan/LSan после реализации.
Статус: план вариантаБ сформирован и логически проверен при указанных предположениях;
Статус: план вариантаБ сформирован и уточнён после отдельной проверки reattach;
логическое обоснование требует п.0 и согласованного индекса, а не опирается на неизменённый старый движок.
новая модель и её тесты ещё не реализованы. Перенос нельзя объявлять проверенным текущими203/203
и8/8: эти результаты относятся к уже выполненному исправлению раздела11.
+3
View File
@@ -105,6 +105,9 @@
План: история как MT_DATA_MESSAGES в общем Merkle, канонический набор без local id, атомарный индекс,
полный корень/раунды/курсор; оставить PUSH/ACK. Учесть startup/stop, права, callback dispatch и sleep/sound
(общий движок сейчас запрещает сон, db_sync допускает sound_on), исправить TTL ms/us и индекс после DELETE.
Обязательный первый этап: изоляция Merkle после cancel/start. Стенд /tmp/merkle-reattach-design.c
подтвердил принятие прежнего BEGIN7 новой follower-сессией; PAGE/ложный MT_OK не проверялись.
План усилен свежими round_id/accept_id обеих сторон handshake; старые пакеты не подтверждают новый запрос.
План отдельно обосновывает сходимость, предпосылки и регрессии; runtime не менялся, перенос не реализован.
[member_merkle_audit_findings.txt](member_merkle_audit_findings.txt), раздел12.