𝗦𝘁𝗼𝗽 𝗧𝗿𝘂𝘀𝘁𝗶𝗻𝗴 𝗧𝗵𝗲 𝗔𝗴𝗲𝗻𝘁: 𝗕𝗶𝗻𝗱 𝗔𝗽𝗽𝗿𝗼𝘃𝗮𝗹𝘀 𝘁𝗼 𝗘𝘅𝗮𝗰𝘁 𝗧𝗼𝗼𝗹 𝗖𝗮𝗹𝗹𝘀
Hầu hết các hệ thống agentic bảo vệ các hành động nguy hiểm như ghi tệp hoặc chuyển tiền bằng một sự phê duyệt đơn giản.
Thông thường, sự phê duyệt này là một cờ boolean trong trạng thái hệ thống.
Ví dụ: approved: true.
Đây là một sai lầm. Một giá trị boolean sẽ thất bại theo ba cách mà kẻ tấn công có thể khai thác:
- Đảo ngược (Flip): Kẻ tấn công thay đổi trạng thái từ
falsesangtruethông qua prompt injection hoặc các lỗ hổng mã nguồn. - Phát lại (Replay): Bạn phê duyệt một lệnh an toàn như "read file". Hệ thống thấy giá trị "true" và cho phép lệnh thứ hai nguy hiểm như "delete database".
- Sai lệch tham số (Argument Drift): Bạn phê duyệt lệnh "send $10". Kẻ tấn công thay đổi số tiền thành $10,000 trước khi thực thi. Cờ vẫn hiển thị là "true".
Vấn đề là bạn đang mô hình hóa sự phê duyệt như một thuộc tính của toàn bộ phiên làm việc (session). Nó phải là bằng chứng cho một lệnh gọi cụ thể.
Cách khắc phục:
Khi con người phê duyệt một lệnh gọi, hãy tạo một thẻ (tag) bảo mật. Thẻ này phải khóa bốn yếu tố sau:
- ID duy nhất của lệnh gọi công cụ (tool call ID).
- Một mã hash của các tham số chính xác.
- Danh tính người dùng.
- Thời gian hết hạn.
Xác minh thẻ này ngay tại thời điểm thực thi. Sử dụng một khóa bí mật (secret key) mà chỉ hệ thống mới biết.
Tuân thủ các quy tắc sau để triển khai:
- Sử dụng Chuẩn hóa (Canonicalization): Cả người phê duyệt và người thực thi đều phải hash cùng một chuỗi byte chính xác. Sử dụng RFC 8785 để đảm bảo các con số và khóa khớp nhau.
- Thất bại đóng (Fail Closed): Nếu thẻ bị thiếu, hết hạn hoặc sai, hãy trả về một lỗi "không được phê duyệt" (not approved) cụ thể. Đừng coi đó là một kết quả công cụ tiêu chuẩn.
- Từ chối theo mặc định (Deny by Default): Chỉ cho phép các công cụ yêu cầu sự phê duyệt rõ ràng. Từ chối tất cả những thứ khác.
- Xử lý Phát lại (Handle Replays): Nếu bạn sử dụng các engine như Temporal, hãy đảm bảo khóa bí mật của bạn có tính xác định (deterministic). Nếu khóa thay đổi sau khi hệ thống khởi động lại, tất cả các phê duyệt hiện có sẽ thất bại.
Việc ủy quyền không nên là một phần trạng thái trôi nổi. Nó phải là một "phong bì" được ràng buộc để chứng minh rằng: "Người cụ thể này đã phê duyệt các tham số cụ thể này cho công cụ cụ thể này cho đến thời điểm cụ thể này."
Hãy ngừng sử dụng boolean. Chúng không phải là một sự đơn giản hóa. Chúng là một lỗi (bug).
Optional learning community: https://t.me/GyaanSetuAi