濃紺の背景に生成された抽象的なイラスト:左側の小さな琥珀色のサーバーキューブが、字形のような図形が連なる細いシアン色の線を放ち、その線は背の高い半透明の青いガラス膜をまっすぐ貫通して、右側の暗いターミナルペインまで続いている。そこでは琥珀色のカーソルブロックが1つ光っている。線は途切れていない。テキスト、人物、組織のロゴは一切現れない。OrcaRouterのロゴが右下隅に合成されている。
AI Safety Incidents

OpenCodeのMCPサインインはサーバーのURLをPowerShellに渡してしまった——そしてそれを指摘するCVEは存在しない

著者

Magnus Corvin

公開日

最新モデル · 20すべてのモデルを見る →
ベンチマーク:Artificial Analysis · 毎日更新
すべての記事に戻る

に2026年10月19日Pillar Securityは、リモートコード実行脆弱性を開示した。対象はOpenCode(Anomalyが保守するオープンソースのコーディングエージェント)である:開発者が設定していたリモートのModel Context Protocolサーバーが、MCP OAuthサインイン中にその開発者自身のマシン上で任意のコードを実行できた。その間に同意プロンプトはなかった。この不具合はWindowsおよびWindows Subsystem for Linuxに限定されており、そこではOpenCodeがサーバー提供のログインURLをエスケープせずにPowerShellコマンドに渡していた。Pillarは影響範囲を1.0.137から1.18.32までとしている。Anomalyは1.18.33で修正し、npmには2026年9月28日に公開したが、CVEは要求せず、アドバイザリも公開しなかった——そのため、通常の脆弱性フィードには、影響を受けるチームにアップグレードを促すものは何も載らない。Pillarは、この不具合が攻撃に使用された証拠は報告していない。これはAIインシデントアーカイブの1件の記録であり、各エントリには独自の情報源、重大度、信頼度グレード、および異議フラグが付されている。

実際に何が欠陥だったのか

MCPクライアントが認可を要求するリモートサーバーに接続すると、OAuthディスカバリのハンドシェイクが実行されます。サーバーは401と、自身のディスカバリドキュメントを指すチャレンジを返し、それらのドキュメント内の1つのフィールド — authorization_endpoint — が、ユーザーをサインインへ送る先をクライアントに伝えます。これは自由形式の文字列であり、認証される側の当事者がそれを選択します。

OpenCode 1.18.32 では、その文字列はネットワークからシェルへと渡りました。oauth-provider.ts、mcp/index.ts と browser.ts、最後はopen に至る経路をたどりました。これは OpenCode がブラウザを起動するために使う小さなパッケージです。その経路上では、URL のスキームを確認するものも、開発者が設定したサーバーのオリジンと比較するものもありませんでした。ハンドシェイクは設計上自動です — 狙いは、URL をコピーさせずにログインページへ送ることにあるため — サーバーの応答とランチャーの間に承認ステップは挟まりませんでした。

The launcher is where it broke. On macOS and Linux, open passes the address as an argument vector and no shell is involved. On Windows, version 10.1.2 of open — the version every affected OpenCode release pinned — builds a PowerShell command, base64-encodes it and runs it with powershell -EncodedCommand. Pillar quotes the source: the application name is escaped on one line, and the target URL is not. PowerShell evaluates $(...) subexpressions inside double-quoted strings, so an address of the form https://evil.test/$([IO.File]::WriteAllText('C:\Users\Public\pwned.txt','RCE')) runs before the browser launch fails. OpenCode discards that failure.

見逃しやすくしていた特性が2つあった。ペイロードには空白が含まれないため、URL正規化を行ってもそのまま残り、構文的にはごく普通の https アドレスである。また、設定された時点でサーバーが悪意あるものである必要はなかった。Pillarは、後からの侵害、乗っ取られたレジストリエントリ、タイポスクワット、期限切れドメインのいずれもが、信頼された設定エントリを配信メカニズムに変えてしまうと指摘している。

誰が曝露されましたか

影響を受ける対象は、リモートMCPサーバーを設定してOpenCodeを実行しているWindowsおよびWSLユーザーです。Pillarは、OpenCodeには約300万回の週間npmダウンロードがあり、GitHubスター数は211,000だと述べています。Infosecurity Magazineの報道では、スター数は218,000超とされています。どちらの数字も影響を受けたインストール数を示すものではなく、それを公表した者もいません。

トリガーは、2つの主要な説明が分かれる唯一の点であり、リスクと深刻度の両方にとって重要です。Pillarは、悪用に追加のユーザー操作や同意は不要だと説明しています。The Hacker Newsは10月22日の報道で、ブラウザのステップは、開発者がサインインを開始したときにのみ実行される——opencode mcp authを実行するか、対応するリクエストを行うことによって——そして、サーバーが設定されているだけでは、またはセッションを開くだけでは、そこには到達しないと述べています。いずれにせよ、開発者は特別なことをしていません。すでに設定に含まれているサーバーに対して認証を開始するのは日常的なことです。しかし「操作なし」と「1回の日常的な操作」は異なる主張であり、その違いはスコアに直接影響します。

その修正はリファクタリングと称して届いた

Pillarは2026年8月29日にGitHub Security Advisoryを通じて脆弱性を非公開で報告し、完全な再現資料を提供した。9月25日に、Pillarはアドバイザリのスレッド外で追加連絡を行った。Anomalyは報告が自社チームに届いていることを確認し、悪意のあるMCPサーバーは自社の脅威モデルの対象外であると回答した。同日、プルリクエスト#51414が—コミット29f07e0cとしてマージされて—取り込まれた。これは8か所のブラウザ起動呼び出し箇所を1つのヘルパーに統合するものと説明されている。バージョン1.18.33は3日後の9月28日にnpmに到達した。

このパッチには3つの層がある。open 依存関係は 11.0.4 に移行し、これはターゲットを一重引用符で囲むが、PowerShell は一重引用符内では何も展開しない。新たな openUrl() ヘルパーは HTTP(S) 以外のスキームを拒否する。スキームチェックは redirectToAuthorization 自体に、Pillar がレポートで名指しした境界において組み込まれた。プルリクエストにもリリースノートにもセキュリティ上の欠陥には言及がなく、Anomaly は CVE を要求しなかった。

The Hacker Newsは、Anomalyが公開したセキュリティポリシーで、ユーザーが設定するMCPサーバーは「当社の信頼境界の外」にあると述べており、同社が今年、OpenCodeの他のコード実行上の欠陥についても勧告を出しており、その中には8月に修正されたものも含まれると報じている。Pillarによる、受け取った返信についての説明はより率直だ。「依存関係は更新しましたが、一般的に、悪意のあるMCPサーバーに対処しようとすることは当社の脅威モデルの外です」。

An HTML timeline card titled 'How a five-year-old escaping bug reached OpenCode', subtitled 'Dated entries from Pillar Security's report and the open package's own issue history', listing nine rows: 22 October 2020, open issue #202 reports that a URL containing a dollar sign breaks on WSL 2; 18 October 2023, issue #323 titles 'OS command injection on windows when opening urls'; 9 July 2025, CVE-2025-6514 in mcp-remote, same sink, CVSS 9.6; 15 November 2025, open 11.0.0 quotes the PowerShell target; 7 December 2025, OpenCode calls open() with a server-supplied URL; 29 August 2026, Pillar reports privately via GitHub Security Advisory; 25 September 2026, pull request #51414 merged; 28 September 2026, OpenCode 1.18.33 published to npm, no CVE and no advisory; 19 October 2026, Pillar publishes. A footer cites Pillar Security and the open repository.

一連の流れとして読むと、このタイムラインはOpenCodeのバグを5年にわたる軌跡の始まりではなく終点に位置づけている。それを生み出した欠陥はすでに公開されており、それを使用した行が書かれる前に、その修正もすでに出荷されていた。

スキーム検証ではなぜそれを防げなかったのか

この種のバグに対して合意されている対策はURLスキーム検証です。奇妙なスキームをブロックし、httpとhttpsを許可して、それで終わりです。これはMCP TypeScript SDKが提供しているものであり、OpenCodeが1.18.33で追加したものでもあります。Pillarのペイロードはhttpsであるため、これらのチェックをすべて通過します。SDKのデナイリストはjavascript:、data:およびvbscript:をブロックします。より厳格なhttp/httpsの許可リストは2025年8月にSDKのプルリクエスト#841で提案されましたが、マージされることなくクローズされました。一方、プルリクエスト#877はv1.17.4で3スキームのデナイリストを出荷しました。そしてPillarは、公開時点のSDK 1.32.0でもそれが依然としてポリシーだったと述べています。OpenCodeの穴を実際に塞いだのは依存関係の更新であり、セキュリティ修正のように見えるチェックではありませんでした。

この経緯は、これを一つのプロジェクトのうっかりミスとして扱うべきでないことを示している。openパッケージは2021年以降、セキュリティを保証せず、入力をサニタイズするのは呼び出し側の責任だと警告するREADMEを備えてきた。2020年10月、あるユーザーがissue #202を起票し、ドル記号を含むURLがWSL 2上で一部を失ったと報告した。それは文字列展開によるもので、リンク切れの厄介事として起票された。2023年10月、Adobeのエンジニアがissue #323「WindowsでURLを開く際のOSコマンドインジェクション」を起票し、1行の実証コードを添えた: open('https://$(calc.exe)')。メンテナーはREADMEを引用し、エスケープを改善するプルリクエストは歓迎すると述べた。そのissueは「未計画」としてクローズされた。それから3日後の2025年11月15日、open 11.0.0はそれでもエスケープを出荷した。OpenCodeは2025年12月7日、修正版のopenが存在してから3週間後に、すでに数か月古くなっていたピン指定に対してブラウザ起動呼び出しを書いた。

あの呼び出しが書かれる前の数か月間、MCPエコシステムでは同じシンクまたは同じフィールドに関する3件のCVEが記録されていた。すなわちmcp-remoteのCVE-2025-6514(CVSS 9.6、2025年7月9日にJFrogが公開)、openmcp-clientのCVE-2025-58062、そしてsequa-mcpのCVE-2025-10619である。Pillarが対比するのは、リモート文字列からシェルコマンドを一切組み立てないクライアントだ。gemini-cli、Claude Code、github-mcp-server、Dockerのmcp-gatewayを、URLを引数ベクトルとして渡すものとして挙げており、そのため文字列に何が含まれるかという問いはもはや決定的な意味を持たなくなる。

A generated abstract illustration on a dark navy field: a long cyan ribbon of abstract glyph shapes runs left to right and splits in two at a hollow chrome ring, which the upper branch passes straight through while the lower branch curves downward into a glowing amber terminal rectangle at bottom right. A faint dotted outline of an empty browser window floats in the upper right. No text, people or organisation logos appear. The OrcaRouter logo is composited in the bottom-right corner.

何が確立されており、何がそうではないのか

この記録はアーカイブによって信頼度Aと評価されており、その背景にある報道も信頼に足る。Infosecurity Magazineは10月20日に、PillarのEilon Cohenとの独自インタビューを公開した。The Hacker Newsは10月22日に独自の記事を公開した。デンマークの国家CERTであるDKCERTは10月21日に、Infosecurityを引用してこの発見を要約した。またCloud Security Allianceの研究ラボは、以下に示す唯一の実質的な注意点を付け加えた分析を公開した。これらのいずれも報告当事者ではなく、機構、バージョン、そしてサイレント修正について一致している。Anomaly自体はこの脆弱性について何も公表していない。

記録に残る形で確定:

• 欠陥、そのメカニズム、およびそのプラットフォーム上の範囲。Pillar は特定のソース行を特定しており、修正は公開されている 1.18.32-to-1.18.33 の diff で確認できる。2 つの独立したニュース記事が同じデータフローを説明している。

• 影響を受ける範囲は 1.0.137 から 1.18.32 で、修正済みリリースは 2026年9月28日に公開された 1.18.33 です。

• CVEもアドバイザリも存在しないこと。これは検証可能であり、防御側にとって決定的な事実である。

• 悪用が報告されていないこと。Pillarは攻撃での使用の兆候は見られなかったと述べ、The Hacker Newsは侵害指標が公開されていないと指摘している。公開された指標がないことは、存在しないことの証明にはならず、ベンダーからのテレメトリがなければ、どちらの解釈も確認できない。

確立されていない、または緊張状態にある:

• その9.8という数字は、Pillarが提案したCVSS v3.1スコアであり、公式のものではありません。CVEが存在しないため、NVDスコアもベンダースコアも存在しません。Cloud Security Allianceのリサーチノートは、9.8がユーザー操作を前提としていないことを指摘しており、もしThe Hacker Newsによるトリガーの説明が正しければ、ユーザー操作を必要とする評価—およそ8.8—のほうが適切でしょう。本稿はその点を決着させるものではありません。アーカイブ自体の高重大度タグは分類であり、スコアではありません。

• 公開日。Pillarの報告書はヘッダーに2026年10月19日と日付が記されており、両方の報道記事もその日付を用いている。Pillar自身の報告書の末尾にある開示タイムラインでは、公開日は10月4日と記載されている。アーカイブは日単位の精度で10月19日と記録している。

• 影響を受ける利用者層の規模。件数は公表されていない。上記のダウンロード数とスター数はリポジトリの指標であり、インストール数ではない。

• 実際にいずれかのマシンが侵害されたかどうか。これを裏付ける公表資料はなく、記録上も実害は確認されていない。

An HTML card titled 'Established, and not', split into two columns. The left column, headed 'Established', lists: affected versions 1.0.137 to 1.18.32, Windows and WSL only; fixed in 1.18.33 on 28 September 2026; no CVE and no security advisory issued; no exploitation reported and no indicators published. The right column, headed 'Not established', lists: official severity, since 9.8 is Pillar's proposed score with no CVE to attach it to; the publication date, 19 October in the report header and 4 October in its own timeline; the number of exposed installations; whether any host was compromised. A footer cites Pillar Security, The Hacker News and the Cloud Security Alliance research note.

何が変わり、何をすべきか

対策はバージョン確認です。他の方法では判別できないからです。OpenCode 1.18.33 以降は修正済みです。影響を受けたインストールは、パッケージを直接インベントリ調査して特定する必要があります。Pillar の推奨は、フィードを待つのではなく、OpenCode 自体をインベントリ調査することであり、Cloud Security Alliance の注記は、問い合わせることを提案しています。対象は opencode-aiパッケージのバージョンです。フィードが照合するための識別子が存在しないためです。アップグレードできず、Windows または Windows Subsystem for Linux 上で実行しているチームは、OpenCode の設定から、検証していないリモート MCP サーバーを削除する必要があります。opencode mcp list は、どのサーバーが存在するかを示します。

MCP クライアントを保守する人にとって、Pillar のガイダンスは一般的な助言よりも限定的です。URL は引数ベクトルとして渡し、リモート文字列からコマンドラインを組み立てないこと、OAuth ディスカバリをユーザーが設定したサーバーのオリジンに結び付けること、ディスカバリ文書・サーバーメタデータ・ツール記述子を設定ではなく信頼できない入力として扱うことです。Cloud Security Alliance の注記はハンティング用のヒューリスティックを追加しています——OpenCode プロセスが powershell.exe に -EncodedCommand、例えば——一方で、これらは検出エンジニアリング向けの提案であり、公開された侵害指標ではないと強調しています。

Consoleの侵害ではない

Pillarによる開示は、AnomalyがOpenCodeのホスト型Consoleに対する別の侵害を確認した数日後に明らかになった。この侵害では、保存されていたAPIプロバイダーキーが露出した可能性がある。両インシデントに関連はなく、PillarのEilon Cohen氏はInfosecurity Magazineとのインタビューでその違いを明確にした。「この侵害は、ホスト型キープロキシの背後にあるレガシーシステムに及び、ユーザーがそこに保存していたプロバイダーキーを露出させた」と同氏は述べた。「私たちが報告した脆弱性は逆方向だ。悪意のあるリモートMCPサーバーがOAuthハンドシェイク中に開発者自身のマシン上でコードを実行する。標的も攻撃者の立場も異なる」。Consoleの侵害はアーカイブ内の別個の記録であり、両者は別々の項目として読むべきだ。

コーエンの枠組みでは、両者を結びつけているのは、その両方の根底にある問いだ。「AIコーディングツールに認証情報や入力を渡すことを誰に許すのか、そしてそのツールがそれらをどう扱うのか」。

開示の空白は、バグより長く残る部分だ。発見者が重大と評価し、依存関係の更新の中で修正され、防御側が通常頼るあらゆる自動シグナルに現れない脆弱性は、直接的なインベントリ確認だけを唯一の検出方法として残す——しかもベンダーは、それを実施するよう誰かに伝えるアドバイザリを一切公開しなかった。