obsidian-tc: メモリライフサイクルツールが、所有されていないノートを上書きしたり、ライフサイクル変更を一部のみコミットしたりする。
### 概要
`create_entity`, `link_entities`, `rename_entity`, `unlink_entities` および `delete_entity` は、計算された `memory/<type>/<name>.md` パスにあるメモリノートの内容をSQLiteから再生成します。もし、そのパスに既にノートが存在し、書き込まれているエンティティによって所有されていない場合(手動で作成されたノートや、別のエンティティによって作成されたが、名前が同じパスに変換されたノートなど)、そのノート全体が上書きされます。ただし、フロントマターは保持されます。また、これらのツールの中には、ファイルシステムへの書き込み処理の前に、SQLiteの行または関連情報を挿入または削除するものがあり、そのため、ノートの書き込みが拒否されると、関連情報が失われたり、ステータスがコミットされたり、誤ったエンティティが削除されたりする可能性があります。
### 詳細
- `create_entity` と `link_entities` は、マテリアライズ処理の前に、SQLの行または関連情報を挿入します。
- `rename_entity` は、所有権チェックを回避する直接的なアトミック書き込みによって、宛先パスを初期化します。また、ステータスのみを変更するリネームの場合、ノートの書き込みが拒否されると、非アクティブステータスがコミットされる可能性があります。
- `unlink_entities` は、ソースノートの再マテリアライズが拒否されることが判明する前に、関連情報の行を削除します。
- `delete_entity` の連鎖削除機能は、近隣のノートが外部参照であることが判明する前に、ターゲットとその関連情報を削除する可能性があります。
この上書きの問題は、`materializeEntity` がリリースされてからのすべてのバージョンで存在します (`git show v1.0.1:packages/server/src/memory/materialize.ts`)。
### 影響
メモリ書き込み権限を持つ認証されたユーザー(M5メモリツールを使用するすべてのエージェント)は、意図せずに、書き込んでいるエンティティ以外のVaultノートの内容を破壊し、ディスク上のノートとメモリグラフの一貫性を損なう可能性があります。書き込み前のスナップショット (`restore_note`) は、スナップショットが有効になっており、ノートが以前に obsidian-tc を使用して書き込まれた場合にのみ、この上書きを軽減します。
### 修正点
バージョン1.31.4で、共有のプリミティブ関数`materializeEntity`において、`obsidian_tc_id`が欠落している、または別のエンティティに属するノートへの書き込みを拒否するようになりました。また、SQLiteデータベースへの変更を行う前に、新しい`assertNoteOwnership`という事前チェックが実行されるため、書き込み拒否は何も行われません。`create_entity`および`link_entities`関数は、挿入した行をロールバックします。`test/m5-memory-ownership.test.ts`によって検証されており、このテストは5つの呼び出し箇所とロールバック処理を網羅しています。
### 対策
ツールを維持する対策はありません。呼び出し元で`write:memory`スコープを無効にすると、書き込み処理全体が完全に無効になります。
### 貢献者
この問題は、`obsidian-tc memory import`のビルド中に、メンテナによって発見されました。脆弱性の種類は、異なるベンダーによるセキュリティレビューによって独立して確認されました。
### 参照
- PR #978 (修正とテスト)、CHANGELOG `## [1.31.4] ### Security`
- `packages/server/src/memory/materialize.ts`, `packages/server/src/tools/m5/memory-lifecycle-tools.ts`
---
影響を受けるパッケージ:
- npm (JavaScript) obsidian-tc: 影響範囲はバージョン1.0.1以上、1.31.3以下。バージョン1.31.4で修正済み。