
Apache Traffic Server 10.2.0 — высокий уровень — локальная — остаточные привилегии — unix-сокет JSON-RPC в неограниченном режиме 0777
abraxaslabs.tech · github.com/abraxas · @abraxas_null · [email protected] · ats-jsonrpc-unrestricted
Класс: Остаточные привилегии (разведка) Доступ: Локальный
Apache Traffic Server 10.2.0 (b1df7334) - Apache Software Foundation
Unix-сокет JSON-RPC по умолчанию имеет restricted_api false. Поставляемый jsonrpc.yaml содержит только комментарии, поэтому побеждает инициализатор на C++. Режим привязки Linux SO_PEERCRED — 0777. Любой локальный uid, имеющий доступ к inode каталога rundir, подключается без токена и выгружает живые записи (включая пути к ключам SSL), а также 5-кортежи connection-tracker. Запись остаётся за SO_PEERCRED (euid == 0 или euid ATS). В таблице документации указано true / 0700; в коде и закомментированном примере — false / 0777.
Это не CVE-2026-58159 (ACL HTTP UDS-листенера). TCP/HTTP JSON-RPC отсутствует. Загрузка плагинов и запись конфигурации остаются запрещены для чужого uid.
| ID | CVE пока нет |
| Класс | Остаточные привилегии (разведка) |
| Доступ | Локальный (непривилегированный uid на хосте ATS) |
| CWE | CWE-276, CWE-284 |
| CVSS | Высокий: 7.1 CVSS:3.1/AV:L/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N |
| Продукт | Apache Traffic Server |
| Затронуто | 10.2.0 (b1df7334b39a878971c376da849e8da4984918b6) unix JSON-RPC по умолчанию |
| Аутентификация | отсутствует для неограниченных методов. Локальный доступ к файловой системе rundir. |
| Лицензия | GNU Affero GPL v3.0 |
| Лаборатория | только 127.0.0.1:18720. Образ ats-10.2.0-lab:local. |
Я зафиксировал тег 10.2.0, коммит b1df7334b39a878971c376da849e8da4984918b6. Образ собран из исходников.
Локальный uid на хосте ATS (не root, не euid ATS). RPC включён. Unix JSON-RPC включён. Типичный rundir 0755, принадлежит ATS. Сокет $RUNTIMEDIR/jsonrpc20.sock.
| Метод | Точка входа | Привилегия |
|---|---|---|
admin_lookup_records от uid 10000 на jsonrpc20.sock с правами 0777 | неограниченный JSON-RPC (RpcAdminPubHandlers.cc) | Разведка (подтверждено в лаборатории): живое значение proxy.config.proxy_name=ATS-JSONRPC-UNRESTRICTED-WITNESS, пути к ключам SSL etc/trafficserver, proxy.config.admin.user_id=nobody. Байты ключей в записях отсутствуют. |
get_connection_tracker_info | тот же сокет | Разведка (подтверждено в лаборатории): таблицы входящих/исходящих трекеров (пусты при отсутствии нагрузки). |
get_server_status, admin_host_get_status, admin_storage_get_device_status, filemanager.get_files_registry | тот же неограниченный бит | Разведка (предположительно): состояние drain, markdown хоста, пути к дискам кэша, абсолютные пути к конфигурации. |
admin_config_set_records от uid 10000 | ограничено SO_PEERCRED | Целостность: закрыто (подтверждено в лаборатории). Ошибка JSON-RPC 10 Unauthorized, Denied privileged API access for uid=10000. Запись-свидетель не изменена. |
| drain / очистка кэша / отключение хранилища | ограниченные методы | Доступность: закрыто для чужого uid (по исходникам). |
Подтверждено в лаборатории vs предположительно: сокет 0777, поиск от uid 10000 значений proxy_name / путей к ключам SSL, таблицы трекеров, отказ в записи, отсутствие TCP JSON-RPC: лаборатория. Прочие неограниченные методы чтения: предположительно, исходя из того же шлюза.
Требуется: локальный uid на хосте ATS. Unix JSON-RPC включён (по умолчанию). Linux SO_PEERCRED, чтобы неограниченная привязка была 0777. Rundir доступен (типично 0755).
| Поверхность | Лаборатория |
|---|---|
admin_config_set_records как uid 10000 | Неавторизовано; запись-свидетель не изменена |
| TCP / HTTP JSON-RPC | отсутствует; только HTTP 8080 / 18080 |
Загрузка плагина .so через RPC | SO_PEERCRED |
traffic_ctl с тем же uid | предполагаемый администратор |
Атомарные umask+bind при restricted_api = true | 0700, исправление из CHANGELOG сохранено |
| ACL HTTP UDS-листенера CVE-2026-58159 | не этот сокет |
RPC включён, если не задано rpc.enabled: false. Существует только CommType::UNIX. Поставляемый jsonrpc.yaml.default содержит только комментарии. Декодирование YAML записывает restrictedAccessApi только при наличии ключа. В противном случае:
bool restrictedAccessApi{
NON_RESTRICTED_API}; // ... 0700(default) or 0777
NON_RESTRICTED_API имеет значение false (IPCSocketServer.h:128-129). В комментарии сказано, что по умолчанию используется 0700. Инициализатор — это неограниченная константа.
Bind (IPCSocketServer.cc:310-342): restricted_api false плюс SO_PEERCRED -> режим 0777. Последнее предложение таблицы в документации говорит, что по умолчанию true. Код и закомментированный пример соответствуют false.
Неверные пути: считать true из документации значением по умолчанию; называть это RCE (запись запрещена); считать, что CVE-2026-58159 покрывает mgmt JSON-RPC; искать TCP-остаток старого traffic_manager XMLRPC.
Театральная постановка: запись от имени uid 10000. Оракул — это подложенный proxy_name плюс строки пути к ключу SSL, затем запрещённый набор.
python3 ats-jsonrpc-unrestricted-Abraxas-Labs.py
или
cd lab
./run.sh
Loopback 127.0.0.1:18720. Проект Compose ats-jsonrpc-unrestricted. Образ ats-10.2.0-lab:local. UID лаборатории 10000. Режим сокета 0777. Свидетель ATS-JSONRPC-UNRESTRICTED-WITNESS. Последняя строка:
SUCCESS ats-jsonrpc-unrestricted how=uds-0777-unrestricted-jsonrpc uid=10000 sock-mode=0777 lookup-proxy_name=ATS-JSONRPC-UNRESTRICTED-WITNESS ssl-key-path=etc/trafficserver tracker=ok write=unauthorized tcp-jsonrpc=absent ATS-JSONRPC-UNRESTRICTED-WITNESS
По умолчанию установить restricted_api в true и привязывать с правами 0700, как указано в таблице документации. Привести в соответствие закомментированный пример jsonrpc.yaml. Оставить неограниченное чтение за явным согласием. Запись уже требует SO_PEERCRED; не открывать её.