เรียบเรียงโดย จิรมิตร สนทนา, MCT
ลองนึกภาพว่าคุณสั่งอาหารจากร้านที่ ไว้ใจได้ ร้านนั้นปลอดภัยดี แต่มีคนแอบวางยาพิษไว้ที่ วัตถุดิบของซัพพลายเออร์ คุณป่วยทั้งที่ ไว้ใจ ร้านนั้นเต็มที่
Supply chain attack ในโลกซอฟต์แวร์ก็ทำงานแบบเดียวกัน — ผู้โจมตีไม่ได้แฮกแอปของคุณโดยตรง แต่ วางยาพิษใส่ package ที่แอปคุณพึ่งพาอยู่
Trivy คือเครื่องมือสแกนช่องโหว่แบบ open-source ของ Aqua Security ใช้กันอย่างแพร่หลายใน CI/CD pipeline เพื่อสแกน container image และ filesystem หา CVE ที่รู้จัก
วันที่ 19 มีนาคม 2026 ผู้ไม่หวังดีเจาะเข้า CI/CD pipeline ของ Aqua Security ได้สำเร็จ พวกเขาขโมย credentials ที่ใช้งานได้จริงออกมา แล้วนำไปใช้ push Docker image ที่ฝัง backdoor ไว้เข้าไปใน repository ของจริงอย่าง aquasec/trivy บน Docker Hub — แหล่งเดียวกับที่นักพัฒนาทั่วโลกหลายล้านคน pull Trivy มาใช้ทุกวัน
จากนั้นวันที่ 22 มีนาคม 2026 ก็มีการ push image อันตรายชุดที่สองตามมาอีก
ทีมไหนที่รันคำสั่ง:
docker pull aquasec/trivy
ในช่วงเวลาดังกล่าว ก็ได้รับ image ที่เป็นอันตรายไปโดยไม่มีการเตือนใดๆ ทั้งสิ้น
Image ของ Trivy ที่ถูกฝัง backdoor ไว้นั้นบรรจุ infostealer — มัลแวร์ที่ออกแบบมาเพื่อเก็บรวบรวมและขโมยข้อมูลสำคัญออกจากสภาพแวดล้อมที่ Trivy ทำงานอยู่อย่างเงียบๆ
เนื่องจาก Trivy เป็นเครื่องมือด้านความปลอดภัยที่รันอยู่ใน CI/CD pipeline มันจึงมักมีสิทธิ์เข้าถึงส่วนที่ละเอียดอ่อนที่สุดของระบบ มัลแวร์มุ่งเป้าไปที่:
~/.docker/config.json ที่บรรจุ credentials ของ registryสาเหตุที่การโจมตีครั้งนี้ได้ผลดีมาก:
aquasec/trivy บน Docker Hub ของจริง ไม่ใช่ของปลอมdocker pull ก็โดนแล้วเมื่อได้ credentials ไปแล้ว ผู้โจมตีสามารถเข้าถึง cloud infrastructure, push code อันตรายเข้า registry, หรือเจาะเข้าเครือข่ายภายในโดยใช้ SSH key ที่ขโมยมา
axios คือ HTTP client ที่ได้รับความนิยมสูงสุดบน npm — มียอดดาวน์โหลดกว่า 100 ล้านครั้งต่อสัปดาห์ สำหรับ version 1.x วันที่ 31 มีนาคม 2026 axios กลายเป็นเป้าหมายของการโจมตี supply chain โดยผู้อยู่เบื้องหลังคือ UNC1069 กลุ่มแฮกเกอร์ที่มีความเชื่อมโยงกับเกาหลีเหนือ ที่ปฏิบัติการมาตั้งแต่ปี 2018 เป็นอย่างน้อย
UNC1069 บัญชี maintainer ของ axios บน npm ได้สำเร็จ โดยเปลี่ยน email ที่ผูกกับบัญชีเป็นที่อยู่ที่ตัวเองควบคุม ([email protected]) จากนั้นใช้บัญชีนั้น publish version ที่ฝัง backdoor ออกมาสองตัว:
ช่วงเวลาของการโจมตีสั้นมาก: 31 มีนาคม 2026 เวลา 00:21 ถึง 03:20 UTC รวมแล้วไม่ถึงสามชั่วโมง
ทั้งสอง version ได้เพิ่ม dependency ใหม่ — package อันตรายชื่อ plain-crypto-js — เข้าไปใน package.json โดยตรง:
{
"name": "axios",
"version": "1.14.1",
"dependencies": {
"plain-crypto-js": "4.2.1"
}
}
นักพัฒนาหรือ CI/CD pipeline ใดก็ตามที่รัน npm install หรือ npm update ในช่วงเวลานั้น จะดึง plain-crypto-js มาติดตั้งโดยอัตโนมัติในฐานะ transitive dependency — โดยที่ตัวเองไม่ต้องทำอะไรเพิ่มเติมเลย
plain-crypto-js คือ obfuscated dropper — โปรแกรมที่ถูก obfuscate ไว้อย่างหนักเพื่อทำหน้าที่ปล่อยมัลแวร์ ซึ่งใช้ postinstall hook ใน package.json ของตัวเองเพื่อรันโดยอัตโนมัติทันทีที่ npm ติดตั้งเสร็จ:
"scripts": {
"postinstall": "node setup.js"
}
setup.js เป็นไฟล์ JavaScript ที่ถูก obfuscate ไว้ เมื่อถอดรหัสแล้วพบว่าทำงานสองขั้นตอน:
npm install axios (หรือ npm update)
↓
plain-crypto-js postinstall ทำงานอัตโนมัติ
↓
setup.js รัน obfuscated dropper
↓
WAVESHAPER.V2 RAT ถูกติดตั้งลงเครื่อง
↓
ผู้โจมตีมีสิทธิ์เข้าถึงเครื่องจากระยะไกลอย่างถาวร
WAVESHAPER.V2 ให้ผู้โจมตีสามารถควบคุมเครื่องที่ติดเชื้อได้อย่างสมบูรณ์:
เนื่องจาก axios เป็น dependency ของ package ยอดนิยมอีกหลายร้อยตัว ผลกระทบจึงขยายไปไกลเกินกว่าแค่ผู้ใช้ axios โดยตรง — ทุกโปรเจกต์ที่ใช้ library ที่อ้างอิง axios ก็มีความเสี่ยงเช่นกัน
postinstall hook ทำงานโดยไม่ถามผู้ใช้เลย — npm เชื่อถือมันโดย defaultทั้งสองเหตุการณ์มีรูปแบบเดียวกัน:
| ขั้นตอน | Trivy (Docker Hub) | axios / plain-crypto-js (npm) |
|---|---|---|
| 1. เจาะเข้าระบบ | ขโมย CI/CD credentials แล้ว push image อันตรายเข้า repo จริง | เจาะบัญชี maintainer แล้ว publish axios version ปลอม |
| 2. รอเหยื่อ | นักพัฒนา pull image ตามปกติ | นักพัฒนารัน npm install หรือ npm update |
| 3. รันโค้ด | infostealer ทำงานภายในเครื่องมือด้านความปลอดภัยที่ไว้ใจ | postinstall hook ติดตั้ง WAVESHAPER.V2 RAT อย่างเงียบๆ |
| 4. เก็บข้อมูล | CI/CD secrets, cloud key, SSH key, Docker config | ไฟล์, credentials, secrets และข้อมูลระบบจากเครื่องที่ติดเชื้อ |
| 5. ขยายการโจมตี | เข้าถึง cloud, push ไปยัง registry, เจาะเครือข่ายภายใน | เข้าถึงเครื่องจากระยะไกลอย่างสมบูรณ์ — รันคำสั่งใดก็ได้, เจาะเครือข่ายต่อ, ฝัง backdoor ถาวร |
แอปของเหยื่อยังทำงานได้ปกติสมบูรณ์ ไม่มี error ไม่มีคำเตือน การโจมตีอาจไม่ถูกตรวจพบนานหลายสัปดาห์หรือหลายเดือน
docker pull aquasec/trivy@sha256:abc123... is immutable; a tag like latest can be silently replacednpm audit after installing new packagespackage-lock.json changes in every pull request — a new transitive dependency version is worth investigatingSonatype Nexus Lifecycle คือแพลตฟอร์ม Software Composition Analysis (SCA) ที่บังคับใช้นโยบายความปลอดภัย open source ตลอดวงจรการพัฒนาซอฟต์แวร์ — ตั้งแต่ IDE ของนักพัฒนาไปจนถึง production
แตกต่างจาก npm audit ที่ตรวจเฉพาะ CVE ที่รู้จัก Nexus Lifecycle ทำได้มากกว่านั้น:
| ความสามารถ | สิ่งที่ตรวจจับได้ |
|---|---|
| Component intelligence | ตรวจจับ package ที่น่าสงสัย เช่น ไม่มีประวัติ release หรือ metadata ผิดปกติ |
| Policy enforcement | บล็อก component ที่ไม่ได้รับอนุมัติ — สามารถตั้งนโยบายให้ปฏิเสธ axios version ใหม่ที่ไม่อยู่ใน allowlist |
| Transitive dependency scanning | สแกน dependency tree ทั้งหมด ไม่ใช่แค่ direct dependency — จะตรวจพบ plain-crypto-js ในฐานะ component ที่ยังไม่ผ่านการประเมิน |
| Quarantine | กักกัน version ใหม่ของ component โดยอัตโนมัติจนกว่าจะผ่านการตรวจสอบด้านความปลอดภัย |
| CI/CD integration | หยุด pipeline build ทันทีเมื่อตรวจพบ component ที่ละเมิดนโยบาย |
ในกรณี axios attack Nexus Lifecycle จะบล็อก [email protected] และ [email protected] และกักกันโดยอัตโนมัติก่อนที่จะเข้าสู่ pipeline
หากองค์กรของคุณต้องการเสริมความแข็งแกร่งด้าน software supply chain security ด้วย Sonatype Nexus Lifecycle ทีมงาน MCT พร้อมให้ความช่วยเหลือ — ตั้งแต่การจัดหา License, การ Implementation ไปจนถึงการฝึกอบรมและ Support
ติดต่อ MCT:
| Cookie | Duration | Description |
|---|---|---|
| cookielawinfo-checbox-analytics | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Analytics". |
| cookielawinfo-checbox-functional | 11 months | The cookie is set by GDPR cookie consent to record the user consent for the cookies in the category "Functional". |
| cookielawinfo-checbox-others | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Other. |
| cookielawinfo-checkbox-necessary | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookies is used to store the user consent for the cookies in the category "Necessary". |
| cookielawinfo-checkbox-performance | 11 months | This cookie is set by GDPR Cookie Consent plugin. The cookie is used to store the user consent for the cookies in the category "Performance". |
| viewed_cookie_policy | 11 months | The cookie is set by the GDPR Cookie Consent plugin and is used to store whether or not user has consented to the use of cookies. It does not store any personal data. |


