
Apache Traffic Server 10.2.0 — высокий уровень — удалённо — остаточные привилегии — fail-open ACL в плагине realip
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 приводит к fail-open в remap @src_ip. Если realip не вызывает TSHttpTxnVerifiedAddrSet, _verified_addr остаётся AF_UNSPEC. Субъект PLUGIN никогда не равен nullptr, поэтому откат к PEER никогда не выполняется. ats_is_ip ложно, @src_ip пропускается, ip_matches остаётся истинным. Allow-list remap совпадает с недоверенным клиентом.
По умолчанию acl.subjects — PEER. realip отсутствует в стандартном plugin.config. Сессионный ip_allow.yaml никогда не читает PLUGIN. Классический X-Forwarded-For-от-кого-угодно закрыт (требуется trustedAddress; заголовок должен быть единственным адресом в формате inet_pton).
| ID | CVE пока нет |
| Класс | Остаточные привилегии (fail-open ACL remap) |
| Доступ | Удалённый (неаутентифицированный HTTP извне trustedAddress) |
| 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 |
| Аутентификация | нет. Клиент не входит в trustedAddress. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18770 |
Я зафиксировал публичный тег 10.2.0 и коммит b1df7334. Лаборатория — это собранный из исходников обратный прокси ats-10.2.0-lab:local на loopback. CONTROL PEER 403. PLUGIN 200. Сессионный PURGE по-прежнему 403.
Обратиться к ATS с загруженным экспериментальным realip.so и proxy.config.acl.subjects: PLUGIN (или PLUGIN,PEER). Remap разрешает @src_ip=10.0.0.0/8. Подключиться с адреса вне trustedAddress.
| Метод | Точка срабатывания | Привилегия |
|---|---|---|
HTTP с 172.x вне trustedAddress к remap @src_ip=10.0.0.0/8 | realip пропускает TSHttpTxnVerifiedAddrSet (address_setter.cc:29-38); субъект PLUGIN всегда присутствует (UrlRewrite.cc:462-473); пропускает @src_ip, когда !ats_is_ip (:495-514) | Целостность (доказано в лаборатории): ACL remap совпадает. Origin 200 ATS-REALIP-PLUGIN-ACL-WITNESS. CONTROL acl.subjects=PEER — 403. |
То же плюс Client-IP: 10.1.2.3 от недоверенного узла | simple.cc verify ложно; заголовок игнорируется | Целостность (доказано в лаборатории): по-прежнему fail-open 200. Это не подмена проверенного адреса. |
Тот же клиент PURGE | сессионный ip_allow.yaml PEER | Закрыто (доказано в лаборатории): 403. PLUGIN никогда не переписывает ACL соединения. |
Хост без @src_ip | карта по умолчанию | Закрыто (доказано в лаборатории): тело DENIED, без witness. |
Доказано в лаборатории vs выведено логически: PLUGIN 200, PEER 403, PURGE 403, запрещённая карта, fail-open недоверенного заголовка — это лаборатория. То, что затем предоставляет origin, выведено из remap, который должен был быть только для 10/8.
Требуется: экспериментальный realip.so плюс acl.subjects=PLUGIN (или PLUGIN,PEER). Переназначение белого списка @src_ip. Не по умолчанию.
| Поверхность | Лаборатория |
|---|---|
CONTROL acl.subjects=PEER | 403 на той же карте @src_ip |
Сессия ip_allow.yaml | атакующий PURGE 403 |
Карта без @src_ip | DENIED |
Пустой trustedAddress | никогда не проверяет; всё ещё fail-open только когда subjects — PLUGIN |
| Классический XFF-от-кого-угодно | закрыт. Заголовок должен быть одиночным адресом inet_pton от доверенного пира |
SNI ip_allow | только PEER/PROXY; рукопожатие происходит до HTTP-заголовков |
Subjects по умолчанию PEER | остаток не применяется |
Это не классический остаток «доверять X-Forwarded-For от кого угодно». Остаток — это документированный путь PLUGIN remap 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. Sidecar атакующего 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
Считать PLUGIN недоступным, когда get_verified_client_addr возвращает AF_UNSPEC (или заставить геттер возвращать nullptr, как в TSHttpTxnVerifiedAddrGet). Тогда сработает запасной вариант PEER. Не пропускайте @src_ip, когда указатель субъекта не равен null, но не является IP-адресом. При использовании списка разрешённых — отказывать по умолчанию (fail closed).
До этого оставляйте acl.subjects в значении PEER, если вы загружаете realip только для логирования. Не устанавливайте PLUGIN, если только каждый клиент, который может попасть под remap, уже не является доверенным прокси.
b1df7334b39a878971c376da849e8da4984918b6)plugins/experimental/realip/address_setter.ccsrc/proxy/http/remap/UrlRewrite.cc PerformACLFilteringinclude/proxy/ProxyTransaction.h get_verified_client_addr