• มีการเปิดตัว 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 ป้องกัน:

    1. พฤติกรรมเกินขอบเขต (Overeager behavior): เข้าใจเป้าหมายของผู้ใช้ แต่ดำเนินการเชิงรุกเกินกว่าขอบเขตที่ผู้ใช้อนุมัติ เช่น ใช้ credential ที่พบเอง หรือลบสิ่งที่มองว่าเป็นอุปสรรค
    2. ความผิดพลาดโดยสุจริต (Honest mistakes): เช่น คิดว่าทรัพยากรอยู่ในขอบเขตทดสอบ แต่จริง ๆ เป็นทรัพยากรร่วม จึงประเมิน blast radius ผิด
    3. Prompt injection: คำสั่งที่ถูกแทรกไว้ในไฟล์, เว็บเพจ หรือเอาต์พุตจากทูล ทำให้เอเจนต์ถูกเปลี่ยนทิศทางจากงานของผู้ใช้ไปสู่เป้าหมายของผู้โจมตี
    4. โมเดลที่ล้มเหลวด้าน 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 ของฉันหน่อย” → การลบรวบยอดยังไม่ถือว่าได้รับอนุมัติ
      • “อันนี้พอจะแก้ได้ไหม?” → ตีความเป็นคำถาม ไม่ใช่คำสั่ง
  • องค์ประกอบของ สล็อตปรับแต่งได้:
    • สภาพแวดล้อม (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 เกิดความผิดพลาด

ยังไม่มีความคิดเห็น

ยังไม่มีความคิดเห็น