
مطابقة PCRE RegEx لـ Log4Shell CVE-2021-44228 IOC في سجلاتك
تمت كتابة التعبير النمطي (RegEx) التالي لمحاولة مطابقة مؤشرات استغلال ثغرة Log4Shell (CVE-2021-44228 و CVE-2021-45046).
إذا كنت تستخدم إصدارًا قديمًا من قبل 2021/12/21، فمن المستحسن بشدة اختباره وتحديثه.
لقد أزلت بعض المشكلات وحسّنت الأداء.
يهدف التعبير النمطي إلى أن يكون متوافقًا مع PCRE، ولكن يجب أن يعمل أيضًا على re2 وربما محركات تعبيرات نمطية أخرى.
التعبير النمطي (RegEx):```regex (?im)(?:^|[\n]).?(?:[\x24]|%(?:25%?)24|\u?0(?:44|24))(?:[\x7b]|%(?:25%?)7b|\u?0(?:7b|173))[^\n]?((?:j|%(?:25%?)(?:4a|6a)|\u?0(?:112|6a|4a|152))[^\n]?(?:n|%(?:25%?)(?:4e|6e)|\u?0*(?:4e|156|116|6e))[^\n]?(?:d|%(?:25%?)(?:44|64)|\u?0*(?:44|144|104|64))[^\n]?(?:[i\x{130}\x{131}]|%(?:25%?)(?:49|69|C4%(?:25%?)B0|C4%(?:25%?)B1)|\u?0(?:111|69|49|151|130|460|131|461))[^\n]?(?:[\x3a]|%(?:25%?)3a|\u?0(?:72|3a))[^\n]?((?:l|%(?:25%?)(?:4c|6c)|\u?0*(?:154|114|6c|4c))[^\n]?(?:d|%(?:25%?)(?:44|64)|\u?0*(?:44|144|104|64))[^\n]?(?:a|%(?:25%?)(?:41|61)|\u?0*(?:101|61|41|141))[^\n]?(?:p|%(?:25%?)(?:50|70)|\u?0*(?:70|50|160|120))(?:[^\n]?(?:[s\x{17f}]|%(?:25%?)(?:53|73|C5%(?:25%?)BF)|\u?0(?:17f|123|577|73|53|163)))?|(?:r|%(?:25%?)(?:52|72)|\u?0(?:122|72|52|162))[^\n]?(?:m|%(?:25%?)(?:4d|6d)|\u?0*(?:4d|155|115|6d))[^\n]?(?:[i\x{130}\x{131}]|%(?:25%?)(?:49|69|C4%(?:25%?)B0|C4%(?:25%?)B1)|\u?0(?:111|69|49|151|130|460|131|461))|(?:d|%(?:25%?)(?:44|64)|\u?0*(?:44|144|104|64))[^\n]?(?:n|%(?:25%?)(?:4e|6e)|\u?0*(?:4e|156|116|6e))[^\n]?(?:[s\x{17f}]|%(?:25%?)(?:53|73|C5%(?:25%?)BF)|\u?0(?:17f|123|577|73|53|163))|(?:n|%(?:25%?)(?:4e|6e)|\u?0(?:4e|156|116|6e))[^\n]?(?:[i\x{130}\x{131}]|%(?:25%?)(?:49|69|C4%(?:25%?)B0|C4%(?:25%?)B1)|\u?0(?:111|69|49|151|130|460|131|461))[^\n]?(?:[s\x{17f}]|%(?:25%?)(?:53|73|C5%(?:25%?)BF)|\u?0(?:17f|123|577|73|53|163))|(?:[^\n]?(?:[i\x{130}\x{131}]|%(?:25%?)(?:49|69|C4%(?:25%?)B0|C4%(?:25%?)B1)|\u?0(?:111|69|49|151|130|460|131|461))){2}[^\n]?(?:o|%(?:25%?)(?:4f|6f)|\u?0*(?:6f|4f|157|117))[^\n]?(?:p|%(?:25%?)(?:50|70)|\u?0*(?:70|50|160|120))|(?:c|%(?:25%?)(?:43|63)|\u?0(?:143|103|63|43))[^\n]?(?:o|%(?:25%?)(?:4f|6f)|\u?0*(?:6f|4f|157|117))[^\n]?(?:r|%(?:25%?)(?:52|72)|\u?0*(?:122|72|52|162))[^\n]?(?:b|%(?:25%?)(?:42|62)|\u?0*(?:102|62|42|142))[^\n]?(?:a|%(?:25%?)(?:41|61)|\u?0*(?:101|61|41|141))|(?:n|%(?:25%?)(?:4e|6e)|\u?0(?:4e|156|116|6e))[^\n]?(?:d|%(?:25%?)(?:44|64)|\u?0*(?:44|144|104|64))[^\n]?(?:[s\x{17f}]|%(?:25%?)(?:53|73|C5%(?:25%?)BF)|\u?0(?:17f|123|577|73|53|163))|(?:h|%(?:25%?)(?:48|68)|\u?0(?:110|68|48|150))(?:[^\n]?(?:t|%(?:25%?)(?:54|74)|\u?0*(?:124|74|54|164))){2}[^\n]?(?:p|%(?:25%?)(?:50|70)|\u?0*(?:70|50|160|120))(?:[^\n]?(?:[s\x{17f}]|%(?:25%?)(?:53|73|C5%(?:25%?)BF)|\u?0(?:17f|123|577|73|53|163)))?)[^\n]?(?:[\x3a]|%(?:25%?)3a|\u?0(?:72|3a))|(?:b|%(?:25%?)(?:42|62)|\u?0*(?:102|62|42|142))[^\n]?(?:a|%(?:25%?)(?:41|61)|\u?0*(?:101|61|41|141))[^\n]?(?:[s\x{17f}]|%(?:25%?)(?:53|73|C5%(?:25%?)BF)|\u?0(?:17f|123|577|73|53|163))[^\n]?(?:e|%(?:25%?)(?:45|65)|\u?0*(?:45|145|105|65))[^\n]*?(?:[\x3a]|%(?:25%?)3a|\u?0(?:72|3a))(JH[s-v]|[\x2b\x2f-9A-Za-z][CSiy]R7|[\x2b\x2f-9A-Za-z]{2}[048AEIMQUYcgkosw]ke[\x2b\x2f-9w-z]))
## القدرات
حتى الآن، ينبغي أن يطابق هذا التعبير المنتظم الاستغلال، بغض النظر عن:
- مجرد تسجيل
- غير حساس لحالة الأحرف (أيضًا في جميع الترميزات المدعومة)
- مشفر بـ URL
- مشفر بـ URL بشكل متكرر
- مع ترميز Unicode
- مع ترميز Octal
- مشفر بـ Base64 (بدائي)
### الخلفية
الهدف هو الحصول على تعبير منتظم يمثل حلاً وسطًا معقولاً بين اكتشاف أكبر عدد ممكن من محاولات الهجوم بعدد مقبول من النتائج الإيجابية الخاطئة.
سيجد المهاجم المتقدم (APT) طريقة للتغلب عليه إذا لزم الأمر، لكن الهجمات الأقل تعقيدًا ستترك الضوء التحذيري مضاءً.
لماذا تعبير منتظم واحد: لأنه يمكن تنفيذه بسهولة على سطر الأوامر أو في نظام SIEM دون الحاجة إلى أدوات إضافية. إذا كان من الممكن تنفيذ الأدوات، فقم بذلك، فهي موجودة.
طول التعبير المنتظم أقل مشكلة من أدائه. على الرغم من الطول، يجب أن يكون التعبير المنتظم سريعًا بشكل مقبول في التنفيذ على بيانات السجل المتوسطة.
### دعوة للعمل
أريد أن أجعل من الصعب إخفاء هجوم في سيناريوهات العالم الحقيقي.
إذا كان هذا التعبير المنتظم لا يطابق شيئًا رأيته في الواقع أو يمكنك إثبات أنه قابل للاستغلال، فيرجى إنشاء issue.
من المعروف أنه يمكنك تجاوز التعبير المنتظم بسهولة عن طريق تشفير أجزاء مختلفة من نمط الهجوم باستخدام Base64. ومع ذلك، يتم قبول هذا، حيث لم يتم دمج `base64` بشكل نهائي في إصدار رسمي من Log4j حتى الآن. ([LOG4J2-2446](https://issues.apache.org/jira/projects/LOG4J2/issues/LOG4J2-2446))
### الأدوات