In this article
MCPサーバーの関数ハンドラーにおけるパストラバーサルの脆弱性を防ぐ
Model Context Protocol(MCP)は、AIアシスタントが外部のツールやデータソースと連携するための標準的な方法として普及しつつあります。MCPの導入が進むにつれ、潜在的な脆弱性からMCPサーバーを保護する重要性も高まっています。Snyk Security ResearchチームのRaul Onitza-Klugmanによる最近のMCPセキュリティ調査では、脆弱なMCPサーバーに伴うリスクが明らかになり、堅牢なセキュリティ対策の必要性が強調されています。
MCPとそのセキュリティ上の影響を理解する
MCPは、外部のツール、サービス、データソースを大規模言語モデル(LLM)に接続するために設計されたオープンプロトコルです。ローカルデータベース、API、コマンドラインツールなど、AIアプリケーションがアクセスする必要のあるリソースとの橋渡しをします。
MCPサーバーは、リソース、ツール、プロンプトという3つの主要な機能を提供します。リソースはLLMが参照できる読み取り専用のデータやファイルであり、ツールはLLMが実行できる関数やコマンドです。
MCPサーバーの多くは開発者のマシン上でローカルに実行され、そこにはAPIキー、認証情報、知的財産などの機密情報が含まれている可能性があるため、そのセキュリティは極めて重要です。脆弱なMCPサーバーは攻撃経路となり、情報漏えいやコード実行などの悪意ある活動につながるおそれがあります。
前述のRaulの調査では、攻撃者が間接的なプロンプトインジェクション手法を使い、AWS MCP ServerとMarkdown MCP Serverを悪用してデータを窃取し、任意のコマンドを実行した事例が取り上げられています。この事例は、連鎖の中の弱点、つまりMCPサーバーのコードが、大規模なデータ侵害やセキュリティリスクにつながる落とし穴になり得ることを示しています。
MCPサーバーでリソースを安全でない方法で共有する
MCPサーバーのリソースを使うと、LLMがコンテキストとして利用できるデータを読み取り専用情報として公開できます。たとえば、MCPサーバーではデータベースレコード、アプリケーションの状態、その他のテキストやバイナリデータをリソースとして定義できます。これらのリソースは固有のURIで識別され、多くの場合、独自のプロトコルスキームを含みます。MCPサーバーでリソースを共有する方法については、リソースを共有するNode.js MCPサーバーの構築に関する以前の記事で詳しく解説しています。
MCPサーバーのリソース定義における安全でないコード
MCPサーバーのリソース定義で安全でないコーディングを行うと、パストラバーサルの脆弱性につながる可能性があります。パストラバーサルの脆弱性とは、攻撃者がファイルパスを操作して、想定されたディレクトリの外にある機密ファイルやデータにアクセスできる状態を指します。
ユーザー入力が適切にサニタイズまたは検証されていない場合に、この問題が発生することがあります。MCPサーバーのリソースが、関数ハンドラーから返すコンテンツとしてディスク上のファイルへのアクセスを実装している場合、特に脆弱性が生じやすくなります。
次の脆弱なNode.jsコードの例を見てみましょう。
server.resource(
"pipeline-workflows",
new ResourceTemplate("pipeline-workflows://{name}", { list: undefined }),
async (uri, { name }) => {
const decodedName = decodeURIComponent(name);
let filePath = path.resolve(process.cwd(), '.github/workflows/', `${decodedName}.yaml`);
// check if filepath exists
if (!accessSync(filePath)) {
// then try without the .yaml suffix incase the user provided the full filename
filePath = path.resolve(process.cwd(), '.github/workflows/', decodedName);
}
if (accessSync(filePath)) {
let fileContents = '';
try {
fileContents = readFileSync(filePath, 'utf-8');
} catch (e) {
writeFileSync('/tmp/mcp_log.log', `ERROR READING FILE: ${e}\n`, { flag: 'a' });
}
return {
contents: [{
uri: uri.href,
text: fileContents
}]
};
}
}
);
const transport = new StdioServerTransport();
await server.connect(transport);この例では、filePathがユーザー入力(decodedName)を使って構築されています。攻撃者がnameパラメーターを操作できる場合、想定されたディレクトリの外にあるファイルにアクセスし、機密データを露出させるおそれがあります。
MCPサーバーにおけるパストラバーサル脆弱性のセキュリティリスク
MCPサーバーにおけるパストラバーサルの脆弱性は、深刻な影響をもたらす可能性があります。攻撃者は、設定ファイルやSSHキーなどの機密ファイル、その他の秘匿データにアクセスできるおそれがあります。さらに悪用され、コード実行やデータ窃取につながる可能性もあります。
パストラバーサルの脆弱性を検出して修正する
Snyk Codeは、MCPサーバーのコードにおけるパストラバーサルの脆弱性の検出と修正を支援する静的アプリケーション・セキュリティ・テスト(SAST)ツールです。
Snyk VS Code拡張機能をインストールすると、ESLintのような静的コード解析プラグインとして機能します。スキャンは非常に高速で、ファイルを保存するたびにSnykがコードを解析し、潜在的なセキュリティ脆弱性を検出します。
次のスクリーンショットでは、MCP Serverのコードが(TypeScript Model Context Protocol SDKの)server.resource() の関数実装をどのように処理するかについて、140行目がSnykによってハイライトされています。この関数に危険な入力が渡された場合、パストラバーサル攻撃に対して脆弱となるコードパスが明確に示されています。

Snykは、開発者のIDEワークフローにこうした生産性向上のメリットを直接もたらし、セキュリティリスクへの対処を加速します。
さらに、Snykはこのセキュリティ問題を修正することもできます。「この問題を修正: Path Traversal」という行の注釈にお気づきかもしれません。実際に、Snykの自動修正は次のように機能します。

Snyk Codeの利用を始める方法
Snyk IDEプラグインを入手しましょう。無料です!
Snyk Codeは、高度なAI搭載型解析(Symbolic AIと呼ばれます)を活用して、パストラバーサルの脆弱性を含む、コード内の潜在的なセキュリティ問題を特定します。Snyk Codeを開発ワークフローに組み込むことで、問題が発生する前にセキュリティ脆弱性を能動的に検出し、修正できます。
このツールは、MCPサーバーのコード(または自分やLLMが生成したその他のコード)を解析して潜在的なセキュリティ問題を検出し、詳細なレポートと修正に関する推奨事項を提示します。IDEやCI/CDパイプラインに統合できるため、開発プロセスの早い段階でセキュリティ問題を発見できます。
MCPサーバーを保護するためのベストプラクティス
MCPサーバーのパストラバーサル脆弱性を防ぐには、安全なコーディングのベストプラクティスに従いましょう。
悪意のあるデータがファイルパスの構築に使われないよう、ユーザー入力を検証し、サニタイズします。
パストラバーサル攻撃を防ぐため、安全で適切なパスの規則に沿ってパスを生成します(files-bucket-serverやstatic-dev-serverなど、過去のCVEを参考にしてください)。
MCPサーバーのリソースを定義する際は、許可リストの使用や適切なエラー処理など、安全なコーディングのベストプラクティスを取り入れます。
Snyk CodeのようなSASTツールを開発ワークフローに組み込み、潜在的なセキュリティ脆弱性を検出して修正します。
MCPセキュリティの今後
MCPが進化し続けるなか、潜在的なセキュリティリスクやMCPサーバーを保護するためのベストプラクティスについて、常に最新情報を把握しておくことが大切です。さらに詳しく知りたい方は、次のリソースをご覧ください。
パストラバーサルに関するSnyk Learnのコース
プロンプトインジェクション攻撃を軽視しないでください。プロンプトインジェクションによってPDFのテキストがどのように悪用されるか、またLLM-as-a-judgeの手法をどのように回避するかをぜひお読みください。
セキュリティを最優先し、ベストプラクティスに従うことで、MCPサーバーの完全性を確保し、潜在的な脆弱性から保護できます。
MCPスキャンについて詳しく知りたいですか?ぜひSnyk Labsをご覧ください。または、SnykとInvariant LabsによるMCP Scanのインキュベーションにアクセスしてください。