Дмитрий
|
e1a6f26c06
|
fix(router-mentor): close sessionId path-traversal class across M1-M4
Аудит M1-M4 (audit-context-building) нашёл непоследовательность guard формы
sessionId: N3-фикс защитил только action-journal.paths() (M1), а 4 sibling-
строителя пути из event.session_id (недоверенный источник) остались без проверки.
Единый экспорт assertSafeSessionId (action-journal.mjs, переиспользует SESSION_ID_RE
N3) применён во всех точках машин:
- M1 action-journal.paths() — рефактор на общий guard (поведение N3 сохранено)
- M4 judge-subrun-journal.paths() — guard добавлен (канал прилежности судьи F1)
- M2 plan-lock.planPath + artifactPath — guard добавлен
- M2 enforce-supreme-gate — экспортируемый guarded stepStatePath, применён в main()
TDD RED-GREEN на каждом файле. Регрессия tools-only 2540 passed + 2 skip (+10).
Серьёзность класса — низкая / защита-в-глубину (sessionId harness-controlled),
закрыт ради консистентности (был 1 из 5).
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-07 05:41:07 +03:00 |
|
Дмитрий
|
2b8ad760be
|
fix(m1-foundation): verifyChain fail-closed на битой записи + sessionId path-guard
Аудит Машины 1 (audit-context-building), 2 находки low/defense-in-depth:
N2 — verifyChain больше не бросает TypeError на структурно-битой записи
(null / не-объект / массив, приходит из порченого .jsonl через loadJournal):
guard !e||typeof!=='object'||Array → {ok:false, brokenAt:null}.
N3 — paths() валидирует sessionId (/^[A-Za-z0-9_-]+/) до склейки пути
журнала → throw на ../ / \ . : закрывает path-traversal (fail-closed,
supreme-gate ловит внешним try/catch → block).
N1 (keytar getPasswordSync inert) и N4 (verifyChain/анти-откат — контракт M4)
не трогались: N1 — верное зеркало judge-key-config/llm-judge-config (env —
рабочий путь, fail-closed цел); N4 — deferred межмашинный дизайн.
TDD RED→GREEN, +7 тестов. Регрессия tools-only 2530 passed + 2 skip, 0 регрессий.
Co-Authored-By: Claude Opus 4.8 (1M context) <noreply@anthropic.com>
|
2026-06-07 05:03:08 +03:00 |
|