この脆弱性は、シニア リサーチ エンジニアの Dave McDaniel によって発見されました。
概要
iPerf は、TCPおよびUDP接続を作成してシステム間のネットワーク帯域幅を測定するために通常クライアント/サーバ構成で導入されるネットワークのテスト アプリケーションです。各接続において、iPerf は最大帯域幅、損失、他のパフォーマンス関連のメトリックを報告します。これは一般的に、ネットワークの最適化の影響の評価や測定、およびネットワーク パフォーマンスに関連するベースライン メトリックを得るために行われるものです。
Esnet および Lawrence Berkeley 国立研究所が開発した iPerf3 はオリジナルの iPerf が完全に再設計されたもので、分岐した cJSON ライブラリを使用しています。今回 Cisco Talosは、iPerf3 サーバ デーモンを実行するシステム上の分岐した cJSON ライブラリにリモート コード実行(RCE)へと繋がる脆弱性が含まれていることを発見しました。この脆弱性は、分岐した cJSON ライブラリが UTF-8/16 文字列を解析する方法に関連しています。現在、複数のパブリック iPerf3 サーバがインターネットからアクセス可能で、この脆弱性を利用して遠隔攻撃を受ける可能性があります。基本の cJSON ライブラリについては、作成者によってこの脆弱性を解決するパッチがリリースされましたが、iPerf3 5512-X, 3.1-1 に付属する cJSON のバージョンには脆弱性が含まれます。 iPerf3 アプリケーションの最新版についてはこちらからご覧ください。
詳細
Unicode 文字列を扱う際に、JSON では仕様により 「\u」トークンとそれに続く 16 ビット 4 桁の数字の使用が求められます。iPerf3 の脆弱性は cJSON ライブラリ内にあり、parse_string () 関数が UTF-8/16 文字列を扱う際のメモリ割り当ての取り扱いによるものです。UTF-8/16 文字列を受け取ると、この関数は文字列を評価し、受け取った入力の規模に基づく適切なヒープ割り当ての決定を試みます。
UTF-8/16 文字列に「”」が含まれる場合は、sscanf () 関数は文字の参照を試みます。フォーマット要件により、sscanf () は「”」に遭遇した時点で読み込みを停止します。しかし実際の関数の長さに関わらず、バッファへのポインタは自動的に 4 バイトずつ増加します。これが論理エラーを引き起こし、確保されたブロックへの書き込みはループの最後に到達するまで継続されます。十分な長さのある文字列を提供することで、攻撃者はヒープ オーバーフローとなる条件を作り出し、ヒープ ブロック ヘッダを上書きさせることが可能になります。また、これはリモート コードの実行に繋がる可能性もあります。
オブジェクトは後からキーのリストと比較され、これはマッチせずに消去されるため、文字列が開放されます。オブジェクトを削除しようとすると、破損した一連のメモリが読み込まれ、その後開放されます。
アプリケーションは、逆順での統合を行い、破損したヒープ ブロック ヘッダーと遭遇し、アプリケーションをクラッシュさせます。
検証済みバージョン
次のバージョンは Talos により検証されています:
iperf 3.1.1 2015 年 10 月 16 日
iperf3 3.1-1 2015 年 11 月 2 日
まとめ
この脆弱性に対応するため、公式の cJSON ライブラリが更新されています。cJSON ライブラリのユーザは、cJSON で検出されたセキュリティ脆弱性に関連する複数の変更が含まれる最新バージョンを公式の cJSON Github のリポジトリより入手できます。iPerf3 アプリケーションを使用している場合は一刻も早く iPerf3 を最新バージョンへ更新してください。
TALOS-2016-0164 は SID 39165 によって検出されました。
この脆弱性に関する詳細については、こちらよりアドバイザリをご覧ください。
本稿は 2016年6月8日に Talos Group のブログに投稿された「VULNERABILITY SPOTLIGHT: ESNET IPERF3 JSON PARSE_STRING UTF CODE EXECUTION VULNERABILITY」の抄訳です。