สรุปสั้น

ผู้ใช้ Claude Code รายหนึ่งรายงานเหตุข้อมูลสูญหายร้ายแรง โดยกล่าวหาว่าเอเจนต์เขียนโค้ดอัตโนมัติได้ลบไฟล์สด 48,218 รายการออกจากโครงสร้างโปรเจกต์บน Windows และทำลาย Git object store ของ repository เหตุการณ์นี้เกิดขึ้นในเวลาเพียง 103 วินาที ระหว่างเวลา 22:10:31 น. ถึง 22:12:14 น. ตามเวลา ET หลังจากเอเจนต์ได้รับอนุญาตให้สร้าง mirror ใหม่สำหรับงานที่ระบุว่า “#873”

ทั้งนี้ คำกล่าวอ้างมาจากโพสต์บน Reddit พร้อมรายงานผลตรวจสอบที่แนบมา ไม่ใช่การสอบสวนทางนิติวิทยาศาสตร์ที่เผยแพร่โดยอิสระ ตามรายงานระบุว่าเอเจนต์พบว่าไฟล์ build_mirror.py ไม่สามารถรีเฟรช mirror ในที่เดิมได้ จึงสร้างสคริปต์ Python เพื่อลบสำเนาเก่าที่เก็บไว้ในตำแหน่งชั่วคราว แต่สคริปต์กลับไล่ลบไฟล์ในไดเรกทอรีที่เชื่อมโยงกลับเข้าสู่โปรเจกต์จริงจนเกิดความเสียหายมหาศาล

รายละเอียดข่าว

เว็บไซต์ Cyber Security News รายงานเมื่อวันที่ 21 กันยายน 2569 ว่า มีผู้ใช้ Claude Code รายงานเหตุที่เอเจนต์เขียนโค้ดอัตโนมัติลบไฟล์จำนวนมากบนเครื่อง Windows ของตน

สำเนา mirror ที่ถูกลบมีไฟล์ทั่วไป 7,332 รายการ และ Windows directory junction 614 รายการที่ชี้กลับเข้าสู่ไดเรกทอรี Dashboard ที่ใช้งานจริง สคริปต์ทำความสะอาดใช้คำสั่ง os.walk(…, followlinks=False) โดยดูเหมือนจะสันนิษฐานว่าตัวเลือกนี้จะป้องกันการไล่เข้าไปในไดเรกทอรีที่ลิงก์ไว้ แต่สมมติฐานนี้กลับก่อหายนะบน Windows

รายงานผลตรวจสอบระบุว่า os.path.islink() คืนค่า false สำหรับ junction เหล่านี้ ทำให้ตัวลบมองไดเรกทอรีใต้แต่ละ junction เป็นเส้นทางปกติและไล่ลบตามไป แม้สคริปต์จะมีตัวป้องกัน junction อยู่ แต่ก็ป้องกันเฉพาะไฟล์ที่อยู่ตรงรากของ junction เท่านั้น ส่วนไดเรกทอรีซ้อนด้านในถูกไล่ลบไปด้วย โดยล็อกของสคริปต์เองนับได้ 55,550 ไฟล์ 614 junction และ 1,808 ไดเรกทอรี เมื่อหักไฟล์ mirror ที่ตั้งใจลบ 7,332 รายการ ผู้ตรวจสอบจึงคำนวณได้ว่ามีไฟล์สดถูกลบไป 48,218 รายการ

ความเสียหายลุกลามเกินกว่าเนื้อหาแอปพลิเคชัน โดยไดเรกทอรี .git/objects, refs และ logs ว่างเปล่า ทำให้ git log ไม่พบ commit ส่วน index ยังอยู่และยังคงแสดง 7,221 เส้นทาง แต่ blob เบื้องหลังหายไปแล้ว ทำให้กู้คืนด้วย Git ไม่ได้ ทั้งนี้ไฟล์ที่รากโปรเจกต์ เอกสาร แบ็กอัป บันทึกการสนทนา และไฟล์นอกไดเรกทอรี Dashboard ยังคงอยู่ครบ

รายละเอียดทางเทคนิค

หัวใจของปัญหาคือความแตกต่างของ Windows directory junction กับ symbolic link ตัวเลือก followlinks=False ของ os.walk และฟังก์ชัน os.path.islink() ของ Python ไม่ได้ปฏิบัติต่อ junction ว่าเป็นลิงก์เสมอไป จึงเปิดทางให้สคริปต์ไล่ลบไฟล์ในไดเรกทอรีปลายทางที่ junction ชี้ไป นอกจากนี้คุณสมบัติ checkpoint ของ Claude Code ก็ไม่สามารถช่วยกู้สถานการณ์นี้ได้ เพราะการเปลี่ยนแปลงที่ทำผ่านคำสั่ง Bash รวมถึงการลบไฟล์ ไม่ได้ถูกติดตามไว้สำหรับการย้อนกลับ (rewind)

เอกสารของ Anthropic ระบุว่าโหมด Manual จะขออนุมัติก่อนรันคำสั่ง Bash และการแก้ไขไฟล์ ขณะที่โหมด bypassPermissions จะข้ามการถามและควรใช้เฉพาะภายในคอนเทนเนอร์หรือเครื่องเสมือนที่แยกออกมาเท่านั้น อย่างไรก็ตาม จนกว่าจะมีการเปิดเผยล็อกหรือหลักฐานทางนิติวิทยาศาสตร์ เรื่องราวที่แน่ชัดยังคงเป็นเหตุการณ์ที่ผู้ใช้รายงานเอง โดยไม่มีการยืนยันอิสระว่าเป็นข้อบกพร่องเฉพาะของ Claude Code บนเครื่องที่ได้รับผลกระทบ

ผลกระทบ

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

คำแนะนำ

ควรปฏิบัติต่อเอเจนต์เขียนโค้ด AI เสมือนระบบอัตโนมัติที่มีสิทธิ์ ไม่ใช่ผู้ช่วยสนทนา การดำเนินการที่ทำลายล้างควรเริ่มด้วยการทดลองแบบ dry run และสร้าง path manifest ก่อน ใช้การย้ายไฟล์ที่ย้อนกลับได้แทนการลบทันที และรันภายใต้บัญชีสิทธิ์ต่ำสุดในแซนด์บ็อกซ์ที่จำกัดการเข้าถึงระบบไฟล์ Anthropic ระบุถึงขอบเขตระบบไฟล์ที่บังคับใช้ระดับ OS สำหรับ Bash, PowerShell และโปรเซสลูก ทำให้การทำแซนด์บ็อกซ์เป็นมาตรการควบคุมที่จำเป็น ไม่ใช่ทางเลือกเสริม ที่สำคัญควรมีแบ็กอัปและระบบเวอร์ชันที่แยกจากเครื่องทำงาน เพื่อให้กู้คืนได้แม้ Git object store จะถูกทำลาย

แหล่งอ้างอิง