
Скрипты обнаружения для Pi-hole FTLDNS RCE (CVE-2026-35517) через инъекцию перевода строки, включая сканер на Python и Nmap NSE-скрипт для оценки уязвимости на основе версии.
Удалённое выполнение кода в движке FTLDNS от Pi-hole (версии 6.0–6.5) позволяет аутентифицированному злоумышленнику внедрять произвольные директивы конфигурации dnsmasq, встраивая символы новой строки (\n) в параметр API dns.upstreams. Поскольку dnsmasq поддерживает директивы, выполняющие команды оболочки, эта инъекция новой строки напрямую приводит к полному выполнению команд на хост-системе.
Это не просто отдельная ошибка, а целый класс инъекций, затрагивающий пять различных параметров конфигурации, все из которых были исправлены вместе в FTL v6.6.
| Поле | Детали |
|---|---|
| ID CVE | CVE-2026-35517 |
| Вендор | Pi-hole Project |
| Продукт | FTLDNS (pihole-FTL) |
| Затронутые версии | 6.0 до < 6.6 |
| CVSS v3.1 | 8.8 (Высокий) |
| CWE | CWE-93 — Некорректная нейтрализация CRLF-последовательностей |
| Вектор атаки | Сеть |
| Аутентификация | Требуется (доступ к админ-панели/API Pi-hole) |
| Взаимодействие с пользователем | Нет |
| Опубликовано | 7 апреля 2026 г. |
| Исправлено в | FTL v6.6 (выпущена 3 апреля 2026 г.) |
| Обнаружил | T0X1Cx |
| Связанные уведомления | GHSA-23w8-7333-p9fj, GHSA-wxhv-w77q-6qwp, GHSA-28g5-gg88-wh5m, GHSA-fqv2-qhfh-ghcj, GHSA-vfmq-jrx3-wv3c |
Pi-hole — один из самых широко развёрнутых DNS-сверхфильтров (sinkhole) в мире. Он работает в вашей сети, обрабатывает DNS-запросы и блокирует рекламу и трекеры на уровне DNS, прежде чем они достигнут вашего браузера. Он используется повсюду: от одиночных Raspberry Pi в квартирах до корпоративных развёртываний, защищающих тысячи устройств.
FTLDNS (Faster Than Light DNS) — это основной движок Pi-hole. Это собственная модификация/обёртка вокруг dnsmasq, известного DNS- и DHCP-сервера. FTLDNS отвечает за:
Вот ключевая деталь: FTLDNS генерирует файлы конфигурации dnsmasq из пользовательских настроек через свой API. Если вы меняете вышестоящий DNS-сервер в админ-панели Pi-hole, FTLDNS записывает это значение в файл конфигурации dnsmasq и перезапускает службу. Именно в этом пути записи и находится уязвимость.
+------------------+ +------------------+ +------------------+
| Панель | API/Web | Движок FTLDNS | Запись конфиг.| dnsmasq |
| администратора | ---------> | (pihole-FTL) | ------------> | (DNS/DHCP) |
| (Web UI) | +------------------+ +------------------+
+------------------+ | |
Читает настройки, Читает конфигурацию,
записывает конфигурацию обслуживает DNS/DHCP
файлы на диск для сети
Когда администратор меняет вышестоящие DNS-серверы через веб-интерфейс или API Pi-hole, поток выглядит так:
Параметр dns.upstreams предназначен для приёма адресов DNS-серверов, таких как 8.8.8.8 или 1.1.1.1. FTLDNS записывает их в конфигурацию dnsmasq как директивы server=:
# Обычный ввод: "8.8.8.8"
# Генерирует:
server=8.8.8.8
Проблема: FTLDNS не очищает символы новой строки во вводе. Злоумышленник может внедрить \n, чтобы выйти за пределы предполагаемой директивы server= и внедрить совершенно новые строки конфигурации:
# Вредоносный ввод: "8.8.8.8\ndhcp-option=6,evil.dns.server"
# Генерирует:
server=8.8.8.8
dhcp-option=6,evil.dns.server
Уже одно это вызывало бы беспокойство (угон DNS через инъекцию DHCP-опций). Но становится ещё хуже.
dnsmasq поддерживает директиву конфигурации под названием dhcp-option, которая может ссылаться на внешние скрипты, и, что более важно, поддерживает несколько директив, которые могут выполнять команды в определённых сценариях. Цепочка эксплуатации выглядит так:
Шаг 1: Злоумышленник аутентифицируется в Pi-hole
(учётные данные по умолчанию, слабый пароль, CSRF, скомпрометированная сессия)
Шаг 2: Злоумышленник отправляет API-запрос на обновление dns.upstreams:
POST /api/dns/upstream
{
"upstreams": ["8.8.8.8\n<вредоносная директива dnsmasq>"]
}
Шаг 3: FTLDNS записывает значение в файл конфигурации dnsmasq
без очистки символа новой строки
Шаг 4: Внедрённая директива dnsmasq интерпретируется как
легитимный параметр конфигурации
Шаг 5: В зависимости от внедрённой директивы злоумышленник достигает:
- Угона DNS (перенаправление всех DNS-запросов)
- Отравления DHCP (отправка вредоносных конфигураций клиентам)
- Выполнения команд через скриптовые возможности dnsmasq
- Записи файлов в произвольные пути
Ключевой вывод: это не эксплуатация уязвимости dnsmasq — dnsmasq работает как задумано. Уязвимость в том, что FTLDNS позволяет недоверенному вводу просачиваться в файл конфигурации, превращая API управления конфигурацией в точку произвольной инъекции конфигурации.
Исследователь (T0X1Cx) обнаружил, что тот же паттерн инъекции новой строки затрагивает пять различных параметров конфигурации FTLDNS. Это системная проблема — коду не хватало очистки ввода во всех местах:
| Уведомление | Параметр | Что он контролирует |
|---|---|---|
| GHSA-23w8-7333-p9fj | dns.upstreams | Вышестоящие DNS-серверы |
| GHSA-wxhv-w77q-6qwp | dns.hostRecord | Пользовательские DNS-записи хостов |
| GHSA-28g5-gg88-wh5m | dns.cnameRecords | Сопоставления CNAME-записей |
| GHSA-fqv2-qhfh-ghcj | dhcp.leaseTime | Продолжительность DHCP-аренды |
| GHSA-vfmq-jrx3-wv3c | dhcp.hosts | Статические назначения DHCP-хостов |
Каждый из этих параметров записывается в файлы конфигурации dnsmasq, и каждый не очищал символы новой строки. Исправление в FTL v6.6 добавило надлежащую проверку ввода, которая отклоняет символы новой строки (и другие управляющие символы) во всех параметрах конфигурации.
На хост-системе Pi-hole:
В сети (нисходящее воздействие):
Факторы усиления риска:
| Версия | Статус |
|---|---|
| FTLDNS 6.6+ | Исправлено |
| FTLDNS 6.0 – 6.5 | Уязвимо |
| FTLDNS 5.x и более ранние | Не затронуты (другая архитектура API) |
Чтобы проверить свою версию:
pihole -v
# или
pihole-FTL --version
Высокий риск:
Умеренный риск:
Более низкий риск (но всё равно обновитесь):
Скрипт на Python обнаруживает уязвимые экземпляры Pi-hole на основе анализа версии.
Как это работает:
Никакие инъекционные нагрузки не отправляются. Тест полностью только для чтения и безопасен.
Использование:
# Установка зависимостей
pip install -r requirements.txt
# Одиночная цель (HTTP, порт по умолчанию 80)
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1
# Пользовательский порт
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t pi.hole -p 8080
# Режим HTTPS (автоматически переключается на порт 443)
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 10.0.0.1 --https
# Массовое сканирование из файла
python CVE-2026-35517_PiHole_FTLDNS_detector.py -f targets.txt
# Вывод JSON, сохранённый в файл
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1 --json -o results.json
# Увеличенный таймаут
python CVE-2026-35517_PiHole_FTLDNS_detector.py -t 192.168.1.1 --timeout 20
Параметры:
| Флаг | Описание | По умолчанию |
|---|---|---|
-t, --target | Целевой IP или имя хоста | — |
-f, --file | Файл с целями, по одной на строку (поддерживаются комментарии #) | — |
-p, --port | Целевой порт | 80 |
--https | Использовать HTTPS (автоматически переключает порт на 443, если порт 80) | Выкл. |
--timeout | Таймаут соединения в секундах | 10 |
--json | Вывод в формате JSON | Выкл. |
-o, --output | Сохранить результаты в файл | — |
Пример вывода:
╔══════════════════════════════════════════════════════════════╗
║ CVE-2026-35517 - Детектор RCE Pi-hole FTLDNS ║
║ Инъекция новой строки в dns.upstreams → Выполнение команд ║
║ CVSS: 8.8 (Высокий) | Затрагивает: FTLDNS 6.0 - 6.5 ║
╚══════════════════════════════════════════════════════════════╝
[*] Сканирование 192.168.1.1:80...
Цель: 192.168.1.1:80
============================================================
[*] Pi-hole обнаружен
Админ-интерфейс: Доступен
API доступен: Да
Версия FTL: v6.4
Версия Core: v6.3
Версия Web: v6.4
Оценка CVE-2026-35517:
[УЯЗВИМО] FTLDNS 6.4 находится в уязвимом диапазоне (6.0 - 6.5).
Немедленно обновитесь до FTL v6.6 или новее.
Связанные уязвимости (также исправлены в FTL v6.6):
[-] GHSA-wxhv-w77q-6qwp: RCE через инъекцию новой строки в dns.hostRecord
[-] GHSA-28g5-gg88-wh5m: RCE через инъекцию новой строки в dns.cnameRecords
[-] GHSA-fqv2-qhfh-ghcj: RCE через инъекцию новой строки в dhcp.leaseTime
[-] GHSA-vfmq-jrx3-wv3c: RCE через инъекцию новой строки в dhcp.hosts
Устранение:
1. Обновите Pi-hole FTL до версии 6.6 или новее
2. Выполните: pihole -up
3. Проверьте с помощью: pihole -v
4. Проверьте контроль доступа к API и настройки аутентификации
5. Проверьте журналы на признаки эксплуатации (необычные изменения DNS-конфигурации)
# Установка NSE-скрипта
sudo cp CVE-2026-35517_PiHole_FTLDNS.nse /usr/share/nmap/scripts/
sudo nmap --script-updatedb
# Базовое сканирование
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS <цель>
# Сканирование распространённых портов Pi-hole
nmap -p 80,443,8080,4711 --script CVE-2026-35517_PiHole_FTLDNS <цель>
# Сканирование подсети — поиск всех экземпляров Pi-hole в сети
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS 192.168.1.0/24
# В сочетании с определением версии
nmap -sV -p 80,443 --script CVE-2026-35517_PiHole_FTLDNS <цель>
# Сканирование целей из файла
nmap -p 80 --script CVE-2026-35517_PiHole_FTLDNS -iL targets.txt
Пример вывода Nmap:
PORT STATE SERVICE
80/tcp open http
| CVE-2026-35517_PiHole_FTLDNS:
| УЯЗВИМО:
| RCE Pi-hole FTLDNS через конфигурацию вышестоящего DNS
| Состояние: УЯЗВИМО
| ID: CVE:CVE-2026-35517
| Фактор риска: Высокий (CVSS: 8.8)
| Дата раскрытия: 2026-04-07
| Дополнительная информация:
| Версия FTL: v6.4
| Версия Core: v6.3
| Версия Web: v6.4
| Связанные уведомления, также исправленные в FTL v6.6:
| GHSA-wxhv-w77q-6qwp (инъекция в dns.hostRecord)
| GHSA-28g5-gg88-wh5m (инъекция в dns.cnameRecords)
| GHSA-fqv2-qhfh-ghcj (инъекция в dhcp.leaseTime)
| GHSA-vfmq-jrx3-wv3c (инъекция в dhcp.hosts)
| Устранение: Обновитесь до Pi-hole FTL v6.6+ (pihole -up)
| Ссылки:
| https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2026-35517
|_ https://github.com/pi-hole/FTL/security/advisories/GHSA-23w8-7333-p9fj
Если у вас есть SSH-доступ к хосту Pi-hole:
# Проверка версии FTL
pihole-FTL --version
# Или через CLI Pi-hole
pihole -v
# Проверка через API (v6)
curl -s http://pi.hole/api/info/version | python3 -m json.tool
# Проверка через API (v5)
curl -s http://pi.hole/admin/api.php?versions | python3 -m json.tool
Если версия FTL находится в диапазоне от 6.0 до 6.5 (включительно), вы уязвимы.
На что обращать внимание:
/etc/dnsmasq.d/ и /etc/pihole/ на наличие неожиданных директивКоманды для расследования:
# Проверка конфигураций dnsmasq на внедрённые строки
grep -r "dhcp-option\|addn-hosts\|conf-file\|log-facility" /etc/dnsmasq.d/
# Проверка недавних изменений конфигурации
find /etc/pihole /etc/dnsmasq.d -mtime -7 -ls
# Просмотр отладочного журнала Pi-hole
pihole -d
# Проверка запущенных процессов на аномалии
ps aux | grep -E "dnsmasq|pihole"
# Просмотр crontab на предмет постоянства
crontab -l
cat /etc/crontab
ls -la /etc/cron.d/
Немедленное действие — обновитесь сейчас:
# Обновление Pi-hole (включает FTL, Web и Core)
pihole -up
# Проверка обновления
pihole -v
# Версия FTL должна быть >= 6.6
Если вы не можете обновиться немедленно:
pihole -a -pДействия после установки патча:
Kerem Oruç — Инженер по кибербезопасности