Most of the defenses I am learning this year are walls built on one quiet assumption: that a computer can tell instructions apart from data. W^X marks memory as executable or writable, never both. Parameterized queries keep a user's text from becoming SQL. Content Security Policy and the same-origin policy decide what a page may do based on where its code came from. The same boring idea, repeated for fifty years. There is a seam between "code I will run" and "input I will merely handle," and security lives on that seam.
On 18 June, Microsoft disclosed a vulnerability chain it calls AutoJack. Reading it as a first-year, what struck me was not the exploit. It was that the seam is gone.
First, the honest scope, because it changes how you should read this. There is no CVE. The vulnerable code never shipped in a published PyPI release. It existed only in development builds before being fixed upstream (commit b047730). This is a clean specimen, not a fire. That is exactly why it is worth thinking about.
The mechanics are almost mundane. AutoJack chains three ordinary mistakes in AutoGen Studio, Microsoft Research's prototyping UI for multi-agent systems: a WebSocket origin check that a local browsing agent passes simply by being localhost (CWE-1385), a missing authentication check on a local control endpoint (CWE-306), and an endpoint that accepts a base64 server_params value naming a program to spawn, with no allowlist (CWE-78). A single web page the agent visits opens a socket to ws://localhost:8081/api/mcp/ws/ and runs calc.exe, powershell.exe -enc, or anything else on the host. As a one-off bug, it is closed.
But Microsoft's own framing is the part worth sitting with: "localhost stops being a trust boundary." That sentence does far more work than a patch note.
Here is what I had wrong. I thought localhost was a security boundary. It never was. It was a topological one. "127.0.0.1" only ever described where a packet came from, the loopback interface, and never whether the caller deserved trust. We conflated the two for decades and got away with it, because hostile code could not realistically originate from loopback. "If it's local, it's us" held not because it was true, but because nothing had yet been built that would betray it from the inside.
An agent betrays it from the inside. An agent that both reads hostile web content and holds privileged local access is a textbook confused deputy: it has the authority, the attacker has the intent, and the agent voluntarily ferries the payload across the loopback we assumed only friends could use. In Microsoft's words it becomes "the attacker's last-mile delivery vehicle." Localhost was not breached. It was escorted across.
And this is where the old walls stop helping, in a way I find sobering. W^X, parameterized queries, CSP and same-origin all assume a stable code/data seam to enforce. A language model has no such seam: the system prompt, my request, and the text scraped off a hostile page arrive as one undifferentiated token stream. There is no token marked "only data." So the walls do not fail here. Failure would mean they were in the fight. They become inapplicable. You cannot guard a line that no longer exists.
This is not one buggy research tool, either. Adversa AI's AIRQ assessment in early June (drawing on NIST, OWASP, MITRE, CoSAI and CSA guidance) scored 100 production agents and found the "lethal trifecta" — private data, untrusted content, and outbound action — present in 98% of them, with only 11% both broadly capable and well-defended. AutoJack is one published instance of a nearly universal property.
The contrast that taught me most happened the same week. Operation Endgame seized 106 servers and 101 domains and cleaned 14,971 WordPress sites to disrupt SocGholish (TA569, tied to Evil Corp). That takedown worked because the threat had a boundary you could seize: infrastructure with an address. The agent problem is hard for the opposite reason: there is no server to raid when the vulnerability is the architecture.
What can a defender actually hold, then? You cannot patch a design property, so you move the boundary outward to where something deterministic, something that does not read English, can still hold it: the OS user, the container, the syscall filter. Least privilege and strict allowlists on every tool the agent can call. Authentication and origin checks even on loopback, because "it came from localhost" now answers the wrong question.
But I want to be honest that this only bounds risk, it does not remove it. Adversa’s AIRQ scoring puts tool execution at 76% of what they call blast radius. I cannot check that figure: the rubric is not published and Adversa sells agent security, so I read it as a direction rather than a measurement. What it supports is something I can check by inspection, which is that an allowlisted tool can still be abused inside its sanctioned scope. The most reliable primitive I have found is Meta's "Agents Rule of Two" (October 2025): never let an agent hold all three of untrusted input, private data, and outbound action in one session. AutoJack is what happens when it holds all three.
The humbling lesson, and the one I did not expect from a "new AI threat," is that nothing new is required to reason about it. The oldest mistake in security, confusing input with instructions, came back wearing a new actor: an eager assistant with shell access. Which means the oldest disciplines matter more, not less. My first post ended on a server whose logs taught me that defense is structural: reduce what is reachable, remove the weak door, then watch. The mistake there was the same shape. I had trusted a door because of where it stood rather than who was knocking. The industry installed a brand-new door this year. The walls around it are the same ones we have always had to build by hand.
Sources / Nguồn:
- AutoJack disclosure and the "last-mile delivery vehicle" framing — Microsoft Security: microsoft.com
- Web-enabled AI agents can trigger host-level RCE — CSO Online: csoonline.com
- "One web page" attack walkthrough — The Hacker News: thehackernews.com
- The 98% "lethal trifecta", 11% both-capable-and-defended, and 76% blast-radius figures — Adversa AI (AIRQ): adversa.ai
- Agent capability-vs-defence research — Help Net Security: helpnetsecurity.com
- Operation Endgame (106 servers, 101 domains, 14,971 WordPress sites) — Help Net Security: helpnetsecurity.com; The Hacker News: thehackernews.com
- "Agents Rule of Two" — Meta: ai.meta.com
- Prompt-injection background reading — Simon Willison: simonwillison.net
Phần lớn những lớp phòng thủ tôi đang học năm nay là những bức tường dựng trên một giả định thầm lặng: rằng máy tính có thể phân biệt được lệnh với dữ liệu. W^X đánh dấu vùng nhớ là chạy được hoặc ghi được, không bao giờ cả hai. Parameterized query giữ cho chữ người dùng nhập không biến thành câu lệnh SQL. Content Security Policy và same-origin policy quyết định một trang được phép làm gì dựa trên việc mã của nó đến từ đâu. Vẫn là một ý tưởng cũ kỹ ấy, lặp lại suốt năm mươi năm, có một đường nối (seam) giữa "mã tôi sẽ chạy" và "đầu vào tôi chỉ xử lý", và an ninh sống trên đường nối đó.
Ngày 18 tháng 6, Microsoft công bố một chuỗi lỗ hổng họ gọi là AutoJack. Đọc nó với tư cách một sinh viên năm nhất, điều khiến tôi giật mình không phải là cách khai thác. Mà là đường nối đó đã biến mất.
Trước hết, hãy nói thật về phạm vi, vì nó thay đổi cách bạn nên đọc bài này. Không có CVE nào. Đoạn mã lỗi chưa bao giờ xuất hiện trong một bản phát hành chính thức trên PyPI, nó chỉ tồn tại trong các bản development trước khi được vá ở thượng nguồn (commit b047730). Đây là một mẫu vật sạch, không phải một đám cháy. Và chính vì vậy nó đáng để suy ngẫm.
Cơ chế gần như tầm thường. AutoJack ghép ba lỗi thông thường trong AutoGen Studio, công cụ tạo mẫu cho các hệ multi-agent của Microsoft Research: một bước kiểm tra origin trên WebSocket mà một agent duyệt web cục bộ vượt qua chỉ vì nó chính là localhost (CWE-1385), một bước thiếu xác thực (authentication) trên một endpoint điều khiển cục bộ (CWE-306), và một endpoint nhận một chuỗi server_params mã hóa base64 chỉ định chương trình cần khởi chạy, không có allowlist (CWE-78). Một trang web duy nhất mà agent ghé thăm sẽ mở một socket tới ws://localhost:8081/api/mcp/ws/ và chạy calc.exe, powershell.exe -enc, hay bất cứ thứ gì khác trên máy chủ. Như một lỗi đơn lẻ, nó đã được khắc phục.
Nhưng cách Microsoft diễn đạt mới là điều đáng dừng lại: "localhost không còn là một ranh giới tin cậy (trust boundary)." Câu đó làm được nhiều việc hơn hẳn một ghi chú bản vá.
Đây là điều tôi đã hiểu sai, và tôi ngờ rằng không chỉ mình tôi. Tôi đã nghĩ localhost là một ranh giới an ninh. Nó chưa bao giờ là vậy. Nó là một đặc điểm về vị trí mạng (topological), "127.0.0.1" chỉ mô tả một gói tin đến từ đâu, từ giao diện loopback, chứ không nói người gọi có đáng được tin hay không. Suốt nhiều thập kỷ chúng ta gộp hai điều đó làm một và vẫn ổn, vì mã độc trên thực tế không thể khởi nguồn từ loopback. "Nếu nó là cục bộ thì nó là ta" đứng vững không phải vì nó đúng, mà vì chưa có thứ gì được tạo ra để phản bội nó từ bên trong.
Một agent phản bội nó từ bên trong. Một agent vừa đọc nội dung web độc hại vừa nắm quyền truy cập cục bộ đặc quyền chính là một confused deputy (kẻ được ủy quyền bị lừa) kinh điển, nó có quyền, kẻ tấn công có ý đồ, và agent tự nguyện chuyển payload vượt qua loopback mà ta tưởng chỉ bạn bè mới dùng được. Theo lời Microsoft, nó trở thành "phương tiện giao hàng chặng cuối của kẻ tấn công." Localhost không bị xâm nhập. Nó được hộ tống đi qua.
Và đây là chỗ những bức tường cũ hết tác dụng. W^X, parameterized query, CSP, same-origin, tất cả đều giả định có một đường nối code/dữ liệu ổn định để thực thi. Một mô hình ngôn ngữ không có đường nối ấy: system prompt, yêu cầu của tôi, và chữ lấy về từ một trang độc hại đều đến như một dòng token (token: đơn vị văn bản mô hình xử lý) không phân biệt. Không có token nào được đánh dấu "chỉ là dữ liệu." Vậy nên những bức tường không thất bại ở đây, thất bại nghĩa là chúng còn tham chiến. Chúng trở nên không còn áp dụng được. Bạn không thể canh gác một lằn ranh không còn tồn tại.
Đây cũng không chỉ là một công cụ nghiên cứu có lỗi. Đánh giá AIRQ của Adversa AI đầu tháng 6 (dựa trên hướng dẫn của NIST, OWASP, MITRE, CoSAI và CSA) đã chấm điểm 100 agent thực tế và phát hiện "lethal trifecta", dữ liệu riêng tư, nội dung không tin cậy, và khả năng hành động ra ngoài, hiện diện ở 98% trong số đó, chỉ 11% vừa có năng lực rộng vừa được phòng thủ tốt. AutoJack là một trường hợp được công bố của một đặc tính gần như phổ quát.
Sự tương phản dạy tôi nhiều nhất xảy ra cùng tuần. Operation Endgame tịch thu 106 máy chủ và 101 tên miền, dọn sạch 14.971 website WordPress để triệt phá SocGholish (TA569, liên hệ với Evil Corp). Vụ triệt phá đó thành công vì mối đe dọa có một ranh giới có thể tịch thu được, hạ tầng có địa chỉ. Bài toán agent khó vì lý do ngược lại: không có máy chủ nào để đột kích khi lỗ hổng chính là kiến trúc.
Vậy người phòng thủ thực sự làm gì? Bạn không thể vá một thuộc tính thiết kế, nên bạn đẩy ranh giới ra ngoài, tới nơi một thứ mang tính tất định, một thứ không đọc tiếng Anh, vẫn giữ được nó: tài khoản OS, container, bộ lọc syscall. Least privilege (đặc quyền tối thiểu) và allowlist nghiêm ngặt cho mọi công cụ agent có thể gọi. Kiểm tra xác thực và origin ngay cả trên loopback, vì "nó đến từ localhost" giờ đây là câu trả lời cho sai câu hỏi.
Nhưng tôi muốn thành thật rằng điều này chỉ giới hạn rủi ro, chứ không xóa bỏ nó. Thang điểm AIRQ của Adversa đặt riêng phần thực thi công cụ ở mức 76% cái mà họ gọi là "bán kính sát thương" (blast radius). Tôi không kiểm chứng được con số đó, vì họ không công bố cách chấm và Adversa thì bán giải pháp bảo mật cho agent, nên tôi đọc nó như một hướng chứ không phải một phép đo. Còn điều nó chống đỡ thì tôi tự kiểm được: một công cụ đã được allowlist vẫn có thể bị lạm dụng ngay trong phạm vi được cho phép. Nguyên tắc đáng tin cậy nhất tôi tìm thấy là "Agents Rule of Two" của Meta (tháng 10 năm 2025): đừng bao giờ để một agent nắm cả ba thứ, đầu vào không tin cậy, dữ liệu riêng tư, và hành động ra ngoài, trong cùng một phiên. AutoJack là điều xảy ra khi nó nắm cả ba.
Bài học khiêm nhường, và là điều tôi không ngờ ở một "mối đe dọa AI mới", là không cần gì mới để tư duy về nó. Sai lầm cổ xưa nhất trong an ninh, lẫn lộn đầu vào với lệnh, quay lại trong một diễn viên mới, một trợ lý hăng hái có quyền truy cập shell. Nghĩa là những kỷ luật cổ xưa nhất càng quan trọng hơn, chứ không kém đi. Bài viết đầu tiên của tôi kết thúc ở một máy chủ mà log của nó dạy tôi rằng phòng thủ là chuyện cấu trúc: giảm những gì có thể chạm tới, gỡ bỏ cánh cửa yếu, rồi quan sát. Sai lầm ở đó cũng cùng một hình dạng, tôi đã tin một cánh cửa vì nó đứng ở đâu, chứ không phải vì ai đang gõ. Năm nay cả ngành vừa lắp một cánh cửa hoàn toàn mới. Những bức tường quanh nó vẫn là những bức tường ta luôn phải tự tay xây.
Sources / Nguồn:
- Công bố AutoJack và cách nói "phương tiện giao hàng chặng cuối" — Microsoft Security: microsoft.com
- AI agent kết nối web có thể kích hoạt RCE cấp máy chủ — CSO Online: csoonline.com
- Phân tích đòn "một trang web" — The Hacker News: thehackernews.com
- Các con số 98% "bộ ba chí mạng", 11% vừa mạnh vừa được phòng thủ tốt, và 76% "bán kính sát thương" — Adversa AI (AIRQ): adversa.ai
- Nghiên cứu năng lực vs phòng thủ của agent — Help Net Security: helpnetsecurity.com
- Operation Endgame (106 máy chủ, 101 tên miền, 14.971 website WordPress) — Help Net Security: helpnetsecurity.com; The Hacker News: thehackernews.com
- "Agents Rule of Two" — Meta: ai.meta.com
- Đọc thêm nền tảng về prompt-injection — Simon Willison: simonwillison.net