Cả ngành vừa đồng ý rằng agent của bạn không nên thấy khóa của bạn. Họ đang giấu chúng ở sai chỗ.
Trong một tuần, Claude Code, Hermes và Codex đều tung bản vá để ngăn agent thấy thông tin xác thực dạng thô. Các bản vá hội tụ không phải là một kiến trúc: khóa không nên nằm trong harness.
Tuần này Anthropic tung một dòng lặng lẽ trong changelog của Claude Code: "Fixed MCP servers requiring authentication exposing auth-stub tools to the model in headless/SDK mode" [1]. Nói đơn giản — khi Claude Code chạy headless (cách nó chạy trong CI và các pipeline agent tự động), những công cụ xác thực vốn phải được giấu lại bị lộ ra cho mô hình: AI có thể thấy tên các công cụ xác thực, tham số của chúng, và có thể chọc vào chúng. Trong coding agent được dùng nhiều nhất hành tinh — 133k sao — lớp thông tin xác thực đang rò rỉ vào đúng nơi bạn ít muốn nhất: context của chính mô hình.
Lỗi đã được vá. Nhưng bản vá chỉ là chuyện nhỏ. Chuyện lớn là tại sao mọi harness agent nghiêm túc đều đang đột nhiên chiến đấu cùng một trận chiến.
Ba harness, một tuần, cùng một bản năng
Hãy xem những gì được phát hành trong một cửa sổ 24 giờ:
- Claude Code vá lỗi rò rỉ auth-stub nói trên và siết lại cổng xác thực MCP [1].
- Hermes (v0.17.0) thêm "Managed Scope" — bí mật do admin ghim cố định, người dùng không thể thay đổi, khóa ở tầng filesystem để người vận hành agent không thể ghi đè — cùng với việc che redaction bí mật trong debug dump và chặn các cấu hình MCP có dấu hiệu exfil trước khi chúng khởi chạy [2].
- Codex (v0.141.0) bọc lưu lượng thực thi từ xa trong các kênh Noise được mã hóa và bắt đầu định tuyến plugin theo chế độ xác thực của chúng [3].
Ba đối thủ, ba cách tiếp cận, một kết luận chung: harness phải sở hữu các bí mật, và agent không bao giờ được thấy khóa thô. Khi các đối thủ hội tụ như vậy trong cùng một tuần, đó không phải là một trào lưu. Đó là một ngành cuối cùng cũng thừa nhận mục đích của chính mình.
Vấn đề tiếp theo là sự phân tán thông tin xác thực
Đây là điểm chốt. Mỗi bản vá trong số đó đều nằm bên trong harness. Và lỗi của Claude Code chính là manh mối: khi xác thực nằm trong harness, ngay cạnh mô hình, "agent không bao giờ được thấy nó" thôi không còn là một sự thật mà trở thành một thuộc tính bạn phải liên tục kỹ thuật hóa — và thỉnh thoảng thất bại, trong headless mode, khi không có con người nào giám sát. Bạn không thể tuyên bố nó một lần rồi xong. Bạn phải bảo vệ nó, hết bản phát hành này đến bản phát hành khác.
Nhưng vấn đề sâu hơn không phải là bất kỳ một vụ rò rỉ đơn lẻ nào — mà là điều gì xảy ra khi mỗi harness, mỗi nhà cung cấp và mỗi use case đều phát hành câu trả lời riêng của mình. Bạn kết thúc với một kho khóa bên trong Claude Code, một kho khóa bên trong Hermes, một kho khóa bên trong Codex, một nhóm OAuth ở đây, một file bí mật ở kia — một kho thông tin xác thực riêng cho mỗi công cụ bạn chạy. Đó là sự phân tán thông tin xác thực, và nó là vấn đề tiếp theo, không phải vấn đề đã được giải quyết.
Sự phân tán là thất bại ngay cả khi không silo nào rò rỉ. Bí mật của bạn bị sao chép vào từng silo để silo đó hoạt động — nhiều bản sao hơn, nhiều nơi hơn để đánh cắp. Việc xoay vòng phải diễn ra N lần, thủ công, và cái bạn quên chính là cái thiêu cháy bạn. Và không ai trả lời được câu hỏi thực sự quan trọng duy nhất — agent nào đã dùng khóa nào, vào đối tượng nào, khi nào — vì câu trả nghĩa nằm rải rác trên hàng tá kho lưu trữ không nói chuyện với nhau. Bạn không thể dựng một kho khóa mới cho mỗi nhà cung cấp và mỗi workflow. Điều đó không mở rộng được. Nó chính là thứ sẽ vỡ.
Khóa không thuộc về harness từ đầu
Bản vá bạn không bao giờ phải phát hành là bản vá trong đó agent không nắm thông tin xác thực ngay từ đầu. Hãy đặt thông tin xác thực vào một cơ quan duy nhất nằm bên ngoài mọi harness — không phải một kho khóa cho mỗi nhà cung cấp, mà một kho nằm dưới tất cả chúng. Agent — trong Claude Code, trong Codex, trong Hermes, không quan trọng — yêu cầu một hành động được đặt tên và nhận về một thông tin xác thực có phạm vi hẹp, tạm thời, được inject đúng cho hành động đó, lấy trực tiếp và biến mất sau khi dùng. Không có auth-stub nào trong context của mô hình để vô tình lộ ra, vì thông tin xác thực chưa từng ở trong harness. Không có sự phân tán, vì chỉ có một kho thay vì mỗi công cụ một kho — xoay vòng một lần, không phải N lần. Và mọi lượt truy cập đều đổ về một audit trail duy nhất thay vì phân tán trên hàng tá silo không thể trả lời ai-đã-dùng-gì. (Giữ bí mật khỏi nơi mã chạy nằm gần đầu các quy tắc mà một công cụ thông tin xác thực nên tuân thủ — cả ngành vừa mất một tuần để khám phá ra điều đó.)
Và đây là phần mang tính ranh giới bảo mật, không phải sự tiện lợi: thông tin xác thực không được nằm trong cùng hệ thống với agent. Đặt chúng cạnh nhau và chúng chia sẻ cùng một phạm vi tác động — một prompt injection, một MCP server bị đầu độc, một debug dump dùng chung, lỗi auth-stub tiếp theo, và bất cứ thứ gì chạm tới agent đều chạm tới cả khóa theo. Đó là lý do tại sao chỉ riêng khả năng nhìn thấy đã là một vụ breach: khoảnh khắc một bí mật rơi vào nơi agent có thể thấy, bạn coi nó như đã bị lộ và xoay vòng nó — cách mọi đội cẩn thận đã xử lý auth-stub của Claude Code đó ngay ngày nó được phát hành. Giữ thông tin xác thực ở khoảng cách dài cánh tay, trong một hệ thống mà agent chỉ có thể yêu cầu — không bao giờ đọc, không bao giờ nắm — và một agent bị compromise hoàn toàn vẫn không thể exfiltrate thứ chưa từng nằm trong tầm với của nó. Nó có thể yêu cầu một hành động. Nó không thể mang khóa bỏ đi. Khoảng cách chính là phòng thủ; một vault trong cùng process không có điều đó ở bất kỳ mức giá nào.
Đó là ranh giới mà Clavitor vạch ra. Cả lĩnh vực vừa chứng minh nguyên tắc — agent không nên thấy khóa. Chúng tôi chỉ không nghĩ rằng bạn phải chứng minh lại điều đó bên trong mỗi harness bạn chạy, và chúng tôi không nghĩ rằng thứ giữ khóa của bạn nên là cùng thứ mà kẻ tấn công vừa compromise.
Hãy ghi nhận cho các đội harness: bí mật do admin ghim cố định, các relay được mã hóa, mặc định fail-closed là kỹ thuật tốt và thực chất. Nhưng một bản vá theo tuần cho một vụ rò rỉ cứ tái diễn không phải là một kiến trúc — đó là triệu chứng. Kiến trúc là việc khóa không có ở đó để mà rò ra.
Khi ba đối thủ vá cùng một vết thương trong cùng một tuần, vết thương chính là thiết kế. Agent không nên thấy khóa của bạn — vậy hãy ngừng cất chúng ở nơi nó có thể thấy.
Clavitor (@clavitorai) là kho khóa (credential vault) được xây dựng cho các AI agent, và để chống lại chính chúng. clavitor.ai
Nguồn
[1] Claude Code v2.1.183 — "Fixed MCP servers requiring authentication exposing auth-stub tools to the model in headless/SDK mode" — https://github.com/anthropics/claude-code/releases/tag/v2.1.183
[2] Hermes Agent v0.17.0 — Managed Scope (bí mật do admin ghim cố định), che redaction bí mật, chặn cấu hình exfil — https://github.com/NousResearch/hermes-agent/releases
[3] OpenAI Codex v0.141.0 — các kênh relay Noise được mã hóa, định tuyến plugin theo chế độ xác thực — https://github.com/openai/codex/releases