GoAhead に発見されたセキュリティ上の欠陥、組み込み/IoT デバイス上の Web サーバーに影響を与える可能性

GoAhead に発見されたセキュリティ上の欠陥、組み込み/IoT デバイス上の Web サーバーに影響を与える可能性

最新の組み込み機器や IoT デバイスでは、シームレスなユーザーインターフェースやリモート管理機能を提供するために、コンパクトで効率的なソリューションが求められます。これらの機能は、多くの場合 HTTP サーバーによって実現されています。HTTP サーバーの実装は、パフォーマンス、セキュリティ、適応性など、複数の要因のバランスを取る必要があるため、困難な作業です。こうした要件と、開発コストの削減の必要性から、ベンダーは、新しい製品を出荷するたびに同じ作業を繰り返すことを避けるため、EmbedThis のGoAheadのような軽量な標準ソリューションを選択するようになりました。

組み込みシステムや IoT デバイスがますます普及するにつれ、それらのセキュリティを確保することが不可欠となっています。この点を認識した Nozomi Networks Labs は、GoAhead Web Server のバージョン 6.0.0 を分析し、3件の CVE が発行された複数の脆弱性を発見しました。これらの脆弱性に関連する影響は、影響を受ける機能が特定の実装に組み込まれている場合、主に Web サーバーの可用性に影響を与える可能性があります。EmbedThis は、これらの脅威を緩和するために、数か月前に新しいパッチ (バージョン 6.0.1) をリリースしました。

この記事では、発見されたセキュリティ脆弱性について詳細を説明し、その潜在的な影響について考察し、推奨される緩和策を提示しています。影響を受ける対象の完全な概要については、以下の "脆弱性リストと影響を受けるバージョン" のセクションを参照してください。

リサーチ範囲

GoAhead は、EmbedThis が開発した組み込みシステムや IoT デバイス向けにカスタマイズされたコンパクトな Web サーバーです。リソースの使用を最小限に抑えつつ、高いパフォーマンスを実現することに重点を置いて構築されており、メモリや処理能力が限られたデバイスに最適なソリューションです。GoAhead は、容易な統合、拡張性、柔軟性 (ARM、MIPS、X86、PPC、Sparcなど、多様なアーキテクチャをサポート) により、スマートホームデバイス、ネットワーク機器、産業用制御システムなど、幅広い製品で使用されています。図1は、GoAhead を自社製品に組み込んでいる多くの著名なメーカーを示しています。

図 1 – GoAhead Web サーバーを統合した EmbedThis Web サイトに公開されているブランド。

私たちの調査は、HTTP リクエスト処理、入力解析、セッション管理など、外部ユーザーとデバイス間のやり取りを仲介する上で重要な役割を果たし、潜在的な悪用ポイントとなる GoAhead サーバーの機能を対象としました。これらの領域を分析することで、このブログでさらに詳しく説明されているように、3 つの CVE で追跡されている複数のメモリ破損の問題が明らかになりました。

これらの脆弱性の影響

発見された脆弱性に関連する影響について論じる前に、GoAhead は高度にカスタマイズ可能な Web サーバーであるため、報告された問題がこれらの Web サーバーのすべての適応版に存在するとは限らず、主に開発者によって有効化された特定の機能に依存している可能性があることを強調しておくことが重要です ("脆弱性リストと影響を受けるバージョン" のセクションで詳細に説明されています)。これらの脆弱性に関連する CVSS スコアを決定する際に、これらの要因が特に考慮されました。

これらの前提条件を踏まえると、最も即座に観察できる影響は、Web サーバーの正常な動作を中断させるサービス拒否 (DoS) 状態であり、機能回復のためにデバイスの再起動が必要になる場合があります。さらに、GoAhead はシングルスレッドの Web サーバーとして動作するため、メモリアクセス違反が発生した場合は、プロセス全体が即座に終了します (これに対して、マルチスレッドサーバーはセグメンテーションフォールト信号を傍受し、より適切に状況に対処することができます)。もちろん、特定の実装によっては、ウォッチドッグなどの追加のメカニズムがクラッシュを検知した際にサービスを自動的に再起動するように設定されていれば、このような影響は限定されるかもしれません。その一方で、これらのメカニズムには、特定のエラー発生回数に達した時点でプロセスの自動再起動を防止するポリシーが設定されている場合があり、その結果、問題が繰り返し発生した場合にはサービスが停止したままになる可能性があります。

脆弱性リストと影響を受けるバージョン

次の表は、GoAhead Web Server バージョン 6.0.0 で見つかったすべての脆弱性を一覧表示しています。順序は CVSS v3.1 ベース スコアによって決定されています。Web サーバーへの潜在的な影響をより正確に評価するには、表の下に記載されている特定の影響を受ける機能を慎重に確認してください。

CVE IDCWECVSS v3.1 ベーススコアCVSS v3.1 ベクトル
CVE-2024-3184NULL Pointer Dereference (CWE-476)5.9CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:N/I:N/A:H
CVE-2024-3187Double Free (CWE-415)、Use After Free (CWE-416)5.9CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:H
CVE-2024-3186NULL Pointer Dereference (CWE-476)5.3CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:N/A:H

脆弱性は、以下に示すふたつのオプション機能に見つかりました。

  1. ひとつめは、EmbedThis が実装した代替アロケーターです。これは、標準の libc 関数 (malloc や free など) を置き換えるために設計された、アプリケーション固有のカスタム動的メモリアロケーターです。 特に、デフォルトのオペレーティングシステムのアロケーターでメモリ断片化が頻繁に発生する場合に有益です。GoAhead アロケーターは決定論的であり、メモリ割り当てと解放を一定時間で実行します。 また、組み込みシステムに標準の Glibc ライブラリを簡単に組み込むことができない場合にも推奨されます。 このカスタム実装は、GoAhead プロジェクトで有効にすることができます。 ME_GOAHEAD_REPLACE_MALLOC=1 コンパイルフラグ。
  2. ふたつめは、Javascript Templates (JST) 機能で、この機能については、以下の "脆弱性のスポットライト" のセクションでさらに詳しく説明します。この機能は、開発者が設定を行うことで有効にすることができます。 ME_GOAHEAD_JAVASCRIPT=1 コンパイル時のフラグ。

脆弱性スポットライト

CVE-2024-3187 および CVE-2024-3186 で追跡されている報告された問題の大部分は、Javascript Templates (JST) 機能に関連して発見されたものです。

GoAhead は、クライアントにレンダリングされる前にサーバー上で埋め込み Javascript を実行する HTML ページを活用することで、動的なウェブページやアプリケーションの作成を容易にする Javascript テンプレートを実装しています。JST 環境は拡張可能であり、C関数を Javascript に直接バインドできるため、JST ウェブページからデバイスやシステムデータにシームレスにアクセスすることができます。JST ドキュメントは、ファイルシステム上のテキストリソースであり、 .jst 拡張機能であり、対応する JST ハンドラによって処理されます。Web サーバーを実装する際、開発者は ” ” の下に新しいエントリを追加することで、JST 拡張機能を有効にすることができます。ルートファイル図 2 に示すように、 ” ファイルを作成します。

図 2 – 対応するハンドラーを使用した JST ルートの定義。

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 つの主な利点があります。

  1. テンプレートの読み込みと解析に関連するすべてのコードが実行されるため、検出されたクラッシュ (重複を除く) はすべて正当なクラッシュであることが保証されます。これにより、フロー全体をテストするために完全に機能するサンプル アプリケーションを作成するために追加の時間を費やした後、不正な入力を防ぐために追加のチェックがいくつか実施されていることが後で判明するといったシナリオを回避できます。
  2. これにより、複雑なウェブサーバーのデータ構造をすべて正しく設定および初期化し、メモリレイアウトの観点から、取得したクラッシュをさらに調査し、関連する影響をより深く理解するための適切な出発点を提供することができます。

図3では、ASAN がファジングキャンペーンを実施した後に検出した Double-Free 脆弱性の結果として取得されたクラッシュのひとつの抜粋を観察することができます。

図 3 – AddressSanitizer による Double-Free 脆弱性の検出

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.

図 4 – ダブルフリー脆弱性を引き起こすメモリ レイアウト

もちろん、ターゲットが Glibc の古いバージョンでコンパイルされているか、または uClibc などの代替 libc 実装が使用されているかによって、プロセスの動作は大きく異なる可能性があります。ただし、この特定のシナリオでは、実行フローをすぐに制御できる、簡単に悪用できる条件は発見されていません。

この攻撃では、ファイル システムに保存されている JST リソースを制御する必要があるため、潜在的な攻撃ベクトルには、JST テンプレート フォルダーへの任意のファイルのアップロードを可能にする別の脆弱性を悪用することが含まれる可能性があります。これにより、攻撃者は悪意のある JST リソースを挿入し、対応するルートにアクセスしてその読み込みと解析を開始できます。

修復

これらの脆弱性を修正するため、EmbedThisはGoAhead のバージョン 6.0.1 を速やかにリリースしました。お客様には、プロジェクトでベンダーがリリースした最新のセキュリティパッチを含むバージョンを使用することをお勧めします。即時のアップデートが不可能な場合は、以下の事項を確認することで、これらの脆弱性の潜在的な存在を評価することをお勧めします。 ME_GOAHEAD_REPLACE_MALLOC コンパイルフラグが有効になっている、またはJavaScriptテンプレート (JST) 機能が使用されている場合です。このふたつ目の条件については、悪意のあるユーザーが動的な JavaScript テンプレートを改ざんできるかどうかを判断するために、詳細な調査を行うことをお勧めします。これは、ドキュメントの読み込みや解析中に予期せぬ動作を引き起こす可能性があるためです。