แบ็กดอร์ที่ซ่อนอยู่ในข้อเสนองานบน LinkedIn
(roman.pt)- กรณีตัวอย่างของ การโจมตีแบบ social engineering ที่รีครูตเตอร์เข้าหาผ่าน ข้อความ LinkedIn แล้วขอให้รีวิวที่เก็บ GitHub สาธารณะ โดยอ้างว่าเป็นการรับสมัครหัวหน้าวิศวกร
- ในโค้ดที่ขอให้รีวิวมี แบ็กดอร์ที่ปลอมตัวเป็น test suite ซ่อนอยู่ และคำขอให้ "ช่วยตรวจสอบปัญหา deprecated Node modules" ก็เป็น เหยื่อล่อ เพื่อชักจูงให้รัน
npm install - เมื่อลองตรวจโค้ดด้วยความสงสัย โดยใช้ VPS ชั่วคราว และ เอเจนต์แบบอ่านอย่างเดียว แทนเครื่องโลคัล ไฟล์ปัญหาก็ถูกตรวจพบภายในไม่กี่วินาที
- ทั้งคอมมิตในที่เก็บและโปรไฟล์รีครูตเตอร์ต่างก็เป็นการ สวมรอยตัวตนของบุคคลจริง โดยแอบอ้างเป็น นักพัฒนาตัวจริงและนักข่าวสายศิลปะ ตามลำดับ
- นำเสนอ บทเรียนการป้องกันที่ใช้ได้จริง ว่าความระแวดระวัง, security hygiene, และ การใช้เอเจนต์แบบอ่านอย่างเดียว มีประสิทธิภาพกว่าการอ่านโค้ดด้วยตัวเองโดยตรง
ที่มาของการเข้าถึง
- เมื่อสัปดาห์ก่อน ได้รับ ข้อความ LinkedIn จากรีครูตเตอร์ของ สตาร์ตอัปคริปโต รายเล็ก
- มีการพูดคุยกันหลายครั้งตลอดหลายวัน และอีกฝ่ายอธิบายถึง proof-of-concept ที่พังอยู่ ซึ่งต้องการหัวหน้าวิศวกร
- อีกฝ่ายส่ง ที่เก็บ GitHub สาธารณะ มาให้รีวิว พร้อมขอว่า "ช่วยตรวจสอบปัญหา deprecated Node modules"
- การถูกขอให้รีวิวโค้ดเบสที่มีอยู่เดิมเป็นเรื่องปกติ แต่ครั้งนี้รู้สึก ผิดสังเกต จึงเพิ่มความระวังมากขึ้น
วิธีการตรวจสอบ
- แทนที่จะ clone แล้วติดตั้ง dependency บนเครื่องตัวเอง ได้เปิด VPS ชั่วคราว บน Hetzner แล้ว clone ที่เก็บไปตรวจที่นั่น
- ตั้ง Pi เป็น โหมดอ่านอย่างเดียว และเปิดใช้เฉพาะเครื่องมืออ่านไฟล์
- คำสั่งที่ใช้:
pi --tools read,grep,find,ls
- คำสั่งที่ใช้:
- เมื่อสั่งให้เอเจนต์รีวิวโค้ดเบสและชี้จุดน่าสงสัย มันก็หยุดที่
app/test/index.jsแทบจะทันที
โครงสร้างของแบ็กดอร์
- ที่เก็บนี้มีลักษณะเป็น React frontend + Node backend
- กับดักอยู่ใน
app/test/index.jsยาว ประมาณ 250 บรรทัด ซึ่ง ปลอมตัวเป็น test suite - ภายในมีการ ประกอบ URL จากชิ้นส่วนย่อย เพื่อซ่อนจุดหมาย
- ใช้ตัวแปรอย่าง protocol, domain, separator, path, token, subdomain มารวมกันเป็น
https://rest-icon-handler.store/icons/77
- ใช้ตัวแปรอย่าง protocol, domain, separator, path, token, subdomain มารวมกันเป็น
- มี payload ซ่อนอยู่ท่ามกลาง test dummy ที่ถูกคอมเมนต์ทิ้งไว้ และทำให้ ไม่ว่าเซิร์ฟเวอร์จะส่งอะไรมา ก็สามารถรันบนเครื่องผู้ใช้ได้
- payload อยู่ที่ บรรทัดที่ 225
กลไกการทริกเกอร์
- ไฟล์นี้ไม่ได้รอให้มีการรันเทสต์ก่อน
app/index.jsเรียกconst test = require('./test')ทำให้app/test/index.jsถูกโหลดและทำงานทันที
package.jsonเชื่อมapp/index.jsเข้ากับ ขั้นตอนเริ่มต้นการทำงาน- แกนสำคัญคือ สคริปต์
prepareซึ่ง npm จะรันให้อัตโนมัติหลังnpm install- ดังนั้น แค่ติดตั้ง dependency ก็ทำให้แบ็กดอร์ทำงานได้
- คำสั่งให้ "ตรวจปัญหา deprecated Node modules" จึงเป็น เหยื่อล่อเพื่อชักจูงให้รัน
npm installนั่นเอง - แม้จะสามารถรัน payload ใน sandbox เพื่อสังเกต payload ระยะที่สอง ได้ แต่เมื่อมีหลักฐานชัดว่ามันรันโค้ดที่เซิร์ฟเวอร์ส่งมา ก็หยุดการตรวจต่อทันที
ตัวตนที่ถูกสวมรอยรายแรก
- คอมมิตทั้งหมดถูกสร้างด้วยชื่อและอีเมลของ นักพัฒนา full-stack ตัวจริง
- เขามีโปรไฟล์ LinkedIn ปกติ เว็บไซต์ส่วนตัว และบัญชี GitHub ที่มีประวัติยาวนาน
- ผู้เขียนจึงติดต่อไปโดยอ้างว่าได้รับช่วงดูแลโค้ดเบสนี้ต่อมา
- เขาตอบว่าไม่เคยทำงานกับบริษัทนี้ และ เคยถูกแอบอ้างบน GitHub มาก่อนจนที่เก็บถูกลบไปแล้ว อีกทั้งไม่เกี่ยวข้องกับที่เก็บนี้เลย
- เขายังบอกด้วยว่าตัวเขาเองก็กำลังรายงานที่เก็บลักษณะนี้อยู่เช่นกัน
- ประวัติคอมมิตทั้งหมด 39 คอมมิต ถูกผูกไว้กับชื่อนักพัฒนาคนหนึ่งที่ไม่เคยแตะที่เก็บนี้จริงแม้แต่ครั้งเดียว
ตัวตนที่ถูกสวมรอยรายที่สอง
- โปรไฟล์รีครูตเตอร์เป็นของ นักข่าวสายศิลปะตัวจริง ซึ่งมีประวัติด้านวัฒนธรรมล้วน ๆ และไม่มีองค์ประกอบทางเทคนิคเลย
- เมื่อโต้กลับไปว่าติดตั้งไม่ได้ นักข่าวสายไม่เทคนิคคนนี้กลับ กลายเป็นผู้เชี่ยวชาญ npm และเวอร์ชัน Node ทันที และพยายามกดดันให้รัน
npm install
เรื่องนี้เกิดขึ้นได้กับทุกคน
- แม้จะเคยได้ยินเรื่องการโจมตีแบบนี้และเคยอ่านบน HN มาก่อน แต่เมื่อกลายเป็นเป้าหมายเองก็ยังโดนเล่นงานแบบไม่ทันตั้งตัวอยู่บ้าง
- ตั้งแต่ข้อความแรกก็สงสัยอยู่แล้ว แต่ถ้าเป็นวันที่เหนื่อยหรือรีบมาก ก็อาจเผลอรัน
npm installไปก่อนโดยไม่ได้คิดให้รอบคอบ
- ตั้งแต่ข้อความแรกก็สงสัยอยู่แล้ว แต่ถ้าเป็นวันที่เหนื่อยหรือรีบมาก ก็อาจเผลอรัน
- ข้อความ LinkedIn ที่แนบลิงก์ให้รีวิวที่เก็บควรถูกมองด้วย ความระแวดระวังระดับหนึ่งและ security hygiene ที่ดี
- การใช้ เอเจนต์แบบอ่านอย่างเดียว เพื่อรีวิวโค้ดได้ผลดีกว่าการอ่านด้วยตัวเองโดยตรง
- แบ็กดอร์นี้ ปลอมตัวเป็นโค้ดมือใหม่ที่เขียนได้อย่างงุ่มง่าม แต่เอเจนต์กลับตรวจพบได้ภายในไม่กี่วินาที
- มีการรายงานที่เก็บไปยัง GitHub และรายงานรีครูตเตอร์ไปยัง LinkedIn แล้ว แต่จนถึงตอนนี้ก็ยังไม่มีการเปลี่ยนแปลง และ โค้ดยังถูกเผยแพร่อยู่เหมือนเดิม
1 ความคิดเห็น
ความคิดเห็นจาก Hacker News
มีรีครูเตอร์จากสตาร์ตอัปคริปโตเล็ก ๆ ส่งรีโปสาธารณะบน GitHub มาให้ดู โดยบอกให้ช่วยตรวจ proof-of-concept repository ที่พังอยู่ และให้เช็ก “deprecated Node modules issue” ซึ่งสุดท้ายเป็นฟิชชิงเพื่อหลอกให้รัน npm install
สคริปต์
prepareจะรันอัตโนมัติหลังnpm installและทำหน้าที่เป็นแบ็กดอร์ที่ให้เซิร์ฟเวอร์ส่งโค้ดอะไรก็ได้มารันบนเครื่องโลคัล เรื่องที่โดนฟิชชิงแบบนี้ได้ผ่าน LinkedIn ดูร้ายแรงจนน่าตกใจ$companyและถ้าแค่ใส่ไว้ในโปรไฟล์ ผู้ใช้นั้นก็จะไปโผล่บน หน้าบริษัทอย่างเป็นทางการบริษัทของเราก็เคยมีรีครูเตอร์ปลอมที่ใช้กลโกงแบบเดียวกัน โปรไฟล์ปลอมดูน่าเชื่อถือมากและยังมีโพสต์เกี่ยวกับ LinkedIn Premium ด้วย แต่คนเหล่านั้นไม่ใช่พนักงานจริง
รายงานไปเท่าไรก็ไม่ถูกถอดลง สุดท้ายต้องเลี้ยงเหล้าเพื่อนที่ทำงานอยู่ LinkedIn ถึงจะแก้ได้ แต่ไม่ใช่ทุกสตาร์ตอัปจะมีเส้นสายแบบนั้น
พอเห็นคนยังโดนเจาะกันอยู่เรื่อย ๆ แบบนี้ ก็ไม่เข้าใจว่าทำไมถึงไม่ใช้เครื่องมืออย่าง PNPM หรืออย่างน้อยก็ปิดช่องโหว่ที่ชัดเจนและถูกใช้โจมตีบ่อยที่สุดอย่างการรันโค้ดตามอำเภอใจระหว่างดาวน์โหลดโค้ด
เครื่องมือที่รันโค้ดตามอำเภอใจทันทีที่คุณพยายามดาวน์โหลดโค้ด ควรเลิกมีได้แล้ว
ครั้งล่าสุดที่จำได้คือไฟล์ดาวน์โหลดที่ปลอมเป็นไฟล์พักหน้าจอ Windows
.scrและการที่ตอนนี้มันมาถึง LinkedIn แล้วคือขั้นที่แย่กว่าเดิมแพลตฟอร์มน่าจะไม่ค่อยสนใจเพราะมันดูเหมือน “มีงานเพิ่มขึ้น” คล้ายกับที่เครือข่ายโฆษณาอย่าง Google หรือ Meta ไม่ได้ใส่ใจกับโฆษณาหลอกลวงมากนัก
bullshitpowershellladendoucument.pdf.docxมาให้ แต่การส่งตรงผ่าน LinkedIn DM แบบนี้ถือว่าใจกล้ามากเรื่องนี้น่าจะเข้าข่ายอาชญากรรมชัด ๆ แต่ไม่เข้าใจว่าทำไมถึงไม่มีช่องทางที่คนรู้จักกันดีคล้าย 911 สำหรับแจ้งและขอความช่วยเหลือเรื่องอาชญากรรมไซเบอร์
สังคมต้องตามให้ทันอันตรายจริงและสร้างเครือข่ายช่วยเหลือให้เร็วขึ้น เพราะอาชญากรรมแบบเป็นขบวนการต้องใช้การป้องกันแบบเป็นขบวนการเหมือนกัน
คุณอาจไม่ได้รับคำตอบ แต่สำหรับพลเมืองสหรัฐฯ หรืออาจจะสำหรับใครก็ตาม เท่าที่ผมรู้ ที่นี่ใกล้เคียงกับ อินเทอร์เน็ต 911 มากที่สุดแล้ว
ปัญหาที่สองคือความไม่สมมาตร: การสร้างการหลอกลวงแบบนี้แทบไม่ต้องออกแรง แต่การตามจับและดำเนินคดีกลับต้องใช้ความพยายามมหาศาลและต้นทุนระดับดาราศาสตร์
มันอยู่ในระดับใกล้เคียงกับสายโทรศัพท์หลอกลวงที่แอบอ้างเป็นฝ่ายซัพพอร์ตของ Microsoft แล้วหลอกผู้สูงอายุ และแทบเป็นไปไม่ได้เลยที่จะจับตัวผู้ต้องสงสัย
ไม่ว่าจะเพราะพวกเขาปกปิดร่องรอยเก่งมาก หรือบ่อยกว่านั้นคืออยู่ในประเทศที่รัฐบาลไม่สนใจ หรือถึงขั้นปล่อยผ่านการหลอกลวงชาวตะวันตก
ต่อให้แจ้งความไป ก็น่าจะไม่มีใครช่วยหรือแม้แต่ติดต่อกลับ
ตอนนี้มันใกล้เคียงกับโจทย์สัมภาษณ์งานทั่วไปจนน่าอึดอัด
สถานการณ์ที่มีคนส่งรีโปมาให้แล้วบอกว่าการติดตั้งพัง ช่วยดูให้หน่อย เป็นอะไรที่ดูเป็นธรรมชาติ และนักพัฒนาหลายคนถ้าเหนื่อยหรือกำลังหางานอยู่ก็อาจรัน
npm installไปก่อนโดยไม่ทันคิดลึกเพราะไม่อยากดูชักช้า ก็เลยข้ามขั้นที่จะถามก่อนว่าอันนี้ควรรันได้ไหม
“รีโปก็รายงานกับ GitHub แล้ว รีครูเตอร์ก็รายงานกับ LinkedIn แล้ว แต่ยังไม่มีอะไรเปลี่ยนและโค้ดยังอยู่ครบ” อืม, Microsoft
พอกดเข้าไปก็เป็นวิดีโอปลอมที่อ้างว่านายกรัฐมนตรีแคนาดาประกาศแผนลงทุนคริปโตสำหรับชาวแคนาดาทุกคน และยังมีลิงก์สมัครด้วย พอรายงานไปกลับได้รับคำตอบว่าตรวจสอบแล้วไม่พบการละเมิดนโยบาย
ทั้งสามอย่างล้วนมีปัญหาเรื่องความปลอดภัยหรือความเสถียร และยิ่ง Microsoft ลงลึกกับ AI มากขึ้น ก็ยิ่งดูเหมือนแย่ลงแทนที่จะดีขึ้น
ไม่รู้เลยว่าประสิทธิภาพจาก AI ภายในบริษัท ที่บางคนบอกว่าเพิ่มได้ 10 เท่า มันหายไปไหนหมด
แบบนั้นน่าจะโดนถอดลงทันที
ดูเหมือนจะใช้โดเมนเดียวกันกับหลายเป้าหมาย
มีเธรดใน Reddit เมื่อ 3 เดือนก่อนที่คล้ายกันอยู่ด้วย: https://www.reddit.com/r/openclaw/comments/1rlet0h/someone_t...
ไม่เข้าใจว่าทำไมระบบปฏิบัติการทั่วโลกยังไม่ บล็อก npm ไปเลย
คนพวกนี้ดูเหมือนจะไม่มีวันเรียนรู้
การหลอกลวงแบบนี้ทำได้ด้วยเทคโนโลยีหลายอย่าง และต่อให้เป็น Makefile ก็ยังใช้ได้เหมือนกัน
อยากให้ Mac มี เฟรมเวิร์ก virtualization ที่ดีจริงเสียที
การดาวน์โหลดสคริปต์สุ่มจากอินเทอร์เน็ตแบบไม่มีการป้องกันเหมือนปี 1995 นี่เริ่มน่าเบื่อมากแล้ว
เวลาไปเจอคนแปลกหน้าแล้วเอาของของพวกเขาใส่ลึกเข้าไปในคอมพิวเตอร์ของตัวเอง ก็อย่าลืมใส่อุปกรณ์ป้องกัน
curl | bashจาก GitHub, AUR, NPM ก็แย่พอ ๆ กัน แต่ดูเหมือนนักพัฒนาหลายคนที่นี่ก็ยังมีสมมติฐานที่น่าสงสัยกับแนวปฏิบัติแย่ ๆ นี้อยู่เหตุการณ์แนว Shai-Hulud เล็ก ๆ หลายครั้งในช่วงไม่กี่สัปดาห์ที่ผ่านมา แสดงให้เห็นชัดว่ามันแย่แค่ไหน
ใน IntelliJ สามารถตั้งให้รันคำสั่ง npm ภายใน Docker container ได้
ข้อเสนองานที่ได้รับจาก LinkedIn ช่วงหลัง ๆ ดูน่าสงสัยไปหมด
บ้างก็ให้สมัครผ่านแพลตฟอร์ม บ้างก็ให้บันทึกวิดีโอแนะนำตัว หรือให้ทำ แบบทดสอบเขียนโค้ดคัดกรอง ที่อยู่หลังแพลตฟอร์มโค้ดอะไรสักอย่าง
อีกฝ่ายขอให้เขาเขียนเช็คเป็นค่ามัดจำโน้ตบุ๊กบริษัท ซึ่งมองเผิน ๆ ก็ไม่สมเหตุสมผลเลย แต่เพราะหางานมานานจนสิ้นหวัง เขากลับดีใจมากที่คิดว่าในที่สุดก็ได้งานแล้ว
คนที่ว่างงานมานานมักสิ้นหวังจนมองข้ามสัญญาณอันตรายร้ายแรงที่คนมีเงินเก็บพอหรือคนที่ยังมีงานทำและกำลังจะย้ายงานไม่มีทางพลาด
ทุกวันนี้ ผู้เขียนแพ็กเกจ NPM ส่วนใหญ่โดนแฮ็กด้วยวิธีแบบนี้กันไม่ใช่หรือ?
คนดูแล axios ก็ดูเหมือนจะโดนแนวทางเดียวกันผ่าน LinkedIn เหมือนกัน
ผมใช้ LinkedIn แค่เพราะประกาศงาน แต่ช่วงไม่กี่เดือนมานี้ประกาศไร้สาระเยอะเกินไป
มีประกาศจากบริษัทแนว ๆ Ladders, Swooped และที่คล้ายกันเต็มไปหมด ตอนนี้เริ่มรู้สึกว่าถึงเวลาทิ้ง LinkedIn ไปจริง ๆ แล้ว