見えないSplinter:隠されたNode.jsの欠陥が毎週1億6000万のセキュリティガードをバイパスする方法

Node.jsエコシステム内で、HTTPクライアントの基本的なロジックに関連する脆弱性が発見されました。これにより、脅威アクターがリクエスト分割に対する既存の防御をバイパスすることが可能になります。r3veriiというモニカーで活動するMartino Spagnoloは、Node.jsコアチームがこの問題を彼らの脅威モデルの違反として分類することを拒否した後、包括的な分析を発表しました。これは、ヘッダーを注入し、単一の接続内で2番目のリクエストを偽造するという危険な能力のロックを解除するメカニズムに関するものです。

この困難の起源は2018年に遡ります。当時、CVE-2018-12116脆弱性は、latin1エンコーディングの特性を利用することで、制御文字の流入を許可していました。これに対応して、開発者はhttp.request内のリクエストパスに対する検証プロトコルを制度化し、\u0021~\u00ff範囲外の文字を厳密に禁止しました。しかし、この保護機構はClientRequestオブジェクトのインスタンス化の正確な瞬間にのみ発動されました。その後、pathプロパティは平凡で可変なフィールドとして放置され、追加の検証はまったくありませんでした。

その後の調査により、リクエスト生成後にclientRequest.pathが変更された場合、この重要な検証が効果的にバイパスされることが明らかになりました。HTTPストリングの合成中、_implicitHeaderメソッドは現在のpathの値を盲目的に消費し、2次的なフィルタリングの対象にしません。その結果、特に\r\nなどの有害な制御シーケンスは、TCPストリームに直接妨害されずに通過します。

影響は自然に送信されたペイロードに応じて異なります。最も基本的な形では、悪意のある人物は補足的なHTTPヘッダーを注入し、HostまたはAuthorizationディレクティブを秘密裏に置き換える可能性があります。より深刻なシナリオでは、敵対者がヘッダーを完全に終了し、偽造されたリクエストボディを追加することができ、元の呼び出しの意味を根本的に変更します。最も悲劇的な順列は、明確なHTTPリクエスト分割に至り、疑わない相手方サーバーが1つになりすまして2つの独立したHTTPリクエストを受け取ります。

研究者は広く使われているライブラリを綿密に監査し、この防御不可能なTime-of-Check to Time-of-Use(TOCTOU)の深淵に悩まされた7つの著名なプロジェクトを暴露しました。これらの被害者の中には、node-http-proxyhttp-proxy-middlewaresuperagentrequest、および@hapi/wreckが含まれます。それらの総ダウンロード量は1週間で驚くべき1億6000万を超えています。アーキテクチャ上の欠陥は全体を通じて均一に一貫しています。ライブラリはClientRequestをインスタンス化し、次にヘッダーの送出前に外部ハンドラーにオブジェクトを時期尚早に譲り渡します。ハンドラーがその後、ユーザー提供データに基づいてpathを変更する場合、フィルタリング機構は完全に回避されます。

特定のユーティリティは、異なるアーキテクチャの利点により幸運にもこの危険を回避しました。axiosfollow-redirectsを活用し、内部ClientRequestへのアクセスを厳密に保持しています。gotはオブジェクトの外部露出に先立ってヘッダーを送出します。一方、undiciとネイティブfetch APIは、可変pathプロパティを完全に持たないHTTPスタックのカスタム実装を採用しています。

HackerOneプログラムを通じて通信する中で、Node.jsの先鋒は、この動作が現在の運用ロジックと完全に一致していると主張し、それを正当な脆弱性として認識することを拒否しました。彼らの視点から、責任の重荷は、インスタンス化後のpath変更を許可する外部ライブラリの上に正確に存在します。この研究の設計者はこの評価に激しく異議を唱え、脆弱なエコシステムの莫大な規模を強調し、完全に機能する概念実証を披露しました。

基本的な万能薬として、パスがリクエスト文字列の合成の直前に2次検証を受けるか、または代わりにpathプロパティが厳密な検証ロジックを備えたセッターを介して強化されることが提案されています。現在コア修正は予想されていませんが、開発者はclientRequest.pathへのあらゆる割り当てについてコードベースを綿密に調べるよう強く促され、これらの値がサニタイズされていないユーザー入力から導出されないことを厳密に検証する必要があります。

翻訳元: https://meterpreter.org/the-invisible-splinter-how-a-hidden-node-js-flaw-bypasses-160-million-weekly-security-guards/

ソース: meterpreter.org