วิธีป้องกัน Claude Code เขียนไฟล์นอกไดเรกทอรีที่กำหนดเมื่อรันแบบอัตโนมัติ
เจาะลึกกลไกความปลอดภัยสำหรับ Claude Code เมื่อต้องปล่อยให้อันเซนต์ทำงานเอง พร้อมวิธีเขียนฮุกและสคริปต์ตรวจสอบส่วนต่างเพื่อป้องกันความผิดพลาด

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- การสั่งงาน Claude Code แบบอัตโนมัติจำเป็นต้องมีระบบบล็อกการเขียนไฟล์ที่ทำงานโดยอัตโนมัติ
- ตั้งค่า permission rules ผ่านไฟล์ settings.json ซึ่งมีข้อจำกัดเรื่องระบบบล็อกลิสต์ที่ไม่สามารถใช้เป็น whitelist ได้
- ใช้ PreToolUse hook อ่านข้อมูลจาก stdin เป็น JSON เพื่อควบคุมสิทธิ์ก่อนเครื่องมือปฏิบัติงาน
- เพิ่มการตรวจสอบด้วย git diff เทียบกับ whitelist ก่อนทำการ commit เพื่ออุดรอยรั่วที่เล็ดลอดจากฮุก
เมื่อเรานั่งทำงานอยู่หน้าคอมพิวเตอร์ การควบคุมไม่ให้เอเจนต์ไปยุ่งกับโฟลเดอร์อื่นนอกเหนือจาก src/ อาศัยเพียงแค่สายตาคอยสังเกตก็เพียงพอแล้ว แต่หากปล่อยให้เอเจนต์ทำงานแบบอัตโนมัติโดยไม่มีคนเฝ้า จำเป็นต้องอาศัยกลไกที่ทำงานได้เองไม่ว่าจะมีคนดูอยู่หรือไม่ก็ตาม
ระบบ Claude Code มีกลไกป้องกันเรื่องนี้มาให้สองรูปแบบแต่ไม่สามารถใช้แทนกันได้ วิธีแรกเป็นแบบประกาศ (declarative) ซึ่งไม่สามารถตอบโจทย์สิ่งที่เราต้องการได้ทั้งหมด ส่วนวิธีที่สองตอบโจทย์ได้มากกว่าแต่ก็ยังมีจุดบอดในแง่โครงสร้างของการเขียนข้อมูล มาดูกันว่าแต่ละแบบทำงานอย่างไรและโค้ดสำหรับวิธีที่สองหน้าตาเป็นอย่างไร
กฎสิทธิ์การใช้งานจะถูกเก็บไว้ในไฟล์ settings.json ในรูปแบบ Tool(specifier) โดยปัญหาหลักคือเรื่องของรูปทรงที่เราต้องการสำหรับเอเจนต์ที่ไม่มีคนควบคุม ซึ่งควรเป็น allow-list อนุญาตเฉพาะบางไดเรกทอรีและห้ามอย่างอื่น แต่ระบบ deny ที่มีให้กลับเป็น block-list และเราไม่สามารถสร้าง allow-list จาก deny-list ได้ วิธีแก้ปัญหาเฉพาะหน้าด้วยการบล็อกทุกอย่างแล้วค่อยปลดล็อกข้อยกเว้นจะติดปัญหาเรื่องกฎความสำคัญที่ว่า Write(**) ในฝั่ง deny มีลำดับความสำคัญเหนือกว่าทุก allow ที่ใช้งานร่วมกัน ส่งผลให้เอเจนต์ไม่สามารถเขียนไฟล์อะไรได้เลย
Claude Code มีขอบเขตในรูปแบบ allow-list เพียงอย่างเดียวคือระดับรากของโปรเจกต์ (project root) บวกกับไดเรกทอรีเพิ่มเติมใน additionalDirectories ซึ่งช่วยป้องกันไม่ให้เอเจนต์เดินหลงเข้าไปใน /etc แต่ไม่ได้จำกัดว่าเอเจนต์สามารถเขียนไฟล์อะไรภายในโปรเจกต์ของเราได้บ้าง ซึ่งเป็นประเด็นสำคัญที่น่ากังวล เพราะไม่มีใครกลัวว่าเอเจนต์ที่ตั้งเวลาไว้จะไปแก้ไฟล์ /etc/hosts แต่กังวลว่าเอเจนต์ที่ได้รับมอบหมายให้เขียนบทความจะเผลอไปแก้ไฟล์ตั้งค่าการทำงานของตัวเองต่างหาก

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ดังนั้น สำหรับขอบเขตที่ละเอียดกว่าแค่การอยู่ภายในโปรเจกต์ เราจึงจำเป็นต้องเขียนโค้ดเข้ามาช่วย โดย PreToolUse hook คือคำสั่งที่ Claude Code ทำงานก่อนที่จะเรียกใช้เครื่องมือใดๆ พร้อมส่งข้อมูลคำขอที่กำลังจะเกิดขึ้นในรูปแบบ JSON ทางช่อง stdin และคำตอบจากฮุกนี้จะมีผลบังคับใช้จริง
เราสามารถลงทะเบียนฮุกนี้กับเครื่องมือที่ทำหน้าที่เขียนไฟล์ และตอบกลับด้วยการออกจากโปรแกรมด้วยรหัส 0 พร้อมพิมพ์ JSON ออกทาง stdout หรือเลือกใช้วิธีออกจากโปรแกรมด้วยรหัส 2 พร้อมระบุเหตุผลทาง stderr แต่ข้อเสียคือจะสูญเสียโครงสร้างข้อมูลแบบฟิลด์ และในกรณีที่ออกด้วยรหัส 0 ข้อความใน stderr จะถูกส่งไปยังบันทึกการดีบักเท่านั้น ซึ่งทั้งตัวเราและโมเดลจะมองไม่เห็น ดังนั้นจึงควรเลือกใช้ JSON จะดีกว่า
การทำความเข้าใจข้อจำกัดของระบบสิทธิ์ในเครื่องมือ AI ระดับเอเจนต์เป็นสิ่งสำคัญมาก เนื่องจากเอเจนต์รุ่นใหม่มีความสามารถในการอ่านและแก้ไขไฟล์ได้เองโดยอัตโนมัติ การพึ่งพาเพียงแค่การตั้งค่าคอนฟิกพื้นฐานมักไม่เพียงพอเมื่อเอเจนต์ต้องทำงานข้ามคืนหรือไม่มีมนุษย์คอยตรวจสอบทุกบรรทัดโค้ด การผสมผสานระหว่าง PreToolUse hook และการตรวจเช็ก git diff จึงเป็นการสร้างระบบป้องกันแบบหลายชั้น (defense-in-depth) ที่ช่วยลดความเสี่ยงจากการที่เอเจนต์ทำงานนอกลู่นอกทางได้อย่างมีประสิทธิภาพ
ในส่วนของการตรวจสอบเส้นทาง ฟังก์ชัน contains จะใช้ path.relative แทนการเช็คสตริงคำนำหน้า เพราะคำสั่งอย่าง /app/src-secret ขึ้นต้นด้วย /app/src เป็นจริง ซึ่งอาจทำให้ allow-list หลุดรอดได้ การแปลงเส้นทางทั้งสองด้านแล้วตรวจสอบว่าพาธสัมพัทธ์หลุดออกไปด้วย .. หรือไม่ จึงเป็นวิธีที่ช่วยรับมือกับไดเรกทอรีพี่น้อง เสียงรบกวนจาก ./ และการพยายามเจาะเส้นทางเข้ามาได้
ทุกข้อมูลที่ไม่รู้จักจะถูกเลื่อนการตัดสินใจแทนที่จะปฏิเสธทันที เนื่องจากข้อมูลที่ไม่ถูกต้องไม่ใช่การตัดสินใจเรื่องสิทธิ์ การส่งเรื่องกลับไปเข้าสู่กระแสการทำงานปกติจะทำให้เกิดความผิดพลาดตามเงื่อนไขของมันเองและบอกเราได้ว่าเกิดอะไรขึ้น เหตุผลดังกล่าวควรส่งตรงไปยังโมเดล การใช้คำว่า "Denied" อาจทำให้โมเดลพยายามลองใหม่ผ่านเครื่องมืออื่น การระบุชื่อรากที่อนุญาตอย่างชัดเจนพร้อมบอกไม่ให้หลบเลี่ยงระบบป้องกัน จะช่วยชี้นทางให้เอเจนต์ไปในทิศทางที่ถูกต้อง
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น