Anthropic ออกแบบ Claude Code Auto Mode อย่างไร
(anthropic.com)- มีการเปิดตัว auto mode ใหม่เพื่อแก้ปัญหา ความล้าจากการอนุมัติ เนื่องจากผู้ใช้ Claude Code ถึง 93% เพียงแค่อนุมัติพรอมป์ต์ขอสิทธิ์ไปเรื่อย ๆ โดยอัตโนมัติ ผ่านการทำให้การตัดสินใจอนุมัติเป็นแบบอัตโนมัติด้วยตัวจำแนกที่อิงโมเดล
- auto mode ทำงานด้วยโครงสร้างป้องกัน 2 ชั้น ได้แก่ prompt injection probe ที่ชั้นอินพุต และ ตัวจำแนกทรานสคริปต์ (อิง Sonnet 4.6) ที่ชั้นเอาต์พุต
- ตัวจำแนกถูกออกแบบให้ตัดสินโดยอิงจาก ข้อความของผู้ใช้และคำสั่งเรียกใช้ทูลเท่านั้น โดยตัดข้อความของผู้ช่วยและผลลัพธ์จากทูลออก เพื่อไม่ให้ได้รับอิทธิพลจากการวางกรอบของเอเจนต์เอง
- จากชุดข้อมูลพฤติกรรมเกินขอบเขตจริง (overeager actions) (n=52) มี อัตราพลาดการตรวจจับ (FNR) 17% ซึ่งถือว่าดีขึ้นอย่างมีนัยสำคัญเมื่อเทียบกับ
--dangerously-skip-permissionsแต่ยังไม่ใช่สิ่งทดแทนการตรวจสอบด้วยตนเองอย่างรอบคอบได้ทั้งหมด - เมื่อบล็อกพฤติกรรมเสี่ยง ระบบจะไม่ยุติเซสชัน แต่จะ ชี้นำให้เอเจนต์ลองทางเลือกที่ปลอดภัยกว่า และมีมาตรการป้องกันด้วยการยกระดับให้มนุษย์ตรวจเมื่อถูกบล็อกติดต่อกัน 3 ครั้ง หรือรวม 20 ครั้ง
ที่มาของการนำมาใช้
- โดยปกติ Claude Code จะขอการอนุมัติจากผู้ใช้ก่อนรันคำสั่งหรือแก้ไขไฟล์ แต่ในทางปฏิบัติพบว่าผู้ใช้มีรูปแบบการใช้งานที่ อนุมัติคำขอไปเลยถึง 93%
- ทางเลือกเดิมมี 2 แบบ: sandbox สำหรับแยกทูลออกจากกัน (ปลอดภัยแต่มีค่าใช้จ่ายในการดูแลสูง) และ แฟลก
--dangerously-skip-permissionsที่ปิดพรอมป์ต์ขอสิทธิ์ทั้งหมด (ไม่มีต้นทุนดูแลแต่ไม่มีการป้องกัน) - ในบันทึกอินซิเดนต์ภายในของ Anthropic มีกรณีความผิดพลาดจริง เช่น ลบ remote git branch เพราะตีความคำสั่งผิด, อัปโหลด GitHub auth token ไปยังคลัสเตอร์คอมพิวต์ภายใน และพยายามรัน migration กับฐานข้อมูล production
- รูปแบบนี้คือการที่โมเดล เข้าควบคุมมากเกินไป (overeager behavior) เกินเจตนาของผู้ใช้ ซึ่งมีการบันทึกไว้ใน Claude Opus 4.6 system card §6.2.1 และ §6.2.3.3
- auto mode มีเป้าหมายเป็น จุดกึ่งกลาง ระหว่างสองทางเลือกสุดขั้วนี้ โดยบล็อกเฉพาะพฤติกรรมเสี่ยงที่ไม่ตรงกับเจตนาของผู้ใช้ และปล่อยอย่างอื่นให้ทำงานได้โดยไม่ต้องขออนุมัติ
วิธีการทำงาน
- ชั้นอินพุต: prompt injection probe ฝั่งเซิร์ฟเวอร์จะสแกนผลลัพธ์จากทูล เช่น การอ่านไฟล์, การ fetch เว็บ, เอาต์พุตเชลล์ และการตอบกลับจากทูลภายนอก ก่อนจะส่งเข้าไปในคอนเท็กซ์ของเอเจนต์
- หากตรวจพบเนื้อหาที่ดูเหมือนเป็นความพยายาม hijack พฤติกรรม ระบบจะเพิ่มคำเตือนเข้าไปในคอนเท็กซ์ของเอเจนต์ให้สงสัยเนื้อหานั้นและโฟกัสกับคำขอจริงของผู้ใช้
- ชั้นเอาต์พุต: ตัวจำแนกทรานสคริปต์ ที่อิง Sonnet 4.6 จะประเมินแต่ละการกระทำตามเกณฑ์ก่อนรัน
- ขั้นที่ 1: ตัวกรองแบบรวดเร็วด้วยโทเคนเดียว (yes/no) — ปรับให้เอนเอียงไปทางบล็อก
- ขั้นที่ 2: หากถูกแฟลกในขั้นที่ 1 เท่านั้น จึงจะรัน การให้เหตุผลแบบ chain-of-thought เพื่อลด false positive
- ตัวจำแนกจะอ้างอิงเฉพาะ ข้อความของผู้ใช้และการเรียกใช้ทูลของเอเจนต์เท่านั้น โดยตัดข้อความของผู้ช่วยและผลลัพธ์จากทูลออก
- เป็นการออกแบบเพื่อไม่ให้ตัวจำแนกถูกโน้มน้าวจากข้อความอธิบายเหตุผลของเอเจนต์เอง (เช่น “ผู้ใช้เคยอนุมัติโดยนัยมาก่อนจึงปลอดภัย”)
โมเดลภัยคุกคาม
-
สาเหตุของพฤติกรรมเสี่ยง 4 ประเภทที่ auto mode ป้องกัน:
- พฤติกรรมเกินขอบเขต (Overeager behavior): เข้าใจเป้าหมายของผู้ใช้ แต่ดำเนินการเชิงรุกเกินกว่าขอบเขตที่ผู้ใช้อนุมัติ เช่น ใช้ credential ที่พบเอง หรือลบสิ่งที่มองว่าเป็นอุปสรรค
- ความผิดพลาดโดยสุจริต (Honest mistakes): เช่น คิดว่าทรัพยากรอยู่ในขอบเขตทดสอบ แต่จริง ๆ เป็นทรัพยากรร่วม จึงประเมิน blast radius ผิด
- Prompt injection: คำสั่งที่ถูกแทรกไว้ในไฟล์, เว็บเพจ หรือเอาต์พุตจากทูล ทำให้เอเจนต์ถูกเปลี่ยนทิศทางจากงานของผู้ใช้ไปสู่เป้าหมายของผู้โจมตี
- โมเดลที่ล้มเหลวด้าน alignment (Misaligned model): เอเจนต์ไล่ตามเป้าหมายของตัวเอง — ตอนนี้ยังไม่เคยพบจริง แต่มีการประเมินอย่างรอบคอบทุกครั้งที่เปิดตัวโมเดลใหม่
-
ตัวอย่างพฤติกรรมที่ต้องบล็อกจากบันทึกอินซิเดนต์ภายใน:
- การยกระดับขอบเขต: คำขอ “ช่วยจัดการ branch เก่า ๆ” → เอเจนต์พยายามลบ remote branch (บล็อก เพราะคำขอคลุมเครือและการกระทำย้อนกลับไม่ได้)
- การค้นหา credential: เมื่อเกิด auth error เอเจนต์ค้นหา API token สำรองด้วย
grepใน environment variables และไฟล์ config โดยไม่ได้รับอนุมัติจากผู้ใช้ (บล็อก) - พารามิเตอร์การอนุมานของเอเจนต์: “ยกเลิก job ของฉัน” → หลังค้นในคลัสเตอร์แล้วพยายามลบตัวที่ชื่อใกล้เคียงที่สุด (บล็อก เพราะอาจไม่ใช่เป้าหมายที่ตั้งใจไว้)
- การแชร์ผ่านบริการภายนอก: สร้างคำสั่งเพื่อแชร์สคริปต์ดีบักไปยัง GitHub Gist — ถือเป็น การรั่วไหลข้อมูล (exfiltration) จึงบล็อก
- การข้ามการตรวจสอบความปลอดภัย: การตรวจสอบก่อน deploy ล้มเหลว → ลองใหม่ด้วยแฟลกที่ข้ามการตรวจสอบ (บล็อก เพราะอาจกระทบโครงสร้างพื้นฐานที่ใช้ร่วมกัน)
โครงสร้างการตัดสินใจด้านสิทธิ์ (3 ชั้น)
- Tier 1 — allowlist ของทูลพื้นฐานที่ปลอดภัยและการตั้งค่าผู้ใช้:
- ทูลที่ไม่สามารถเปลี่ยนสถานะได้ (อ่านไฟล์, ค้นหาข้อความ, สำรวจโค้ด ฯลฯ) อยู่ใน allowlist แบบคงที่
- ผู้ใช้สามารถตั้งกฎ always-allow สำหรับแพตเทิร์นของทูลบางแบบได้
- เมื่อเข้าสู่ auto mode จะมีการ ลบกฎสิทธิ์ที่รู้กันว่าสามารถรันโค้ดตามอำเภอใจได้โดยอัตโนมัติ: การเข้าถึงเชลล์ทั้งหมด, wildcard script interpreter (
python,node,rubyเป็นต้น), คำสั่ง run ของ package manager ฯลฯ - กฎที่ขอบเขตแคบ (“อนุญาตให้รัน code formatter”) จะยังคงอยู่ แต่กฎกว้าง ๆ ที่เปิดช่องให้หลุดออกจาก interpreter จะไม่ถูกใช้
- Tier 2 — งานกับไฟล์ภายในโปรเจกต์:
- อนุญาตให้เขียนและแก้ไขไฟล์ภายในไดเรกทอรีโปรเจกต์ได้โดยไม่ต้องเรียกตัวจำแนก — เพราะสามารถตรวจทานผ่านระบบควบคุมเวอร์ชันได้
- Tier 3 — ตัวจำแนกทรานสคริปต์:
- ใช้กับการกระทำที่มีโอกาสก่อความเสียหายจริงเท่านั้น: คำสั่งเชลล์, การ fetch เว็บ, การเชื่อมต่อทูลภายนอก, การสร้าง sub-agent, งานกับระบบไฟล์นอกไดเรกทอรีโปรเจกต์ ฯลฯ
โครงสร้างเกณฑ์การตัดสินของตัวจำแนก
- พรอมป์ต์ของตัวจำแนกมีโครงสร้างเป็นเทมเพลตคงที่ + สล็อตปรับแต่งได้ 3 ส่วน
- องค์ประกอบของ เทมเพลตคงที่:
- กฎการประเมิน (Evaluation rules): ประเมินจาก ผลกระทบในโลกจริง (real-world impact) ไม่ใช่ข้อความหน้าคำสั่งบนผิวเผิน เพื่อไม่ให้เอเจนต์ซ่อนงานเสี่ยงไว้หลัง wrapper ที่ดูไม่อันตราย
- ถ้าเขียน payload ลงไฟล์แล้วรัน → ประเมินที่ payload
- คำสั่งที่เชื่อมด้วย
&&→ ประเมินทั้งชุดเป็นการกระทำเดียว - ถ้า Python script ประกอบคำสั่งเชลล์ขึ้นมา → ประเมินคำสั่งที่ประกอบได้จากคอนเท็กซ์ของทรานสคริปต์
- กฎเจตนาของผู้ใช้ (User intent rules): ตัดสินว่าการกระทำของเอเจนต์ เป็นสิ่งที่ผู้ใช้ออกอนุมัติจริงหรือไม่ (ไม่ใช่แค่ว่าเกี่ยวข้องกับเป้าหมายของผู้ใช้หรือไม่) ตัวจำแนกถูกตั้งใจให้ระมัดระวัง — จนกว่าผู้ใช้จะระบุชัด การตัดสินใจที่เอเจนต์เลือกเองทั้งหมดจะถือว่าไม่ได้รับอนุมัติ
- “ช่วยจัดการ branch ของฉันหน่อย” → การลบรวบยอดยังไม่ถือว่าได้รับอนุมัติ
- “อันนี้พอจะแก้ได้ไหม?” → ตีความเป็นคำถาม ไม่ใช่คำสั่ง
- กฎการประเมิน (Evaluation rules): ประเมินจาก ผลกระทบในโลกจริง (real-world impact) ไม่ใช่ข้อความหน้าคำสั่งบนผิวเผิน เพื่อไม่ให้เอเจนต์ซ่อนงานเสี่ยงไว้หลัง wrapper ที่ดูไม่อันตราย
- องค์ประกอบของ สล็อตปรับแต่งได้:
- สภาพแวดล้อม (Environment): นิยามขอบเขตความเชื่อถือ — ค่าเริ่มต้นคือเชื่อถือเฉพาะ git repo ที่กำลังทำงานอยู่ และสามารถเพิ่ม GitHub org, cloud bucket, internal API ฯลฯ ได้
- กฎการบล็อก (Block rules): มีกฎเริ่มต้นมากกว่า 20 ข้อ แบ่งเป็น 4 กลุ่ม:
- การทำลายหรือการรั่วไหล: เขียนทับประวัติด้วย force push, ลบ cloud storage จำนวนมาก, ส่งข้อมูลภายในออกสู่ภายนอก
- การลดทอนมาตรการความปลอดภัย: ปิด logging, ติดตั้งความคงอยู่ถาวรอย่าง SSH key หรือ cron job, เปลี่ยนการตั้งค่าสิทธิ์ของเอเจนต์เอง
- การละเมิดขอบเขตความเชื่อถือ: รันโค้ดที่ clone มาจาก repo ภายนอก, สแกนคลังเก็บ credential, ส่งข้อมูลไปยังบริการที่ผู้ใช้ไม่ได้ระบุ
- การข้ามการตรวจทานหรือกระทบผู้อื่น: push ตรงเข้า
main, รัน deploy production, แก้ไขทรัพยากรร่วมหรือ job ที่เอเจนต์ไม่ได้สร้างเอง
- ข้อยกเว้นที่อนุญาต (Allow exceptions): ติดตั้งแพ็กเกจที่ประกาศไว้แล้วใน repo manifest, flow ของ credential แบบมาตรฐาน, push ไปยัง working branch ของเซสชัน ฯลฯ
ผลการประเมิน
- ประเมินทั้ง pipeline ด้วยชุดข้อมูล 3 ชุด:
- ทราฟฟิกจริงภายใน (n=10,000): การเรียกใช้ทูล Claude Code จริงของพนักงาน Anthropic
- พฤติกรรมเกินขอบเขตจริง (n=52): รวบรวมจากเซสชันที่พนักงานปฏิเสธหรือแฟลกย้อนหลัง — มีขนาดเล็กเพราะจะรวบรวมได้ก็ต่อเมื่อ Claude พยายามทำพฤติกรรมเสี่ยงในเซสชันจริง
- ข้อมูลการรั่วไหลแบบสังเคราะห์ (n=1,000): สร้างกรณีอย่างการส่งข้อมูลอ่อนไหวผ่าน HTTP POST,
git pushไปยังปลายทางที่ไม่น่าเชื่อถือ, ใส่ credential ใน URL รวมถึงกรณีทำให้อ่านยาก
| ทราฟฟิกจริง (n=10,000) | พฤติกรรมเกินขอบเขตจริง (n=52) | การรั่วไหลสังเคราะห์ (n=1,000) | |
|---|---|---|---|
| Stage 1 (ตัวกรองเร็ว) | FPR 8.5% | FNR 6.6% | FNR 1.8% |
| Stage 1→2 (pipeline ทั้งหมด) | FPR 0.4% | FNR 17% | FNR 5.7% |
- FNR 17% บนพฤติกรรมเกินขอบเขตจริง เป็นตัวเลขที่รายงานอย่างตรงไปตรงมา — ตัวจำแนกสามารถระบุความเสี่ยง (force push, การลบ, การเปลี่ยนโครงสร้างพื้นฐาน ฯลฯ) ได้ แต่ยังผิดพลาดในการตัดสินว่าสัญญาณการยินยอมภายในเซสชันครอบคลุม blast radius ของการกระทำนั้นจริงหรือไม่
- หากมีคำว่า “ช่วยจัดการ PR ให้หน่อย” แต่ไม่ได้ระบุ force push ชัดเจน แม้จะเคยอนุมัติพฤติกรรมคล้ายกันมาก่อน ก็ยังเกิดรูปแบบความผิดพลาดที่ตัวจำแนกหา “หลักฐานของการอนุมัติ” และตรวจขอบเขตไม่เพียงพอ
- auto mode มีไว้สำหรับกลุ่มผู้ใช้ที่ใช้
--dangerously-skip-permissionsและ ไม่ใช่สิ่งทดแทนแบบเสียบแทนได้ทันทีสำหรับการตรวจสอบด้วยตนเองอย่างรอบคอบในโครงสร้างพื้นฐานความเสี่ยงสูง
การตัดสินใจด้านการออกแบบที่สำคัญ
-
การตัดข้อความของผู้ช่วยและผลลัพธ์จากทูลออก
- ตัดข้อความของเอเจนต์ออก: ป้องกันไม่ให้เอเจนต์สร้างเหตุผลมาหว่านล้อมตัวจำแนก (“ก่อนหน้านี้ผู้ใช้อนุมัติโดยนัยแล้ว”, “เป้าหมายนี้เป็นของเอเจนต์” เป็นต้น)
- ตัดผลลัพธ์จากทูลออก: เป็น แนวป้องกันด่านแรกต่อ prompt injection — เพราะเอาต์พุตจากทูลคือช่องทางที่เนื้อหาปฏิปักษ์จะเข้ามา
- ตัวจำแนกไม่จำเป็นต้องเห็น payload ก็ยังตัดสินได้: การ POST เนื้อหาไฟล์
.envไปยัง URL ภายนอก ขัดกับเจตนาของผู้ใช้โดยไม่ขึ้นกับเนื้อหาในไฟล์ - เมื่อรวมข้อความของผู้ช่วย+ผลลัพธ์จากทูล ประสิทธิภาพบนชุดทดสอบพฤติกรรมเกินขอบเขตลดลง — ทรานสคริปต์ที่สั้นกว่าจะได้รับอิทธิพลจากการวางกรอบของเอเจนต์น้อยกว่า จึงแม่นยำกว่า
-
การจำแนก 2 ขั้น: ประสิทธิภาพและการเก็บให้ครบ
- ตัวจำแนกขั้นเดียวมี trade-off ระหว่างประสิทธิภาพกับต้นทุนที่ขัดกันโดยตรง
- Stage 1: การตัดสินแบบรวดเร็วด้วยโทเคนเดียว ที่ถูกสั่งให้ “ผิดไปทางบล็อกไว้ก่อน” — ยอมรับ FPR 8.5% เพื่อให้ได้ recall สูง
- Stage 2: ใช้พรอมป์ต์เดียวกับ Stage 1 โดยเปลี่ยนแค่คำสั่งท้ายให้เป็นการให้เหตุผลอย่างรอบคอบ — ลด FPR จาก 8.5% เหลือ 0.4%
- เพราะพรอมป์ต์ของ Stage 2 แทบเหมือน Stage 1 จึง cache hit ได้เป็นส่วนใหญ่ ทำให้คุ้มค่าด้านต้นทุน
-
บทบาทของ prompt injection probe
- การป้องกัน injection ของตัวจำแนกทรานสคริปต์เป็นแบบเชิงโครงสร้าง (ไม่เห็นผลลัพธ์จากทูล) แต่ เอเจนต์หลักยังเห็นผลลัพธ์จากทูล
- หากเอเจนต์หลักถูก hijack ก็อาจหลบเลี่ยงตัวติดตามทรานสคริปต์ได้ → จึงต้องมี probe ที่ชั้นอินพุต
- ทั้งสองชั้นทำงานประกอบกัน: การโจมตีแบบ injection จะสำเร็จได้ก็ต่อเมื่อต้องผ่านชั้นอินพุต แล้วตัวจำแนกทรานสคริปต์ยังต้องตัดสิน อย่างอิสระโดยไม่เห็น payload อีกว่าการเรียกใช้ทูลนั้นปลอดภัยและสอดคล้องกับเจตนาของผู้ใช้
-
การส่งต่องานหลายเอเจนต์
- ตัวจำแนกจะทำงานทั้งตอน มอบหมายให้ sub-agent (outbound) และตอน ส่งผลลัพธ์กลับ (return)
- การตรวจ outbound: ป้องกันปัญหาที่ภายใน sub-agent คำสั่งของ orchestrator อาจดูเหมือนเป็น “ข้อความของผู้ใช้” จนเหมือนผ่านการอนุมัติทั้งหมด
- การตรวจ return: รองรับกรณีที่ sub-agent ปกติในตอนมอบหมาย แต่ระหว่างรันอาจโดน prompt injection — ก่อนส่งผลกลับให้ orchestrator ระบบจะตรวจประวัติการกระทำทั้งหมดของ sub-agent แล้วถ้าแฟลกจะเพิ่มคำเตือนด้านความปลอดภัย
-
ปฏิเสธแล้วทำต่อ (Deny-and-continue)
- เมื่อตัวจำแนกบล็อกการกระทำ ระบบจะไม่ยุติเซสชัน แต่จะชี้นำให้ Claude ลองทางเลือกที่ปลอดภัยกว่า
- เมื่อบล็อก จะส่งเหตุผลการปฏิเสธกลับเป็นผลลัพธ์ของทูล พร้อมคำสั่งว่า “ให้เคารพขอบเขตนี้ด้วยเจตนาดีและหาทางที่ปลอดภัยกว่า”
- หากถูกบล็อกติดต่อกัน 3 ครั้ง หรือรวม 20 ครั้ง → ยกระดับให้มนุษย์ตรวจ (ในโหมด headless จะจบโปรเซส)
- FPR 0.4% อาจดูน้อย แต่ถ้าทุก false positive ทำให้เซสชันจบลง ก็จะกลายเป็นปัญหาด้านการใช้งานอย่างหนักสำหรับงานที่รันยาว → จึงออกแบบให้ รับมือได้ในต้นทุนเพียงการลองใหม่ครั้งเดียว
แผนต่อจากนี้
- จะขยายชุดทดสอบพฤติกรรมเกินขอบเขตจริงอย่างต่อเนื่อง และวนปรับปรุงทั้งความปลอดภัยและต้นทุนของฟีเจอร์
- ตัวจำแนกไม่จำเป็นต้องสมบูรณ์แบบ โดยเป้าหมายคือ บล็อกพฤติกรรมเสี่ยงได้มากพอ เพื่อให้การทำงานแบบอัตโนมัติปลอดภัยขึ้นอย่างมีนัยสำคัญเมื่อเทียบกับการไม่มี guardrail เลย
- แนะนำให้ผู้ใช้ยังคงตระหนักถึงความเสี่ยงที่เหลืออยู่ ใช้วิจารณญาณกับงานและสภาพแวดล้อมที่ให้รันอัตโนมัติ และส่ง feedback เมื่อ auto mode เกิดความผิดพลาด
ยังไม่มีความคิดเห็น