Claude Code 2.1.251 ปิดช่องหลุดขอบเขตสิทธิ์ยกชุด — symlink ที่สลับหลังผ่านการตรวจ, deny rule ที่ Grep มองไม่เห็น และคำสั่ง Bash ที่อนุมัติตัวเองได้ด้วยเลขคณิต
28 สิงหาคม 2026 Anthropic ปล่อย Claude Code v2.1.251 ซึ่งเมื่ออ่านผ่าน ๆ ดูเหมือนรุ่นเก็บกวาดบั๊กตามปกติ — แต่ถ้าเรียงเฉพาะบรรทัดที่แตะเรื่องสิทธิ์ จะเห็นว่านี่คือการ ตรวจสอบขอบเขตความเชื่อถือ (trust boundary) ของตัวเอเจนต์ทั้งระบบในคราวเดียว และช่องที่ปิดหลายช่องเป็นรูปแบบคลาสสิกของช่องโหว่ระบบไฟล์ที่ย้ายมาอยู่ในบริบทของ AI agent
ประเด็นนี้สำคัญกว่าที่ตัวเลขเวอร์ชันบอก เพราะโมเดลความปลอดภัยของ coding agent ทุกวันนี้วางอยู่บนสมมติฐานเดียว คือ “สิ่งที่ผู้ใช้อนุมัติ = สิ่งที่เอเจนต์ทำจริง” ทุกบั๊กในรายการนี้คือกรณีที่สมมติฐานนั้นไม่จริง
TOCTOU กลับมาอีกครั้ง — คราวนี้อยู่ระหว่างการอนุมัติกับการอ่านไฟล์
รายการที่ตรงที่สุดคือ:
Fixed file tools (Read, Write, Edit) following a symlink swapped inside the working directory after the permission check, which could read or write outside the approved location
นี่คือ TOCTOU (time-of-check to time-of-use) ตำราเล่มแรก: ระบบตรวจว่าพาธอยู่ในไดเรกทอรีที่อนุมัติแล้ว → ผ่าน → แต่ระหว่างช่วงเวลาสั้น ๆ ก่อนจะเปิดไฟล์จริง มีคนสลับพาธนั้นเป็น symlink ที่ชี้ออกไปข้างนอก ผลคือเครื่องมืออ่าน/เขียนนอกขอบเขตที่ผู้ใช้อนุมัติได้จริง
ความต่างจาก TOCTOU ทั่วไปอยู่ที่ ใครเป็นคนสลับ ในระบบยูนิกซ์ปกติ ผู้โจมตีต้องมีสิทธิ์เขียนในไดเรกทอรีเป้าหมายอยู่แล้ว แต่ในบริบท coding agent ตัวเอเจนต์เองต่างหากที่มีสิทธิ์เขียนในไดเรกทอรีทำงานตลอดเวลา — เพราะนั่นคืองานของมัน สถานการณ์ที่สมจริงจึงไม่ใช่ “แฮกเกอร์แอบเข้ามาแก้ไฟล์” แต่คือ prompt injection จาก repo ที่โคลนมา, จาก issue ที่ให้อ่าน หรือจากผลลัพธ์ของ WebFetch ที่หลอกให้เอเจนต์สร้าง symlink ด้วยมือมันเอง แล้วอ่านไฟล์ผ่านลิงก์นั้นในเทิร์นถัดไป
รุ่นเดียวกันปิดญาติของมันอีกสองช่อง:
- Grep และ Glob ไม่บังคับใช้กฎ
Read(...)deny กับไฟล์ที่เข้าถึงผ่าน symlinked search path — แปลว่าถ้าคุณตั้ง deny rule ห้ามอ่าน.envหรือ~/.sshไว้ Read จะเคารพ แต่ Grep เดินผ่านลิงก์แล้วดึงเนื้อหาออกมาให้อยู่ดี ซึ่งเป็นการรั่วที่ตรวจจับยากกว่า เพราะผู้ใช้ตั้ง deny rule แล้วก็เชื่อว่าปิดแล้ว - Workflow tool อ่าน
scriptPathที่อยู่นอกขอบเขตที่เซสชันอ่านได้ ก่อนที่การตรวจสิทธิ์จะรัน — และแย่กว่านั้นคือ ยกเนื้อหานั้นไปใส่ในข้อความ error ซึ่งเป็นช่องรั่วข้อมูลผ่านข้อความแจ้งเตือน (error-message oracle) แบบคลาสสิก
เมื่อการตรวจสิทธิ์ Bash แพ้ให้กับไวยากรณ์ของ shell
บรรทัดที่น่าสนใจที่สุดในเชิงเทคนิคคืออันนี้:
Fixed Bash permission checks auto-approving commands that assign an arithmetic expression to an integer shell variable (e.g.
OPTIND=1/0,RANDOM=2+2); these now prompt for approval
ตัวตรวจสิทธิ์ของ Bash ต้อง parse คำสั่งเพื่อดูว่ามันจะรันโปรแกรมอะไร คำสั่งที่เป็นแค่การกำหนดค่าให้ตัวแปร (เช่น FOO=bar) ไม่ได้รันอะไรเลย จึงถูกจัดว่าปลอดภัยและอนุมัติอัตโนมัติได้ ปัญหาคือใน shell การกำหนดค่าให้ตัวแปรจำนวนเต็มพิเศษบางตัว (OPTIND, RANDOM, SECONDS, LINENO) จะทำให้ฝั่งขวาถูกประเมินในบริบท arithmetic evaluation — ซึ่งไม่ใช่การกำหนดค่าเฉย ๆ อีกต่อไป มันคือการรันโค้ด และในหลายเชลล์ arithmetic context ยังพา command substitution เข้ามาได้ด้วย ตัวอย่าง OPTIND=1/0 ในรายการคือการสาธิตแบบไม่เป็นพิษ (หารด้วยศูนย์) ว่าฝั่งขวาถูกประเมินจริง
บทเรียนกว้างกว่านั้นคือ การอนุญาตด้วยการ parse คำสั่งเป็นเกมที่ฝ่ายป้องกันต้องรู้ไวยากรณ์ทั้งหมดของ shell ให้ครบ ส่วนฝ่ายโจมตีต้องหาเจอแค่ช่องเดียว — เป็นเหตุผลตรง ๆ ว่าทำไม allowlist ระดับคำสั่งจึงควรเป็นชั้นเสริม ไม่ใช่ชั้นเดียวที่กั้นอยู่
รุ่นนี้ยังปิดช่องกลุ่ม “ตั้งค่าจากที่ไม่ควรตั้งได้”:
- plugin command จาก marketplace ที่ชี้พาธออกนอกไดเรกทอรีปลั๊กอิน ตอนนี้ถูกปฏิเสธด้วย path-traversal error
- project settings ไม่สามารถเปิด beta tracing แบบละเอียดหรือ raw API body logging ได้อีก — คือกันไม่ให้ไฟล์
.claude/settings.jsonที่มากับ repo แปลกหน้า เปิดการบันทึกเนื้อหาคำขอ API ดิบ (ซึ่งรวมโค้ดและ prompt ของคุณ) และไม่ให้ endpoint สโคปต่ำ bypass ตัว OTLP collector ที่ managed settings ปักไว้ envใน project settings ตั้งCLAUDE_CONFIG_DIR,CLAUDE_CODE_TMPDIRหรือTMPDIR/TMP/TEMPไม่ได้แล้ว — ทั้งสามตัวคือการชี้ที่เก็บ credential และไฟล์ชั่วคราวไปที่อื่นANTHROPIC_CUSTOM_HEADERSจาก managed หรือ project settings ต้องขออนุมัติ เมื่อมันตั้งเฮดเดอร์ประเภท credential, org/tenant, routing หรือเปลี่ยนพฤติกรรม API (เช่นAuthorization,Host)- server-managed settings ที่ terminate TLS ของ sandbox, ส่งทราฟฟิกผ่าน proxy ของตัวเอง, ฉีด credential หรือลดความแข็งของ sandbox ต้องขออนุมัติก่อนมีผล
- ไฟล์ที่ใช้รับ output ของคำสั่ง Bash ในโหมด sandbox ถูกเปลี่ยนวิธีสร้างและอ่านกลับ เพื่อไม่ให้คำสั่งที่รันอยู่ใน sandbox redirect หรือแทนที่มันได้
- Claude in Chrome ตอนนี้ให้ browser action ผ่านการตรวจสิทธิ์ของ Claude Code เสมอ รวมถึงเซสชันที่ปิด telemetry ซึ่งเดิมใช้ prompt ของส่วนขยาย Chrome เอง
อ่านคู่กับ --restricted ที่มาก่อนหน้าสองวัน
รุ่น 2.1.248 (27 ส.ค.) เพิ่มธง --restricted (หรือ CLAUDE_CODE_RESTRICTED=1) ซึ่งเป็นการเดินเกมเดียวกันจากอีกฝั่ง: ถอดเครื่องมือที่รันคำสั่งหรือโค้ดออกทั้งหมด รวมถึง WebFetch (เว้นแต่จะระบุใน --tools), บังคับเครื่องมือไฟล์ให้อยู่ในไดเรกทอรีทำงาน, ปฏิเสธ bypassPermissions และ ไม่อ่านไฟล์ settings ระดับ user, project และ local เลย
บรรทัดสุดท้ายคือหัวใจ — โหมดนี้ออกแบบมาสำหรับกรณีที่คุณรันเอเจนต์บนโค้ดที่คุณไม่ไว้ใจ ซึ่งพอเอามาอ่านคู่กับรายการแก้บั๊กใน 2.1.251 จะเห็นภาพชัดว่าทีมกำลังยอมรับอะไร: ไฟล์ตั้งค่าที่มาพร้อม repo คือ input ที่ไม่น่าเชื่อถือ ไม่ต่างจากเนื้อหาในไฟล์โค้ด
มุมมอง AI Curator
สิ่งที่ควรสังเกตในรุ่นนี้ไม่ใช่บั๊กแต่ละตัว แต่คือ รูปแบบ ที่มันซ้ำกัน: ทุกช่องคือกรณีที่ “สิ่งที่ผู้ใช้เห็นตอนกดอนุมัติ” กับ “สิ่งที่เกิดขึ้นจริงตอนรัน” ไม่ตรงกัน — พาธที่ถูกสลับหลังตรวจ, กฎ deny ที่บังคับใช้แค่บางเครื่องมือ, คำสั่งที่ดูเหมือนกำหนดค่าตัวแปรแต่รันโค้ด, ไฟล์ตั้งค่าจาก repo ที่เปลี่ยนพฤติกรรมของเอเจนต์เงียบ ๆ นี่คือช่องว่างระหว่าง การอนุมัติเชิงสัญลักษณ์กับผลเชิงความหมาย และมันจะเป็นแหล่งช่องโหว่หลักของยุคเอเจนต์ไปอีกนาน เพราะ prompt injection ทำให้ผู้โจมตีสั่งงานตัวที่มีสิทธิ์อยู่แล้วได้โดยไม่ต้องเจาะสิทธิ์ใด ๆ เลย
สำหรับทีมไทยที่กำลังเอา coding agent เข้าสายงานจริง มีข้อสรุปที่ใช้ได้ทันทีสามข้อ หนึ่ง — อัปเดตเป็น 2.1.251 ขึ้นไป โดยเฉพาะถ้าคุณให้เอเจนต์แตะ repo ของลูกค้าหรือโค้ดที่โคลนมาจากภายนอก สอง — อย่าถือว่า deny rule คือกำแพง บทเรียนจากช่อง Grep/Glob คือกฎที่บังคับใช้ไม่ครบทุกเครื่องมือให้ความมั่นใจผิด ๆ ความลับจริง (คีย์ production, credential ลูกค้า) ควรอยู่นอกเครื่องที่เอเจนต์รัน ไม่ใช่อยู่ในไฟล์ที่ถูกกฎห้ามอ่าน สาม — ถ้ารันบนโค้ดที่ไม่ไว้ใจ ให้ใช้ --restricted และรันในคอนเทนเนอร์ที่ทิ้งได้ ไม่ใช่บนเครื่องที่มี ~/.aws และคีย์ SSH ของคุณอยู่
จุดที่ควรให้เครดิต Anthropic คือการเขียน changelog ที่บอกลักษณะช่องโหว่ตรง ๆ พร้อมตัวอย่างคำสั่ง แทนที่จะเขียนว่า “ปรับปรุงความปลอดภัย” — ซึ่งเป็นสิ่งที่ผู้ขายเครื่องมือส่วนใหญ่ทำ ความโปร่งใสระดับนี้ทำให้ทีมที่ใช้งานประเมินได้เองว่าตัวเองเคยเสี่ยงแค่ไหน แต่ก็ต้องพูดอีกด้านด้วย: การที่ช่องพวกนี้ยังหลุดมาถึงรุ่น 2.1.251 บอกว่าโมเดลสิทธิ์ของ coding agent ยังอยู่ในช่วงตั้งไข่ และคำถามที่ยังไม่มีใครตอบได้ดีคือ ทำไมการตรวจสิทธิ์จึงยังกระจายอยู่ในเครื่องมือแต่ละตัว แทนที่จะรวมศูนย์ไว้ที่ชั้นเดียวที่ทุกการเข้าถึงระบบไฟล์ต้องผ่าน — เพราะตราบใดที่ Read, Grep, Glob และ Workflow ต่างคนต่างตรวจ ก็จะมีเครื่องมือที่ห้าที่ตรวจไม่ครบเสมอ
แหล่งข่าว
อ่านเพิ่มในหมวด เครื่องมือนักพัฒนา
Betelgeuse รัน Qwen3.8 Flash Next ขนาด 68GB บน RTX 3060 กับแรม 16GB ส่วน Basalt วัดให้เห็นว่าเอนจินที่เร่งด้วยแฟล็กลัดทำให้โมเดลลืมของ
Betelgeuse ฟอร์ก llama.cpp ที่เปิดเมื่อ 31 ต.ค. ดึง expert จาก NVMe เข้า VRAM ตามต้องการ อ้าง 22 tok/s แบบไม่ทิ้ง expert แต่ README เตือนเองว่ายังทดลองและตัวเลขมาจากคนละรอบ วันเดียวกันผู้พัฒนา Basalt เผยผลวัดว่าแฟล็กเร่งความเร็วทำคุณภาพ Q8 ตกไปใกล้ Q2
กฎห้ามโคลนเกมของ Claude Code เริ่มกระทบงานจริง บริษัทรับทำเกมกระดานร้องงานลูกค้าหยุด แต่รายงานหลายชิ้นปนกับตัวกรองไซเบอร์คนละเรื่อง
ต่อจากที่เราพบกฎนี้ในไบนารี Claude Code ผู้ใช้เริ่มรายงานว่างานเชิงพาณิชย์ถูกปฏิเสธ และ Tom's Hardware กับ Mashable หยิบไปรายงาน แต่เมื่อไล่ issue ที่อ้างถึง พบว่าหลายรายการเกิดก่อนกฎจะมา จึงน่าจะเป็นตัวกรองด้านไซเบอร์ ส่วน Anthropic ยังไม่ชี้แจง
Claude Code ส่ง transcript ของ background agent ให้โมเดลทุก ~30 วินาทีเพื่อเขียนสถานะ 3–5 คำ ผู้วัดรายงานกินราว 16% และยังปิดแบบทางการไม่ได้
รายงานอิสระพบว่าฟีเจอร์ agent_summary ของ Claude Code ส่ง transcript เต็มของ background agent ไปถามสถานะทุก ~30 วินาที คิดเป็น 16.4% ของค่าใช้จ่ายในระบบของผู้วัด Issue เปิดมาตั้งแต่ ส.ค. ยังไม่มีสวิตช์ปิดที่รองรับ เราตรวจพบโค้ดนี้ใน 2.1.314 และพบกฎใหม่เรื่องเกมที่ไม่อยู่ใน changelog