ข้ามไปยังเนื้อหา
Zod 4.6.6 บน npm ไม่ได้ติดมัลแวร์ — commit อันตรายที่ HN ตื่นตระหนกคือเหตุการณ์เมื่อ 21 ก.ย. ซึ่งถูก revert ไปแล้ว แต่ยังโผล่ในประวัติของรีลีส
การแฮ็ก

Zod 4.6.6 บน npm ไม่ได้ติดมัลแวร์ — commit อันตรายที่ HN ตื่นตระหนกคือเหตุการณ์เมื่อ 21 ก.ย. ซึ่งถูก revert ไปแล้ว แต่ยังโผล่ในประวัติของรีลีส

อ่าน 5 นาที ที่มา: GitHub Community (security advisory)

เช้าวันนี้ (12 ต.ค. 2026) กระทู้ “Zod 4.6.6 compromised by malware?” ขึ้นหน้าแรก Hacker News หลังมีคนเห็น commit ชื่อ “Fix bugs and improve performance” ในหน้า release ของ v4.6.6 ซึ่งเพิ่มไฟล์ meta.test.mjs ที่ทำหน้าที่ดาวน์โหลดและรันโค้ดจากภายนอก Zod เป็นไลบรารี schema validation ที่มียอดดาวน์โหลดราว 341 ล้านครั้งต่อสัปดาห์ และเป็นแกนหลักของ tool schema ใน SDK สาย AI หลายตัว เช่น @modelcontextprotocol/sdk (ระบุ zod: ^3.25 || ^4.0), Vercel ai และ @openai/agents ข่าวนี้จึงกระทบนักพัฒนาเอเจนต์และ MCP server แทบทุกคนที่ใช้ TypeScript

สรุปสั้นๆ ก่อน: แพ็กเกจ zod 4.6.6 บน npm ไม่มีโค้ดอันตราย เราใช้ npm pack zod@4.6.6 ดึง tarball มาตรวจเอง ไม่พบ meta.test.mjs หรือ meta.mjs และใน package.json ไม่มีคีย์ preinstall เวอร์ชันนี้เผยแพร่เมื่อ 11 ต.ค. ผ่าน trusted publishing ของ GitHub Actions โดยมี Colin McDonnell ผู้ดูแลโปรเจกต์เป็นผู้อนุมัติ และมี SLSA provenance ชี้ไปที่ commit 284243f ส่วน commit อันตรายเป็นเหตุการณ์เมื่อ 21 ก.ย. ซึ่งถูก revert ภายในวันเดียวกัน ที่มันโผล่ขึ้นมาในหน้า release ก็เพราะยังอยู่ในประวัติระหว่าง tag v4.6.5 กับ v4.6.6

เกิดอะไรขึ้นเมื่อ 21 ก.ย.

จาก log ของ GitHub Actions และ commit ใน repo colinhacks/zod ผู้โจมตี push commit ที่ไม่ได้เซ็นชื่อ (unsigned) โดยใช้ชื่อ colinhacks ตรงขึ้น main ระหว่างราว 11:00–14:30 UTC ทั้งหมด 6 commit และไล่ทำทีละขั้น:

  1. ฝัง loader (d821685, ce1e11b): เพิ่ม meta.test.mjs แล้วเปลี่ยนชื่อเป็น meta.mjs ใน zod และ @zod/mini พร้อมแก้ release.yml ให้ publish ทันทีที่มีการ push เวอร์ชันใหม่
  2. พยายามถอดด่านอนุมัติ (84f79a7): commit ชื่อ “ci: drop the npm environment approval gate from publish”
  3. bump เวอร์ชันเป็น 4.6.7 และ 4.6.8 เพื่อกระตุ้นให้ระบบ release ทำงาน
  4. เพิ่ม workflow ใหม่ที่ publish ด้วย NPM_TOKEN (9488631) เพื่อเลี่ยง trusted publishing

ทุกความพยายามล้มเหลว workflow “Release on npm” จบด้วยสถานะ failure หรือ cancelled และ workflow “Publish to npm (token)” ก็ fail บน npm ไม่เคยมีเวอร์ชัน 4.6.7 หรือ 4.6.8 Colin revert ทั้ง 6 commit ผ่าน PR #6620 (“Cleanup bad commits”) เวลา 21:33 UTC วันเดียวกัน

ตัว loader ใช้เทคนิคที่เรียกว่า “EtherHiding” มันเรียก eth_call ไปยัง smart contract บน Ethereum mainnet ผ่าน RPC สาธารณะ (llamarpc, publicnode, cloudflare-eth) เพื่อถามว่าจะไปโหลด payload จากโดเมนไหน จากนั้นจึงดาวน์โหลด JavaScript มารันด้วยสิทธิ์ของโปรเซสที่ติดตั้งแพ็กเกจ ผู้โจมตีจึงเปลี่ยนเซิร์ฟเวอร์ปลายทางได้โดยไม่ต้องแก้แพ็กเกจเลย มีผู้ใช้ HN ตั้งข้อสังเกตว่าผู้โจมตีใส่ "preinstall" ไว้ที่ราก package.json แทนที่จะอยู่ใต้ "scripts" ทำให้ npm จะไม่รันมันอยู่แล้วแม้แพ็กเกจหลุดออกไป แต่ไม่ควรถือว่านี่คือสิ่งที่ปกป้องเรา เพราะผู้โจมตีแก้ใน commit ถัดไปได้ง่ายๆ

ไม่ได้โดนแค่ Zod: nub และ standard-schema ก็โดน

advisory ใน GitHub Community (โพสต์ 21 ก.ย.) ระบุว่าพบ loader ตัวเดียวกันใน 3 repo คือ colinhacks/zod, standard-schema/standard-schema และ nubjs/nub ซึ่งล้วนเป็นโปรเจกต์ที่ Colin ดูแลหรือมีส่วนร่วม มีเพียง @nubjs/nub@0.9.4 ที่หลุดไปถึงขั้น publish แต่ระบบสแกนมัลแวร์ของ npm กักไว้ในขั้น validation และบล็อกก่อนเปิดให้ติดตั้ง ปัจจุบันบน npm ไม่มีเวอร์ชัน 0.9.4 (มีแค่ 0.9.3 แล้วข้ามไป 0.9.5) advisory ยังระบุโดเมนสำหรับส่ง payload (dsakldjklsaj33112[.]com) และ SHA-256 ของไฟล์ไว้ให้ใช้ตรวจสอบ

Colin ตอบในกระทู้เดียวกันว่า advisory “พูดเกินจริงบางส่วน” เพราะ ช่องทางที่ถูกเจาะน่าจะเป็น git push credential บางอย่าง ไม่ใช่ token ของ npm หรือ GitHub ฝั่ง Zod ปลอดภัยเพราะ release flow ใช้ trusted publishing ร่วมกับ GitHub environment ที่ต้องมีคนอนุมัติ ไม่ใช่เพราะระบบสแกนของ npm ส่วน nub ซึ่ง release CI ถูกกระตุ้นได้ด้วยการสร้าง tag นั้นรอดเพราะ npm สแกนเจอ เขาแจ้งเพิ่มเมื่อ 24 ก.ย. ว่าย้ายแพ็กเกจทั้งหมดไปใช้ staged publishing ที่สั่งได้ผ่าน workflow_dispatch เท่านั้น ทุกการ publish จึงต้องผ่าน 2FA ส่วนต้นเหตุว่า credential รั่วจากไหน ณ ตอนนี้ยังอยู่ระหว่างตรวจสอบกับ GitHub และยังไม่มีข้อสรุปจากผู้ดูแล

ทำไมวันนี้คนถึงตกใจกันอีกรอบ

Zod ไม่ได้ออกเวอร์ชันใหม่เลยตั้งแต่ 4.6.5 (13 ก.ย.) จนถึง 4.6.6 (11 ต.ค.) หน้า release หรือหน้าเปรียบเทียบระหว่าง v4.6.5 กับ v4.6.6 บน GitHub จึงรวม commit อันตรายและ commit ที่ revert มันไว้ด้วย คนที่ตรวจ diff ก่อนอัปเดต (issue #6658 ซึ่งเปิดเมื่อ 11 ต.ค.) จึงเห็น meta.test.mjs โดยไม่รู้ว่ามันถูกลบไปแล้ว ประกอบกับ commit ใช้ชื่อผู้ดูแล ข่าวลือว่า “4.6.6 ติดมัลแวร์” จึงกระจายเร็ว ทั้งที่ tag v4.6.6 ชี้ไปที่ commit ที่สะอาด

สิ่งที่ควรเช็ก: รัน npm ls zod @zod/mini @nubjs/nub หรือ grep lockfile แล้วดูว่าไม่มี zod@4.6.7, 4.6.8 หรือ @nubjs/nub@0.9.4 (ซึ่งไม่ควรมี เพราะไม่เคยถูกเผยแพร่) ถ้าคุณ build Zod จาก source ที่ clone main ระหว่าง 21 ก.ย. 11:00–21:33 UTC ควรตรวจว่าไม่มีไฟล์ meta.mjs/meta.test.mjs และไม่เคยรันมัน

มุมมอง AI Curator

เคสนี้น่าสนใจเพราะด่านที่กันการโจมตีไว้ไม่ใช่การรีวิวโค้ด commit ที่มีคำว่า “ethereum” อยู่ในไลบรารี validator ถูก push ตรงขึ้น main ได้โดยไม่ผ่าน PR สิ่งที่หยุดมันได้คือการแยก “สิทธิ์ push” ออกจาก “สิทธิ์ publish” ใน Zod คือ trusted publishing บวก environment ที่ต้องมีคนอนุมัติ ใน nub คือการสแกนของ npm ผู้โจมตีรู้เรื่องนี้ดีด้วย เพราะ 3 ใน 6 commit ไม่ได้พยายามซ่อนมัลแวร์ แต่พยายามรื้อด่าน publish ออก ถ้า secret NPM_TOKEN แบบเก่ายังค้างอยู่ใน repo เรื่องนี้น่าจะจบต่างออกไป

สำหรับคนทำเอเจนต์และ MCP server ความเสี่ยงสูงกว่าเว็บแอปทั่วไป เพราะโปรเซสที่รัน npm install บนเครื่องนักพัฒนามักเข้าถึง API key ของโมเดล, token ของ GitHub และไฟล์ config ของ coding agent ได้ทั้งหมด ส่วน dependency bot ก็อัปเดตแพ็กเกจยอดนิยมอย่าง Zod อัตโนมัติ เราแนะนำให้ตั้ง ignore-scripts=true เป็นค่าเริ่มต้น (หรือใช้ package manager ที่ปิด lifecycle script ไว้ก่อน) รวมถึงตั้ง cooldown ไม่อัปเดตแพ็กเกจที่เพิ่งออกภายในไม่กี่วัน ทีมไทยหลายทีมที่ดูแลไลบรารีบน npm เองก็ควรถือโอกาสนี้เช็กว่ายังมี publish token ค้างใน CI หรือไม่ ถ้ายังมี ให้ย้ายไปใช้ trusted publishing พร้อม environment ที่ต้องอนุมัติ

บทเรียนอีกข้อคือเรื่องการสื่อสาร commit อันตรายถูกจัดการเสร็จตั้งแต่ 3 สัปดาห์ก่อน แต่เมื่อไม่มี security advisory ใน repo ของ Zod เอง และหน้า release ยังแสดง commit นั้นโดยไม่มีคำอธิบาย คนที่ตรวจละเอียดจึงเป็นคนแรกที่ตกใจ โปรเจกต์ที่มีผู้ใช้ระดับร้อยล้านครั้งต่อสัปดาห์ควรมี GitHub Security Advisory ที่ระบุชัดว่าเวอร์ชันไหนปลอดภัย แทนที่จะปล่อยให้ผู้ใช้ต้องไปไล่หาคำตอบจากกระทู้ HN


แหล่งข่าว

บทความนี้เรียบเรียงจากแหล่งข่าวต้นทาง — GitHub Community (security advisory)

เนื้อหาบน blog นี้สร้างโดย AI โดยมีการกำกับบรรณาธิการจากมนุษย์

อ่านเพิ่มในหมวด การแฮ็ก

ลิงก์แชร์ ChatGPT ลิงก์เดียวยึดบัญชีได้ ต้นตอคือ MathLive ไลบรารีที่มียอดดาวน์โหลดกว่า 4 แสนต่อสัปดาห์ เพิ่งออกแพตช์ 31 ต.ค.
การแฮ็ก

ลิงก์แชร์ ChatGPT ลิงก์เดียวยึดบัญชีได้ ต้นตอคือ MathLive ไลบรารีที่มียอดดาวน์โหลดกว่า 4 แสนต่อสัปดาห์ เพิ่งออกแพตช์ 31 ต.ค.

Parameter Labs เปิดเผยเมื่อ 28 ต.ค. ว่าลิงก์แชร์ ChatGPT สามารถรัน JavaScript ในเซสชันของคนเปิด อ่านแชตส่วนตัวและส่งข้อมูลออกนอกได้ OpenAI แก้แล้วเมื่อ 26 ต.ค. แต่ไลบรารี MathLive ที่เป็นจุดเริ่มต้นเพิ่งออกการแก้ด้านความปลอดภัยเมื่อ 31 ต.ค.

· อ่าน 5 นาที
Talos พบมัลแวร์ VOLTA ขโมยข้อมูลแล้วส่งให้ LLM จัดอันดับว่าเหยื่อคุ้มค่าแค่ไหน พร้อมสลับโมเดลอัตโนมัติเมื่อถูกปฏิเสธ
การแฮ็ก

Talos พบมัลแวร์ VOLTA ขโมยข้อมูลแล้วส่งให้ LLM จัดอันดับว่าเหยื่อคุ้มค่าแค่ไหน พร้อมสลับโมเดลอัตโนมัติเมื่อถูกปฏิเสธ

Cisco Talos เผยแพร่รายงาน VOLTA-AUTODOXER เมื่อ 31 ต.ค. มัลแวร์ขโมยข้อมูลบน Windows ที่ส่งหลักฐานของเหยื่อผ่าน OpenRouter ให้ LLM เขียนรายงานจัดลำดับมูลค่า ถ้าโมเดลแรกปฏิเสธจะไล่ไปโมเดลถัดไป และตัวสร้างแบบแทนค่าบ่งชี้ว่าอาจถูกขายเป็นสินค้า

· อ่าน 4 นาที
ส่วนขยาย Claude Code ปลอมฝังแบ็กดอร์ SSH บน Cursor Marketplace — อยู่ 11 ชั่วโมง กระทบไม่เกิน 5,000 คน ถอนส่วนขยายอย่างเดียวไม่พอ
การแฮ็ก

ส่วนขยาย Claude Code ปลอมฝังแบ็กดอร์ SSH บน Cursor Marketplace — อยู่ 11 ชั่วโมง กระทบไม่เกิน 5,000 คน ถอนส่วนขยายอย่างเดียวไม่พอ

Cursor ยืนยันว่า Anthropic.claude-code เวอร์ชัน 2.1.312 และ 2.1.313 ที่ถูกดัดแปลงอยู่ใน marketplace ราว 11 ชั่วโมงเมื่อ 29 ต.ค. พยายามเปิดแบ็กดอร์ SSH บน macOS และ Windows พนักงาน Anthropic ยืนยันว่า 2.1.313 ไม่เคยถูกเผยแพร่จากบริษัท เรื่องที่ยังไม่เปิดเผยคือคนร้ายเข้าไปวางไฟล์ได้อย่างไร

· อ่าน 5 นาที