เจาะลึกการสร้าง AI Agent ตั้งแต่ต้น: ยกระดับความปลอดภัยและระบบควบคุม (ตอนที่ 3)
ปิดท้ายซีรีส์การสร้าง AI Agent ด้วยการเพิ่มเกราะป้องกันความปลอดภัยขั้นสูง ทั้ง Policy Gate, ตัวกรองคำสั่ง Shell, ป้องกัน SSRF และระบบจำกัดทรัพยากร

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
- เพิ่มระบบ Policy Gate 3 ชั้นเพื่อคัดกรองคำสั่งก่อนตัดสินใจตามโหมด
- กำหนดรายการบล็อกคำสั่งอันตรายใน Shell และป้องกัน SSRF สำหรับเว็บ
- จำกัดงบประมาณบริบทด้วยการคำนวณโทเค็นและตัดข้อความอัตโนมัติ
- ควบคุมการทำงานด้วยสวิตช์ฉุกเฉินและระบบบันทึกการตรวจสอบย้อนหลัง
เดินทางมาถึงช่วงท้ายซีรีส์การสร้าง AI Agent จากศูนย์กันแล้ว หลังจากในตอนก่อนหน้าเราได้เริ่มอุดช่องโหว่ที่เกิดขึ้นจากมนุษย์ในวง Looop ไปบ้างแล้ว เช่น การใช้ Docker sandbox เพื่อจำกัดคำสั่งที่หลุดรอด, การป้องกัน prompt-injection เพื่อไม่ให้โมเดลเชื่อผลลัพธ์จากเครื่องมือเป็นคำสั่ง รวมถึงการตรวจสอบ schema เพื่อให้มั่นใจว่าเครื่องมือที่เรียกใช้งานถูกต้อง ในพาร์ตนี้เราจะมาทำให้ระบบสมบูรณ์แบบยิ่งขึ้นด้วยการยกระดับเกราะนโยบายเครื่องมือ, การจำกัดทรัพยากรและต้นทุน, การซ่อนความลับออกจากสภาพแวดล้อมคอนเทนเนอร์ ตลอดจนเพิ่มระบบบันทึกการตรวจสอบและสวิตช์ตัดการทำงานฉุกเฉิน
ในส่วนของ Human in the Loop และความปลอดภัยก่อนหน้านี้ ฟังก์ชัน check_permission เคยเป็นฟังก์ชันเดี่ยวๆ โดยเครื่องมืออ่านและเครื่องมือวางแผนจะได้รับอนุญาตเสมอ ส่วนเครื่องมือเขียนจะได้รับอนุญาตเฉพาะภายในไดเรกทอรีทำงานในโหมด acceptEdits นอกเหนือจากนั้นจะต้องมีการถามผู้ใช้ แต่ในตอนนี้เราได้เพิ่มเกราะนโยบาย (policy gate) ที่จะทำงานก่อนการตัดสินใจตามโหมด ซึ่งเกราะนี้ประกอบด้วย 3 เลเยอร์หลัก ได้แก่ การตรวจสอบขอบเขตพาธ, นโยบาย Shell และนโยบายเว็บหรือ SSRF โดยหากเกิดข้อผิดพลาดในชั้นเหล่านี้ จะถูกบล็อกทันทีโดยไม่มีโหมดใดลบล้างได้
สำหรับการตรวจสอบขอบเขตพาธ จากเดิมที่ตรวจสอบเฉพาะเครื่องมือเขียน ตอนนี้ถูกขยายผลไปยังทุกเครื่องมือที่ใช้งานเกี่ยวกับพาธ เช่น read_file, glob_files, grep, write_file และ edit_file โดยอาร์กิวเมนต์พาธของแต่ละเครื่องมือจะถูกแปลงเพื่อจัดการกับพาธสัมพัทธ์, symlinks และการอ้างอิง .. และจะถูกปฏิเสธทันทีหากมีการหลุดออกนอกไดเรกทอรีทำงาน ในขณะที่เครื่องมือ run_bash ถือเป็นเครื่องมือที่อันตรายที่สุด จึงต้องมีกระบวนการคัดกรองเฉพาะตัวผ่านชุดรายการปฏิเสธนิพจน์ทั่วไป (regex denylist) สำหรับไบนารีอันตราย เช่น docker, sudo, su, nc, netcat, curl, wget, chmod และคำสั่งจัดการระบบอื่นๆ

ภาพประกอบจากคลังภาพสต็อก ไม่ใช่ภาพจากเหตุการณ์จริง
ในส่วนของนโยบายเว็บหรือการป้องกัน SSRF (Server-Side Request Forgery) เครื่องมือ webfetch จะถูกคัดกรองเพื่อป้องกันไม่ให้มีการเรียกไปยังปลายทางเมทาดาตาทีของคลาวด์, localhost และช่วงไอพีส่วนตัว โดยโฮสต์จะถูกแปลงผ่าน getaddrinfo และตรวจสอบไอพีแต่ละตัวด้วยไลบรารี ipaddress เพื่อบล็อกลูปแบ็ก, link-local, มัลติคาสต์ และช่วงไอพีส่วนตัวตามมาตรฐาน RFC1918 ซึ่งช่วยป้องกันไม่ให้โมเดลแอบดึงข้อมูลจาก http://169.254.169.254/latest/meta-data/iam/security-credentials/ เพื่อขโมยข้อมูลรับรองบนคลาวด์ หรือแอบสแกนบริการภายในเครือข่าย
การเพิ่มชั้นตรวจสอบความปลอดภัยหลายเลเยอร์ (Defense-in-Depth) เช่น Policy Gate และการบล็อกคำสั่งอันตรายระดับ Bash ถือเป็นหัวใจสำคัญในการพัฒนา AI Agent ที่ต้องรันโค้ดหรือคำสั่งอัตโนมัติ การจำกัดขอบเขตตั้งแต่ระดับโค้ดช่วยลดความเสี่ยงที่ Agent จะทำลายระบบหรือรั่วไหลของข้อมูลสำคัญในกรณีที่โมเดลถูกหลอกด้วยเทคนิค Prompt Injection
นอกเหนือจากเกราะนโยบายแบบฮาร์ดบล็อกแล้ว ยังมีรูปแบบคำสั่งบางประเภทที่มีความเสี่ยงสูงและต้องได้รับการยืนยันอย่างชัดเจนเสมอไม่ว่าจะอยู่ในโหมดสิทธิ์ใดก็ตาม เช่น การบังคับพุชโค้ด git (-f หรือ --force) ที่อาจเขียนทับประวัติการทำงานบนรีโมท หรือการเขียนทับไฟล์ด้วยเนื้อหาว่างเปล่าเพื่อลบข้อมูล นอกจากนี้ยังมีแฟล็ก CLI อย่าง --tools ที่ช่วยให้เราสามารถจำกัดรายชื่อเครื่องมือที่อนุญาตผ่านการคั่นด้วยจุลภาค เพื่อลดพื้นที่ความเสี่ยง (blast radius) ให้เหลือน้อยที่สุดในกรณีที่ Agent ไม่จำเป็นต้องใช้งานเครื่องมือบางตัว
ในด้านการควบคุมทรัพยากรและต้นทุน ระบบได้เพิ่มกลไก ContextBudget เพื่อติดตามจำนวนโทเค็นสะสม โดยใช้การประมาณคร่าวๆ ที่ 4 ตัวอักษรต่อ 1 โทเค็น และทำการตัดประวัติข้อความก่อนการเรียก LLM ทุกครั้ง ค่าเริ่มต้นถูกกำหนดไว้ที่ 24,000 โทเค็นแต่สามารถปรับเปลี่ยนได้ผ่านอาร์กิวเมนต์ --max-context-tokens เพื่อป้องกันไม่ให้ Agent วิ่งวนในลูปที่ติดขัดอย่างไร้ขีดจำกัดขณะที่เราไม่อยู่หน้าจอ
ที่มา: Dev.to
พบข้อมูลผิดพลาดในบทความนี้? แจ้งปัญหาบทความนี้
ความคิดเห็น
แสดงความคิดเห็น