
Apache Traffic Server 10.2.0 - 높음 - 원격 - 권한 잔여 - realip PLUGIN ACL fail-open
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가 fail-open됩니다. realip가 TSHttpTxnVerifiedAddrSet을 호출하지 않으면 _verified_addr는 AF_UNSPEC으로 남습니다. PLUGIN subject는 절대 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 fail-open) |
| 도달 범위 | 원격 (trustedAddress 외부에서 인증 없는 HTTP) |
| CWE | CWE-863 |
| CVSS | 높음: 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 subjects |
| 인증 | 없음. 클라이언트는 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 subject는 항상 존재 (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; 헤더 무시됨 | 무결성 (랩 입증): 여전히 fail-open 200. 검증된 주소의 스푸핑은 아님. |
동일 클라이언트 PURGE | 세션 ip_allow.yaml PEER | 차단됨 (랩 입증): 403. PLUGIN은 연결 ACL을 절대 재작성하지 않음. |
@src_ip 없는 호스트 | 기본 맵 | 차단됨 (랩 입증): 본문 DENIED, witness 없음. |
랩 입증 vs 추론: PLUGIN 200, PEER 403, PURGE 403, 거부된 맵, 신뢰할 수 없는 헤더 fail-open은 랩 결과입니다. 오리진이 그 후 부여하는 것은 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일 때만 여전히 fail-open |
| 누구로부터든 오는 클래식 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
Loopback 127.0.0.1:18770 (origin 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 폴백이 실행됩니다. subject 포인터가 null이 아니지만 IP가 아닌 경우 @src_ip를 건너뛰지 마십시오. 허용 목록에서는 fail closed로 처리하십시오.
그때까지는 로깅 목적으로만 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