วันนี้มีรายงานถึงช่องโหว่ CVE-2021-44228 ของไลบรารี log4j ที่เป็นไบรารี log ยอดนิยมในภาษา จาวา ส่งผลให้แอปพลิเคชั่นจำนวนมากมีช่องโหว่รันโค้ดระยะไกลไปด้วย หากแอปพลิเคชั่นเขียน log จากอินพุตของผู้ใช้ไม่ว่าช่องทางใดก็ตาม เช่น การเขียน username จากอินพุตของผู้ใช้ลงใน log หรือการ log ข้อมูล user-agent ของเบราว์เซอร์
ตอนนี้มีรายงานว่าบริการสำคัญๆ จำนวนมากมีช่องโหว่นี้ เช่น Steam, iCloud, หรือ Minecraft ตลอดจนแอปแทบทุกตัวที่ใช้ Apache Struts
ช่องโหว่นี้เกิดจากความสามารถในการดึงข้อมูลจากภายนอกมาเขียน log (message lookup) คนร้ายจะใส่ข้อมูลกระตุ้นให้ log4j ดึงข้อมูลผ่านโปรโตคอล JNDI (Java Naming and Directory Interface) จากเซิร์ฟเวอร์ที่คนร้ายกำหนด จากนั้นคนร้ายจะส่ง java class รันโค้ดเข้าไปยัง log4j เพื่อรันโค้ดในสิทธิ์ระดับเดียวกับตัวแอปพลิเคชั่นได้
ในจาวาตั้งแต่ปี 2018 เป็นต้นมา (6u211, 7u201, 8u191, และ 11.0.1) การตั้งค่าเริ่มต้นของ JNDI ในจาวาปิดไม่ให้รันโค้ดจากภายนอกแล้ว แต่ฟีเจอร์นี้ของ log4j ก็ยังเปิดทางให้คนร้ายโจมตีได้อยู่ดี ขึ้นกับว่าในแอปพลิเคชั่นมีไลบรารีอะไรอยู่บ้าง
ทาง log4j ออกอัพเดตเวอร์ชั่น 2.15 มาแก้ช่องโหว่นี้แล้ว และหากยังไม่สามารถอัพเดตได้ก็สามารถตั้งค่า formatMsgNoLookups=true
ไปชั่วคราว หรือหากไม่ได้ใช้ฟีเจอร์ lookup อยู่แล้วเปิดทิ้งไว้เลยก็ได้เช่นกัน
ที่มา - LunaSec, ArsTechnica
ตัวอย่างโค้ดที่มีช่องโหว่เนื่องจาก log อินพุตจากผู้ใช้ (ค่า user-agent จากเบราว์เซอร์) โดย LunaSec