Skip to main content

Gruntにおける任意コード実行

Blog illustrations vul profile feature

2020年9月21日

0 分で読めます

Snyk Monthly Vulnerability Profileへようこそ。このシリーズでは、SnykがSecurity Research Teamによって発見された、または同チームに報告された脆弱性を振り返ります。毎月、注目すべき脆弱性を1つ取り上げ、その発見、調査、開示に至るまでの経緯を紹介します。オープンソースコミュニティ全体で脆弱性の特定と修正に取り組む研究者、開発者、ユーザーにスポットライトを当てます。

今月は、人気のGrunt JavaScriptパッケージで発見された任意コード実行の脆弱性を取り上げます。


脆弱性:js-gruntにおける任意コード実行

割り当てられたCVE: CVE-2020-7729

Snykアナリスト: George Gkitsas

発見者: Snyk Research Team

Snykの研究チームは、人気のGrunt JavaScriptパッケージにおける任意コード実行の脆弱性を発見し、開示しました。

オープンソースソフトウェアのセキュリティ向上を支援する継続的な取り組みの一環として、チームは脆弱性につながりかねない安全でないコーディング慣行のパターンを特定しています。こうしたパターンを特定できると、リンターなどのツールで人気パッケージを調べ、脆弱性が存在するかどうかを確認するためのルールを作成できます。

Gruntパッケージの任意コード実行の脆弱性も、この方法で特定されました。脆弱性の詳細や発見の経緯、そして研究チームがパッケージのメンテナーと協力し、脆弱性を確実に修正した方法を詳しく見ていきましょう。

任意コード実行の脆弱性を詳しく解説

George Gkitsasは、JavaScriptエコシステムの脆弱性を発見するための新しいリンタールールの開発に取り組んでいました。このケースでは、パッケージがload()関数を使ってjs-yamlパッケージから文字列内のyamlドキュメントを解析しているかを検出しようとしていました。このような文字列の解析には、より新しく脆弱性のないメソッドsafeLoad()の使用が推奨されています。

Georgeは、JavaScriptパッケージ内のこのパターンを特定するためのリンタールールを試作しました。検出結果を確認しながらルールを修正することで、誤検出を許容できる水準まで減らすことができました。その結果、このルールをSnykが定期的に実行する自動処理に追加し、オープンソースエコシステム内の脆弱性の可能性があるパッケージを特定できるようになりました。

Snykはダウンロード総数を基準に、特に人気の高い上位1,000件のパッケージを定期的に選び、さまざまな脆弱性の兆候がないかスキャンしています。このケースでは、load()関数の使用により、Gruntパッケージに脆弱性があると検出されました。しかし、もちろん、自動リンターでパッケージを特定するだけでは十分ではありません。

次のステップは、検出結果を調査し、コードが実際に脆弱であり、誤検出ではないことを確認することです。Georgeは検出されたコードを簡単に調べ、実際に脆弱であることを確認できました。しかし、研究チームの作業はそこで終わりません。脆弱性が実際に到達可能なコードに存在し、悪用できることの確認も重要です。実質的に悪用できない脆弱なコードは、リスクがそれほど深刻ではありません。そこでGeorgeは簡単な概念実証を作成し、コードが実際に脆弱であることを確認しました。

grunt.util.warnとエラー処理を使ってYAMLファイルを読み取り、解析するJavaScript関数を示すコードスニペット。

確認済み:CVE-2020-7729

脆弱なコードが実際に悪用可能であることを確認した後、Georgeは脆弱性を記録するためにCVE-2020-7729を割り当て、メールでパッケージのメンテナーに連絡しました。メンテナーは1時間足らずで返信し、Snykが発見した内容について詳しく知りたいと伝えました。追加情報を求めた後、実際に脆弱性があることを確認しました。

ただし、このケースが一般的に発見される脆弱性と異なる点の1つは、Gruntパッケージが開発者向けツールであることです。Gruntは、開発者が開発プロセスで繰り返し行う作業を自動化するタスクランナーです。そのため研究チームは、攻撃の一環として誰かが実際にコードを悪用できるユースケースが存在するかを検討する必要がありました。開発者によるGruntの使用方法を検討した結果、Georgeはメンテナーとともに、有効な攻撃経路が存在することを確認できました。

1週間も経たないうちに、メンテナーはGruntパッケージの修正版をリリースしました。バージョン1.3.0は2020年8月17日にGitHubにコミットされました。新しいコードでは、状況や必要な機能に応じて、従来のload()メソッドとsafeLoad()メソッドのどちらかを開発者が選べるようになっています。

更新版が公開された後、SnykはCVEを公表し、Snyk Vulnerability Databaseに追加しました。Snykが監視していた2,000件を超えるプロジェクトで脆弱性が確認され、各プロジェクトの所有者に通知されました。

YAMLファイルを読み込み、その内容を解析するJavaScript関数の変更を示すコード差分。

セキュリティに対するSnykの取り組み

今回の脆弱性の発見と開示は、Snykの研究チームがオープンソースパッケージのセキュリティ問題をより迅速かつ効果的に発見するために取り組んでいることを示しています。研究者は、脆弱性とその悪用可能性を特定して確認しただけでなく、脆弱性が実際にリスクとなることを示す、現実的な攻撃経路も確認しました。これは、開発者がオープンソースを活用しながら安全に開発できるよう支援するという、Snykの取り組みの一部です。

Capture the Flagを始めよう

オンデマンドのバーチャル入門ワークショップを見て、Capture the Flagの課題の解き方を学びましょう。

カテゴリー: