
PaperCut NG의 인증 타이밍 부채널을 통한 사용자 이름 열거
| 필드 | 세부 정보 |
|---|---|
| CVE ID | CVE-2026-8794 |
| 제품 | PaperCut NG |
| 영향받는 버전 | 25.0.11 (Build 75758) 및 이전 버전 |
| CWE | CWE-208 — 관측 가능한 타이밍 불일치 |
| CVSS 점수 | 3.7 (낮음) — 단독 기준, CVE-2026-8793과 연계 시 위험도 상승 |
| 연구자 | Vivien LEBAS (@Hazaz) |
| 보고일 | 2026년 5월 |
| 상태 | 패치 완료 — PaperCut NG 26.0.3 |
PaperCut NG의 인증 엔드포인트는 존재하는 계정과 존재하지 않는 계정에 대한 로그인 시도 간에 측정 가능한 타이밍 차이를 보입니다. 일치하는 계정이 발견된 경우에만 bcrypt 비밀번호 해싱이 수행되기 때문에 발생하는 이 차이로 인해, 인증되지 않은 공격자가 HTTP 응답 시간을 측정하여 특정 사용자명이 시스템에 존재하는지 여부를 안정적으로 판별할 수 있습니다.
CVE-2026-8793(무차별 대입 공격 보호 부재)과 결합하면, 이 취약점은 완전한 자격 증명 탈취 공격 체인을 가능하게 합니다: 먼저 유효한 사용자명을 열거한 다음, 잠금 위험 없이 무제한의 표적 비밀번호 추측을 수행할 수 있습니다.
타이밍 차이는 전형적인 구현 패턴에서 비롯됩니다. 애플리케이션은 제출된 사용자명과 일치하는 계정이 데이터베이스에서 발견된 경우에만 bcrypt 비교를 호출합니다. 존재하지 않는 계정의 경우 인증 루틴은 bcrypt가 호출되기 전에 조기 종료되어 측정 가능할 정도로 더 짧은 응답 시간이 발생합니다.
Valid username: DB lookup (found) → bcrypt comparison → failure response ~2.1s avg
Invalid username: DB lookup (not found) → immediate failure response ~0.2s avg
이 패턴은 잘 문서화되어 있습니다(CWE-208 참조). 표준 해결책은 계정이 존재하지 않을 때에도 더미 bcrypt 비교를 수행하여 두 코드 경로 간 응답 시간을 동일하게 만드는 것입니다.
통제된 조건에서 PaperCut NG 로그인 엔드포인트에 대해 인증 시도를 수행했습니다:
--write-out "%{time_total}" 옵션을 사용한 curl, 모든 경우 의도적으로 잘못된 비밀번호 사용두 분포는 겹침이 전혀 없어, 적당한 수준의 네트워크 지터가 있어도 열거를 안정적으로 수행할 수 있습니다.
# Measure response time for an existing account (wrong password)
curl -s -o /dev/null -w "%{time_total}\n" \
-X POST "http://<target>:9191/app" \
-H "Origin: http://<target>:9191" \
--data "service=direct/1/Home/%24Form&inputUsername=admin&inputPassword=wrongpassword"
# Output: ~2.1s
# Measure response time for a non-existent account
curl -s -o /dev/null -w "%{time_total}\n" \
-X POST "http://<target>:9191/app" \
-H "Origin: http://<target>:9191" \
--data "service=direct/1/Home/%24Form&inputUsername=zz_doesnotexist_zz&inputPassword=wrongpassword"
# Output: ~0.2s
~0.5초를 크게 초과하는 응답 시간은 유효한 사용자명을 안정적으로 나타냅니다. 간단한 스크립트를 통해 일반적인 기업 명명 패턴(firstname.lastname, flastname 등)의 단어 목록에 대해 열거를 자동화할 수 있습니다.
이 발견은 2단계 공격의 첫 단계로 사용될 때 가장 큰 영향력을 발휘합니다:
1단계 (CVE-2026-8794, 본 발견) — 인증 응답 시간을 측정하여 유효한 PaperCut NG 계정 이름 목록을 구축합니다. 기업 환경에서는 공개 소스(LinkedIn, 회사 웹사이트, 이메일 서명)에서 얻은 firstname.lastname 조합의 짧은 단어 목록으로 충분한 경우가 많습니다.
2단계 (CVE-2026-8793) — 확인된 유효 계정에 대해 무제한 비밀번호 시도를 수행합니다. 속도 제한이나 잠금이 없으므로 자격 증명 스터핑 또는 비밀번호 스프레이 공격을 완전히 온라인 상태에서 전속도로 수행할 수 있습니다.
TCP/9191에 네트워크 접근 권한이 있는 인증되지 않은 공격자는 다음을 수행할 수 있습니다:
일반적인 기업 배포 환경에서 PaperCut 사용자명은 Active Directory 계정을 그대로 반영합니다. 따라서 확인된 유효한 PaperCut 사용자명은 확인된 유효한 도메인 계정 이름이기도 하며, 정찰 가치가 PaperCut 자체를 넘어 확대됩니다.
관리자를 위한 조치 (임시 완화):
공급업체를 위한 조치:
제출된 사용자명이 어떤 계정과도 일치하지 않을 때 상수 시간 더미 bcrypt 비교를 수행하여, 계정 존재 여부와 관계없이 응답 시간이 동일해지도록 보장합니다:
# Pseudocode — constant-time authentication pattern
user = db.find_user(username)
if user:
valid = bcrypt.verify(password, user.password_hash)
else:
bcrypt.verify(password, DUMMY_HASH) # always run, result discarded
valid = False
이는 인증 흐름에서 CWE-208을 완화하기 위한 잘 정립된 패턴입니다.
| 날짜 | 이벤트 |
|---|---|
| 2026년 5월 9일 | PaperCut 보안 팀에 초기 보고서 제출 |
| 2026년 5월 10일 | 확인 응답 수신 |
| 2026년 5월 | PaperCut(CNA)이 CVE-2026-8794 배정 |
책임 있는 공개 원칙에 따라 공개되었습니다. 전체 기술 세부 정보는 공개 전에 PaperCut 보안 팀과 공유되었습니다.
연구자: Vivien LEBAS — @Hazaz
| 조건 | 최소 (s) | 최대 (s) | 평균 (s) | 표준 편차 |
|---|
존재하는 계정 (admin) | 2.08 | 2.19 | 2.13 | 0.031 |
존재하지 않는 계정 (zz_doesnotexist_zz) | 0.18 | 0.24 | 0.21 | 0.018 |
| 차이 | ~1.92s |
| 2026년 8월 | 패치 릴리스 — PaperCut NG 26.0.3 |
| 2026년 8월 | 공급업체와 협력하여 공개 공지 |