
Pi-hole FTLDNS RCE(CVE-2026-35517) 개행 삽입 취약점 탐지 스크립트로, 버전 기반 취약점 평가를 위한 Python 스캐너와 Nmap NSE 스크립트를 포함합니다.
Pi-hole의 FTLDNS 엔진(버전 6.0~6.5)에서 원격 코드 실행 취약점이 발견되었습니다. 인증된 공격자가 dns.upstreams API 파라미터에 개행 문자(\n)를 삽입하여 임의의 dnsmasq 구성 지시문을 주입할 수 있습니다. dnsmasq는 셸 명령을 실행하는 지시문을 지원하므로, 이 개행 문자 주입은 호스트 시스템에서의 전체 명령 실행으로 직접 이어집니다.
이것은 단일 버그가 아니라 다섯 가지 서로 다른 구성 파라미터에 영향을 미치는 주입 클래스이며, 모두 FTL v6.6에서 함께 패치되었습니다.
| 필드 | 세부 정보 |
|---|---|
| CVE ID | CVE-2026-35517 |
| 공급업체 | Pi-hole 프로젝트 |
| 제품 | FTLDNS (pihole-FTL) |
| 영향받는 버전 | 6.0 ~ 6.6 미만 |
| CVSS v3.1 | 8.8 (높음) |
| CWE | CWE-93 — CRLF 시퀀스의 부적절한 중화 |
| 공격 벡터 | 네트워크 |
| 인증 | 필요 (Pi-hole 관리자/API 접근) |
| 사용자 상호작용 | 없음 |
| 공개일 | 2026년 4월 7일 |
| 패치 버전 | FTL v6.6 (2026년 4월 3일 출시) |
| 발견자 | T0X1Cx |
| 관련 권고 | GHSA-23w8-7333-p9fj, GHSA-wxhv-w77q-6qwp, GHSA-28g5-gg88-wh5m, GHSA-fqv2-qhfh-ghcj, GHSA-vfmq-jrx3-wv3c |
Pi-hole은 전 세계에서 가장 널리 배포된 DNS 싱크홀 중 하나입니다. 네트워크에 위치하여 DNS 쿼리를 처리하고, 광고와 추적기가 브라우저에 도달하기 전에 DNS 수준에서 차단합니다. 아파트의 단일 Raspberry Pi 설정부터 수천 대의 장치를 보호하는 엔터프라이즈 배포까지 다양한 환경에서 사용됩니다.
FTLDNS (Faster Than Light DNS)는 Pi-hole의 핵심 엔진입니다. 잘 알려진 DNS 및 DHCP 서버인 dnsmasq를 기반으로 한 커스텀 포크/래퍼입니다. FTLDNS는 다음을 처리합니다:
핵심 세부 사항은 다음과 같습니다: FTLDNS는 API를 통해 사용자가 제공한 설정에서 dnsmasq 구성 파일을 생성합니다. Pi-hole 관리 패널에서 업스트림 DNS 서버를 변경하면 FTLDNS가 해당 값을 dnsmasq 구성 파일에 쓰고 서비스를 다시 시작합니다. 취약점은 바로 이 쓰기 경로에 존재합니다.
+------------------+ +------------------+ +------------------+
| 관리 패널 | API/Web | FTLDNS 엔진 | 구성 쓰기 | dnsmasq |
| (Web UI) | ---------> | (pihole-FTL) | ------------> | (DNS/DHCP) |
+------------------+ +------------------+ +------------------+
| |
설정을 읽고, 구성을 읽고,
디스크의 구성 네트워크에 DNS/DHCP
파일에 씀 서비스 제공
관리자가 Pi-hole 웹 UI 또는 API를 통해 업스트림 DNS 서버를 변경하면 흐름은 다음과 같습니다:
dns.upstreams 파라미터는 8.8.8.8 또는 1.1.1.1과 같은 DNS 서버 주소를 수용하도록 설계되었습니다. 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
이것만으로도 우려되는 상황입니다 (DHCP 옵션 주입을 통한 DNS 하이재킹). 하지만 더 심각해집니다.
dnsmasq는 외부 스크립트를 참조할 수 있는 dhcp-option이라는 구성 지시문을 지원하며, 더 중요하게는 특정 시나리오에서 명령을 실행할 수 있는 여러 지시문을 지원합니다. 공격 체인은 다음과 같습니다:
1단계: 공격자가 Pi-hole에 인증합니다
(기본 자격 증명, 약한 비밀번호, CSRF, 세션 탈취)
2단계: 공격자가 dns.upstreams를 업데이트하는 API 요청을 보냅니다:
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 사용 (포트가 80이면 443으로 자동 전환) | 꺼짐 |
--timeout | 연결 타임아웃(초) | 10 |
--json | JSON 형식으로 출력 | 꺼짐 |
-o, --output | 결과를 파일로 저장 | — |
출력 예시:
╔══════════════════════════════════════════════════════════════╗
║ CVE-2026-35517 - Pi-hole FTLDNS RCE 탐지기 ║
║ 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: dns.hostRecord 개행 문자 주입을 통한 RCE
[-] GHSA-28g5-gg88-wh5m: dns.cnameRecords 개행 문자 주입을 통한 RCE
[-] GHSA-fqv2-qhfh-ghcj: dhcp.leaseTime 개행 문자 주입을 통한 RCE
[-] GHSA-vfmq-jrx3-wv3c: dhcp.hosts 개행 문자 주입을 통한 RCE
수정 조치:
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 <target>
# 일반적인 Pi-hole 포트 스캔
nmap -p 80,443,8080,4711 --script CVE-2026-35517_PiHole_FTLDNS <target>
# 서브넷 스캔 — 네트워크의 모든 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 <target>
# 파일에서 대상 스캔
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:
| 취약:
| 업스트림 DNS 구성을 통한 Pi-hole FTLDNS RCE
| 상태: 취약
| 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
Pi-hole 호스트에 SSH 접근 권한이 있는 경우:
# FTL 버전 확인
pihole-FTL --version
# 또는 Pi-hole CLI를 통해
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ç - 사이버보안 엔지니어