Bảo mật
Hermes Agent được thiết kế với mô hình bảo mật có chiều sâu phòng thủ. Trang này bao gồm mọi ranh giới bảo mật — từ phê duyệt lệnh đến cách ly vùng chứa cho đến ủy quyền người dùng trên nền tảng nhắn tin.
Tổng quan
Mô hình bảo mật có bảy lớp:
- Ủy quyền người dùng — ai có thể nói chuyện với nhân viên hỗ trợ (danh sách cho phép, ghép nối DM)
- Phê duyệt lệnh nguy hiểm — con người tham gia vào các hoạt động phá hoại
- Cách ly vùng chứa — Hộp cát Docker/Singularity/Modal với cài đặt cứng
- Lọc thông tin xác thực MCP — cách ly biến môi trường cho các quy trình con MCP
- Quét tệp ngữ cảnh — phát hiện nội dung nhắc nhở trong tệp dự án
- Cách ly nhiều phiên — các phiên không thể truy cập dữ liệu hoặc trạng thái của nhau; đường dẫn lưu trữ công việc định kỳ được tăng cường chống lại các cuộc tấn công truyền tải đường dẫn
- Khử trùng đầu vào — các tham số thư mục làm việc trong phần phụ trợ của công cụ đầu cuối được xác thực dựa trên danh sách cho phép để ngăn chặn việc chèn shell
Phê duyệt lệnh nguy hiểm
Trước khi thực hiện bất kỳ lệnh nào, Hermes sẽ kiểm tra lệnh đó dựa trên danh sách các mẫu nguy hiểm đã được tuyển chọn. Nếu tìm thấy sự trùng khớp, người dùng phải phê duyệt nó một cách rõ ràng.
Chế độ phê duyệt
Hệ thống phê duyệt hỗ trợ ba chế độ, được định cấu hình qua approvals.mode trong ~/.hermes/config.yaml :
approvals:
mode: manual
# manual
| smart | off
timeout: 60
# seconds to wait for user response (default: 60)
| Chế độ | Hành vi |
|---|---|
| thủ công (mặc định) | Luôn nhắc người dùng phê duyệt các lệnh nguy hiểm |
| thông minh | Sử dụng LLM phụ trợ để đánh giá rủi ro. Các lệnh có rủi ro thấp (ví dụ: python -c "print('hello')" ) được phê duyệt tự động. Các lệnh thực sự nguy hiểm sẽ bị tự động từ chối. Các trường hợp không chắc chắn sẽ chuyển sang lời nhắc thủ công. |
| tắt | Vô hiệu hóa tất cả các bước kiểm tra phê duyệt — tương đương với việc chạy với --yolo . Tất cả các lệnh thực thi mà không có lời nhắc. |
Cài đặt approvals.mode: off sẽ tắt tất cả lời nhắc về an toàn. Chỉ sử dụng trong các môi trường đáng tin cậy (CI/CD, vùng chứa, v.v.).
Chế độ YOLO
Chế độ YOLO bỏ qua tất cả lời nhắc phê duyệt lệnh nguy hiểm cho phiên hiện tại. Nó có thể được kích hoạt theo ba cách:
- Cờ CLI: Bắt đầu phiên với
hermes --yolohoặchermes chat --yolo - Lệnh gạch chéo: Nhập
/yolotrong phiên để bật/tắt lệnh này - Biến môi trường: Đặt
HERMES_YOLO_MODE=1
Lệnh /yolo là chuyển đổi — mỗi lần sử dụng sẽ bật hoặc tắt chế độ:
> /yolo
⚡ YOLO mode ON — all commands auto-approved. Use with caution.
> /yolo
⚠ YOLO mode OFF — dangerous commands will require approval.
Chế độ YOLO có sẵn trong cả phiên CLI và cổng. Trong nội bộ, nó đặt biến môi trường HERMES_YOLO_MODE được kiểm tra trước mỗi lần thực thi lệnh.
Chế độ YOLO vô hiệu hóa tất cả các kiểm tra an toàn lệnh nguy hiểm cho phiên. Chỉ sử dụng khi bạn hoàn toàn tin tưởng vào các lệnh được tạo (ví dụ: các tập lệnh tự động hóa đã được kiểm tra kỹ lưỡng trong môi trường dùng một lần).
Hết thời gian phê duyệt
Khi một dấu nhắc lệnh nguy hiểm xuất hiện, người dùng có một khoảng thời gian có thể định cấu hình để phản hồi. Nếu không có phản hồi nào được đưa ra trong thời gian chờ, lệnh sẽ bị từ chối theo mặc định (đóng không thành công).
Định cấu hình thời gian chờ trong ~/.hermes/config.yaml :
approvals:
timeout: 60
# seconds (default: 60)
Điều gì kích hoạt sự phê duyệtCác mẫu sau kích hoạt lời nhắc phê duyệt (được xác định trong tools/approval.py ):
| Mẫu | Mô tả |
|---|---|
rm -r / rm --recursive | Xóa đệ quy |
rm ... / | Xóa trong đường dẫn gốc |
chmod 777/666 / o+w / a+w | Quyền trên thế giới/có thể ghi khác |
chmod --recursive với quyền uốn không an toàn | Thế giới đệ quy/có thể ghi khác (cờ dài) |
chown -R root / chown --recursive root | Chown đệ quy về gốc |
mkfs | Định dạng hệ thống tập tin |
dd if= | Sao chép đĩa |
> /dev/sd | Viết để chặn thiết bị |
DROP TABLE/DATABASE | THẢ SQL |
DELETE FROM (không có WHERE) | XÓA SQL mà không cần WHERE |
TRUNCATE TABLE | TRUNCATE SQL |
> /etc/ | Ghi đè cấu hình hệ thống |
systemctl stop/disable/mask | Dừng/vô hiệu hóa dịch vụ hệ thống |
kill -9 -1 | Giết tất cả các quá trình |
pkill -9 | Buộc tiêu diệt quá trình |
| Mẫu bom ngã ba | Bom ngã ba |
bash -c / sh -c / zsh -c / ksh -c | Thực thi lệnh Shell thông qua cờ -c (bao gồm các cờ kết hợp như -lc ) |
python -e / perl -e / ruby -e / node -c | Thực thi tập lệnh thông qua cờ -e / -c |
curl ... | sh / wget ... | sh | Đưa nội dung từ xa vào shell |
bash <(curl ...) / sh <(wget ...) | Thực thi tập lệnh từ xa thông qua thay thế quy trình |
tee tới /etc/ , ~/.ssh/ , ~/.hermes/.env | Ghi đè tập tin nhạy cảm qua tee |
> / >> tới /etc/ , ~/.ssh/ , ~/.hermes/.env | Ghi đè tệp nhạy cảm thông qua chuyển hướng |
xargs rm | xargs với rm |
find -exec rm / find -delete | Tìm với hành động phá hoại |
cp / mv / install tới /etc/ | Sao chép/di chuyển tập tin vào cấu hình hệ thống |
sed -i / sed --in-place trên /etc/ | Chỉnh sửa tại chỗ cấu hình hệ thống |
pkill / killall hermes/gateway | Phòng chống tự chấm dứt |
gateway run với & / disown / nohup / setsid | Ngăn chặn việc khởi động cổng quản lý dịch vụ bên ngoài |
Bỏ qua vùng chứa: Khi chạy trong phần phụ trợ docker , singularity , modal hoặc daytona, các lệnh kiểm tra nguy hiểm sẽ bị bỏ qua vì bản thân vùng chứa đó là ranh giới bảo mật. Các lệnh hủy bên trong vùng chứa không thể gây hại cho máy chủ.
Luồng phê duyệt (CLI)
Trong CLI tương tác, các lệnh nguy hiểm hiển thị lời nhắc phê duyệt nội tuyến:
⚠️ DANGEROUS COMMAND: recursive delete
rm -rf /tmp/old-project
[o]nce | [s]ession | [a]lways | [d]eny
Choice [o/s/a/D]:
Bốn lựa chọn:
- một lần — cho phép thực hiện một lần
- session — cho phép mẫu này trong phần còn lại của phiên
- luôn luôn — thêm vào danh sách cho phép vĩnh viễn (được lưu vào
config.yaml) - deny (mặc định) — chặn lệnh
Luồng phê duyệt (Cổng/Nhắn tin)
Trên nền tảng nhắn tin, tác nhân gửi chi tiết lệnh nguy hiểm đến cuộc trò chuyện và chờ người dùng trả lời:
- Trả lời yes, y, approve, ok, hoặc go để phê duyệt
- Trả lời no, n, deny, hoặc cancel để từ chốiBiến môi trường
HERMES_EXEC_ASK=1được đặt tự động khi chạy cổng.
Danh sách cho phép vĩnh viễn
Các lệnh được phê duyệt với "luôn luôn" sẽ được lưu vào ~/.hermes/config.yaml :
# Permanently allowed dangerous command patterns
command_allowlist:
- rm
- systemctl
Các mẫu này được tải khi khởi động và được phê duyệt âm thầm trong tất cả các phiên trong tương lai.
Sử dụng hermes config edit để xem lại hoặc xóa mẫu khỏi danh sách cho phép vĩnh viễn của bạn.
Ủy quyền người dùng (Cổng)
Khi chạy cổng nhắn tin, Hermes kiểm soát ai có thể tương tác với bot thông qua hệ thống ủy quyền phân lớp.
Lệnh kiểm tra ủy quyền
Phương thức _is_user_authorized() kiểm tra theo thứ tự sau:
- Cờ cho phép tất cả trên mỗi nền tảng (ví dụ:
DISCORD_ALLOW_ALL_USERS=true) - Danh sách được phê duyệt ghép nối DM (người dùng được phê duyệt thông qua mã ghép nối)
- Danh sách cho phép dành riêng cho từng nền tảng (ví dụ:
TELEGRAM_ALLOWED_USERS=12345,67890) - Danh sách cho phép toàn cầu (
GATEWAY_ALLOWED_USERS=12345,67890) - Cho phép tất cả toàn cầu (
GATEWAY_ALLOW_ALL_USERS=true) - Mặc định: từ chối
Danh sách cho phép của nền tảng
Đặt ID người dùng được phép dưới dạng giá trị được phân tách bằng dấu phẩy trong ~/.hermes/.env :
# Platform-specific allowlists
TELEGRAM_ALLOWED_USERS=123456789,987654321
DISCORD_ALLOWED_USERS=111222333444555666
WHATSAPP_ALLOWED_USERS=15551234567
SLACK_ALLOWED_USERS=U01ABC123
# Cross-platform allowlist (checked for all platforms)
GATEWAY_ALLOWED_USERS=123456789
# Per-platform allow-all (use with caution)
DISCORD_ALLOW_ALL_USERS=true
# Global allow-all (use with extreme caution)
GATEWAY_ALLOW_ALL_USERS=true
Nếu không có danh sách cho phép nào được định cấu hình và chưa đặt GATEWAY_ALLOW_ALL_USERS thì tất cả người dùng đều bị từ chối. Cổng ghi lại cảnh báo khi khởi động:
No user allowlists configured. All unauthorized users will be denied.
Set GATEWAY_ALLOW_ALL_USERS=true in ~/.hermes/.env to allow open access,
or configure platform allowlists (e.g., TELEGRAM_ALLOWED_USERS=your_id).
Hệ thống ghép nối DM
Để ủy quyền linh hoạt hơn, Hermes bao gồm hệ thống ghép nối dựa trên mã. Thay vì yêu cầu trả trước ID người dùng, những người dùng không xác định sẽ nhận được mã ghép nối một lần mà chủ sở hữu bot phê duyệt thông qua CLI.
Cách thức hoạt động:
- Một người dùng không xác định gửi tin nhắn trực tiếp tới bot
- Bot trả lời bằng mã ghép nối gồm 8 ký tự
- Chủ sở hữu bot chạy
hermes pairing approve <platform> <code>trên CLI - Người dùng được chấp thuận vĩnh viễn cho nền tảng đó
Kiểm soát cách xử lý tin nhắn trực tiếp trái phép trong ~/.hermes/config.yaml :
unauthorized_dm_behavior: pair
whatsapp:
unauthorized_dm_behavior: ignore
pairlà mặc định. DM trái phép sẽ nhận được phản hồi bằng mã ghép nối.ignoreâm thầm gửi tin nhắn trực tiếp trái phép.- Các phần nền tảng ghi đè mặc định chung, do đó bạn có thể tiếp tục ghép nối trên Telegram trong khi giữ im lặng cho WhatsApp.
Các tính năng bảo mật (dựa trên hướng dẫn của OWASP + NIST SP 800-63-4):
| Tính năng | Chi tiết |
|---|---|
| Định dạng mã | 8-char từ bảng chữ cái rõ ràng 32-char (không có 0/O/1/I) |
| Sự ngẫu nhiên | Mật mã ( secrets.choice() ) |
| Mã TTL | Hết hạn 1 giờ |
| Giới hạn tỷ lệ | 1 yêu cầu cho mỗi người dùng trong 10 phút |
| Giới hạn chờ xử lý | Tối đa 3 mã đang chờ xử lý trên mỗi nền tảng |
| Khóa | 5 lần phê duyệt không thành công → khóa 1 giờ |
| Bảo mật tập tin | chmod 0600 trên tất cả các tệp dữ liệu ghép nối |
| Ghi nhật ký | Mã không bao giờ được ghi vào thiết bị xuất chuẩn |
Ghép nối các lệnh CLI:
# List pending and approved users
hermes pairing list
# Approve a pairing code
hermes pairing approve telegram ABC12DEF
# Revoke a user's access
hermes pairing revoke telegram 123456789
# Clear all pending codes
hermes pairing clear-pending
Bộ nhớ: Dữ liệu ghép nối được lưu trữ trong ~/.hermes/pairing/ với các tệp JSON trên mỗi nền tảng:
{platform}-pending.json— yêu cầu ghép nối đang chờ xử lý{platform}-approved.json— người dùng đã được phê duyệt_rate_limits.json— giới hạn tỷ lệ và theo dõi khóa
Cách ly container
Khi sử dụng phần phụ trợ terminal docker, Hermes áp dụng biện pháp tăng cường bảo mật nghiêm ngặt cho mọi vùng chứa.
Cờ bảo mật Docker
Mọi container đều chạy với các cờ này (được xác định trong tools/environments/docker.py ):
_SECURITY_ARGS = [
"--cap-drop", "ALL",
# Drop ALL Linux capabilities
"--cap-add", "DAC_OVERRIDE",
# Root can write to bind-mounted dirs
"--cap-add", "CHOWN",
# Package managers need file ownership
"--cap-add", "FOWNER",
# Package managers need file ownership
"--security-opt", "no-new-privileges",
# Block privilege escalation
"--pids-limit", "256",
# Limit process count
"--tmpfs", "/tmp:rw,nosuid,size=512m",
# Size-limited /tmp
"--tmpfs", "/var/tmp:rw,noexec,nosuid,size=256m",
# No-exec /var/tmp
"--tmpfs", "/run:rw,noexec,nosuid,size=64m",
# No-exec /run
]
Giới hạn tài nguyênTài nguyên vùng chứa có thể định cấu hình trong ~/.hermes/config.yaml :
terminal:
backend: docker
docker_image: "nikolaik/python-nodejs:python3.11-nodejs20"
docker_forward_env: []
# Explicit allowlist only; empty keeps secrets out of the container
container_cpu: 1
# CPU cores
container_memory: 5120
# MB (default 5GB)
container_disk: 51200
# MB (default 50GB, requires overlay2 on XFS)
container_persistent: true
# Persist filesystem across sessions
Tính bền bỉ của hệ thống tập tin
- Chế độ liên tục (
container_persistent: true): Gắn kết/workspacevà/roottừ~/.hermes/sandboxes/docker/<task_id>/ - Chế độ tạm thời (
container_persistent: false): Sử dụng tmpfs cho không gian làm việc — mọi thứ sẽ bị mất khi dọn dẹp
Để triển khai cổng sản xuất, hãy sử dụng phần phụ trợ docker , modal hoặc daytona để tách biệt các lệnh tác nhân khỏi hệ thống máy chủ của bạn. Điều này loại bỏ hoàn toàn sự cần thiết phải phê duyệt lệnh nguy hiểm.
Nếu bạn thêm tên vào terminal.docker_forward_env , các biến đó sẽ được cố ý đưa vào vùng chứa cho các lệnh đầu cuối. Điều này hữu ích đối với thông tin xác thực dành riêng cho nhiệm vụ như GITHUB_TOKEN nhưng cũng có nghĩa là mã chạy trong vùng chứa có thể đọc và lọc chúng.
So sánh bảo mật phần cuối của terminal
| Phần cuối | Cô lập | Kiểm tra Cmd nguy hiểm | Tốt nhất cho |
|---|---|---|---|
| địa phương | Không có — chạy trên máy chủ | ✅ Có | Phát triển, người dùng tin cậy |
| suỵt | Máy từ xa | ✅ Có | Chạy trên một máy chủ riêng biệt |
| docker | Thùng chứa | ❌ Bỏ qua (container là ranh giới) | Cổng sản xuất |
| điểm kỳ dị | Thùng chứa | ❌ Bỏ qua | Môi trường HPC |
| phương thức | Hộp cát đám mây | ❌ Bỏ qua | Cách ly đám mây có thể mở rộng |
| daytona | Hộp cát đám mây | ❌ Bỏ qua | Không gian làm việc trên đám mây liên tục |
Truyền qua biến môi trường
Cả execute_code và terminal đều loại bỏ các biến môi trường nhạy cảm khỏi các tiến trình con để ngăn chặn việc đánh cắp thông tin xác thực bằng mã do LLM tạo. Tuy nhiên, các kỹ năng khai báo required_environment_variables cần có quyền truy cập vào các lọ đó một cách hợp pháp.
Cách thức hoạt động
Hai cơ chế cho phép các biến cụ thể thông qua bộ lọc hộp cát:
1. Chuyển qua phạm vi kỹ năng (tự động)
Khi một kỹ năng được tải (thông qua skill_view hoặc lệnh /skill) và khai báo required_environment_variables , bất kỳ vars nào thực sự được đặt trong môi trường sẽ tự động được đăng ký dưới dạng truyền qua. Các vars bị thiếu (vẫn ở trạng thái cần thiết lập) chưa được đăng ký.
# In a skill's SKILL.md frontmatter
required_environment_variables:
- name: TENOR_API_KEY
prompt: Tenor API key
help: Get a key from https://developers.google.com/tenor
Sau khi tải kỹ năng này, TENOR_API_KEY chuyển đến execute_code , terminal (cục bộ), và các chương trình phụ trợ từ xa (Docker, Modal) — không cần cấu hình thủ công.
Trước v0.5.1, forward_env của Docker là một hệ thống riêng biệt với quá trình chuyển đổi kỹ năng. Bây giờ chúng đã được hợp nhất - các vars env được khai báo theo kỹ năng sẽ tự động được chuyển tiếp vào vùng chứa Docker và hộp cát Modal mà không cần thêm chúng vào docker_forward_env theo cách thủ công.
2. Chuyển qua dựa trên cấu hình (thủ công)
Đối với các vars env không được khai báo bởi bất kỳ kỹ năng nào, hãy thêm chúng vào terminal.env_passthrough trong config.yaml :
terminal:
env_passthrough:
- MY_CUSTOM_KEY
- ANOTHER_TOKEN
Truyền qua tệp thông tin xác thực (mã thông báo OAuth, v.v.) {#credential-file-passthrough}Một số kỹ năng cần tệp (không chỉ env vars) trong hộp cát — ví dụ: Google Workspace lưu trữ mã thông báo OAuth dưới dạng google_token.json trong HERMES_HOME của hồ sơ đang hoạt động. Các kỹ năng khai báo những điều này trong frontmatter:
required_credential_files:
- path: google_token.json
description: Google OAuth2 token (created by setup script)
- path: google_client_secret.json
description: Google OAuth2 client credentials
Khi được tải, Hermes kiểm tra xem các tệp này có tồn tại trong HERMES_HOME của cấu hình đang hoạt động hay không và đăng ký chúng để gắn kết:
- Docker: Gắn kết liên kết chỉ đọc (
-v host:container:ro) - Phương thức: Được gắn khi tạo hộp cát + được đồng bộ hóa trước mỗi lệnh (xử lý việc thiết lập OAuth giữa phiên)
- Cục bộ: Không cần thực hiện hành động nào (tệp đã có thể truy cập được)
Bạn cũng có thể liệt kê các tệp thông tin xác thực theo cách thủ công trong config.yaml :
terminal:
credential_files:
- google_token.json
- my_custom_oauth_token.json
Đường dẫn có liên quan đến ~/.hermes/ . Các tệp được gắn vào /root/.hermes/ bên trong vùng chứa.
Mỗi bộ lọc hộp cát sẽ lọc những gì
| Hộp cát | Bộ lọc mặc định | Ghi đè thông qua |
|---|---|---|
| execute_code | Chặn các vars chứa KEY , TOKEN , SECRET , PASSWORD , CREDENTIAL , PASSWD , AUTH trong tên; chỉ cho phép các vars tiền tố an toàn thông qua | ✅ Passthrough vars bỏ qua cả hai lần kiểm tra |
| terminal (cục bộ) | Chặn các loại cơ sở hạ tầng Hermes rõ ràng (khóa nhà cung cấp, mã thông báo cổng, khóa API công cụ) | ✅ Vượt qua vars bỏ qua danh sách chặn |
| terminal (Docker) | Không có máy chủ env vars theo mặc định | ✅ Chuyển tiếp vars + docker_forward_env được chuyển tiếp qua -e |
| terminal (Phương thức) | Không có tập tin/env máy chủ theo mặc định | ✅ Đã gắn tệp thông tin xác thực; truyền env qua đồng bộ hóa |
| MCP | Chặn mọi thứ ngoại trừ các vars hệ thống an toàn + được định cấu hình rõ ràng env | ❌ Không bị ảnh hưởng bởi sự chuyển tiếp (thay vào đó hãy sử dụng cấu hình MCP env) |
Cân nhắc về bảo mật
- Việc chuyển tiếp chỉ ảnh hưởng đến các lọ mà bạn hoặc các kỹ năng của bạn đã khai báo rõ ràng — chế độ bảo mật mặc định không thay đổi đối với mã do LLM tạo tùy ý
- Các tệp thông tin xác thực được gắn chỉ đọc vào vùng chứa Docker
- Skills Guard quét nội dung kỹ năng để tìm các kiểu truy cập env đáng ngờ trước khi cài đặt
- Các lọ bị thiếu/không được đặt sẽ không bao giờ được đăng ký (bạn không thể rò rỉ những gì không tồn tại)
- Không bao giờ được thêm bí mật cơ sở hạ tầng Hermes (khóa API của nhà cung cấp, mã thông báo cổng) vào
env_passthrough— chúng có cơ chế chuyên dụng
Xử lý thông tin xác thực MCP
Các quy trình con của máy chủ MCP (Model Context Protocol) nhận được môi trường được lọc để ngăn chặn rò rỉ thông tin xác thực do vô tình.
Biến môi trường an toàn
Chỉ các biến này được truyền từ máy chủ đến các quy trình con MCP stdio:
PATH, HOME, USER, LANG, LC_ALL, TERM, SHELL, TMPDIR
Cộng với bất kỳ biến XDG_* nào. Tất cả các biến môi trường khác (khóa API, mã thông báo, bí mật) đều bị loại bỏ.
Các biến được xác định rõ ràng trong cấu hình env của máy chủ MCP được chuyển qua:
mcp_servers:
github:
command: "npx"
args: ["-y", "@modelcontextprotocol/server-github"]
env:
GITHUB_PERSONAL_ACCESS_TOKEN: "ghp_..."
# Only this is passed
Chỉnh sửa thông tin xác thực
Thông báo lỗi từ các công cụ MCP sẽ được loại bỏ trước khi được trả lại cho LLM. Các mẫu sau được thay thế bằng [REDACTED] :- PAT GitHub ( ghp_... )
- Phím kiểu OpenAI (
sk-...) - Mã thông báo mang
- Các tham số
token=,key=,API_KEY=,password=,secret=
Chính sách truy cập trang web
Bạn có thể hạn chế những trang web mà đại lý có thể truy cập thông qua các công cụ trình duyệt và web của nó. Điều này hữu ích để ngăn tác nhân truy cập vào các dịch vụ nội bộ, bảng quản trị hoặc các URL nhạy cảm khác.
# In ~/.hermes/config.yaml
security:
website_blocklist:
enabled: true
domains:
- "*.internal.company.com"
- "admin.example.com"
shared_files:
- "/etc/hermes/blocked-sites.txt"
Khi yêu cầu một URL bị chặn, công cụ sẽ trả về lỗi giải thích miền bị chặn theo chính sách. Danh sách chặn được thực thi trên web_search , web_extract , browser_navigate và tất cả các công cụ hỗ trợ URL.
Xem Danh sách chặn trang web trong hướng dẫn cấu hình để biết chi tiết đầy đủ.
Bảo vệ SSRF
Tất cả các công cụ hỗ trợ URL (tìm kiếm trên web, trích xuất web, tầm nhìn, trình duyệt) đều xác thực URL trước khi tìm nạp chúng để ngăn chặn các cuộc tấn công Giả mạo yêu cầu phía máy chủ (SSRF). Các địa chỉ bị chặn bao gồm:
- Mạng riêng (RFC 1918):
10.0.0.0/8,172.16.0.0/12,192.168.0.0/16 - Lặp lại:
127.0.0.0/8,::1 - Liên kết cục bộ:
169.254.0.0/16(bao gồm siêu dữ liệu đám mây tại169.254.169.254) - CGNAT / không gian địa chỉ dùng chung (RFC 6598):
100.64.0.0/10(Tailscale, WireGuard VPN) - Tên máy chủ siêu dữ liệu đám mây:
metadata.google.internal,metadata.goog - Địa chỉ dành riêng, multicast và không xác định
Bảo vệ SSRF luôn hoạt động và không thể tắt được. Lỗi DNS được coi là bị chặn (đóng không thành công). Chuỗi chuyển hướng được xác nhận lại ở mỗi bước nhảy để ngăn chặn việc bỏ qua dựa trên chuyển hướng.
Quét bảo mật trước khi thực thi Tirith
Hermes tích hợp tirith để quét lệnh ở cấp độ nội dung trước khi thực thi. Tirith phát hiện các mối đe dọa mà việc so khớp mẫu đơn thuần sẽ bỏ sót:
- Giả mạo URL đồng âm (tấn công tên miền quốc tế hóa)
- Mẫu chuyển từ đường ống sang trình thông dịch (
curl | bash,wget | sh) - Tấn công tiêm terminal
Tirith tự động cài đặt từ các bản phát hành GitHub trong lần sử dụng đầu tiên với xác minh tổng kiểm tra SHA-256 (và xác minh xuất xứ cosign nếu có cosign).
# In ~/.hermes/config.yaml
security:
tirith_enabled: true
# Enable/disable tirith scanning (default: true)
tirith_path: "tirith"
# Path to tirith binary (default: PATH lookup)
tirith_timeout: 5
# Subprocess timeout in seconds
tirith_fail_open: true
# Allow execution when tirith is unavailable (default: true)
Khi tirith_fail_open là true (mặc định), các lệnh sẽ tiếp tục nếu tirith chưa được cài đặt hoặc hết thời gian chờ. Đặt thành false trong môi trường bảo mật cao để chặn lệnh khi không có tirith.
Phán quyết của Tirith tích hợp với luồng phê duyệt: các lệnh an toàn được chuyển qua, trong khi cả lệnh đáng ngờ và lệnh bị chặn đều kích hoạt sự chấp thuận của người dùng với các phát hiện đầy đủ về tirith (mức độ nghiêm trọng, tiêu đề, mô tả, các lựa chọn thay thế an toàn hơn). Người dùng có thể phê duyệt hoặc từ chối - lựa chọn mặc định là từ chối để giữ an toàn cho các tình huống không được giám sát.
Bảo vệ tiêm tệp ngữ cảnh
Các tệp ngữ cảnh (AGENTS.md, .cursorrules, SOUL.md) được quét để đưa vào lời nhắc trước khi được đưa vào lời nhắc hệ thống. Máy quét kiểm tra:- Hướng dẫn bỏ qua/bỏ qua hướng dẫn trước
- Nhận xét HTML ẩn với các từ khóa đáng ngờ
- Cố gắng đọc bí mật (
.env,credentials,.netrc) - Lọc thông tin xác thực qua
curl - Ký tự Unicode vô hình (khoảng trắng có độ rộng bằng 0, ghi đè hai chiều)
Các tệp bị chặn hiển thị cảnh báo:
[BLOCKED: AGENTS.md contained potential prompt injection (prompt_injection). Content not loaded.]
Các phương pháp thực hành tốt nhất để triển khai sản xuất
Danh sách kiểm tra triển khai cổng
- Đặt danh sách cho phép rõ ràng — không bao giờ sử dụng
GATEWAY_ALLOW_ALL_USERS=truetrong sản xuất - Sử dụng phần phụ trợ vùng chứa — đặt
terminal.backend: dockertrong config.yaml - Hạn chế giới hạn tài nguyên — đặt giới hạn CPU, bộ nhớ và đĩa thích hợp
- Lưu trữ bí mật một cách an toàn — giữ khóa API trong
~/.hermes/.envvới quyền truy cập tệp thích hợp - Bật ghép nối DM — sử dụng mã ghép nối thay vì mã hóa ID người dùng khi có thể
- Xem lại danh sách lệnh cho phép — kiểm tra định kỳ
command_allowlisttrong config.yaml - **Đặt
MESSAGING_CWD** — không để tác nhân hoạt động từ các thư mục nhạy cảm - Chạy với quyền không phải root — không bao giờ chạy cổng với quyền root
- Theo dõi nhật ký — kiểm tra
~/.hermes/logs/để phát hiện các nỗ lực truy cập trái phép - Luôn cập nhật — chạy
hermes updatethường xuyên để có các bản vá bảo mật
Bảo mật khóa API
# Set proper permissions on the .env file
chmod 600 ~/.hermes/.env
# Keep separate keys for different services
# Never commit .env files to version control
Cách ly mạng
Để bảo mật tối đa, hãy chạy cổng trên một máy hoặc VM riêng biệt:
terminal:
backend: ssh
ssh_host: "agent-worker.local"
ssh_user: "hermes"
ssh_key: "~/.ssh/hermes_agent_key"
Điều này giữ cho các kết nối nhắn tin của cổng tách biệt với việc thực thi lệnh của tác nhân.