สรุปสั้น

ผู้อยู่เบื้องหลังการโจมตีห่วงโซ่อุปทาน GhostAction ซึ่งเคยยึดบัญชีผู้ดูแลโอเพนซอร์สเพื่อฝังเวิร์กโฟลว์ GitHub Actions อันตรายลงใน repo จำนวนมาก (ดูโพสต์ 075) ได้ยกระดับวิธีโจมตีอีกขั้น แพลตฟอร์มข่าวกรองภัยคุกคาม OpenSourceMalware พบว่าผู้โจมตีจดโดเมน my-github[.]com เมื่อ 9 ตุลาคม 2569 ชี้ไปยัง IP เดียวกับที่ใช้รับข้อมูลที่ขโมยจากเวิร์กโฟลว์ แล้วส่งอีเมลปลอมเป็นการแจ้งเตือนความปลอดภัยของ GitHub ไปหาผู้ดูแลโอเพนซอร์สในวันเดียวกัน หน้าล็อกอินปลอมทำงานเป็น reverse proxy ดักรหัสผ่านและรหัส 2FA แล้วใช้ JavaScript อนุมัติ OAuth device flow ให้เองโดยที่เหยื่อไม่ต้องพิมพ์รหัสหรือกดยืนยันใด ๆ

นอกจากนี้ยังพบส่วนประกอบขั้นที่สองที่ฝังตัวบนเครื่องนักพัฒนาได้แม้เวิร์กโฟลว์อันตรายจะถูกลบไปแล้ว โดยเลียนแบบเทคนิคของแคมเปญ PolinRider ของเกาหลีเหนือ คือซ่อน stealer ในไฟล์ฟอนต์ปลอม fa-solid-400.woff2 และให้ VS Code รันอัตโนมัติเมื่อเปิดโฟลเดอร์ stealer นี้กวาดกุญแจ AWS, token ของ PyPI และ npm, ข้อมูลรับรอง Kubernetes, กุญแจ SSH และกุญแจ API ของ Anthropic Claude กับ Google Gemini พบแล้วใน 94 repo ของเจ้าของ 66 ราย ส่วนใหญ่เป็น repo ที่แทบถูกทิ้งร้าง

รายละเอียดข่าว

เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 19 ตุลาคม 2569 ว่า อีเมลฟิชชิงถูกส่งจาก noreply@my-github[.]com แจ้งว่ามีการล็อกอินบัญชี GitHub ใหม่จากกรุงมอสโก ประเทศรัสเซีย และให้คลิกลิงก์เพื่อรักษาความปลอดภัยบัญชี หน้าเว็บปลอมดังกล่าวมีสคริปต์อนุมัติ GitHub OAuth device flow แบบเงียบ ๆ ด้วยสิทธิ์ repo, workflow และ read:org ซึ่งให้สิทธิ์อ่านเขียน repo แก้ไฟล์เวิร์กโฟลว์ Actions และดูข้อมูลสมาชิกองค์กร แล้วส่ง access token ออกไปยัง my-github[.]com ทางพอร์ต TCP 8443

นาย Paul McCarty นักวิจัยของ OpenSourceMalware ระบุว่ายังมีโดเมน my-gitlab[.]com ที่จดก่อนหน้า 17 วันและใช้รูปแบบชื่อเดียวกัน แต่ยังเชื่อมโยงกับ GhostAction โดยตรงไม่ได้ เพราะใช้ผู้ให้บริการจดโดเมน ข้อมูลผู้จด nameserver IP และ ASN ต่างกันทั้งหมด

OpenSourceMalware ระบุว่า GitHub เริ่มบล็อกไม่ให้เวิร์กโฟลว์อันตรายทำงานตั้งแต่ 9 ตุลาคม ทำให้คลื่นการโจมตีวันที่ 10 และ 12 ตุลาคมขโมย secret ไม่ได้เลย ส่วน launcher ขั้นที่สองที่ไม่ต้องพึ่ง runner ของ GitHub ปรากฏขึ้นหกวันหลังการบล็อก “เราบอกไม่ได้ว่าการบล็อกเป็นสาเหตุ แต่บอกได้ว่าผู้โจมตีย้ายไปยังจุดที่การควบคุมของ GitHub เข้าไม่ถึง”

วิธีการโจมตี

ขั้นฟิชชิงและขโมย OAuth token — สคริปต์บนหน้าปลอมรับ device code และ user code โหลดหน้า /login/device ดึงฟอร์มของ GitHub จาก HTML ที่ได้ ใส่ user code หาฟอร์มอนุมัติ เติม authorize=1 แล้วส่งการอนุมัติผ่าน session ของเหยื่อที่ผ่าน proxy อยู่ ต่างจาก device code phishing ทั่วไปที่เหยื่อต้องพิมพ์รหัสเอง ชุดเครื่องมือนี้ทำทุกขั้นแทนเหยื่ออัตโนมัติ token ที่ได้เป็นข้อมูลรับรอง API ที่ใช้ซ้ำได้ และมีสิทธิ์ตรงกับที่ GhostAction ต้องใช้ไล่หา repo และฝังไฟล์ใน .github/workflows/

ขั้นฝังตัวบนเครื่องนักพัฒนา — ผู้โจมตี commit ไฟล์ 3 ชิ้นลง repo ที่ยึดได้

  • tasks.json ของ VS Code ที่ตั้งทริกเกอร์ runOn: folderOpen ให้รันอัตโนมัติเมื่อเปิดโฟลเดอร์
  • public/fonts/fa-solid-400.woff2 ไฟล์ฟอนต์ปลอมที่บรรจุ stealer (ชื่อไฟล์เดียวกับที่แคมเปญ PolinRider ของเกาหลีเหนือใช้เมื่อมกราคม 2569) เมื่อรันจะกวาดข้อมูลรับรองแล้วติดตั้ง cron job ที่รันโค้ดของผู้โจมตีทุก 5 นาที และส่งข้อมูลออกทาง HTTP ธรรมดาพอร์ต 8080
  • เวิร์กโฟลว์ GitHub Actions ชุดที่สอง ทำงานเป็นแผนสำรองหาก stealer ไม่ได้รัน มีรูปแบบข้อมูลรับรองที่ค้นหาเพิ่มขึ้น และหาก POST ล้มเหลวจะอัปโหลดผลไปยัง GitHub gist ลับแทน

ผลกระทบ

จาก 94 repo ที่พบ มี 15 repo ที่ถูกลบ เปลี่ยนชื่อ หรือปิดเป็นส่วนตัวแล้ว ใน 79 repo ที่ยังเข้าถึงได้ 65 repo ไม่มี commit มานานกว่าหนึ่งปี และมีหนึ่ง repo ที่ไม่ถูกแตะมานานกว่าเก้าปี ซึ่งตอกย้ำว่า repo ที่ถูกทิ้งร้างแต่ยังมีคนโคลนอยู่คือช่องทางกระจายมัลแวร์ที่ดี นักพัฒนาที่โคลน repo เหล่านี้แล้วเปิดใน VS Code เสี่ยงถูกขโมยข้อมูลรับรองคลาวด์ registry และ AI ทั้งหมดบนเครื่อง

การผสานการฟิชชิงรายบุคคลเข้ากับระบบอัตโนมัติระดับ repo ทำให้ผู้โจมตีเล็งบัญชีที่มีสิทธิ์เข้าถึงโปรเจกต์ องค์กร registry และผู้ใช้ปลายน้ำได้แม่นยำขึ้น และการที่ 2FA ถูกดักผ่าน reverse proxy ได้ แสดงว่า 2FA แบบรหัส OTP ไม่พอสำหรับบัญชีผู้ดูแลโอเพนซอร์ส

ข้อจำกัดของหลักฐาน: ยังไม่ทราบตัวผู้อยู่เบื้องหลัง นาง Jenn Gile ผู้ร่วมก่อตั้ง OpenSourceMalware ประเมินว่าผู้โจมตีน่าจะประสบการณ์จำกัด เพราะตัวกรองตัวแปรสภาพแวดล้อมของ stealer พลาดกุญแจ API ส่วนใหญ่ การค้นโฮมไดเรกทอรีอาจหมดเวลาจนทิ้งผลลัพธ์ของตัวเอง และใช้ IP เดียวทั้งรับข้อมูล ฟิชชิง และสแกนอินเทอร์เน็ต ซึ่งเป็นเหตุให้ค้นหาการติดเชื้อจาก IP นี้ได้

คำแนะนำ

  • เพิกถอน OAuth app และ token ของ GitHub ทั้งหมดจากเครื่องที่สะอาด แล้วเปลี่ยนรหัสผ่าน
  • ตรวจ repo หาไฟล์ .vscode/tasks.json ที่มี runOn: folderOpen, ไฟล์ public/fonts/fa-solid-400.woff2 ที่ไม่ได้เพิ่มเอง และเวิร์กโฟลว์ชื่อแปลกในรายการ IoCs
  • หมุนเวียนข้อมูลรับรองทุกตัวที่เวิร์กโฟลว์เข้าถึงได้ และแจ้งผู้ที่โคลน repo ไปแล้ว
  • บนเครื่องนักพัฒนา ตรวจ crontab หางานที่รันทุก 5 นาที และบล็อกการเชื่อมต่อไปยัง 193.32.204[.]199
  • เปิด Workspace Trust ใน VS Code และอย่าเปิดโฟลเดอร์จาก repo ที่ไม่รู้จักในโหมดเชื่อถือ
  • ใช้ passkey หรือ security key แทน OTP สำหรับบัญชีผู้ดูแล และสงสัยอีเมลแจ้งเตือนความปลอดภัยที่ไม่ได้มาจากโดเมน github.com

Indicators of Compromise (IoCs)

ประเภทค่าหมายเหตุ
โดเมนmy-github[.]comหน้าฟิชชิง + รับ OAuth token (TCP/8443)
อีเมลผู้ส่งnoreply@my-github[.]comอีเมลแจ้งเตือนความปลอดภัย GitHub ปลอม
IP193.32.204[.]199รับข้อมูลจากเวิร์กโฟลว์ + stealer (HTTP/8080)
โดเมนmy-gitlab[.]comรูปแบบชื่อเดียวกัน ยังเชื่อมโยงกับ GhostAction ไม่ได้
ไฟล์public/fonts/fa-solid-400.woff2stealer ปลอมเป็นไฟล์ฟอนต์
ไฟล์.vscode/tasks.json (runOn: folderOpen)ตัวเรียก stealer อัตโนมัติ
เวิร์กโฟลว์lint.yml, ci-check.yml, build-check.yml, repo-health.yml, audit.yml, code-review.yml, test-suite.yml, cache-cleanup.ymlเวิร์กโฟลว์ขั้นที่สอง

โดเมนและ IP ถูก defang แล้ว

แหล่งอ้างอิง