- ตั้งแต่ปี 2023 เป็นต้นมา มีการค้นพบ ช่องโหว่ข้ามบันทึกล็อกการเข้าสู่ระบบ Azure Entra ID รวมทั้งหมด 4 กรณี โดย 2 กรณีล่าสุดได้รับการยืนยันว่าเป็น ปัญหาร้ายแรงที่สามารถออกโทเค็นที่ใช้งานได้ตามปกติ
- GraphGoblin ข้ามการสร้างล็อกได้ในโฟลว์ OAuth2 ROPC โดยป้อนพารามิเตอร์
scopeซ้ำๆ และ Graph**** ทำให้ ล็อกหายไปทั้งหมด ด้วยสตริง User-Agent ที่ยาวเกิน 50,000 ตัวอักษร - ช่องโหว่ทั้งสองกรณีถูกชี้ว่าเกิดจาก ความล้มเหลวในการบันทึกล็อกจากการที่ความยาวคอลัมน์ SQL เกินกำหนด และ Microsoft ได้แก้ไขหลังจากได้รับรายงานแล้ว
- Microsoft จัดปัญหานี้ไว้ในระดับ “ปานกลาง (Medium)” และ แก้ไขแบบเงียบๆ โดยไม่มีรางวัลหรือการรับรองอย่างเป็นทางการ ขณะที่ตามเกณฑ์ CVSS ถูกประเมินว่าอยู่ในระดับ High (7.5~8.7 คะแนน)
- เนื่องจากข้อบกพร่องจากการตรวจสอบค่าป้อนซ้ำๆ ยังคงเกิดขึ้นอย่างต่อเนื่อง จึงมีการชี้ว่าการ ตรวจสอบล็อกแบบข้ามแหล่งและการเสริมกฎตรวจจับด้วย KQL เป็นภารกิจสำคัญสำหรับผู้ดูแลความปลอดภัย
เปิดเผยช่องโหว่ข้ามบันทึกล็อกการเข้าสู่ระบบ Azure Entra ID
- ตั้งแต่ปี 2023 เป็นต้นมา มีการค้นพบ ช่องโหว่ข้ามบันทึกล็อกการเข้าสู่ระบบ Azure Entra ID รวมทั้งหมด 4 กรณี
- 2 กรณีแรกตรวจสอบได้เพียงความถูกต้องของรหัสผ่าน แต่ 2 กรณีล่าสุดเป็นปัญหาระดับร้ายแรงที่สามารถ ออกโทเค็นปกติ ได้
- ปัจจุบัน Microsoft ได้แก้ไขช่องโหว่ทั้งหมดแล้ว
-
สรุป GraphNinja และ GraphGhost
- GraphNinja: เมื่อพยายามเข้าสู่ระบบโดยระบุเอนด์พอยต์ของเทนเนนต์อื่น จะสามารถทราบได้ว่ารหัสผ่านถูกต้องหรือไม่ แต่จะไม่มีการสร้างล็อก
- ผู้โจมตีสามารถส่งคำขอรับรองความถูกต้องไปยังเทนเนนต์ภายนอก และตรวจสอบจากการตอบกลับได้ว่ารหัสผ่านถูกต้องหรือไม่
- ต่อมา Microsoft ได้เพิ่มการบันทึกเพิ่มเติมเพื่อแก้ปัญหานี้
- GraphGhost: หากใช้ Client ID ที่ไม่ถูกต้อง โฟลว์การยืนยันตัวตนจะล้มเหลวหลังจากตรวจสอบรหัสผ่านแล้ว และในล็อกจะแสดงเพียงว่าล้มเหลว
- ข้อมูลว่ารหัสผ่านถูกต้องจะไม่ถูกบันทึกไว้ในล็อกของผู้ดูแลระบบ
- Microsoft แก้ไขโดยเพิ่มข้อมูลการตรวจสอบรหัสผ่านลงในล็อกการเข้าสู่ระบบ
- GraphNinja: เมื่อพยายามเข้าสู่ระบบโดยระบุเอนด์พอยต์ของเทนเนนต์อื่น จะสามารถทราบได้ว่ารหัสผ่านถูกต้องหรือไม่ แต่จะไม่มีการสร้างล็อก
-
ช่องโหว่ GraphGoblin
- GraphGoblin ข้ามการสร้างล็อกได้ในโฟลว์ OAuth2 ROPC โดยป้อนพารามิเตอร์
scopeซ้ำๆ- หากป้อนซ้ำหลายพันครั้งในรูปแบบ
"openid openid openid ..."จะมีการออกโทเค็นปกติ แต่ จะไม่เหลือบันทึกใดๆ ในล็อกการเข้าสู่ระบบของ Entra ID
- หากป้อนซ้ำหลายพันครั้งในรูปแบบ
- สาเหตุถูกชี้ว่าเป็น ความล้มเหลวของคำสั่ง INSERT จากการที่ความยาวคอลัมน์ SQL เกินกำหนด
- คาดว่าสตริง scope ที่ถูกทำซ้ำทำให้เกินความยาวของฟิลด์ในฐานข้อมูลจนไม่สามารถบันทึกล็อกได้
- Microsoft มีปัญหาในการทำซ้ำปัญหานี้ แต่หลังได้รับหลักฐานวิดีโอก็ได้แก้ไขแล้ว
- GraphGoblin ข้ามการสร้างล็อกได้ในโฟลว์ OAuth2 ROPC โดยป้อนพารามิเตอร์
-
Graph****** (การข้ามโดยอาศัย User-Agent)
- หาก ป้อนสตริงยาวเกิน 50,000 ตัวอักษรในฟิลด์ User-Agent จะไม่มีการสร้างล็อก
- คำขอรับรองความถูกต้องจะถูกประมวลผลตามปกติและมีการออกโทเค็น แต่ล็อกจะหายไปทั้งหมด
- คาดว่าเกิดจากความล้มเหลวในการบันทึกล็อกเพราะความยาวคอลัมน์ SQL เกินกำหนด
- ค้นพบเมื่อ 2025-09-28 และ Microsoft ได้แก้ไขเสร็จสิ้นไปแล้วก่อนมีการรายงานในวันที่ 2025-10-08
- หาก ป้อนสตริงยาวเกิน 50,000 ตัวอักษรในฟิลด์ User-Agent จะไม่มีการสร้างล็อก
-
สรุปไทม์ไลน์
- 2025-09-20: ค้นพบ GraphGoblin ครั้งแรก
- 2025-09-26: รายงาน GraphGoblin ให้ Microsoft
- 2025-09-28: ค้นพบ Graph******
- 2025-10-08: แก้ไข Graph****** เสร็จสิ้น
- 2025-11-21: Microsoft ทำซ้ำ GraphGoblin สำเร็จและเริ่มแก้ไข
การตอบสนองและการประเมินของ Microsoft
- Microsoft จัดช่องโหว่นี้ไว้ในระดับ “ปานกลาง (Medium)” และ ไม่มีการให้รางวัลหรือการรับรองต่อสาธารณะ
- 2 กรณีก่อนหน้า (2023~2024) เคยมีการมอบรางวัลและการรับรอง
- แต่ครั้งนี้ แม้จะเป็นปัญหาร้ายแรงที่มีการออกโทเค็นปกติได้ ก็ยังถูกประเมินว่าไม่สำคัญมาก
- ตามเกณฑ์ CVSS v3.1 ได้ 7.5 คะแนน (High) และตาม v4.0 ได้ 8.7 คะแนน (High)
- ได้คะแนนสูงจากผลกระทบด้าน Integrity (ความถูกต้องสมบูรณ์)
- การที่ล็อกหายไปถือเป็นความเสียหายโดยตรงต่อคอมโพเนนต์ด้านความปลอดภัย
- Microsoft แก้ไขเสร็จสิ้นภายใน 2 สัปดาห์หลังทำซ้ำปัญหาได้
- ในอดีต GraphNinja ใช้เวลาแก้ 7 เดือน และ GraphGhost ใช้เวลา 5 เดือน
วิธีตรวจจับการข้ามล็อก
- ผ่าน คิวรี KQL สามารถเปรียบเทียบ Session ID หรือ UniqueTokenIdentifier ระหว่าง Graph Activity log กับ Sign-In log ได้
- หากมีอยู่ใน Graph Activity แต่ไม่มีใน Sign-In log สามารถพิจารณาได้ว่าเป็นการเข้าสู่ระบบที่ข้ามล็อก
- อย่างไรก็ตาม ต้องมี ไลเซนส์ E5 จึงจะเก็บ Graph Activity log ได้
- ตัวอย่างคิวรี KQL:
MicrosoftGraphActivityLogs | where TimeGenerated > ago(8d) | join kind=leftanti (union isfuzzy=true SigninLogs, AADNonInteractiveUserSignInLogs, AADServicePrincipalSignInLogs, AADManagedIdentitySignInLogs, MicrosoftServicePrincipalSignInLogs | where TimeGenerated > ago(90d) | summarize arg_max(TimeGenerated, *) by UniqueTokenIdentifier ) on $left.SignInActivityId == $right.UniqueTokenIdentifier- หากจำเป็น สามารถเปรียบเทียบโดยใช้
SessionIdได้ - จากผลการตรวจจับ สามารถตั้งค่า Azure Log Search Alert Rule ได้
- หากจำเป็น สามารถเปรียบเทียบโดยใช้
สรุป 4 วิธีข้ามล็อกการเข้าสู่ระบบ
| ช่วงเวลาที่ค้นพบ | วิธีการ | มีการออกโทเค็นหรือไม่ | Microsoft รับรองหรือไม่ |
|---|---|---|---|
| 2023-08 / 2024-05 | ระบุ external tenant ID เพื่อไม่ให้เกิดล็อกการตรวจสอบรหัสผ่าน | X | X |
| 2024-12 / 2025-04 | ทำให้การยืนยันตัวตนล้มเหลวด้วย Client ID ที่ไม่ถูกต้อง | X | X |
| 2025-09-20 | ป้อน scope ซ้ำจน SQL column overflow | O | X |
| 2025-09-28 | ใช้สตริง User-Agent ยาวเพื่อทำให้ SQL column overflow | O | N/A |
คำวิจารณ์ต่อกระบวนการความปลอดภัยของ Microsoft
-
พบข้อบกพร่องในหลายพารามิเตอร์ของฟังก์ชันบันทึกการเข้าสู่ระบบ Entra ID
- เกิดช่องโหว่ซ้ำๆ ในฟิลด์สำคัญอย่าง
tenant ID,client ID,scope,user-agent - เป็นปัญหาจาก ความล้มเหลวในการตรวจสอบค่าป้อน แบบเรียบง่าย ไม่ใช่การโจมตีที่ซับซ้อน
- มีการชี้ถึงการขาด การทบทวนด้านความปลอดภัยและการควบคุมคุณภาพ ของ Microsoft
- ข้อบกพร่องลักษณะคล้ายกันเกิดซ้ำในพื้นที่เดิมตลอดหลายปี
- มีการตั้งข้อสังเกตถึงความเป็นไปได้ของการนำ AI มาสร้างโค้ดหรือการตกหล่นในกระบวนการจัดการโค้ด
- เกิดช่องโหว่ซ้ำๆ ในฟิลด์สำคัญอย่าง
-
การเปิดเผยข้อมูลที่ขาดความโปร่งใส
- ทั้ง 4 กรณีไม่ได้รับ CVE และไม่มีประกาศอย่างเป็นทางการ
- Microsoft ในฐานะ CNA เป็นผู้ตัดสินใจแบบผูกขาดว่าจะเปิดเผยช่องโหว่ของตนเองหรือไม่
บทสรุป
- ล็อกการเข้าสู่ระบบของ Azure Entra ID คือ ข้อมูลหลักในการตรวจจับการบุกรุกขององค์กรทั่วโลก
- หากล็อกสูญหาย ระบบตรวจจับการโจมตีทั้งหมดอาจถูกทำให้ไร้ประสิทธิภาพ
- ช่องโหว่ทั้ง 4 กรณีที่พบ ล้วนอยู่ในระดับที่สามารถตรวจพบได้ด้วย การทำ fuzzing กับค่าป้อนอย่างง่าย
- Microsoft จำเป็นต้องมี คำอธิบายต่อสาธารณะและเสริมความเข้มแข็งของกระบวนการทบทวนความปลอดภัยอย่างโปร่งใส ต่อข้อบกพร่องที่เกิดซ้ำเหล่านี้
- ผู้ดูแลระบบและผู้รับผิดชอบด้านความปลอดภัยควรเสริมมาตรการป้องกันผ่าน การตรวจสอบล็อกแบบข้ามแหล่งและกฎตรวจจับบน KQL
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
ทำให้นึกถึง รายงานเหตุการณ์การเจาะระบบของ Microsoft ที่ CISA เผยแพร่
เป็นกรณีที่แฮ็กเกอร์ซึ่งได้รับการสนับสนุนจากรัฐเจาะ Microsoft แล้วแทรกซึมเข้าไปยังหลายหน่วยงานรวมถึงกระทรวงการต่างประเทศสหรัฐฯ
สิ่งที่น่าตกใจคือ คนที่ตรวจพบความผิดปกติในเมลล็อกและพบการบุกรุกไม่ใช่ Microsoft แต่เป็น ผู้ดูแลระบบ ของกระทรวงการต่างประเทศ
ลิงก์รายงาน CISA
มันยกปัญหาสมัย Windows ขึ้นมาบนคลาวด์แบบเดิมทุกประการ และเคยมีเหตุการณ์ล้มเหลวของการแยกเทนเนนต์ข้ามกันถึงสองครั้ง
บทความที่เกี่ยวข้อง: Azure’s Security Vulnerabilities Are Out of Control / Microsoft comes under blistering criticism for “grossly irresponsible” security
ในบทความที่ ProPublica และ ArsTechnica วิจารณ์ Azure แบบตรงไปตรงมา มีการบอกว่าผู้เชี่ยวชาญไซเบอร์ของรัฐบาลกลางเรียก Microsoft cloud ว่า “ห่วย”
ลิงก์บทความ
สภาพไซเบอร์ซีเคียวริตี้ตอนนี้ หละหลวมเกินไปสำหรับระบบที่อารยธรรมทั้งระบบพึ่งพาอยู่
เหมือนเอาเทปผ้ามาปิดรูเรือที่รั่วแล้วออกสู่มหาสมุทร
ในการคุยกันเรื่อง SQL log ดูเหมือนว่าผู้โจมตีส่งอินพุตที่ยาวเกินไปจน เกินความยาวคอลัมน์ ทำให้ INSERT ล้มเหลว
ผลก็คือไม่มีการบันทึกประวัติความพยายามล็อกอินนั้นไว้
มันดูเป็น ปัญหาเชิงโครงสร้างจากการออกแบบ flow การยืนยันตัวตนที่ซับซ้อนเกินไป
เคยเจอกรณีที่ audit log ของ Azure บันทึกไม่ตรงกับสิ่งที่เกิดขึ้นจริง
ฉันลบ client secret แต่ UI บอกเหมือนจะลบ B ขณะที่ API กลับทำงานเป็นการเหลือแค่ A
สุดท้ายในล็อกมันถูกบันทึกเหมือนเป็นการกระทำของฉัน ทั้งที่จริงๆ เป็นบั๊กของระบบ
หลังจากเจอแบบนี้ ความเชื่อมั่นของฉันต่อ Azure log รวมถึง ความน่าเชื่อถือของ audit log โดยรวม ก็สั่นคลอน
ฉันคิดว่ามันเสี่ยงเกินกว่าจะใช้เป็นหลักฐานในศาล
เมื่อเทียบกับช่องโหว่ EntraID ช่วงหลังๆ แล้ว การหลบเลี่ยงล็อก ดูสำคัญน้อยกว่า
Microsoft เคยใส่ช่องโหว่ร้ายแรงไว้แม้กระทั่งใน Notepad มาแล้ว เพราะงั้นเรื่องนี้ก็ไม่น่าแปลกใจ
ตอนที่เคยประเมิน Azure VPN ในอดีต ไม่มีล็อกการเชื่อมต่อสำเร็จ/ล้มเหลวเลยแม้แต่นิดเดียว
พอทักท้วงไป Microsoft กลับบอกว่าให้ไปลงทะเบียนเป็น คำขอฟีเจอร์ใหม่
ตั้งแต่นั้นมาก็ หมดความเชื่อมั่น ใน Azure อย่างสิ้นเชิง เวลาผ่านไปก็ไม่ดีขึ้น แถมเหมือนจะแย่ลงด้วย
เหตุผลที่ผู้ดูแลระบบ IT ยังใช้ Microsoft ต่อไปก็เพราะ ไม่มีตัวเลือกอื่น
งบก็น้อย คนก็ไม่พอ เลยทำได้แค่รักษาไว้ให้อยู่ในระดับ รับเงินเดือนแล้วกลับบ้านได้ตามปกติ
ตอนที่ Microsoft ไม่สามารถทำซ้ำช่องโหว่ Azure ได้และขอ หลักฐานเป็นวิดีโอ นั้น สิ่งที่น่าประทับใจคือมีการแสดงให้เห็นด้วย คำสั่ง
curlเพียงบรรทัดเดียวเป็นช่วงเวลาที่สะใจจริงๆ