express-fileuploadにおけるプロトタイプ汚染
2020年8月24日
0 分で読めますSnyk Monthly Vulnerability Profileへようこそ。このシリーズでは、Snykが セキュリティリサーチチームによって発見された、または報告を受けた脆弱性を振り返ります。毎月、注目すべき脆弱性を1つ取り上げ、その発見、調査、開示に至るまでの経緯をご紹介します。また、オープンソースコミュニティ全体で脆弱性の特定と修正に取り組む研究者、開発者、ユーザーにも焦点を当てます。
今月は、express-fileuploadで発見されたプロトタイプ汚染の脆弱性を取り上げます。
脆弱性: express-fileuploadにおけるプロトタイプ汚染
割り当てられたCVE: CVE-2020-7699
Snykのアナリスト: Sam Sanoop
発見者: po6ixのハンドルネームで活動する研究者
人気のexpress-fileuploadパッケージで最近プロトタイプ汚染の脆弱性が発見され、GitHubリポジトリでissueとして記録されました。
issue機能は、開発者やセキュリティ研究者が発見したバグやセキュリティ上の脆弱性をパッケージのメンテナーに知らせる便利な方法です。しかし、情報は公開されているものの、問題を把握する必要があるセキュリティコミュニティや開発コミュニティには広く共有されていません。
では、リポジトリのissueとして記録された重大なセキュリティ脆弱性を、より広く伝えるにはどうすればよいでしょうか。express-fileuploadのプロトタイプ汚染をめぐるこの事例は、Snykのリサーチチームがこの課題にどう取り組んでいるかを示しています。
プロトタイプ汚染の脆弱性を詳しく調査
2020年7月25日、po6ixのハンドルネームで活動する研究者が、express-fileuploadパッケージのGitHubリポジトリにissueを登録しました。このissueでは、研究者がパッケージ内で発見したプロトタイプ汚染の脆弱性について説明しています。また、ファイルパス情報を解析するための関数を通じて、この脆弱性がリモートコード実行に悪用される可能性も示しています。さらに研究者は、自身のウェブサイトにブログ記事を公開し、脆弱性の詳細と概念実証(POC)を紹介しました。

Snykのセキュリティリサーチチームは、潜在的なセキュリティ上の欠陥を説明するissueを、公開されているGitHubリポジトリで定期的に調査しています。短期間にpo6ixが登録した一連のissueに注目し、その中からexpress-fileuploadパッケージの脆弱性を確認しました。SnykのセキュリティアナリストであるSam Sanoopは、脆弱性についてさらに詳しく知り、研究者が発見した複数の脆弱性へのCVEの割り当てを支援するため、po6ixに連絡しました。
po6ixと脆弱性について話し合った後、Samはブログ記事に記載されていた概念実証を使って攻撃を再現しました。これにより、Snykは脆弱性の深刻度と悪用可能性を確認できました。
脆弱性の詳細を確認した後、Samは、攻撃がリモートから実行されることなどを考慮して、CVSSスコアを7.5と算出しました。po6ixのブログ記事によると、2020年7月末時点でexpress-fileuploadパッケージのダウンロード数は約800万回に達していました。脆弱性の深刻度と、脆弱なパッケージが広く使われていることが相まって、特に懸念される発見となりました。
Samはこの脆弱性にCVE-2020-7699を割り当て、詳細なレポートを作成してSnyk Vulnerability Databaseに追加しました。また、Snyk Vulnerability DBでは、発見者であるpo6ixの功績も適切にクレジットされています。

その間に、パッケージのメンテナーはバージョン1.1.8でセキュリティ脆弱性を修正しました。しかし、問題は完全には解決されず、別のGitHubユーザーが追加のissueを登録しました。この追加のissueでは、同じ攻撃手法の要素を利用したサービス拒否(DoS)脆弱性がパッケージ内にまだ残っていると指摘されていました。2020年8月6日、メンテナーはバージョン1.1.10をリリースし、Snykはこのバージョンで脆弱性が正常に修正されたことを確認しました。
この事例は、Snykのリサーチチームが開発者やセキュリティコミュニティと連携する方法の一例にすぎません。私たちの目標は、パッケージの脆弱性を修正するだけではありません。誰もがソフトウェアをより安全にできるよう、脆弱性に関する情報をオープンに共有することも目指しています。
以前のMVP記事を見逃しましたか?こちらからご覧ください:
