634 รหัสผ่านใน 56 วินาที
นักพัฒนาคนหนึ่งผ่านการสัมภาษณ์สองรอบกับบริษัทปลอม เว็บไซต์จริง ใบหน้าจริง บทสนทนาเทคนิคจริง จากนั้นพวกเขาให้ทำโค้ดดิ้งชาเลนจ์ ภายในเวลาไม่ถึงหนึ่งนาที รหัสผ่านทั้งหมดใน Chrome ไฟล์ Keychain ของ macOS และข้อมูลกระเป๋าคริปโต หายไปทั้งหมด
นักพัฒนาคนหนึ่ง — ใส่ใจเรื่องความปลอดภัย มีประสบการณ์ และเป็นคนที่คอยมองหาการหลอกลวงอยู่เสมอ — ผ่านกระบวนการสัมภาษณ์หลายขั้นตอนกับบริษัทปลอม โทรคุยกับ HR สัมภาษณ์เทคนิคกับวิศวกรสองคน เว็บไซต์จริงพร้อมรูปทีมงาน โปรไฟล์ LinkedIn จริง ใช้เวลาสร้างความสัมพันธ์หลายสัปดาห์
จากนั้นเขาถูกขอให้ทำโค้ดดิ้งชาเลนจ์เล็ก ๆ ระหว่างแชร์หน้าจอ
อีก 56 วินาทีต่อมา ผู้โจมตีได้รหัสผ่านที่บันทึกไว้ใน Chrome ทั้ง 634 รายการ ไฟล์ Keychain ของ macOS (ซึ่งบรรจุคีย์สำหรับถอดรหัสไฟล์เหล่านั้น) และข้อมูลกระเป๋า MetaMask
การโจมตีทำงานอย่างไร
GitHub repo ดูสะอาด ไฟล์ฝั่งแบ็กเอนด์ไม่กี่ไฟล์ ไม่มีอะไรน่าสงสัย แต่ dependency ตัวหนึ่ง — winston-middleware แพ็กเกจสำหรับ logging ที่ฟังดูปกติ — มี dependency ของตัวเองคือ next-runtimejs
อาวุธอยู่ตรงนั้นเอง
ทันทีที่ npm install ถูกรัน สคริปต์เชลล์ก็ทำงานอย่างเงียบ ๆ ไม่มีข้อความแจ้ง ไม่มีคำเตือน มันดาวน์โหลดแบ็กดอร์ที่เขียนด้วย Go และลงทะเบียนให้เริ่มทำงานอัตโนมัติทุกครั้งที่บูตเครื่อง
นี่ไม่ใช่เครื่องมือของมือสมัครเล่น โปรโตคอล C2 แบบเข้ารหัส RC4 ที่เขียนขึ้นเอง มีคำสั่งสำหรับรันเชลล์ ขโมยไฟล์ ดึงรหัสผ่านจาก Chrome ดึงข้อมูล Keychain และเล่นงานกระเป๋าคริปโตโดยเฉพาะ สร้างอย่างมืออาชีพ
แบ็กดอร์เริ่มทำงานเวลา 16:16:37 เข้าถึงรหัสผ่านใน Chrome เวลา 16:17:33 นักพัฒนาสังเกตเห็นป๊อปอัปของ macOS เตือนเรื่องการเชื่อมต่อขาออก และปิด WiFi ภายในหนึ่งนาที — แต่ความเสียหายเกิดขึ้นแล้ว
เพราะเหตุใดการสัมภาษณ์จึงสำคัญ
การโจมตีนี้จะล้มเหลวถ้าเป็นอีเมลเย็น "ลองรัน repo นี้" จากคนแปลกหน้า คนทั่วไปจะไม่สนใจ
แต่หลังผ่านการสัมภาษณ์สองรอบ? หลังหัวเราะด้วยกันเรื่องที่มีการหลอกลวงรูปแบบรับสมัครงานปลอมจำนวนมากพุ่งเป้านักพัฒนา? หลังหนึ่งในผู้สัมภาษณ์พูดยิ้ม ๆ ว่า "ลองหาแบ็กดอร์ดูได้เลยนะครับ"?
นั่นคือจังหวะที่การ์ดของคุณตก ความไว้วางใจคือช่องโหว่ที่ถูกใช้ประโยชน์ มัลแวร์เป็นเพียงพาโหลด
นักพัฒนาพูดได้ดีที่สุด: "ถ้ามันเกิดขึ้นกับผมได้ มันก็เกิดขึ้นกับใครก็ได้ในทีมของคุณ"
รหัสผ่านใน Chrome จริง ๆ แล้วมีความหมายอย่างไร
Chrome เข้ารหัสรหัสผ่านที่บันทึกไว้ด้วย AES คีย์สำหรับถอดรหัสเก็บอยู่ใน Keychain ของ macOS ผู้โจมตีขโมยไฟล์ทั้งสองภายในเวลาไม่ถึงหนึ่งนาที
รหัสผ่านที่บันทึกไว้ทุกรายการ — ธนาคาร อีเมล GitHub คอนโซลคลาวด์ — อ่านออกได้ทั้งหมดในฝั่งของพวกเขา ไฟล์ Keychain ถูกแคร็กแบบออฟไลน์ได้โดยไม่มีการจำกัดจำนวนครั้ง นักพัฒนาต้องเปลี่ยนรหัสผ่านทุกตัว
นี่คือความลับที่ไม่มีใครพูดถึงของรหัสผ่านที่บันทึกในเบราว์เซอร์: มันถูกเข้ารหัสด้วยคีย์ที่อยู่บนเครื่องเดียวกัน ถ้าเครื่องถูกบุกรุก "การเข้ารหัส" ก็เป็นแค่ของตกแต่ง
รูปแบบการโจมตีของ DPRK
นักพัฒนาเล่าว่า บริษัทเดิม ของเขาก็ถูกเกาหลีเหนือแฮ็กเช่นกันเมื่อสามเดือนก่อน นี่คือแคมเปญ "Contagious Interview" — ผู้โจมตีที่ได้รับการสนับสนุนจากรัฐ DPRK เปิดการสัมภาษณ์งานปลอมเพื่อฝังมัลแวร์ลงในเครื่องของนักพัฒนา
ไม่ใช่การสุ่มเลือก พวกเขาเจาะจงนักพัฒนาเพราะสิ่งที่นักพัฒนาเข้าถึงได้: ข้อมูลรับรองระบบโปรดักชัน คีย์เซ็นโค้ด โครงสร้างพื้นฐานคลาวด์ และ — มากขึ้นเรื่อย ๆ — token ของ AI agent ที่เข้าถึงได้มากกว่านั้นอีก
ขนาดของการดำเนินการเป็นระดับอุตสาหกรรม บริษัทปลอมที่ใช้ใบหน้าที่สร้างขึ้น เว็บไซต์ที่ขัดเกลามาอย่างดี กระบวนการสัมภาษณ์ที่กินเวลาหลายสัปดาห์ พวกเขาลงทุนเพราะผลตอบแทนคุ้มค่า
"โปรแกรมจัดการรหัสผ่านไม่ช่วยอะไร"
นักพัฒนาตั้งข้อสังเกตที่น่าสนใจไว้ในเธรดว่า: "โปรแกรมจัดการรหัสผ่านไม่ช่วยอะไร ถ้าคนร้ายเข้าถึงคอมพิวเตอร์ของคุณผ่านแบ็กดอร์แบบนี้ เพราะพวกเขาส่งไฟล์ใดก็ได้ภายหลังได้ สร้างเอ็กซ์พลอยต์ที่เจาะจงคุณโดยเฉพาะได้ คีย์ล็อกเกอร์ จับภาพหน้าจอ"
ข้อนี้ถูกบางส่วนและผิดบางส่วน
โปรแกรมจัดการรหัสผ่านที่เก็บ vault ไว้บนดิสก์ในเครื่อง แล้วปลดล็อกด้วยรหัสผ่านหลักที่คุณพิมพ์เอง — ใช่ แบ็กดอร์ที่มีคีย์ล็อกเกอร์และการเข้าถึงไฟล์สามารถเจาะสิ่งนั้นได้
แต่โปรแกรมจัดการรหัสผ่านที่ใช้คีย์ผูกกับฮาร์ดแวร์ — ซึ่งคีย์ถอดรหัสถูกอนุพันธ์จากอุปกรณ์ยืนยันตัวตนที่เป็นวัตถุจริง และไม่เคยมีอยู่เป็นไฟล์บนดิสก์ — ต่างกันโดยพื้นฐาน แบ็กดอร์ขโมยไฟล์ได้ บันทึกการกดแป้นได้ จับภาพหน้าจอได้ แต่มันดึงคีย์ที่มีอยู่เฉพาะภายในโมดูลความปลอดภัยฮาร์ดแวร์ระหว่างการสัมผัสทางกายภาพออกมาไม่ได้
รหัสผ่านทั้ง 634 รายการใน Chrome ถูกขโมยเพราะทั้งข้อมูลที่เข้ารหัสและคีย์ถอดรหัสต่างเป็นไฟล์บนระบบไฟล์ ถ้าคีย์ถอดรหัสต้องใช้การครอบครองอุปกรณ์ทางกายภาพ การขโมยไฟล์จะได้แค่ก้อนข้อมูลที่เข้ารหัสแล้ว ไม่ได้อะไรไปกว่านั้น
สิ่งที่ควรทำ
- ไม่รันโค้ดจากการสัมภาษณ์บนเครื่องหลักของคุณ ใช้ VM หรืออุปกรณ์แยกต่างหาก
- รัน
npm install --ignore-scriptsกับ repo ที่ไม่คุ้นเคยทุกครั้งก่อนรันโค้ดจริง - ใช้ไฟร์วอลล์ขาออก (Little Snitch, LuLu) ที่แจ้งเตือนเมื่อมีการเชื่อมต่อใหม่
- เลิกบันทึกรหัสผ่านใน Chrome อย่างเด็ดขาด
- เก็บคริปโตไว้ในฮาร์ดแวร์วอลเล็ต ไม่ใช่ส่วนขยายของเบราว์เซอร์
- ปฏิบัติต่อโค้ดดิ้งชาเลนจ์ทุกชิ้นจากผู้รับสมัครงานว่าอาจเป็นภัยคุกคาม ไม่ว่าจะคุยกันมาแล้วกี่ครั้ง
นักพัฒนารอดมาได้เพราะป๊อปอัปของ macOS จับการเชื่อมต่อขาออกได้ทันเวลา คนส่วนใหญ่คงกด "อนุญาต" โดยไม่ได้คิดอะไร
56 วินาที แค่นั้นเองครับ