Tài liệu

Rủi ro và gia cố

English: security-risks.md.

Trang này dành cho người triển khai và vận hành Guard Spec. Nó liệt kê những rủi ro vẫn còn khi Guard Spec đứng trước LLM của bạn và cách giảm từng rủi ro. Để biết gateway bảo vệ được gì và không bảo vệ được gì, hãy đọc Mô hình bảo mật và giới hạn trước. Báo lỗ hổng theo SECURITY.md.

Guard Spec là một lớp phòng thủ. Nó giảm khả năng chỉ dẫn bị chèn đến được model và hạn chế những gì câu trả lời có thể làm lộ. Riêng nó không làm một ứng dụng LLM trở nên an toàn.

Mục lục

Tóm tắt

# Rủi ro Hậu quả Cách giảm
D1 Không phát hiện được tấn công Chỉ dẫn bị chèn đến được model Tool quyền tối thiểu, người xác nhận, output guard, exemplar
D2 Chặn nhầm request vô hại Người dùng bị từ chối Đo trên lưu lượng thật, allow exemplar, DETECTOR_LAYERS
D3 Lớp model thiếu mà không ai biết Chỉ chạy L1, tỷ lệ bắt giảm DETECTOR_REQUIRE_ML=true, cảnh báo khi /readyz báo degraded
D4 Injection gián tiếp trong phần không quét Kết quả tool hoặc system prompt không được kiểm SCAN_ROLES, scan_roles theo org, SPOTLIGHT
A1 Agent dùng tool sai mục đích Mất dữ liệu, hành động ngoài ý muốn Phân quyền trong ứng dụng, kiểm soát egress, xác nhận
A2 Rò dữ liệu qua link được giữ lại Dữ liệu ra ngoài qua câu trả lời Allowlist host ngắn, tắt tự tạo link trong UI
P1 Dịch vụ chạy không có TLS Lộ thông tin đăng nhập và prompt trên mạng TLS ở reverse proxy hoặc load balancer
P2 Control plane hoặc metrics ra Internet Tấn công đăng nhập admin, lộ thông tin Mạng riêng, VPN hoặc SSO đứng trước
P3 Upstream của org trỏ vào host nội bộ hoặc nhận key của bạn SSRF, lộ key UPSTREAM_ALLOW_PRIVATE=false, UPSTREAM_KEY_ORGS
P4 Vượt rate limit bằng số lượng lớn Tốn chi phí, từ chối dịch vụ WAF hoặc rate limiter phía trước; giới hạn tính theo replica
I1 Secret yếu hoặc bị lộ Bị chiếm toàn bộ Secret mạnh trong secret manager, xoay vòng
I2 Mất MFA_ENC_KEY 2FA của mọi người ngừng hoạt động Sao lưu cùng database
I3 Ai cũng tạo được tổ chức Admin không tin cậy chọn upstream Thiết lập ở P3, giới hạn người đăng ký
I4 Đăng ký 2FA tin ở lần đầu Kẻ có mật khẩu đăng ký trước Bắt buộc 2FA sớm; reset 2FA khi nghi ngờ
I5 TRUSTED_PROXIES sai Giả mạo IP trong rate limit và log Chỉ liệt kê proxy của bạn
R1 Lưu nội dung prompt trong audit Dữ liệu cá nhân lưu trữ lâu dài Để tắt AUDIT_STORE_CONTENT, đặt thời hạn lưu
R2 Dữ liệu cá nhân lọt qua bộ che Lộ trong câu trả lời Bộ che dựa trên regex; tự kiểm thêm
R3 Trace ID hoặc nhãn metric lộ dữ liệu tenant Lộ thông tin giữa các tenant Mặc định an toàn; xem kỹ trước khi đổi
S1 Image, binary hoặc model bị sửa Chạy mã tuỳ ý hoặc bộ phát hiện yếu đi cosign verify, model ghim SHA-256, digest
S2 Lỗ hổng đã biết trong thư viện Dịch vụ bị khai thác Cập nhật bản mới nhất; theo dõi advisory
O1 Lạm dụng quyền database hoặc admin Đổi policy, đọc audit Quyền tối thiểu, activity log, sao lưu
O2 Fail-closed gây gián đoạn Request bị từ chối (503) Health check, nhiều replica, cảnh báo

Rủi ro phát hiện

D1. Không phát hiện được tấn công

Phát hiện mang tính xác suất. Cách diễn đạt mới, ngôn ngữ khác ngoài tiếng Anh và tiếng Việt, kiểu mã hoá mà L1 chỉ giải được một phần (như base64) và tấn công nhiều lượt mà từng tin nhắn trông vô hại đều có thể lọt. Với các lớp model mặc định, bộ eval cho tỷ lệ bắt khoảng 0,93 ở ngưỡng chặn (xem Benchmark); phần còn lại đến được model.

Nên làm:

D2. Chặn nhầm request vô hại

Với L2 và L3, khoảng 1,4% prompt vô hại trong bộ eval bị chặn; teencode tiếng Việt vô hại là 3,5%, tiếng Anh là 1,7%. Dữ liệu eval và huấn luyện tiếng Việt là dữ liệu tổng hợp, nên tỷ lệ của bạn có thể khác.

Nên làm:

D3. Lớp model thiếu mà không ai biết

Khi thiếu model hoặc model nạp lỗi, gateway ghi cảnh báo và tiếp tục chạy chỉ với L1. Khi đó /readyz báo "degraded":true.

Nên làm:

D4. Injection gián tiếp trong phần không quét

Mặc định gateway phân loại tin nhắn người dùng, kết quả tool và mô tả tool MCP (SCAN_ROLES=user,tool,tool_descriptions). System prompt và tham số tool call của model không được phân loại nếu bạn không thêm vào; ảnh, âm thanh và các phần không phải văn bản không được kiểm.

Nên làm:

Rủi ro ở ứng dụng và agent

A1. Agent dùng tool sai mục đích

Gateway thấy tham số tool call và kiểm các chuỗi trong đó, nhưng không thực thi hay cấp quyền cho tool call và không kiểm soát egress. Nếu model bị thuyết phục gọi tool, tool sẽ chạy.

Nên làm:

Output guard gỡ ảnh và link tới host ngoài allowlist, nhưng giữ link tới host trong allowlist và URL dạng văn bản không có query string. Nếu UI của bạn tự biến URL thành link, kênh này vẫn có thể bị dùng để làm lộ dữ liệu.

Nên làm:

Rủi ro triển khai

P1. Dịch vụ chạy không có TLS

Gateway và control plane phục vụ HTTP thường. API key, cookie phiên và prompt đi qua mạng dạng rõ nếu không có thành phần nào phía trước kết thúc TLS.

Nên làm:

P2. Control plane hoặc metrics ra Internet

Control plane chứa admin UI và API quản trị. /metrics chạy trên listener riêng (METRICS_ADDR).

Nên làm:

P3. Upstream của org trỏ vào host nội bộ hoặc nhận key của bạn

Admin của một org tự chọn nơi các upstream có tên trỏ tới.

Nên làm:

P4. Vượt rate limit bằng số lượng lớn

Rate limit lưu trong bộ nhớ từng replica gateway, nên giới hạn thực tế tăng theo số replica, và nó không chặn được một đợt tràn kết nối.

Nên làm: đặt WAF hoặc rate limiter dùng chung trước gateway, và đặt giới hạn chi tiêu ở nhà cung cấp LLM.

Rủi ro danh tính và quyền truy cập

I1. Secret yếu hoặc bị lộ

POSTGRES_PASSWORD, GUARDSPEC_APP_PASSWORD, JWT_SECRET, MFA_ENC_KEY và ADMIN_PASSWORD bảo vệ mọi thứ. Ngoài GUARD_ENV=dev, các dịch vụ từ chối secret thiếu, mặc định hoặc quá ngắn, nhưng không biết được secret đã bị lộ hay chưa.

Nên làm:

I2. Mất MFA_ENC_KEY

Secret TOTP được mã hoá bằng MFA_ENC_KEY. Mất key thì 2FA của mọi người không dùng được, và control plane từ chối khởi động khi đã có người dùng bật 2FA.

Nên làm: sao lưu key cùng với database, nhưng cất ở nơi khác với bản sao lưu database.

I3. Ai cũng tạo được tổ chức

Người dùng đã đăng nhập nào cũng tạo được tổ chức và trở thành admin của nó. Xem P3 để biết admin đó cấu hình được những gì.

Nên làm: nếu người không tin cậy truy cập được control plane, dùng SSO với allowed_domains và giữ chặt các thiết lập ở P3.

I4. Đăng ký 2FA tin ở lần đầu

Khi một tổ chức bắt đầu bắt buộc 2FA, thành viên chưa có 2FA sẽ đăng ký ở lần đăng nhập tiếp theo chỉ với mật khẩu. Ai đã có mật khẩu đó có thể đăng ký authenticator của họ trước.

Nên làm: bắt buộc 2FA ngay từ đầu, và reset 2FA của thành viên khi nghi ngờ.

I5. TRUSTED_PROXIES sai

TRUSTED_PROXIES quyết định tin X-Forwarded-For của ai. Đặt quá rộng thì client tự chọn được địa chỉ dùng cho rate limit, phiên và activity log; để trống khi đứng sau proxy thì mọi client trông như một.

Nên làm: liệt kê đúng địa chỉ hoặc CIDR của các proxy của bạn.

Rủi ro dữ liệu và quyền riêng tư

R1. Lưu nội dung prompt trong audit

Mặc định audit lưu điểm, quyết định, SHA-256 và độ dài của body, không lưu nội dung. AUDIT_STORE_CONTENT=true hoặc thiết lập audit_store_content theo org sẽ lưu prompt và câu trả lời được đệm.

Nên làm:

R2. Dữ liệu cá nhân lọt qua bộ che

Output guard che email, số điện thoại, CCCD, số thẻ Việt Nam và địa chỉ IPv4 bằng mẫu regex. Định dạng khác, của nước khác, hay dữ liệu cá nhân viết bằng chữ đều không bị bắt. Prompt gửi lên upstream không được che.

Nên làm: nếu không được gửi dữ liệu cá nhân cho nhà cung cấp LLM, hãy loại bỏ nó trong ứng dụng trước khi gửi, hoặc dùng nhà cung cấp và hợp đồng cho phép điều đó.

R3. Trace ID hoặc nhãn metric lộ dữ liệu tenant

Nhãn metric chỉ nhận giá trị trong tập cố định, nhãn theo tenant tắt (METRICS_TENANT_LABELS=false) và traceparent không gửi lên upstream (OTEL_PROPAGATE_UPSTREAM=false). Bật các mục này là chia sẻ nhiều hơn với hệ thống giám sát hoặc nhà cung cấp.

Nên làm: chỉ đổi các mặc định này khi hệ thống nhận là tin cậy được.

Rủi ro chuỗi cung ứng

S1. Image, binary hoặc model bị sửa

Nên làm:

S2. Lỗ hổng đã biết trong thư viện

Dự án chưa tới 1.0; bản vá bảo mật chỉ có trong bản phát hành kế tiếp.

Nên làm: theo dõi release và security advisory của repo, nâng lên bản 0.x mới nhất, và quét các image bạn chạy.

Rủi ro vận hành

O1. Lạm dụng quyền database hoặc admin

Ai có quyền database hoặc instance admin đều đổi được policy, đọc audit và tạo API key.

Nên làm: chỉ cấp role ứng dụng (guardspec_app) cho các dịch vụ, giữ role owner cho migration, cấp cho người dùng vai trò thấp nhất đủ dùng, và xem activity log.

O2. Fail-closed gây gián đoạn

Nếu policy, thiết lập org hoặc bộ phát hiện không chạy được, gateway từ chối request (503) thay vì cho qua. Vì vậy database gặp sự cố sẽ làm dừng lưu lượng LLM.

Nên làm: chạy nhiều hơn một replica gateway, dùng Postgres có tính sẵn sàng cao, và cảnh báo theo tỷ lệ 503 và /readyz.

Checklist gia cố

Nguồn: docs/security-risks.vi.md @ ca69dad29f02