สรุปสั้น

นักวิจัยด้านความปลอดภัยไซเบอร์เปิดเผยการโจมตีห่วงโซ่อุปทาน (Supply Chain) รูปแบบใหม่ในระบบนิเวศภาษา Ruby ที่ถูกตั้งชื่อรหัสว่า SleeperGem หลังพบว่ามีแพ็กเกจ (gem) อันตราย 3 ตัวถูกเผยแพร่ขึ้นไปบนคลังกลาง RubyGems โดยมีเป้าหมายสุดท้ายคือการส่งเพย์โหลดเพิ่มเติมลงเครื่องของนักพัฒนา แพ็กเกจตัวหลักคือ git_credential_manager ซึ่งปลอมตัวเป็นเครื่องมือ Git Credential Manager อย่างเป็นทางการของบริษัท Microsoft และถูกปล่อยขึ้นระบบเมื่อวันที่ 18 กรกฎาคม พ.ศ. 2569 ส่วนอีกสองตัวคือ Dendreo และ fastlane-plugin-run_tests_firebase_testlab เป็นแพ็กเกจที่มีอยู่จริงมาตั้งแต่ปี 2560-2561 แต่ถูกทิ้งร้างไม่มีการอัปเดตมานานถึง 6-7 ปี ก่อนที่จู่ๆ จะมีเวอร์ชันใหม่ที่ฝังโค้ดอันตรายโผล่ขึ้นมา

จุดที่ทำให้แคมเปญนี้อันตรายเป็นพิเศษคือ ผู้โจมตีนำ git_credential_manager ไปใส่เป็น dependency ของแพ็กเกจอื่นอีก 5 ตัว ทำให้มัลแวร์แพร่ไปถึงผู้ใช้เดิมที่ติดตั้งแพ็กเกจเหล่านั้นอยู่แล้วโดยอัตโนมัติ นอกจากนี้มัลแวร์ยังมีกลไกตรวจสอบว่ากำลังทำงานอยู่บนระบบ CI/CD หรือไม่ ถ้าใช่ก็จะออกจากการทำงานทันที เพื่อให้แน่ใจว่าจะทำงานเฉพาะบนเครื่องของนักพัฒนาตัวจริงเท่านั้น ซึ่งช่วยให้หลบการตรวจจับของระบบวิเคราะห์อัตโนมัติได้ ผู้ที่เคยติดตั้งแพ็กเกจกลุ่มนี้ควรถือว่าเครื่องและความลับทั้งหมดในเครื่องถูกเจาะแล้ว และต้องเปลี่ยนข้อมูลรับรอง (credential) ทุกตัวทันที

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

เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 20 กรกฎาคม พ.ศ. 2569 ว่า บริษัท StepSecurity ได้เผยแพร่ผลการวิเคราะห์แคมเปญโจมตีห่วงโซ่อุปทานที่ตั้งชื่อว่า SleeperGem ซึ่งอาศัยการเผยแพร่แพ็กเกจอันตรายขึ้นคลัง RubyGems รายชื่อแพ็กเกจที่พบประกอบด้วย git_credential_manager เวอร์ชัน 2.8.0, 2.8.1, 2.8.2 และ 2.8.3 (เผยแพร่ 18 กรกฎาคม 2569), Dendreo เวอร์ชัน 1.1.3 และ 1.1.4 (แพ็กเกจตั้งต้นเผยแพร่ครั้งแรก 14 ตุลาคม 2560) และ fastlane-plugin-run_tests_firebase_testlab เวอร์ชัน 0.3.2 (แพ็กเกจตั้งต้นเผยแพร่ครั้งแรก 6 กุมภาพันธ์ 2561) โดย Dendreo มีการอัปเดตครั้งสุดท้ายเมื่อ 24 ตุลาคม 2563 ส่วน fastlane-plugin-run_tests_firebase_testlab เงียบมาตั้งแต่ 9 มีนาคม 2562

ทีมวิจัยของ StepSecurity อธิบายว่า “แต่ละเวอร์ชันที่เป็นอันตรายคือตัวโหลด (loader) มันจะดึงเพย์โหลดขั้นที่สองจากเซิร์ฟเวอร์ Forgejo ที่ผู้โจมตีควบคุม ตรวจว่ากำลังรันอยู่บนระบบ build หรือไม่ ถ้าใช่ก็ข้ามไป แต่ถ้าเป็นเครื่องนักพัฒนา มันจะวางเดมอน (daemon) ที่คอมไพล์เป็นไบนารีลงเครื่องและติดตั้งกลไกฝังตัว”

ลักษณะเด่นอีกอย่างของแคมเปญนี้คือ เวอร์ชันอันตรายทั้งหมดถูกอัปโหลดขึ้นคลังกลางโดยตรง โดยไม่มี commit หรือ tag ที่ตรงกันในโปรเจกต์ต้นทางเลย ซึ่งเป็นสัญญาณบ่งชี้ชัดเจนว่าบัญชีผู้ดูแลถูกยึด ไม่ใช่การอัปเดตปกติของนักพัฒนาตัวจริง ที่น่ากังวลกว่านั้นคือแพ็กเกจ git_credential_manager ถูกเพิ่มเข้าไปเป็น dependency ของแพ็กเกจอีก 5 ตัว ได้แก่ Dendreo, fastlane-plugin-run_tests_firebase_testlab, slackHtmlToMarkdown, seo_optimizer และ array_fast_methods ทำให้เพย์โหลดอันตรายแพร่ไปยังผู้ใช้เดิมของแพ็กเกจเหล่านั้นได้ทันทีที่มีการอัปเดต

แพ็กเกจทั้งหมดยกเว้น fastlane-plugin-run_tests_firebase_testlab อยู่ภายใต้บัญชีผู้ดูแลเดียวกันชื่อ “LR-DEV” ส่วนตัวที่เหลือเป็นของบัญชีชื่อ “pinkroom” ซึ่งบ่งชี้ว่าน่าจะมีบัญชีผู้ดูแลถูกเจาะมากกว่าหนึ่งบัญชีเพื่อดันเวอร์ชันอันตรายขึ้นระบบ นาย Charlie Eriksen นักวิจัยจากบริษัท Aikido Security อธิบายที่มาของชื่อรหัสไว้ว่า “บัญชี RubyGems ที่เงียบหายไป 6 หรือ 7 ปีไม่ดูน่าสงสัยในสายตาใครเลย นั่นแหละคือโปรไฟล์ที่คุ้มค่าแก่การยึดที่สุด ที่มาของชื่อ SleeperGem จึงไม่ได้หมายถึงทรัพย์สินที่ผู้โจมตีวางแผนฝังไว้ล่วงหน้าแบบเกมยาว แต่หมายถึงบัญชีจริงของคนธรรมดาที่เพียงแค่หลับใหลไป และดูไม่มีพิษภัยมากพอที่จะถูกยึดโดยไม่มีใครสังเกตเห็น”

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

เมื่อแพ็กเกจถูกติดตั้ง มัลแวร์ที่ฝังอยู่จะสแกนเครื่องเป้าหมายเพื่อหาตัวแปรสภาพแวดล้อม (environment variable) ราว 30 ตัว ซึ่งรวมถึงตัวแปรที่เกี่ยวข้องกับ GitHub Actions, GitLab, CircleCI, Travis, Jenkins และ Vercel หากพบตัวใดตัวหนึ่ง มัลแวร์จะยุติการทำงานทันที นักวิจัยประเมินว่าการตรวจสอบนี้เป็นความตั้งใจของผู้โจมตีที่จะเลี่ยงการทำงานบน CI runner ซึ่งเป็นเครื่องชั่วคราวที่มักถูกเฝ้าระวังและถูกทำลายทิ้งหลังใช้งาน เพื่อให้แน่ใจว่ามัลแวร์จะทำงานบนเครื่องของนักพัฒนาตัวจริงที่มีความลับและสิทธิ์เข้าถึงระบบมากกว่า

ในกรณีของ git_credential_manager โค้ดอันตรายจะถูกเรียกทำงานตอนที่ไลบรารีถูก require เข้าโปรเจกต์ ทำให้เครื่องเหยื่อดาวน์โหลดเพย์โหลด 2 ชิ้นจากเซิร์ฟเวอร์ Forgejo สาธารณะที่ git.disroot[.]org/git-ecosystem (หมายเหตุ: ที่อยู่ถูกทำให้ปลอดภัยด้วยการใส่วงเล็บ ป้องกันการคลิกโดยไม่ตั้งใจ) ได้แก่ shell script ชื่อ deploy.sh และไบนารีที่ตั้งชื่อเหมือนกับเครื่องมือที่แพ็กเกจปลอมตัวเป็น ส่วนบนระบบ Windows เพย์โหลดที่ดึงมาจะถูกสั่งรันผ่าน PowerShell

ความแตกต่างระหว่างเวอร์ชันแสดงให้เห็นการยกระดับการโจมตีอย่างชัดเจน โดยเวอร์ชัน 2.8.2 เพียงแค่วางเพย์โหลดเตรียมไว้ ขณะที่เวอร์ชัน 2.8.3 เดินหน้าสู่ขั้นถัดไป คือใช้สคริปต์ติดตั้งเปิดไบนารีขึ้นเป็นเดมอนทำงานเบื้องหลัง จากนั้นสร้างกลไกฝังตัว (persistence) ทั้งผ่านรายการ cron และ systemd user service แล้วสอบถามกลุ่มสิทธิ์ sudo และ wheel ของเครื่อง โดย StepSecurity ระบุว่า “หากผู้ใช้สามารถรัน sudo ได้โดยไม่ต้องใส่รหัสผ่าน สคริปต์จะรันตัวเองซ้ำในสิทธิ์ root และเมื่อทำงานในสิทธิ์ root มันจะวางสำเนาของเชลล์ระบบที่ตั้งค่า setuid root ไว้ในตำแหน่งที่ตั้งชื่อเลียนแบบเครื่องมือเครือข่าย” ซึ่งหมายความว่าผู้โจมตีจะมีช่องทางกลับเข้ามาเป็น root ได้ตลอด แม้ผู้ใช้จะถอนแพ็กเกจออกไปแล้วก็ตาม

การเปิดเผยครั้งนี้ยังสะท้อนว่า RubyGems กำลังถูกใช้ในทางที่ผิดหลายรูปแบบ ก่อนหน้านี้ราวสองเดือน RubyGems เคยระงับการสมัครบัญชีใหม่ชั่วคราวหลังมีผู้ไม่หวังดีดันแพ็กเกจอันตรายจำนวนมากขึ้นระบบพร้อมกัน ขณะที่นักวิจัยจากบริษัท Socket พบอีกแคมเปญที่ปล่อยแพ็กเกจ 150 ตัวเพื่อใช้คลังกลางเป็นช่องทางส่งข้อมูลที่ขโมยมาออกไป และเมื่อต้นเดือนนี้ บริษัท Mend.io เปิดเผยกรณีที่ส่วนขยายเบราว์เซอร์อันตรายเก็บข้อมูลรับรองผ่าน API ในเครื่อง แล้วบรรจุเป็นไฟล์ .gem ที่ถูกต้องด้วย JavaScript ในเบราว์เซอร์เอง ก่อนอัปโหลดขึ้น RubyGems.org ด้วย API key ที่ฝังไว้ในโค้ด นาย Maciej Mensfeld ระบุว่าข้อมูลที่ถูกขโมยมีทั้งรหัสผ่านแบบข้อความธรรมดา กุญแจ SSH ส่วนตัว ข้อมูลรับรอง AWS วลีกู้คืนกระเป๋าคริปโต หมายเลขประกันสังคม หมายเลขบัตรเครดิต และข้อมูลบัญชีธนาคาร รวม 63 รายการ พร้อมสรุปว่า “RubyGems ไม่ได้เป็นกลไกส่งมัลแวร์ในกรณีนั้น แต่เป็นจุดพักของ (dead drop) คือโดเมนที่น่าเชื่อถือและมีทราฟฟิกสูง ที่ข้อมูลซึ่งถูกขโมยมานั่งรออยู่จนกว่าผู้โจมตีจะกลับมาเก็บ โดยกลมกลืนไปกับการอัปโหลดปกติของนักพัฒนา”

ผลกระทบต่อไทย

นักพัฒนาไทยจำนวนไม่น้อยใช้ภาษา Ruby และเฟรมเวิร์ก Ruby on Rails ในการพัฒนาระบบเว็บ โดยเฉพาะสตาร์ตอัป บริษัทรับพัฒนาซอฟต์แวร์ และทีมที่ดูแลระบบ e-commerce ที่สืบทอดโค้ดเดิมมานาน การโจมตีรูปแบบนี้อันตรายกว่าปกติเพราะเหยื่อไม่ได้ทำอะไรผิด เพียงแค่ติดตั้งหรืออัปเดตแพ็กเกจที่ตัวเองใช้อยู่แล้วมาหลายปี ก็ได้รับมัลแวร์ไปโดยอัตโนมัติผ่าน dependency ที่ถูกแอบเพิ่มเข้ามา ยิ่งไปกว่านั้น การที่มัลแวร์จงใจหลบไม่ทำงานบนระบบ CI/CD ทำให้ระบบสแกนความปลอดภัยอัตโนมัติที่หลายองค์กรไทยพึ่งพาอยู่ตรวจไม่พบ และปล่อยให้มัลแวร์ไปทำงานบนโน้ตบุ๊กของนักพัฒนาที่มักมีกุญแจ SSH ข้อมูลรับรองคลาวด์ และสิทธิ์เข้าถึงระบบ production อยู่ครบ

ความเสี่ยงที่ตามมาคือ หากเครื่องนักพัฒนาในองค์กรไทยถูกเจาะและถูกวางเชลล์ setuid root ไว้ ผู้โจมตีจะมีสิทธิ์สูงสุดบนเครื่องนั้นอย่างถาวร และสามารถใช้ข้อมูลรับรองที่ขโมยได้ไปเจาะเข้าคลังซอร์สโค้ดหรือระบบคลาวด์ขององค์กรต่อได้ทันที ซึ่งเท่ากับเปลี่ยนการติดมัลแวร์บนเครื่องเดียวให้กลายเป็นการเจาะทั้งองค์กร องค์กรไทยที่ยังไม่มีนโยบายตรึงเวอร์ชัน dependency หรือไม่มีระบบตรวจสอบว่าแพ็กเกจที่อัปเดตมามี commit ต้นทางตรงกันหรือไม่ ควรถือว่านี่เป็นสัญญาณเตือนที่ต้องเร่งจัดการ

คำแนะนำ

ผู้ที่เคยติดตั้งแพ็กเกจ git_credential_manager, Dendreo, fastlane-plugin-run_tests_firebase_testlab, slackHtmlToMarkdown, seo_optimizer หรือ array_fast_methods ควรถือว่าเครื่องและความลับที่เกี่ยวข้องทั้งหมดถูกเจาะแล้ว ให้ถอนแพ็กเกจออกทันที ลบเดมอนที่ถูกวางไว้ที่ ~/.local/share/gcm/ ลบกลไกฝังตัวทั้งรายการ cron และ systemd user service ตรวจหาเชลล์ที่ตั้งค่า setuid ไว้ที่ /usr/local/sbin/ping6 และเปลี่ยนข้อมูลรับรองทุกตัวที่เคยอยู่บนเครื่องนั้น ทั้งกุญแจ SSH โทเคน GitHub/GitLab ข้อมูลรับรองคลาวด์ และรหัสผ่านที่เก็บใน credential manager

ในเชิงป้องกันระยะยาว ควรตรึงเวอร์ชันของ dependency ด้วยไฟล์ Gemfile.lock และตรวจสอบทุกครั้งที่มีการเปลี่ยนแปลง โดยเฉพาะเมื่อมี dependency ใหม่ถูกเพิ่มเข้ามาโดยที่ทีมไม่ได้ตั้งใจ ควรตั้งกฎว่าแพ็กเกจที่เงียบมานานหลายปีแล้วจู่ๆ มีอัปเดตใหญ่ ต้องถูกตรวจสอบด้วยมือก่อนนำเข้าระบบเสมอ รวมถึงเทียบว่าเวอร์ชันที่ปล่อยขึ้นคลังกลางมี commit หรือ tag ที่ตรงกันในโปรเจกต์ต้นทางหรือไม่ นอกจากนี้ควรแยกเครื่องที่ใช้พัฒนาออกจากเครื่องที่เก็บข้อมูลรับรองสำคัญ ใช้หลักสิทธิ์น้อยที่สุด (Least Privilege) และหลีกเลี่ยงการตั้งค่า sudo แบบไม่ต้องใส่รหัสผ่าน เพราะเป็นเงื่อนไขที่มัลแวร์ตัวนี้ใช้ยกสิทธิ์เป็น root โดยตรง

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