
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 | 높음: 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 및 map 하나. |
| 라이선스 | GNU Affero GPL v3.0 |
| 랩 | 127.0.0.1:18710 전용. 이미지 ats-10.2.0-lab:local. |
태그 10.2.0, 커밋 b1df7334b39a878971c376da849e8da4984918b6을 핀했습니다. 최신 안정 버전 2026년 8월 17일. 소스 빌드 이미지이며 가젯이 아닙니다.
비루프백 주소에서 HTTP/1로 일반적인 리버스 프록시(remap_required: 1 및 map 하나)에 도달합니다. 127.0.0.1은 모두 허용입니다. 빈 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. |
| 동일한 대소문자 혼용 요청 | 오리진 홉 하나 추가 | 가용성 (랩 입증): 프로세스 종료 아님. |
랩 입증 vs 추론: 대문자 거부, 대소문자 혼용 DELETE/TRACE 터널, 캐시 PURGE/PUSH 종료: 랩. 오리진 DELETE/TRACE는 해당 오리진이 메서드 대소문자를 폴딩하는 경우에만(IIS / 일부 Java). RFC 9110 대소문자 구분 오리진(nginx, httpd, Go)은 501로 응답. 랩 오리진은 대소문자를 폴딩함.
요구 사항: 비루프백 클라이언트로부터의 HTTP/1. remap_required: 1과 하나의 map. PURGE/PUSH/DELETE/TRACE에 대한 기본 인바운드 거부. HTTP/2 :method는 대소문자 무시(nocase)로도 여전히 거부됨.
| 표면 | 실험실 |
|---|---|
172.x에서의 정확한 대소문자 DELETE / TRACE | 403, 오리진에 도달하지 않음 |
HTTP/2 :method 혼합 대소문자 | nocase 토큰화, 여전히 거부됨 |
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(nocase)를 사용합니다. 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
Loopback 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은 메서드 대소문자를 병합함. Witness 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
YAML과 HTTP/2가 이미 하는 것과 동일한 방식(nocase)으로 HTTP/1 메서드를 토큰화하거나, 알 수 없는 메서드 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