背景
PR #56 のディープレビュー指摘 (R2-blocker1)。read 経路の完全性検証 (docs/design.md §10) のうち、CID 検証(payload真正性) + 単調性チェックでは塞がらない残りの穴。
問題
CID 照合が保証するのは「バイト列が要求した版 CID に一致すること」であり、「その版が正規の書き込みとして作られたこと」ではない。
relay 上で暗号文を観測できる攻撃者は:
- 観測済みの本物の暗号文を新しい crsl-lib Node に包み直す
- parents に任意の CID (例: クライアントの last_seen) を詰める
- その Node の CID を「最新版」として提示する
→ payload は本物なので CEK 復号も plain CID 照合も通る。単調性チェックは parents を信頼して祖先を辿るため、last_seen を parents に含めた偽版で bypass される。
本修正
版メタデータ(parents / version)の真正性を保証する trust anchor が必要:
- 案A: Node への owner 署名 (書き込み時に owner が Node 全体へ署名し、クライアントが検証)
- 案B: checkpoint (定期的に owner が署名した版チェーンのスナップショット)
いずれも crsl-lib の Node フォーマットに及ぶプロトコル変更のため、#56 のスコープ外として明文化した上でここで追跡する (design.md §10「既知の限界」1 に記載済み)。
🤖 Generated with Claude Code
背景
PR #56 のディープレビュー指摘 (R2-blocker1)。read 経路の完全性検証 (docs/design.md §10) のうち、CID 検証(payload真正性) + 単調性チェックでは塞がらない残りの穴。
問題
CID 照合が保証するのは「バイト列が要求した版 CID に一致すること」であり、「その版が正規の書き込みとして作られたこと」ではない。
relay 上で暗号文を観測できる攻撃者は:
→ payload は本物なので CEK 復号も plain CID 照合も通る。単調性チェックは parents を信頼して祖先を辿るため、last_seen を parents に含めた偽版で bypass される。
本修正
版メタデータ(parents / version)の真正性を保証する trust anchor が必要:
いずれも crsl-lib の Node フォーマットに及ぶプロトコル変更のため、#56 のスコープ外として明文化した上でここで追跡する (design.md §10「既知の限界」1 に記載済み)。
🤖 Generated with Claude Code