
Apache Traffic Server 10.2.0 - 高 - リモート - 権限の残留 - ip_allow メソッドの大文字小文字
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-ipallow-method-case
クラス: 権限の取りこぼし 到達性: リモート
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
HTTP/1 の大文字小文字混在メソッドは、デフォルトの ip_allow.yaml による PURGE/PUSH/DELETE/TRACE の拒否を回避し、リマップ先オリジンへ ATS uid として TUNNEL される。YAML および remap の @method パースは大文字小文字を区別しない。H1 はトークン化した後、リクエストバイト列を strncmp し、大文字小文字が一致しない場合は -1 を返す。拒否の反転処理は、この未知のトークンを許可として扱う。HTTP/2 の :method は大文字小文字を区別せず、拒否されたままである。キャッシュの PURGE/PUSH には依然として既知の wksidx が必要なため、大文字小文字混在ではキャッシュのパージやプッシュは行われない。
これはデフォルトの受信メソッド ACL の取りこぼしであり、CVE-2026-33267 (hop-by-hop) でも、反転した空の非標準 remap ACL (このピンではクローズ済み) でもない。
| ID | CVE 未割当 |
| クラス | 権限の取りこぼし |
| 到達性 | リモート (非ループバッククライアントからの未認証 HTTP/1) |
| CWE | CWE-178, CWE-863 |
| CVSS | High: 7.5 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:H/A:N |
| 製品 | Apache Traffic Server |
| 影響範囲 | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) デフォルトリバースプロキシ |
| 認証 | なし。デフォルトの ip_allow.yaml。remap_required: 1 と 1 つの map。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18710 のみ。イメージ ats-10.2.0-lab:local。 |
タグ 10.2.0、コミット b1df7334b39a878971c376da849e8da4984918b6 をピン留めした。Latest Stable は 2026 年 8 月 17 日。ソースからビルドしたイメージであり、ガジェットではない。
非ループバックアドレスから HTTP/1 で典型的なリバースプロキシ (remap_required: 1 と 1 つの map) に到達する。127.0.0.1 は ALL 許可。plugin.config は空。デフォルトの ip_allow.yaml。
| メソッド | シンク | 権限 |
|---|---|---|
172.x サイドカーからのリマップ後の HTTP/1 delete / DeLeTe | hdrtoken_method_tokenize の後 process_quick_http_filter、続いて METHOD_NOT_SUPPORTED TUNNEL (HdrToken.cc:512-528, HttpTransact.cc:6855-6858) | 整合性 (ラボ実証): オリジン 200 DELETED ATS-IPALLOW-METHOD-CASE-WITNESS。大文字の DELETE は 403。オリジンには ATS uid としてメソッドが渡る。 |
HTTP/1 trace | 同じ TUNNEL | 偵察 (ラボ実証): オリジン 200 TRACE-OK。ATS は TRACE エコーを構築しない (wksidx は TRACE ではない)。大文字の TRACE は 403。 |
HTTP/1 purge / push | 未知メソッドの TUNNEL、キャッシュ操作ではない | 整合性 (ATS キャッシュ): クローズ (ラボ実証)。 オリジンは PURGE-ORIGIN / PUSH-ORIGIN を受信した。キャッシュ操作には既知の wksidx が必要。push_method_enabled のデフォルトは 0。 |
| 同じ大文字小文字混在リクエスト | オリジンへの余分な 1 ホップ | 可用性 (ラボ実証): プロセスの停止ではない。 |
ラボ実証と推測: 大文字の拒否、大文字小文字混在 DELETE/TRACE のトンネル、キャッシュ PURGE/PUSH のクローズはラボで実証済み。オリジンでの DELETE/TRACE は、そのオリジンがメソッドの大文字小文字を折りたたむ場合 (IIS / 一部の Java) に限られる。RFC 9110 に準拠した大文字小文字を区別するオリジン (nginx、httpd、Go) は 501 を返す。ラボのオリジンは大文字小文字を折りたたむ。
要件: 非ループバッククライアントからの HTTP/1。remap_required: 1 と1つの map。デフォルトで PURGE/PUSH/DELETE/TRACE の受信を拒否。HTTP/2 の :method は大文字小文字を区別せず、依然として拒否される。
| 攻撃面 | ラボ |
|---|---|
172.x からの完全一致する DELETE / TRACE | 403、オリジンには到達しない |
HTTP/2 :method の大文字小文字混在 | 大文字小文字を区別せずトークン化、依然として拒否 |
ATS キャッシュ操作としての大文字小文字混在 purge / push | オリジンはその動詞を認識したが、キャッシュパスは閉じたまま |
CONNECT 宛先拒否 (0.0.0.0/8、RFC1918、リンクローカル、::ffff:0:0/96) | デフォルトの ip_allow.yaml によるアウトバウンド |
remap_required: 1 のミス | 404、オープンリレーにはならない |
| 反転された空の非標準 remap ACL | CHANGELOG の修正が維持された |
CVE-2026-33267 のホップバイホップ / @ ストリップ | このピンでは閉じている |
デフォルトの ip_allow.yaml は標準のリモートメソッド ACL である。YAML の読み込みは hdrtoken_tokenize (大文字小文字を区別しない) を使用する。DENY の反転により _method_mask = ALL & ~listed が設定され、空の非標準リストとともに _deny_nonstandard_methods = true が設定される (IPAllow.cc:545-548)。
HTTP/1 のパースは hdrtoken_method_tokenize でトークン化する。DFA は大文字小文字を区別しないが、その後ヘルパーがリクエストバイトを既知の文字列と strncmp で比較し、大文字小文字が一致しない場合は -1 を返す:
retval = hdrtoken_tokenize(string, string_len, &string_out);
if (retval >= 0) {
if (strncmp(string, string_out, string_len) != 0) {
// Not a case match
retval = -1;
}
}
EndRemapRequest は method == -1 に対して isNonstandardMethodAllowed を問い合わせます(IPAllow.h:365-376)。非標準メソッド集合が空で、非標準メソッドを拒否する設定の場合、!method_in_set となるため、大文字小文字混在は許可されます。is_this_http_method_supported(-1) は false です。METHOD_NOT_SUPPORTED は ProxyMode_t::TUNNELLING を設定して true を返します。ドキュメントには、ATS が未知のメソッドをオリジンへ転送すると記載されています。TUNNELLING ではキャッシュ検索はスキップされます。
HTTP/2 の :method は HTTPHdr::method_set -> hdrtoken_tokenize を経由し、大文字小文字のチェックはありません。H2 の delete は DELETE になり、拒否されます。この残存部分は HTTP/1 です。
誤った方向性:RFC 9110 の大文字小文字を区別するオリジンが拒否リストを無効化するとみなすこと(ATS キャッシュの PURGE/PUSH は引き続き閉じたまま。オリジンへの DELETE/TRACE が残存部分です)。127.0.0.1 から curl を実行すること(ALL を許可)。キャッシュパージを主張すること。hop-by-hop を再申請すること。
茶番:リバースシェル。オラクルは、大文字化された 403 の後にオリジン上に現れる証人文字列です。
python3 ats-ipallow-method-case-Abraxas-Labs.py
または
cd lab
./run.sh
ループバック 127.0.0.1:18710。Compose プロジェクト ats-ipallow-method-case。イメージ ats-10.2.0-lab:local(10.2.0 のソースビルド)。攻撃者サイドカーは 172.x 上にあり、localhost の ALL が deny を隠さないようにしている。Origin はメソッドの大文字小文字を折りたたむ。ウィットネス ATS-IPALLOW-METHOD-CASE-WITNESS。最終行:
SUCCESS ats-ipallow-method-case how=live control=DELETE/TRACE-403 poc=delete/DeLeTe/trace-tunneled cache-purge-push=closed ATS-IPALLOW-METHOD-CASE-WITNESS
HTTP/1 メソッドを、YAML と HTTP/2 がすでに行っているのと同じ方法(nocase)でトークン化するか、未知のメソッドの TUNNEL より前に ip_allow.yaml の deny 名を nocase で照合します。キャッシュの PURGE/PUSH は既知の wksidx のままにします。拒否された既知のメソッドの大文字小文字違いを新しいメソッドとして扱わないでください。
b1df7334b39a878971c376da849e8da4984918b6)HdrToken.cc hdrtoken_method_tokenizeIPAllow.cc DENY 反転IPAllow.h isNonstandardMethodAllowedHttpTransact.cc METHOD_NOT_SUPPORTED TUNNELip_allow.yaml.default