最新の組み込みおよびIoT デバイスには、シームレスなユーザー インターフェイスとリモート管理機能を提供するためのコンパクトで効率的なソリューションが必要ですが、これは多くの場合、HTTP サーバーを通じて実現されます。HTTP サーバーの実装は、パフォーマンス、セキュリティ、適応性など、複数の要素のバランスを取る必要があるため、困難な作業です。これらの要件と開発コストの削減の必要性が相まって、ベンダーは、新製品を出荷するたびに車輪の再発明を避けるために、EmbedThis のGoAheadなどの軽量の標準ソリューションを選択するようになりました。
組み込みシステムやIoT デバイスの普及が進むにつれ、そのセキュリティを確保することが不可欠になっています。これを認識し、 Nozomi Networks Labs は GoAhead Web Server のバージョン 6.0.0 を分析し、3 つの CVE が発行される原因となった複数の脆弱性を発見しました。これらの脆弱性に関連する影響は、影響を受ける機能が特定の実装に組み込まれている場合、主に Web サーバーの可用性に影響する可能性があります。これらの脅威を軽減するために、EmbedThis によって過去数か月間に新しいパッチ (バージョン 6.0.1) がリリースされました。
この記事では、発見されたセキュリティ脆弱性の詳細、その潜在的な影響について説明し、推奨される緩和戦略を示します。影響を受けるターゲットの完全な概要については、以下のセクション「脆弱性リストと影響を受けるバージョン」を参照してください。
研究範囲
EmbedThisが開発したGoAheadは、組み込みシステム向けにカスタマイズされたコンパクトなWebサーバーであり、 IoT デバイスに最適です。リソース使用量を最小限に抑えながら高性能を実現することに重点を置いて構築されているため、メモリと処理能力が限られているデバイスに最適なソリューションです。GoAhead は、統合が容易で、拡張性と柔軟性に優れているため (ARM、MIPS、X86、PPC、Sparc など、さまざまなアーキテクチャがサポートされています)、スマート ホーム デバイス、ネットワーク機器、産業用制御システムなど、幅広い製品で使用されています。図 1 は、GoAhead を自社製品に組み込んでいる多くの有名メーカーを示しています。
私たちの調査は、HTTP リクエスト処理、入力解析、セッション管理など、外部ユーザーとデバイス間のやり取りを仲介する上で重要な役割を果たし、潜在的な悪用ポイントとなる GoAhead サーバーの機能を対象としました。これらの領域を分析することで、このブログでさらに詳しく説明されているように、3 つの CVE で追跡されている複数のメモリ破損の問題が明らかになりました。
これらの脆弱性の影響は?
発見された脆弱性に関連する影響について説明する前に、GoAhead は高度にカスタマイズ可能な Web サーバーであるため、報告された問題はこれらの Web サーバーのすべての適応に存在するとは限らず、主に開発者が有効にした特定の機能に依存する可能性があることを強調しておくことが重要です (「脆弱性リストと影響を受けるバージョン」のセクションで詳しく説明)。これらの脆弱性に関連する CVSS スコアを決定する際には、これらの要素が特に考慮されました。
これらの前提から、最もすぐに観察できる影響はサービス拒否 (DoS) 状態です。これは、Web サーバーの通常の操作を中断し、機能を復元するためにデバイスの再起動が必要になる場合があります。さらに、GoAhead はシングル スレッドの Web サーバーとして動作するため、メモリ アクセス違反が発生した場合、プロセス全体が直ちに終了します (対照的に、マルチ スレッド サーバーはセグメンテーション エラー信号を傍受し、状況をより適切に処理できます)。具体的な実装によっては、クラッシュが検出されたときにサービスを自動的に再起動するウォッチドッグなどの追加メカニズムが実装されている場合、このような影響は当然制限される可能性があります。一方、これらのメカニズムには、特定の数の障害が発生した後にプロセスを自動的に再起動しないポリシーが設定されていることもあり、問題が繰り返されるとサービスがダウンする可能性があります。
脆弱性リストと影響を受けるバージョン
次の表は、GoAhead Web Server バージョン 6.0.0 で見つかったすべての脆弱性を一覧表示しています。順序は CVSS v3.1 ベース スコアによって決定されています。Web サーバーへの潜在的な影響をより正確に評価するには、表の下に記載されている特定の影響を受ける機能を慎重に確認してください。
脆弱性は、以下に示す 2 つのオプション機能に見つかりました。
- 1つ目は、EmbedThisによって実装された代替アロケータです。これは、標準のlibc関数(mallocやfreeなど)を置き換えるために設計された、カスタムのアプリケーション固有の動的メモリアロケータです。デフォルトのオペレーティングシステムアロケータでメモリの断片化が頻繁に発生する場合に特に役立ちます。GoAheadアロケータは決定論的であり、メモリの割り当てと解放を一定時間で実行します。組み込みシステムが標準のGlibcライブラリを簡単に組み込むことができないシナリオでも推奨されます。このカスタム実装は、GoAheadプロジェクトで次のように設定することで有効にできます。
ME_GOAHEAD_REPLACE_MALLOC=1
コンパイルフラグ。 - 2つ目はJavascriptテンプレート(JST)機能です。これについては、以下の「脆弱性スポットライト」セクションで詳しく説明します。この機能は、開発者が設定することで有効にできます。
ME_GOAHEAD_JAVASCRIPT=1
コンパイル時のフラグ。
脆弱性スポットライト
CVE-2024-3187 および CVE-2024-3186 で追跡されている報告された問題の大部分は、Javascript テンプレート (JST) 機能のコンテキストで発見されました。
GoAheadは、HTMLページを利用して動的なWebページやアプリケーションの作成を容易にするJavascriptテンプレートを実装し、サーバー上で埋め込まれたJavascriptをクライアントにレンダリングする前に実行します。JST環境は拡張可能で、C関数をJavascriptに直接バインドできるため、JST Webページからデバイスやシステムのデータにシームレスにアクセスできます。JSTドキュメントは、ファイルシステム上のテキストリソースであり、 .jst
拡張機能は対応するJSTハンドラによって処理されます。Webサーバーを実装する場合、開発者は「ルートファイル
図 2 に示すように、 ” ファイルを作成します。
JSTテンプレートファイルは、 /var/www/goahead/jst/
ディレクトリとその内容は、以下に示すように単純なものになります。
デフォルトでは、JST は 1 つの標準関数のみを定義します。 書く
この関数は、JSTスクリプトの代わりにクライアントにデータを書き戻します。開発者は、新しいJST関数を実装することもできます。 ウェブ定義Jst
C で定義されたカスタム操作を Javascript 関数にバインドします。
例えば、以下に新しい定義を示します。 日付()
JST 経由でアクセス可能な機能。
開発者は新しい 日付()
対応する情報をクライアントに返す機能。
ユーザーのブラウザが JST ドキュメントを要求すると、JST ハンドラがトリガーされて要求が処理されます。ドキュメントはファイル システムから 1 回のパスで読み取られます。JST 区切り文字の前のテキストはクライアントに直接送信されます。JST 区切り文字が検出されると、その中のスクリプトが実行され、結果の出力がクライアントに送信されます。このプロセスは、ドキュメント全体が処理されるまで繰り返されます。
分析中、私たちは AFL++ のようなよく知られたオープンソースのファジング ソリューションを採用し、JST ドキュメント処理機能に対してカバレッジ ガイド付きの試行を実行することにしました。Use-After-Free (UAF) や Double Free などの目立たないメモリ破損をより適切に検出するために、Clang や GCC などの最新のコンパイラで利用可能な Address Sanitizer (ASAN) 機能がターゲットで有効になっています。最後に、発見されたクラッシュのトリアージ作業を簡素化するために、最終ビルドでシンボルが有効になっています。
ターゲットをインストルメント化するために、解析機能に特に焦点を当てたハーネスを作成する代わりに、別のアプローチを採用しました。メインの goahead.c ファイルから開始して、STDIN からペイロードを読み取り、ペイロードを JST ファイルに保存し、テンプレートの読み込みと解析を行う適切なサーバー エンドポイントをトリガーするための追加コードが挿入されました。この追加コードは別のスレッドの一部として実装され、読み込み操作はサーバーの初期化が完了した後にトリガーされます。このアプローチには、1 つのペイロードに関係するコードが増えるため、1 秒あたりのファズ テストの量が減るという明らかな欠点がありますが、次の 2 つの主な利点があります。
- テンプレートの読み込みと解析に関連するすべてのコードが実行されるため、検出されたクラッシュ (重複を除く) はすべて正当なクラッシュであることが保証されます。これにより、フロー全体をテストするために完全に機能するサンプル アプリケーションを作成するために追加の時間を費やした後、不正な入力を防ぐために追加のチェックがいくつか実施されていることが後で判明するといったシナリオを回避できます。
- これにより、複雑な Web サーバーのデータ構造をすべて正しく設定および初期化できるようになり、メモリ レイアウトの観点から適切な出発点が提供され、発生したクラッシュをさらに調査して関連する影響をより深く理解できるようになります。
図 3 では、ファジング キャンペーンの実行後に ASAN によって検出された Double-Free 脆弱性の結果として取得されたクラッシュの 1 つのスニペットを確認できます。
GDBを使用してこの特定のクラッシュをさらにトリアージすると、図4に示すような結果が得られました。 無料
function (1), it is possible to observe that it matches the one of a memory chunk that has been previously freed (2) by another portion of code. Since this chunk was already inserted as part of a 0x20-tcache list for chunks <= 0x18 in size, additional security checks implemented over tcache bins in Glibc versions >= 2.29 prevent the program execution from continuing and raise a Double-Free error violation since the allocator is in an inconsistent state.
もちろん、ターゲットが Glibc の古いバージョンでコンパイルされているか、または uClibc などの代替 libc 実装が使用されているかによって、プロセスの動作は大きく異なる可能性があります。ただし、この特定のシナリオでは、実行フローをすぐに制御できる、簡単に悪用できる条件は発見されていません。
この攻撃では、ファイル システムに保存されている JST リソースを制御する必要があるため、潜在的な攻撃ベクトルには、JST テンプレート フォルダーへの任意のファイルのアップロードを可能にする別の脆弱性を悪用することが含まれる可能性があります。これにより、攻撃者は悪意のある JST リソースを挿入し、対応するルートにアクセスしてその読み込みと解析を開始できます。
修復
これらの脆弱性を修正するために、EmbedThisはGoAheadのバージョン6.0.1を速やかにリリースしました。お客様は、ベンダーがリリースした最新のセキュリティパッチを含むバージョンをプロジェクトで使用することをお勧めします。すぐに更新できない場合は、次の点を確認して、これらの脆弱性が存在する可能性があるかどうかを評価することをお勧めします。 ME_GOAHEAD_REPLACE_MALLOC
コンパイル フラグが有効になっているか、JavaScript テンプレート (JST) 機能が使用されています。この 2 番目の条件では、悪意のあるユーザーが動的な JavaScript テンプレートを改ざんできるかどうかを判断するために、詳細なレビューを実施することもお勧めします。これは、ドキュメントの読み込みと解析中に意図しない動作が発生する可能性があるためです。