Skip to main content

websocket-extensionsにおける正規表現サービス拒否攻撃

Blog illustrations vul profile feature

2020年6月22日

0 分で読めます

Snykの新しいブログシリーズへようこそ。この月刊シリーズでは、Snykのリサーチチームが 発見した、または報告を受けた 脆弱性を振り返ります。毎月、注目すべき脆弱性を1つ取り上げ、その発見から調査、開示までの経緯をご紹介します。オープンソースコミュニティ全体で脆弱性の特定と修正に取り組む研究者、開発者、ユーザーにもスポットライトを当てます。

この月刊シリーズの初回では、websocket-extensionsパッケージで発見された脆弱性を取り上げます。


脆弱性: websocket-extensionsにおけるReDoS割り当てられたCVE:CVE-2020-7662、CVE-2020-7663Snykアナリスト:Sam Sanoop発見者: Robert McLaughlin

2020年6月2日、Snykセキュリティリサーチチームは、人気のwebsocket-extensionsパッケージで正規表現サービス拒否(ReDoS)脆弱性を公表しました。この脆弱性は、Snykのスキャン対象となった13,000を超えるプロジェクトに影響していました。脆弱性をSnykに報告したのは、カリフォルニア大学サンタバーバラ校のコンピューターサイエンス課程に在籍する博士課程の学生、Robert McLaughlinです。RobertはUCSBのSecLabでソフトウェアセキュリティ脆弱性の自動検出と修復に取り組んでいます。Node.jsエコシステム全体のReDoS脆弱性を調査する中で、この問題を発見しました。

Robertによると、人気のnpmパッケージから大量の正規表現サンプルを収集した後、脆弱性を最初に発見したとのことです。研究室のチームは、収集したサンプルをReDoSスキャナーで解析しました。そして最終的に、Nicolaas Weidemanが公開・保守しているオープンソースツールRegexStaticAnalysisを使って、この脆弱性を特定しました。

この脆弱性を悪用すると、悪意のあるユーザーが正規表現アルゴリズムを攻撃できる可能性があります。細工した入力を与えることで、「壊滅的なバックトラッキング」と呼ばれる状態を引き起こせます。この状態では、正規表現エンジンが文字列がパターンに一致するかどうかを判定するために、膨大な数の候補経路を解析しなければなりません。ReDoS脆弱性について詳しくは、こちらのブログをご覧ください。

「正規表現によるサービス拒否(ReDoS)の公開件数が増加」と題された折れ線グラフ。2016年の14件から、2017年は30件、2018年は72件へと増加している。

出典:Snyk「2019年オープンソースセキュリティの現状」レポート

Robertは調査と並行して概念実証(PoC)エクスプロイトを開発し、脆弱性を当社に報告する際に提出しました。SnykセキュリティチームのアナリストであるSam Sanoopは、脆弱性を再現できるかどうかの検証を担当しました。しかし、提供されたPoCを使ってテスト用コンテナで試したものの、Samは当初エクスプロイトを再現できませんでした。そこでRobertがエクスプロイトの実行方法を追加で説明し、攻撃ペイロードの詳細を確認したところ、Samは脆弱性が実際に再現可能であることを確認できました。

Samは脆弱なコードが存在することを確認するだけでなく、パッケージの利用方法に照らして、修正が必要な真の脆弱性であることも検証しました。この確認は、ReDoS脆弱性を扱う際に特に重要です。オープンソースコードには、調査すると脆弱に見えても、実際には悪用できない正規表現パターンが数多くあります。

脆弱性の妥当性、影響度、深刻度を確認した後、Samはパッケージのコードベースを調査しました。脆弱性を引き起こしたコード行を特定し、見つかった問題の修正方法を具体的にまとめました。この情報をもとに、SamはパッケージのJavaScript版とRuby版の脆弱性を説明する2つのCVEを割り当てました。また報告者に連絡し、脆弱性の検証が完了したことと、予約されたCVE番号を伝え、Snykからメンテナーに連絡する旨を知らせました。その後、パッケージのメンテナーにも連絡し、脆弱性の詳細と修正の具体的な推奨事項を伝えました。

今回のwebsocket-extensionsは非常に活発に保守されているパッケージで、メンテナーは提供された情報にすぐに対応しました。数時間以内にSamへ返信し、脆弱性を理解したことと、修正に取り組んでいることを伝えました。Samは修正をリリースする際に参照できるCVE番号を共有し、脆弱性の公開日について合意しました。メンテナーはSnykから報告を受けた翌日までに修正をリリースし、脆弱性の解説記事はその翌日に公開されました。

この脆弱性は、Snykの開示プロセスが、研究者による発見の報告と功績の認定を支援しながら、オープンソースのメンテナーとの協力を実現している好例です。この脆弱性を報告した研究者のRobertに、Snykを通じて開示することにした理由を聞きました。

「開示における私の主な目的はCVEの割り当てです。Snykはその対応を非常にうまく行っています。また、適切なメンテナーに連絡して修正を調整してくれる点もありがたいです。」 - Robert McLaughlin

Snykは、脆弱性の妥当性と悪用可能性を確認するとともに、責任ある開示と、修正に向けた詳細なガイダンスをメンテナーに提供することを目指しています。この脆弱性の詳細や、オープンソースプロジェクトで発見した脆弱性の報告方法については、以下のリンクをご覧ください。

Capture the Flagを始めよう

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

カテゴリー: