
Перебор имен пользователей через временной побочный канал аутентификации в PaperCut NG
| Field | Details |
|---|---|
| CVE ID | CVE-2026-8794 |
| Продукт | PaperCut NG |
| Затронутая версия | 25.0.11 (Build 75758) и более ранние |
| CWE | CWE-208 — Наблюдаемое расхождение во времени |
| CVSS Score | 3.7 (низкий) — самостоятельно; возрастает при комбинировании с CVE-2026-8793 |
| Исследователь | Vivien LEBAS (@Hazaz) |
| Сообщено | Май 2026 |
| Статус | Исправлено — 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 в контролируемых условиях:
curl с параметром --write-out "%{time_total}", во всех случаях намеренно неверный парольДва распределения показывают нулевое перекрытие, что делает перечисление надёжным даже при умеренном джиттере сети.
# 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.5s, достоверно указывает на действительное имя пользователя. Простой скрипт позволяет автоматизировать перечисление по списку слов с типовыми корпоративными схемами именования (firstname.lastname, flastname и т. д.).
Эта находка наиболее эффективна при использовании в качестве первого шага двухэтапной атаки:
Шаг 1 (CVE-2026-8794, данная находка) — Составьте список действительных имён учётных записей PaperCut NG, измеряя время ответа аутентификации. В корпоративной среде зачастую достаточно короткого списка слов из комбинаций firstname.lastname, полученных из открытых источников (LinkedIn, сайт компании, подписи электронной почты).
Шаг 2 (CVE-2026-8793) — Выполняйте неограниченные попытки подбора пароля против подтверждённых действительных учётных записей. Отсутствие ограничения скорости или блокировки означает, что любые атаки с подстановкой учётных данных (credential stuffing) или подбором паролей (password spraying) могут проводиться полностью онлайн на полной скорости.
Неаутентифицированный злоумышленник с сетевым доступом к 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 в процессах аутентификации.
| Date | Event |
|---|---|
| 9 мая 2026 | Первоначальный отчёт отправлен команде безопасности PaperCut |
Раскрыто в соответствии с принципами ответственного раскрытия уязвимостей. Полные технические детали были переданы команде безопасности PaperCut до публичного выпуска.
Исследователь: Vivien LEBAS — @Hazaz
| Condition | Min (s) | Max (s) | Mean (s) | Std Dev |
|---|
Существующая учётная запись (admin) | 2.08 | 2.19 | 2.13 | 0.031 |
Несуществующая учётная запись (zz_doesnotexist_zz) | 0.18 | 0.24 | 0.21 | 0.018 |
| Разница | ~1.92s |
| 10 мая 2026 |
| Получено подтверждение |
| Май 2026 | Назначен CVE-2026-8794 организацией PaperCut (CNA) |
| Август 2026 | Выпущено исправление — PaperCut NG 26.0.3 |
| Август 2026 | Публичное раскрытие скоординировано с вендором |