Snyk、Visual Studio Code拡張機能におけるサプライチェーンセキュリティの脆弱性を発見
2021年5月26日
0 分で読めます私たちは、実際の現場でサプライチェーンセキュリティに関するインシデントが増え続けていることを目の当たりにしてきました。オープンソースのパッケージマネージャーのセキュリティ上の欠陥が悪用されたり、継続的インテグレーションシステムが侵害されたり、ソフトウェア成果物にバックドアが仕込まれたりと、事例はさまざまです。そして今、こうしたインシデントは、開発者が最も多くの時間を過ごす場所、つまり統合開発環境、とりわけVisual Studio Code IDEにも広がり始めています。
この記事の内容:
概念実証による攻撃:Visual Studio Code拡張機能を攻撃する
セキュリティ調査の開示:SnykがVisual Studio Codeのサプライチェーンセキュリティに関する調査結果を公開
どう対処すればよいのか? VS Code拡張機能のセキュリティ上の懸念を軽減する
これまで、VS Code拡張機能ではセキュリティ脆弱性が発見されておらず、何百万人もの開発者に安心感を与えていました。しかし現在、Snykは、こうした拡張機能を使用し、悪意ある攻撃者とやり取りする開発者に、現実的かつ差し迫った脅威となる脆弱性を発見し、開示しています。潜在的な侵害の深刻度は非常に高く、開発者をだましてリンクをクリックさせるだけで、開発者のマシン上でリモートコード実行が可能になるほどです。
この新たなVS Code拡張機能のサプライチェーンセキュリティ脅威は、新たな攻撃の温床となる可能性があり、200万人を超える開発者に影響する恐れがあります。詳しく見ていきましょう。
脆弱性のあるVS Code Extensions Marketplace
VS Code Extension Marketplaceには、約25,000個の拡張機能があります。これらは基本的にJavaScriptコードを圧縮したアーカイブで、npmパッケージに似ています。実際、拡張機能の構築に役立つサードパーティ依存関係のソースとして、npmエコシステムにも依存しています。
npmレジストリと同様に、VS Code Extensions Marketplaceはオープンなエコシステムであり、開発者なら誰でも登録して拡張機能を提出できます。アップロードされ、確認が済むと、VS Code IDEから開発者が利用できるようになります。
こうした攻撃の一部を成立させるには、開発者が拡張機能を実際に使用している必要があります。Snykが発見した脆弱な拡張機能の例をいくつか紹介します。
Open in Default Browser—ダウンロード数は52万回超。ファイルをブラウザーで開けるため、内容を手軽にすばやく確認できます(HTMLファイルでよく使われます)。
Instant Markdown — ダウンロード数は12万回超。ファイルのMarkdown構文を解析し、HTMLとして表示してウェブブラウザーで開けるようにします。たとえば、README.mdのようなMarkdownファイルが、GitHubリポジトリのホームページとして表示されるのと同様です。
人気のあるこうした拡張機能を見て、見知らぬ誰かが書いたコードを受け入れていることにまったく気づかず、エディターに拡張機能をインストールした経験が、私たちには何度あるでしょうか。そのコードが開発環境にアクセスし、さらには制御できる可能性もあります。拡張機能を使っただけで、開発者が危険にさらされた可能性はどれほどあるでしょうか。
脆弱なVS Code拡張機能が開発者に与える影響
拡張機能は単にIDEの機能を拡張するものに見えるかもしれませんが、侵害された場合の影響範囲はそれよりはるかに深刻です。開発者のノートパソコン上で拡張機能が侵害されると、少なくとも攻撃者はファイアウォールに穴を開け、社内ネットワークへのアクセスを得たことになります。さらに、開発者がアクセスできる機密情報について考えてみましょう。攻撃者が、典型的なパストラバーサルの脆弱性のようにファイルを読み取ることしかできない場合でも、開発者の環境設定ファイルやSSHキーを読み取るなどしてシークレットを窃取できます。その結果、ソースコードリポジトリへの読み書きアクセスまで得られる可能性があります。
ご覧のとおり、開発環境は非常に強力で、ネットワーク内で信頼された存在と見なされることも少なくありません。そのため、開発者を侵害することは、攻撃者にとって大きな利益につながる標的となります。
実際、2018年11月には、Node.jsランタイムに同様のセキュリティ脆弱性が存在していました。CVE-2018-12120として特定されたこの脆弱性では、ランタイムのデバッガーポートがすべてのネットワークインターフェースで待ち受けていたため、開発者が危険な状況にさらされていました。コーヒーショップなどの公共で安全でないネットワークから、node --debugを実行してNode.jsやJavaScriptアプリケーションをデバッグしている状況を想像してみてください。攻撃者がデバッグインターフェースに接続し、開発環境で任意のJavaScriptコードを実行できる可能性があります。
これが特殊なケースだと思うなら、Rapid7がMetasploitエクスプロイトフレームワーク用のモジュールを作成し、Node.jsデバッガーのコマンドインジェクションというこの脆弱性を狙うエクスプロイトを実際に悪用可能な形にしたことを知っておくべきでしょう。
VS Code拡張機能を攻撃する
脆弱な拡張機能の例を詳しく見て、攻撃者がどのように悪用できるかを確認しましょう。
以下のデモでは、Instant Markdown拡張機能のコードの脆弱性を悪用します。Marketplaceからインストールすると、Markdownファイルをプレビューする一般的な使い方を確認できます。

リポジトリのREADME.mdなどのMarkdownファイルを表示すると、拡張機能はlocalhostのポート8090で待ち受けるウェブサーバーを起動します。VS Codeで拡張機能のビューを開く必要さえありません。バックグラウンドで自動的に起動します。
VS CodeエディターでREADME.mdファイルを開き、http://localhost:8090にアクセスすると、README.mdの内容がHTMLファイルとして表示されます。
問題は、Instant Markdown拡張機能にパストラバーサルの脆弱性があることです。つまり、そのlocalhostサーバーにアクセスできる人なら誰でも、VS Codeが動作している環境の任意のファイルを要求して取得できます。これは実質的に、開発者のマシンそのものです。
たとえば、この拡張機能を使っていて、ダウンロードフォルダーに~/Downloads/snyk-dog.svgのようなSnykロゴのファイルがあるとします。コマンドラインで次のcurlコマンドを実行すると、このファイルの内容が返されます。
ローカルのウェブサーバーが配信しているファイルに、どうすれば他人がアクセスできるのかと疑問に思うかもしれません。ウェブサイトにアクセスするよう誘導されたらどうでしょうか。攻撃者が用意したウェブサイトをブラウザーで開くだけで、攻撃に必要なことはすべて完了します。
次のフローチャートは、CORSに関連する問題がどのように回避されるかを示しています。

上記の攻撃ベクトルでは、パストラバーサルの脆弱性に加えてサーバーサイドリクエストフォージェリを利用し、ユーザー環境へのファイルの強制ダウンロード、iframe、そして必要なデータをやり取りするためのブラウザーのWindow.postMessage APIといった巧妙なJavaScriptの手法を組み合わせています。
次の動画では、この一連の攻撃を実際に紹介しています。Snykのセキュリティリサーチャー、Kirill Efimovが自分で制御できるウェブサーバーを立ち上げ、ngrok経由で公開してインターネットからアクセス可能なHTTPウェブサイトを再現し、VS Codeと脆弱な拡張機能を使う開発者からSSHキーを窃取します。
SnykがVS Codeのサプライチェーンセキュリティに関する調査結果を公開
これは、攻撃者がVS Code拡張機能とサプライチェーンという攻撃経路を利用して開発者を標的にする方法の一例にすぎません。実際、同様の攻撃ベクトルに対して脆弱な別の拡張機能も見つかっており、その一つであるLaTeX Workshopのダウンロード数は120万回を超えています。
この調査結果を一般公開するまでに、Snykは責任ある開示のプロセスを踏み、ここで指摘した懸念について該当するメンテナーに連絡し、修正に向けて調整しました。
調査を実施し、概念実証を作成し、拡張機能のメンテナーと協力して問題を解決し、エコシステムの安全を守ったSnykのセキュリティリサーチャー、Raul Onitza-KlugmanとKirill EfimovによるVS Codeのサプライチェーンに関する技術的な詳細もぜひご覧ください。
VS Code拡張機能のセキュリティ上の懸念を軽減する
こうした拡張機能を開発したり、JavaScript、TypeScript、Javaでコードを書いたりする開発者は、IDEでコーディングしながらセキュリティ上の欠陥を見つけるツールを利用できますし、利用すべきです。一般的なリンターではなく、IDEから直接使える、発表されたばかりの静的アプリケーションセキュリティテスト(SAST)ツール、Snyk Codeのことです。Snyk CLIから実行することもできます:$ snyk code test。
Snyk CodeがVS Code用のInstant Markdown拡張機能で、このパストラバーサルの脆弱性を検出しているスクリーンショットをご覧ください。

複数のプロジェクトリポジトリにまたがるセキュリティ関連の静的解析の問題をすべて見つけるもう一つの方法は、GitHubリポジトリをSnykにインポートすることです。潜在的な脆弱性を検出できます。Snykのウェブアプリで同じパストラバーサルの脆弱性情報に注釈を付けた例がこちらです。

VS Code IDEソフトウェアを使う開発者としては、インストールする拡張機能に、より注意を払い慎重になる必要があります。残念ながら、現在Marketplaceには拡張機能のセキュリティを審査するツールが組み込まれていません。一方、npmなどで利用するプロジェクト独自のオープンソースライブラリについては、いつでもSnyk(無料です!)を使って、パッケージのセキュリティ脆弱性を見つけて修正できます。
まとめ
サプライチェーンセキュリティへの懸念は、今後ますます大きく、深刻になり、開発者エコシステムを狙うものになるでしょう。調査結果を読むことで、潜在的なセキュリティリスクとその影響について、皆さんの理解がさらに深まることを願っています。
Visual Studio Code拡張機能への攻撃をライブでご覧になりたい方は、SnykのDeveloper AdvocacyディレクターであるLiran Talと、SnykのセキュリティリサーチャーであるKirill Efimovによる6月8日15:00 UTCのセッションをご覧ください。
https://www.youtube.com/watch?v=pkvywMhd30c

このトピックに関する、あわせて読みたいおすすめの事例研究をご紹介します。
Zoomのリモートコード実行に関するセキュリティ脆弱性 CVE-2019-13567
依存関係の混乱など、最新のソフトウェアサプライチェーンを保護するためのトピック
JavaScriptまたはNode.jsの開発者なら、次のnpmセキュリティのベストプラクティス10選ガイドもぜひご覧ください。
InfoQでGuy Podjarnyが行ったプレゼンテーション:マルウェア配布の媒介となる開発者