Filesystem MCPのパス境界: 似た名前の別ディレクトリを拒否
パス文字列の先頭一致だけでは、許可ディレクトリと同じ文字から始まる別ディレクトリを配下と誤認します。公式advisoryと修正パッチに基づく、構成要素単位の境界確認と導入時の検証項目です。
Read in EnglishModel Context Protocolの公式serversプロジェクトは、Filesystem MCPサーバーについて、許可ディレクトリと似たprefixを持つ別ディレクトリが許可範囲内と誤認される脆弱性を公表しました。破られたのはファイル機能そのものではなく、許可範囲の終端です。パスを単なる文字列として比較すると、「同じディレクトリの配下」と「同じ文字で始まる隣のディレクトリ」を区別できません。
文字列の先頭一致とパス構成要素の違い
許可範囲を /srv/team とします。/srv/team/report.csv は team ディレクトリの配下ですが、/srv/team-archive/report.csv と /srv/team2/report.csv は兄弟ディレクトリです。3つとも文字列は /srv/team から始まるため、単純なstartsWith判定では区別できません。
| 要求パス | 文字列prefix | 構成要素の境界 | 接続判断 |
|---|---|---|---|
/srv/team | 一致 | 許可ディレクトリそのもの | 許可候補 |
/srv/team/reports/q3.csv | 一致 | 区切り文字の後に子の構成要素 | 許可候補 |
/srv/team-archive/q3.csv | 一致 | teamの直後が区切り文字ではない | 拒否 |
/srv/team2/q3.csv | 一致 | 別のディレクトリ名 | 拒否 |
公式修正パッチは、正規化した要求パスが許可ディレクトリと完全一致する場合、または許可ディレクトリにOSのパス区切り文字を加えた文字列から始まる場合だけ、配下として認める実装へ変更しました。project2、project_backup、project-oldのような似た名前を拒否するテストも追加されています。比較前の正規化は.や..、末尾の区切り文字などの表現差をそろえますが、prefix境界の確認とは別の役割です。
導入前の確認項目
採用側では、まず許可ディレクトリの隣に、同じprefixを持つ無害なテスト用ディレクトリを用意します。許可範囲内の通常ファイルは必要な操作が成立し、隣のディレクトリは読取・書込・一覧取得のすべてで拒否されることを、実際のpackageと起動設定で確認します。複数の許可ディレクトリがある場合は、それぞれについて完全一致、正しい子ディレクトリ、似た名前の兄弟ディレクトリを分けて記録します。
配布版の確認も独立して必要です。公式advisoryは0.x系について、patched versions表に0.6.3、本文の更新推奨に0.6.4を記載しており一致しません。固定版を推測で断言せず、配布元の現在の推奨、実際に展開された配布物、公式修正commit相当の変更を照合します。lockfileだけでなく、コンテナimageやpackage cacheが保持する実体も確認対象です。
サーバー内の境界確認に加えて、プロセスから見えるディレクトリ自体を限定します。広いhost filesystemを見せたままアプリケーションの一判定へ依存するより、必要な作業領域だけのmountと専用アカウントを組み合わせる方が、同種の退行に対する影響範囲を小さくできます。
確認範囲と限界
2026年9月22日に、公式advisory、公式修正commit、MCP公式セキュリティ方針を確認した解説です。MCP Guard独自の発見や、現在利用中の全Filesystem MCPが脆弱であるという主張ではありません。このcomponent境界は文字列prefixの誤認を防ぎますが、symlinkの実体、大小文字の扱い、network filesystem、検証後の差替えなど、別の境界まで単独で解決するものではありません。
