
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 и TUNNEL к remap-источнику от имени uid ATS. Разбор YAML и @method в remap нечувствителен к регистру. H1 выполняет токенизацию, затем strncmp байтов запроса и возвращает -1 при несовпадении регистра. Инверсия запрета трактует этот неизвестный токен как разрешённый. HTTP/2 :method нечувствителен к регистру и остаётся запрещённым. PURGE/PUSH кэша по-прежнему требуют известного wksidx, поэтому смешанный регистр не очищает и не отправляет кэш.
Это остаток ACL методов входящих запросов по умолчанию, а не CVE-2026-33267 (hop-by-hop) и не инвертированный ACL remap для пустого нестандартного метода (закрыт на этом пине).
| ID | CVE пока нет |
| Класс | Остаточная привилегия |
| Доступ | Удалённый (неаутентифицированный HTTP/1 от клиента не с loopback) |
| 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. Последний стабильный на 17 авг. 2026. Образ, собранный из исходников, не гаджет.
Достичь типичного обратного прокси (remap_required: 1 плюс один map) по HTTP/1 с не-loopback адреса. 127.0.0.1 разрешён для ALL. Пустой plugin.config. ip_allow.yaml по умолчанию.
| Метод | Приёмник | Привилегия |
|---|---|---|
HTTP/1 delete / DeLeTe после remap из sidecar 172.x | hdrtoken_method_tokenize, затем process_quick_http_filter, затем TUNNEL METHOD_NOT_SUPPORTED (HdrToken.cc:512-528, HttpTransact.cc:6855-6858) | Целостность (доказано в лаборатории): источник 200 DELETED ATS-IPALLOW-METHOD-CASE-WITNESS. Верхний регистр DELETE — 403. Метод источника от имени uid ATS. |
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 выведено: запрет верхнего регистра, TUNNEL DELETE/TRACE со смешанным регистром, закрытие PURGE/PUSH кэша: лаборатория. DELETE/TRACE к источнику — только если этот источник сворачивает регистр метода (IIS / некоторые Java). Источники, чувствительные к регистру по RFC 9110 (nginx, httpd, Go), отвечают 501. Источник в лаборатории сворачивает регистр.
Требуется: HTTP/1 от клиента, не являющегося loopback. remap_required: 1 плюс один map. По умолчанию входящие PURGE/PUSH/DELETE/TRACE запрещены. HTTP/2 :method без учёта регистра по-прежнему запрещён.
| Поверхность | Лаборатория |
|---|---|
Точный регистр DELETE / TRACE с 172.x | 403, origin не затронут |
HTTP/2 :method в смешанном регистре | токенизация без учёта регистра, всё равно запрещено |
purge / push в смешанном регистре как операции кэша ATS | origin увидел глагол; путь кэша остался закрыт |
Запрет назначения CONNECT (0.0.0.0/8, RFC1918, link-local, ::ffff:0:0/96) | исходящий по умолчанию ip_allow.yaml |
Промах remap_required: 1 | 404, а не открытый релей |
| Инвертированный ACL remap с пустым nonstandard | исправление из CHANGELOG удержалось |
CVE-2026-33267 hop-by-hop / удаление @ | закрыто на этом пине |
По умолчанию ip_allow.yaml — это штатный ACL удалённых методов. Загрузка YAML использует hdrtoken_tokenize (без учёта регистра). Затем инверсия DENY устанавливает _method_mask = ALL & ~listed и _deny_nonstandard_methods = true с пустым списком nonstandard (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 запрашивает isNonstandardMethodAllowed для method == -1 (IPAllow.h:365-376). Пустой набор нестандартных методов плюс запрет нестандартных даёт !method_in_set, поэтому метод со смешанным регистром разрешён. is_this_http_method_supported(-1) возвращает false. METHOD_NOT_SUPPORTED устанавливает ProxyMode_t::TUNNELLING и возвращает true. Документация говорит, что ATS пересылает неизвестные методы на origin. Поиск в кэше пропускается в режиме TUNNELLING.
HTTP/2 :method проходит через HTTPHdr::method_set -> hdrtoken_tokenize без проверки регистра. H2 delete превращается в DELETE и запрещается. Этот остаток относится к HTTP/1.
Неверные пути: считать, что чувствительные к регистру origin из RFC 9110 делают список запретов бесполезным (кэш ATS PURGE/PUSH остаются закрытыми; origin DELETE/TRACE — это и есть остаток); выполнять curl с 127.0.0.1 (разрешает ALL); заявлять об очистке кэша; повторно подавать как hop-by-hop.
Театральность: обратная оболочка. Оракул — это строка-свидетель на origin после 403 в верхнем регистре.
python3 ats-ipallow-method-case-Abraxas-Labs.py
или
cd lab
./run.sh