แพ็คเกจ npm ที่เป็นอันตราย

แพ็กเกจ npm ที่เป็นอันตรายใน Baileys Fork (กรณีศึกษาจาก Skyzopedia)

TL; DR

การขอ ทีมวิจัยด้านความปลอดภัย Xygeni ระบุ แพ็คเกจ npm ที่เป็นอันตราย, @dappaoffc/baileys-modเผยแพร่โดยแยกออกมาจากไลบรารี WhatsApp Web API ที่ใช้งานกันอย่างแพร่หลาย @whiskeysockets/baileys.

ตั้งแต่เวอร์ชัน 8.0.1 เป็นต้นไป แพ็กเกจ npm ที่เป็นอันตรายนี้มีช่องโหว่การแทรกโค้ดขณะรันไทม์อยู่ภายใน lib/Socket/newsletter.jsโค้ดที่ถูกแทรกเข้าไปนั้นจะทำการสมัครใช้งานช่องจดหมายข่าวที่ผู้โจมตีควบคุมโดยอัตโนมัติให้กับเซสชันบอท WhatsApp ที่ได้รับการรับรองความถูกต้องของนักพัฒนา

เพย์โหลดจะเริ่มทำงาน 80 วินาทีหลังจากโหลดโมดูล และดึงรายการเป้าหมายจาก GitHub แบบไดนามิก ทำให้พฤติกรรมนี้อัปเดตตัวเองได้ และยากต่อการตรวจจับผ่านการวิเคราะห์ในระหว่างการติดตั้ง

ภาพรวมทางเทคนิค

ระหว่างการตรวจสอบการพึ่งพาที่เพิ่งเผยแพร่ใหม่ตามปกติ ทีมวิจัยด้านความปลอดภัยของ Xygeni ตรวจพบพฤติกรรมที่ผิดปกติใน @dappaoffc/baileys-modต่อมาได้รับการยืนยันว่าเป็น แพ็คเกจ npm ที่เป็นอันตราย โดยมุ่งเป้าไปที่ระบบนิเวศของบอท WhatsApp

ไม่เหมือนกับเวิร์มที่ขโมยข้อมูลประจำตัวหรือมัลแวร์เรียกค่าไถ่ แพ็กเกจ npm ที่เป็นอันตรายนี้ใช้ประโยชน์จากความสัมพันธ์ด้านความไว้วางใจระหว่างนักพัฒนาและไลบรารีโอเพนซอร์สที่ถูกคัดลอกไปใช้งานกันอย่างแพร่หลาย

แพ็กเกจนี้แสดงตัวว่าเป็นเวอร์ชันที่ได้รับการดัดแปลงจาก Baileysซึ่งเป็นการใช้งาน WhatsApp Web API ที่ได้รับความนิยมและใช้กันอย่างแพร่หลายในการสร้างบอทอัตโนมัติ ภายในระบบนิเวศนั้น การติดตั้งเวอร์ชันที่ดัดแปลง (forks) เป็นเรื่องปกติ ดังนั้น ผู้โจมตีจึงใช้ประโยชน์จากโมเดลการแจกจ่ายที่สมจริง แทนที่จะใช้ประโยชน์จากช่องโหว่

ที่สำคัญ:

  • การขอ สคริปต์ preinstall จะตรวจสอบเฉพาะเวอร์ชันของ Node.js เท่านั้น
  • ไม่มีการขโมยข้อมูลประจำตัวเกิดขึ้นในระหว่างการติดตั้ง
  • ไม่พบกิจกรรมหลังการติดตั้งที่น่าสงสัยใดๆ
  • การฉีดจะทำงานเฉพาะในระหว่างการรันไทม์เท่านั้น

เนื่องจากการออกแบบเช่นนี้ โปรแกรมสแกนในระหว่างการติดตั้งจะไม่สามารถตรวจจับพฤติกรรมที่เป็นอันตรายได้

กลไกการแทรกโค้ดขณะรันไทม์ภายในแพ็กเกจ npm ที่เป็นอันตราย

ตรรกะที่เป็นอันตรายภายในแพ็กเกจ npm ที่เป็นอันตรายนี้อยู่ใน... lib/Socket/newsletter.jsฝังอยู่ภายในบริบทการทำงานของโมดูลโดยตรง

ผู้โจมตีได้ห่อบล็อกที่แทรกเข้าไปด้วยนิพจน์ฟังก์ชันที่เรียกใช้ทันที (Immediately Invoked Function Expression หรือ IIFE) ซึ่งรับประกันว่าจะดำเนินการทันทีที่โมดูลโหลดเสร็จ

อย่างไรก็ตาม แทนที่จะเริ่มทำงานทันที ข้อมูลที่ส่งเข้าไปจะนำเสนอกลไกการทำงานแบบหน่วงเวลา:

หลังจากระยะเวลาหน่วงหมดลง ข้อมูลที่ส่งไปยังระบบจะดำเนินการตามลำดับที่กำหนดไว้:

  • ดึงข้อมูล JSON ไฟล์จาก URL เนื้อหาดิบของ GitHub
  • วิเคราะห์รายการรหัสจดหมายข่าว WhatsApp
  • วนลูปผ่านรายการ
  • โทร newsletterWMexQuery(id, QueryIds.FOLLOW) สำหรับแต่ละรายการ
  • ระบบจะเว้นระยะเวลาการส่งคำขอ 5 วินาที เพื่อลดการตรวจจับการจำกัดอัตราการส่ง
  • ระงับข้อผิดพลาดขณะรันไทม์ทั้งหมดโดยไม่แจ้งให้ทราบล่วงหน้า

เนื่องจากโค้ดเรียกใช้ฟังก์ชันภายในไลบรารีแทนที่จะเรียกใช้สคริปต์ภายนอก การรับส่งข้อมูลที่เกิดขึ้นจึงดูไม่แตกต่างจากการกระทำที่ผู้ใช้เริ่มต้นอย่างถูกต้องตามกฎหมาย WhatsApp ของ จากมุมมองของโปรโตคอล บอทได้สมัครรับข้อมูลจากช่องเหล่านั้นโดยสมัครใจ

การเปรียบเทียบทางเทคนิค: พฤติกรรมที่ถูกต้องตามธรรมชาติ กับ พฤติกรรมที่ถูกแทรกเข้าไป

ตัวแทน พฤติกรรมที่ถูกต้องตามกฎหมาย การฉีดที่เป็นอันตราย
ขั้นตอนการติดตั้ง ตรวจสอบเฉพาะเวอร์ชัน Node.js เท่านั้น ไม่พบพฤติกรรมที่เป็นอันตรายใดๆ ในระหว่างการติดตั้ง
การเริ่มต้นโมดูล โรงงานผลิตซ็อกเก็ต WhatsApp สำหรับส่งออก IIFE จะทำงานโดยอัตโนมัติเมื่อโหลดโมดูล
ระยะเวลาการดำเนินการ ไม่มีพฤติกรรมล่าช้า การเปิดใช้งานแบบหน่วงเวลา 80 วินาที
การสื่อสารผ่านเครือข่าย สื่อสารผ่านโปรโตคอล WhatsApp WebSocket เท่านั้น การดึงข้อมูลขาออกไปยังเนื้อหาดิบของ GitHub (ช่องทางการควบคุมแบบไดนามิก)
การดำเนินการจดหมายข่าว คำขอสมัครสมาชิกที่เริ่มต้นโดยผู้ใช้ การส่งคำขอติดตามอัตโนมัติผ่าน API ภายในไลบรารี
จัดการข้อผิดพลาด แพร่กระจายข้อผิดพลาดในการปฏิบัติงาน ระงับข้อยกเว้นทั้งหมดโดยไม่แจ้งให้ทราบล่วงหน้า

ช่องทางการควบคุมแบบไดนามิกผ่าน GitHub

รายชื่อรหัสจดหมายข่าวอยู่ที่:

การออกแบบนี้มีข้อดีในการใช้งานหลายประการ:

  • การอัปเดตเพย์โหลดแบบไดนามิกโดยไม่ต้องเผยแพร่เวอร์ชัน npm ใหม่
  • จุดเชื่อมต่อ TLS ที่เชื่อถือได้ซึ่งกลมกลืนกับทราฟฟิกการพัฒนาซอฟต์แวร์ทั่วไป
  • ไม่จำเป็นต้องมีโครงสร้างพื้นฐานที่ผู้โจมตีจัดการ
  • ความต่อเนื่องของบอทที่ติดตั้งใช้งานไปแล้ว

เนื่องจากการฉีดทำงานภายในขอบเขตของโรงงาน จึงมีการนำส่วนปิดภายในกลับมาใช้ใหม่ เช่น newsletterWMexQuery และ delay โดยไม่ต้องนำเข้าโมดูลภายนอก ซึ่งช่วยลดขนาดพื้นที่ใช้งานและเพิ่มประสิทธิภาพในการพรางตัว

โดยพื้นฐานแล้ว GitHub ทำหน้าที่เป็นช่องทางการกระจายคำสั่งที่มีน้ำหนักเบา

ชื่อแทนการพึ่งพาและสัญญาณการระบุแหล่งที่มา

ข้อมูลเมตาของแพ็กเกจประกอบด้วยชื่อเรียกแทนการพึ่งพา (dependency alias) ดังต่อไปนี้:

การกระทำนี้จะเปลี่ยนเส้นทางการพึ่งพาการเข้ารหัสที่สำคัญไปยังขอบเขต npm ที่ผู้โจมตีควบคุมได้

นอกจากนี้ เมตาเดต้ายังปลอมตัวเป็นโครงการต้นทางโดยการอ้างอิงถึงผู้เขียนต้นฉบับและแหล่งเก็บข้อมูล ซึ่งจะช่วยเพิ่มความน่าเชื่อถือและลดการตรวจสอบอย่างละเอียดถี่ถ้วนในระหว่างการตรวจสอบแบบคร่าวๆ

สัญญาณเหล่านี้บ่งชี้ถึงการผสมผสานระบบนิเวศอย่างจงใจมากกว่า การดัดแปลงโดยฉวยโอกาส.

ตัวบ่งชี้การถูกบุกรุกสำหรับแพ็กเกจ npm ที่เป็นอันตรายนี้

ทีมรักษาความปลอดภัยที่ตรวจสอบแพ็กเกจ npm ที่เป็นอันตรายนี้ ควรประเมินสัญญาณต่อไปนี้:

สัญญาณเครือข่าย

  • คำขอ GET ขาออกไปยัง raw.githubusercontent.com จากกระบวนการบอทของ WhatsApp
  • การติดตามการทำงานของจดหมายข่าวเกิดขึ้นโดยไม่มีตรรกะของแอปพลิเคชันเป็นตัวกระตุ้น

สัญญาณแพ็คเกจ

  • @dappaoffc/baileys-mod รุ่น 8.0.1 (และอาจรวมถึงเวอร์ชัน 8.0.0 ด้วย)
  • การเปลี่ยนเส้นทางนามแฝงการพึ่งพา libsignal
  • การฉีด IIFE แบบเรียลไทม์ภายใน newsletter.js

สัญญาณพฤติกรรม

  • คำขอติดตามจะเว้นระยะห่างกันห้าวินาที
  • ไม่มีการโต้ตอบใดๆ จากผู้ใช้ก่อนการสมัครรับจดหมายข่าว
  • การระงับข้อผิดพลาดแบบเงียบๆ ภายในโค้ดไลบรารีหลัก

แตกต่างจากมัลแวร์แบบดั้งเดิม การโจมตีนี้ไม่จำเป็นต้องขโมยข้อมูลประจำตัว การโจมตีเกิดขึ้นภายในบริบทของเซสชันที่ได้รับการยืนยันตัวตนแล้วเท่านั้น

การตรวจจับและการลดผลกระทบด้วย Xygeni

กรณีนี้แสดงให้เห็นว่าเหตุใดการสแกนเฉพาะตอนติดตั้งจึงไม่เพียงพอ พฤติกรรมที่เป็นอันตรายจะทำงานหลังจากโหลดโมดูลแล้ว และซ่อนตัวอยู่ภายในตรรกะทางธุรกิจที่ถูกต้อง

ระบบเตือนภัยมัลแวร์ล่วงหน้าของ Xygeni (MEW) ตรวจพบพัสดุนี้โดยการเชื่อมโยงสัญญาณหลายตัวเข้าด้วยกัน แทนที่จะพึ่งพาสัญญาณบ่งชี้เพียงอย่างเดียว

การวิเคราะห์สถิตแบบซอร์สโค้ดเต็มรูปแบบ

MEW ตรวจสอบโครงสร้างซอร์สโค้ดของแพ็กเกจทั้งหมด ไม่ใช่แค่สคริปต์วงจรชีวิตเท่านั้น

ในกรณีนี้ สัญญาณตรวจจับประกอบด้วย:

  • ไม่คาดคิด fetch() โทรภายในโมดูลหลักของ WhatsApp
  • การสื่อสารขาออกไปยังเนื้อหาดิบของ GitHub
  • รูปแบบการดำเนินการที่ล่าช้าซึ่งฝังอยู่ในตรรกะขณะรันไทม์
  • การจัดการข้อผิดพลาดแบบเงียบซ้อน

โดยลำพังแล้ว รูปแบบเหล่านี้อาจดูไม่เป็นอันตราย อย่างไรก็ตาม การวิเคราะห์แบบรวมกันเผยให้เห็นพฤติกรรมที่ผิดปกติซึ่งไม่สอดคล้องกับรูปแบบ Baileys fork ที่ถูกต้อง

ความสัมพันธ์ของความเสี่ยงจากการพึ่งพา

การขอ libsignal การใช้ชื่อแทน (alias) ทำให้เกิดการตรวจสอบอย่างเข้มงวดมากขึ้น เนื่องจากเป็นการเปลี่ยนเส้นทางการพึ่งพาข้อมูลที่มีความละเอียดอ่อนไปยังขอบเขตที่ไม่ได้รับการตรวจสอบ

Xygeni มีความสัมพันธ์ดังนี้:

  • สัญญาณชื่อเสียงของสำนักพิมพ์
  • ความไม่สอดคล้องกันของการเป็นเจ้าของขอบเขต
  • การเปลี่ยนเส้นทางการพึ่งพาไปยังไลบรารีการเข้ารหัส
  • ตัวบ่งชี้การปลอมแปลงเมตาเดตา

การวิเคราะห์แบบหลายชั้นนี้ช่วยลดผลลัพธ์ที่ผิดพลาด (false positives) ในขณะเดียวกันก็ช่วยระบุการละเมิดความไว้วางใจได้

การควบคุมห่วงโซ่อุปทานที่คำนึงถึงเวลาการทำงาน

เนื่องจากแพ็กเกจ npm ที่เป็นอันตรายนี้ทำงานในระหว่างการทำงาน การป้องกันที่มีประสิทธิภาพจึงต้องอาศัยการวิเคราะห์ที่คำนึงถึงพฤติกรรม

Xygeni ประเมินว่า:

  • กลไกการดำเนินการแบบหน่วงเวลา
  • การใช้งาน API ภายในในทางที่ผิด
  • การเรียกใช้งานเครือข่ายขาออกภายในโค้ดส่วนที่พึ่งพา
  • การควบคุมการไหลที่ผิดปกติภายในไลบรารีของบุคคลที่สาม

นอกจากนี้ยังมี Guardrails นโยบายใน CI/CD สามารถ:

  • ป้องกันการโทรออกที่ไม่คาดคิดระหว่างการสร้างโปรแกรม
  • ตรวจจับการเปลี่ยนแปลงที่น่าสงสัยในกราฟความสัมพันธ์
  • บังคับใช้ข้อจำกัดในการเปลี่ยนเส้นทางขอบเขต
  • รูปแบบการดึงข้อมูลเพย์โหลดแบบไดนามิกของแฟล็ก

ดังนั้น การควบคุมจึงไม่ได้อาศัยเพียงแค่การลบข้อมูลในทะเบียนเท่านั้น

เหตุใดแพ็กเกจ npm ที่เป็นอันตรายนี้จึงมีความสำคัญต่อความปลอดภัยของห่วงโซ่อุปทาน

แพ็กเกจ npm ที่เป็นอันตรายนี้สะท้อนให้เห็นถึงการเปลี่ยนแปลงเชิงโครงสร้างในการละเมิดห่วงโซ่อุปทาน:

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

ผู้โจมตีไม่ได้ใช้ประโยชน์จากช่องโหว่ของซอฟต์แวร์ แต่ใช้ประโยชน์จากความเชื่อมั่นใน forks และการอัปเดต dependency แทน

ด้วยเหตุนี้ การตรวจจับจึงต้องอาศัยการตรวจสอบซอร์สโค้ดทั้งหมด การเชื่อมโยงความเสี่ยงด้านการพึ่งพา และการวิเคราะห์ที่คำนึงถึงเวลาการทำงาน ไม่ใช่แค่การสแกนสคริปต์เพียงอย่างเดียว

sca-tools-software-composition-analysis-tools
จัดลำดับความสำคัญ แก้ไข และรักษาความปลอดภัยความเสี่ยงด้านซอฟต์แวร์ของคุณ
สมัครบัญชีฟรีได้เลย
ไม่ต้องใช้บัตรเครดิต

รักษาความปลอดภัยให้กับการพัฒนาและส่งมอบซอฟต์แวร์ของคุณ

ด้วยชุดผลิตภัณฑ์ Xygeni