
Apache Traffic Server 10.2.0 - 高 - リモート - 権限残留 - realip PLUGIN ACL フェイルオープン
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-realip-plugin-acl
クラス: 権限の残存 到達性: リモート
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
実験的な realip と、文書化されている acl.subjects: PLUGIN のフェイルオープンにより、remap の @src_ip が回避されます。realip が TSHttpTxnVerifiedAddrSet を呼び出さない場合、_verified_addr は AF_UNSPEC のままになります。PLUGIN サブジェクトは決して nullptr にならないため、PEER へのフォールバックは決して実行されません。ats_is_ip が false となり、@src_ip がスキップされ、ip_matches は true のままになります。remap の許可リストが信頼できないクライアントに一致してしまいます。
デフォルトの acl.subjects は PEER です。realip は標準の plugin.config には含まれていません。セッションの ip_allow.yaml は PLUGIN を決して参照しません。古典的な「誰からでも X-Forwarded-For」は塞がれています(trustedAddress が必須で、ヘッダーは単一の inet_pton アドレスでなければなりません)。
| ID | CVE 未割当 |
| クラス | 権限の残存(remap ACL のフェイルオープン) |
| 到達性 | リモート(trustedAddress 外からの未認証 HTTP) |
| CWE | CWE-863 |
| CVSS | High: 8.1 CVSS:3.1/AV:N/AC:H/PR:N/UI:N/S:U/C:H/I:H/A:H |
| 製品 | Apache Traffic Server |
| 影響を受けるバージョン | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) 実験的 realip + PLUGIN サブジェクト |
| 認証 | なし。クライアントは trustedAddress に含まれない。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18770 のみ |
公開タグ 10.2.0 のピール b1df7334 に固定しました。ラボはループバック上のソースビルド ats-10.2.0-lab:local リバースプロキシです。CONTROL PEER は 403。PLUGIN は 200。セッション PURGE は依然として 403 です。
実験的な realip.so がロードされ、proxy.config.acl.subjects: PLUGIN(または PLUGIN,PEER)が設定された ATS に到達します。remap の @src_ip=10.0.0.0/8 を許可します。trustedAddress の外側のアドレスから接続します。
| 手法 | シンク | 権限 |
|---|---|---|
trustedAddress 外の 172.x から remap @src_ip=10.0.0.0/8 への HTTP | realip が TSHttpTxnVerifiedAddrSet をスキップ(address_setter.cc:29-38)。PLUGIN サブジェクトは常に存在(UrlRewrite.cc:462-473)。!ats_is_ip の場合に @src_ip をスキップ(:495-514) | 整合性(ラボで実証済み): remap ACL が一致。オリジン 200 ATS-REALIP-PLUGIN-ACL-WITNESS。CONTROL acl.subjects=PEER は 403。 |
同じ状況に加え、信頼できないピアから Client-IP: 10.1.2.3 | simple.cc の verify が false。ヘッダーは無視される | 整合性(ラボで実証済み): 依然としてフェイルオープンで 200。検証済みアドレスのなりすましではない。 |
同じクライアントの PURGE | セッション ip_allow.yaml の PEER | クローズ(ラボで実証済み): 403。PLUGIN は接続 ACL を決して書き換えない。 |
@src_ip を持たないホスト | デフォルトマップ | クローズ(ラボで実証済み): ボディは DENIED、ウィットネスなし。 |
ラボで実証済み vs 推測: PLUGIN 200、PEER 403、PURGE 403、拒否マップ、信頼できないヘッダーのフェイルオープンはラボでの結果です。その後にオリジンが何を許可するかは、本来 10/8 のみであるはずの remap から推測されます。
必要条件: 実験的な realip.so と acl.subjects=PLUGIN(または PLUGIN,PEER)。@src_ip 許可リストを再マップします。デフォルトではありません。
| サーフェス | ラボ |
|---|---|
CONTROL acl.subjects=PEER | 同じ @src_ip マップで 403 |
セッション ip_allow.yaml | 攻撃者による PURGE は 403 |
@src_ip のないマップ | DENIED |
空の trustedAddress | 検証されない。subjects が PLUGIN の場合のみフェイルオープンのまま |
| 任意の送信元からのクラシックな XFF | クローズ済み。ヘッダーは信頼されたピアからの単一の inet_pton アドレスでなければならない |
SNI ip_allow | PEER/PROXY のみ。ハンドシェイクは HTTP ヘッダーより前に行われる |
デフォルトの subjects PEER | 残存設定は適用されない |
古典的な「誰からでも X-Forwarded-For を信頼する」という残存設定ではない。残存設定とは、文書化されている PLUGIN リマップ ACL パスのことである。
python3 ats-realip-plugin-acl-Abraxas-Labs.py
または
cd lab
./run.sh
ループバック 127.0.0.1:18770(オリジン 18771)。Compose プロジェクト ats-realip-plugin-acl。イメージ ats-10.2.0-lab:local。攻撃側サイドカー 172.x。ウィットネス ATS-REALIP-PLUGIN-ACL-WITNESS。最終行:
SUCCESS ats-realip-plugin-acl control-http=403 poc-http=200 purge-http=403 denied-http=200 spoof-http=200 trusted-http=200 ATS-REALIP-PLUGIN-ACL-WITNESS
get_verified_client_addr が AF_UNSPEC を返す場合、PLUGIN を利用不可として扱ってください(または、TSHttpTxnVerifiedAddrGet に合わせて getter が nullptr を返すようにしてください)。そうすれば PEER フォールバックが実行されます。サブジェクトポインタが非 null であっても IP でない場合に @src_ip をスキップしないでください。許可リストではフェイルクローズドにしてください。
それまでの間、realip をログ記録のためだけにロードする場合は、acl.subjects を PEER のままにしてください。リマップに到達し得るすべてのクライアントがすでに信頼済みプロキシでない限り、PLUGIN を設定しないでください。
b1df7334b39a878971c376da849e8da4984918b6)plugins/experimental/realip/address_setter.ccsrc/proxy/http/remap/UrlRewrite.cc PerformACLFilteringinclude/proxy/ProxyTransaction.h get_verified_client_addr