มัลแวร์ที่คุณอนุมัติ เพราะมองไม่เห็นมัน
GlassWorm ซ่อน payload ไว้ใน Unicode ที่มองไม่เห็น ผ่าน human code review ไปได้ แล้วจึงอ่าน credentials ที่วางอยู่เกลื่อน workspace ของคุณ หนอนที่มองไม่เห็นไม่ได้เจาะการเข้ารหัส มันแค่ต้องการไฟล์
ผู้ review โค้ดของคุณอ่าน pull request นั้นแล้ว ทุกบรรทัดแสดงผลสะอาด: การขึ้น version, refactor เล็กน้อย, แก้เอกสารนิดหน่อย ไม่มีอะไรดูผิดปกติ เพราะส่วนที่ผิดนั้นไม่เคยถูกวาดขึ้นบนหน้าจอ มันเขียนด้วยอักขระ Unicode ที่ไม่มี glyph มองไม่เห็นด้วยตา มองไม่เห็นใน diff view และมองไม่เห็นสำหรับ human sign-off ที่ supply-chain security ยังคงพึ่งพาอยู่
นั่นคือ GlassWorm ตั้งแต่เดือนตุลาคม นักวิจัยจาก Koi Security ติดตามหนอนตัวแรกที่แพร่กระจายตัวเองผ่าน VS Code extensions และมันยังไม่หยุด [1] Socket ตรวจพบ extensions ที่เป็นอันตรายใหม่กว่าเจ็ดสิบรายการบน Open VSX marketplace ตั้งแต่สิ้นเดือนมกราคม [2] loader ซ่อนอยู่ใน Unicode ที่มองไม่เห็น โค้ดจึงแล่นผ่าน review ไปได้หน้าตาเหมือนงานจัดระเบียบธรรมดา
สิ่งที่มันทำหลังติดตั้งเป็นเรื่องธรรมดา และนั่นคือประเด็น มันอ่านสิ่งที่วางอยู่เฉย ๆ npm tokens, GitHub credentials, Git config, environment variables และ CI secrets ที่เปิดค้างอยู่ใน workspace ของคุณ จากนั้นมันใช้ credentials ที่ขโมยมา เผยแพร่ packages ที่ถูกวางยาเพิ่มขึ้นในชื่อของคุณ ซึ่งเป็นวิธีที่หนอนกลายเป็นหนอน Command and control วิ่งผ่าน Solana transactions จึงไม่มี server ให้ยึด [3]
ลองปรับมุมมองกันดูนะครับ ไม่มีใครแฮก @code Open VSX ไม่ได้ถูกเจาะในความหมายแบบดั้งเดิม extension model ทำงานตามที่มันถูกออกแบบมาทุกอย่าง: คุณติดตั้งตัวช่วย แล้วมันรันด้วยสิทธิ์ของคุณ ภายใน project ที่คุณเปิดอยู่ ข้าง ๆ secrets ของคุณ โมเดลนั้นถูกสร้างไว้สำหรับโลกที่ผู้เขียน extension เป็นฝ่ายเดียวที่คุณต้องไว้ใจ GlassWorm เปลี่ยนบัญชีของผู้เขียนที่ไว้ใจได้ให้กลายเป็นรถส่งของ และซ่อนสินค้าไว้ในอักขระที่คุณมองไม่เห็น เครื่องมือไม่ได้ล้มเหลว แต่ threat model ขยับไปอยู่ใต้เท้าของทุกคนพร้อมกัน
ซึ่งนำไปสู่คำถามที่ไม่ค่อยสบายนักเกี่ยวกับเครื่องของคุณเอง เมื่อ extension ที่คุณไว้ใจเปิด project ของคุณ มีอะไรให้มันเอาไปได้บ้าง?
สำหรับนักพัฒนาส่วนใหญ่ คำตอบคือ: ทุกอย่าง npm token อายุยืนใน dotfile, personal access token ที่คู่มือ setup ใจดีบอกให้คุณวางครั้งเดียวแล้วลืม, secrets ในไฟล์ env ที่ทุก process บนเครื่องอ่านได้ credentials เหล่านี้วางนิ่งอยู่ตรงจุดที่โค้ดรัน รอให้อะไรก็ตามที่เข้าถึงได้ในเครื่องมาหยิบ หนอนที่มองไม่เห็นใน editor ของคุณไม่จำเป็นต้องเจาะการเข้ารหัส มันแค่ต้องการไฟล์
Clavitor ตั้งต้นจากสมมติฐานตรงข้าม credential จะถูก brokered ในขณะที่จำเป็นต้องใช้ จำกัดขอบเขตเฉพาะสิ่งที่มันมีไว้ทำ และหมดอายุ มันไม่เคยถูกเขียนลง dev environment ของคุณเพื่อรอให้ค้นพบทีหลัง ดังนั้นเมื่อโค้ดที่เป็นศัตรูกวาด workspace หา keys ที่วางนิ่งอยู่ จะไม่มี npm token ค้างอยู่ ไม่มี GitHub PAT แบบถาวร ไม่มีอะไรที่อยู่นานเกินวินาทีที่มันถูกใช้ หนอนเปิดลิ้นชัก แล้วลิ้นชักว่าง
ข้อเท็จจริงที่ต้องพูดตรง ๆ: credential ที่กำลังใช้งานยังมีผลอยู่ขณะที่ใช้ ถ้า session ของคุณกำลังรัน และโค้ดที่เป็นศัตรูอยู่ใน session เดียวกัน มันจะขี่ของที่ยังมีชีวิตอยู่ตอนนั้น ภายในหน้าต่างเวลาสั้น ๆ และขอบเขตแคบ ๆ ของ credential นั้น การออก credential แบบชั่วคราวและจำกัดขอบเขตช่วยลดรัศมีความเสียหายและนาฬิกาที่เดินอยู่ แต่ไม่ได้ทำให้เครื่องที่คุณยกให้ผู้โจมตีปลอดภัย ไม่มีอะไรทำได้ แต่ระหว่างผู้โจมตีที่ฉก credential หนึ่งรายการที่มีขอบเขตแคบในขณะใช้งาน กับผู้โจมตีที่คัดลอกไฟล์คีย์ถาวรและเป็นเจ้าของคุณไปอีกปีนั้น ห่างกันมากทีเดียวครับ
เราเขียนรายการสั้น ๆ ของสิ่งที่ระบบ credential ไม่ควรทำเอาไว้ ใกล้หัวรายการคือ: อย่าปล่อยให้ secrets วางอยู่ตรงที่โค้ดรัน อ่านได้ที่นี่
Clavitor (@clavitorai) คือ credential vault ที่สร้างขึ้นเพื่อ AI agents และเพื่อรับมือกับมัน clavitor.ai
แหล่งอ้างอิง
[1] Koi Security — "GlassWorm: The First Self-Propagating Worm Using Invisible Code Hits the Open VSX Marketplace" (บริษัทวิจัย ไม่มี X handle ที่ยืนยันตัวตนแล้ว)
[2] Socket, via @TheHackersNews — "GlassWorm Supply-Chain Attack Abuses 72 Open VSX Extensions to Target Developers" (@SocketSecurity)
[3] @SecurityWeek — "Supply Chain Attack Targets VS Code Extensions With ‘GlassWorm’ Malware"