最近、あるワイヤレスルータを調査していたところ、次のコードが目に留まりました。
この unescape 関数は、URL エンコードされたバイトを元の形式に戻していますが、気になる点があります。処理を実行する際にサイズチェックを行っておらず、「%」の後に必ず 2 つのバイトがあると想定しています。では、「%」の後に文字が 1 つしかなかったらどうなるでしょうか?strcpy の s+3 によって文字列の終端を超えて境界外にアクセスしてしまうので、メモリが破損する危険性があります。
次に、調査中のルータでこのバグをエクスプロイトしようとしてみましたが、そのデバイスでの URL 文字列の扱い方では、エクスプロイトするのは不可能でした。しかし、このコードを使用する他の Web サーバーをクラッシュさせられる可能性はあります。この関数は freshtomato ライブラリに含まれています。そこでソースコードを調べてみたところ、この関数が含まれているファイルの先頭に次のようなコメントがありました。
コードは Broadcom 社のものでした。このコメントを Google で検索したところ、同じコードを使用しているプロジェクトがいくつか見つかりました。また、grep.app で正規表現を使用してこのバグのレイアウトを検出してみたところ、さらに別のプロジェクトも見つかりました。それらのプロジェクトのコードを確認したところ、改変が可能なものや、Web サーバーのシナリオで使用されるものがありました。そこでコードのテストを行い、最終的に複数のベンダーに連絡して当該製品の脆弱性について報告しました。
複数のプロジェクトで利用されていたコードはどれもよく似ているため、同じ 1 次ソースから流用されたものと考えるのが妥当です。このコードは元々 Broadcom 社の著作物であったことから、同社の製品を使用して HTTP サーバーを実装する顧客のために同社がリリースしたリファレンス実装の一部であった可能性があります。この脆弱性を持つ製品を詳しく調べていく中で、興味深い事実が判明しました。オープンソースソフトウェアの ArduPilot も同じ脆弱性のある製品の 1 つだったのです。このソフトウェアは自動運転車向けのオープンソースパッケージです。Broadcom 社とは何のつながりもなく、直接のリファレンス実装は存在しないにもかかわらず、この脆弱なコードがコードベースに紛れ込んでいます。このようにコードが分野をまたがって再利用されている場合、それぞれのユースケースに合わせてコードが若干変更されているため、最新の安全なコーディング手法が使用されていても、追跡するのは非常に困難になります。こうした理由から、開発者は変更してからコードベースに挿入された外部機能を注意深く確認することが非常に重要です。同じくセキュリティ研究者も、若干の変更を加えて複数のソフトウェアパッケージ間で流用されているかもしれない問題を調査することが非常に重要です。
以下に、この調査の一環として Talos が公開し、修正を支援した脆弱性を示します。TALOS-2022-1509、TALOS-2022-1511、TALOS-2022-1512 は、各社または管理者によってパッチが適用されています。しかし TALOS-2022-1510 については、シスコの脆弱性公開ポリシーに規定されている 90 日間の期限にベンダーが従っていないため、パッチの提供がないまま公開しています。
TALOS-2022-1509(CVE-2022-28664 ~ CVE-2022-28665)
FreshTomato バージョン 2022.1 の httpd の unescape 機能におけるメモリ破損の脆弱性。細工された HTTP リクエストにより、メモリが破損される危険性があります。攻撃者はネットワークリクエストを送信することでこの脆弱性をエクスプロイトできます。
TALOS-2022-1510(CVE-2022-27631)
DD-WRT(組み込みシステム用の Linux ベースのファームウェア)リビジョン 32270 からリビジョン 48599 の httpd の unescape 機能におけるメモリ破損の脆弱性。細工された HTTP リクエストにより、メモリが破損される危険性があります。攻撃者はネットワークリクエストを送信することでこの脆弱性をエクスプロイトできます。
TALOS-2022-1511(CVE-2022-26376)
Asus 社のワイヤレスルータ向けに提供されている公式の Asuswrt ファームウェアと Asuswrt-Merlin New Gen オープンソース ファームウェアの両方に存在するメモリ破損の脆弱性。この脆弱性は、これらのファームウェアの httpd の unescape 機能に存在します。細工された HTTP リクエストにより、メモリが破損される危険性があります。攻撃者はネットワークリクエストを送信することでこの脆弱性をエクスプロイトできます。Asus デバイスを管理するための同社のユーザー インターフェイス ソフトウェアである ASUSWRT もこの脆弱性の影響を受けます。
TALOS-2022-1512(CVE-2022-28711)
ArduPilot APWeb master ブランチ 50b6b7ac から master ブランチ 46177cb9 の cgi.c の unescape 機能におけるメモリ破損の脆弱性。ArduPilot は、ドローンなどの自動飛行デバイスや自動運転デバイスをプログラムできるオープンソースのソフトウェアスイートです。細工された HTTP リクエストにより、メモリが破損される危険性があります。攻撃者はネットワークリクエストを送信することでこの脆弱性をエクスプロイトできます。
本稿は 2022 年 07 月 27 日に Talos Group のブログに投稿された「Vulnerability Spotlight: How a code re-use issue led to vulnerabilities across multiple products」の抄訳です。