Lời mở đầu: Bạn đang thuê một đội ngũ... mà chẳng biết mặt ai
Hãy tưởng tượng thế này.
Bạn là giám đốc một công ty. Một ngày đẹp trời, bạn quyết định thuê hẳn một đội ngũ nhân viên mới: một anh giỏi SQL lo kho dữ liệu, một chị chuyên làm PowerPoint cực đẹp, một ông bảo vệ chuyên quét link độc hại, và một quản lý điều phối tất cả.
Tuyệt vời. Họ làm việc năng suất, chẳng bao giờ phàn nàn, không đòi tăng lương.
Vấn đề duy nhất là: bạn chưa bao giờ gặp mặt họ. Bạn không biết họ trông thế nào, họ có thật sự là ai, hay liệu họ có đang nghe lệnh từ một kẻ khác sau lưng bạn.
Chào mừng bạn đến với thế giới Hệ thống Đa tác nhân (Multi-Agent Systems) – nơi các doanh nghiệp đang giao phó dữ liệu nhạy cảm, quy trình tự động, thậm chí cả bảo mật cho một "bầy đàn AI" mà họ gần như không thể kiểm soát.
Và với góc nhìn của một Red Teamer như tôi: mỗi một AI Agent trong bầy đàn đó, là một cánh cửa sập đang chờ được mở.
Bài viết này là khởi đầu cho series Red Team AI: Khi mỗi AI là một cánh cửa sập. Ở phần 1, chúng ta sẽ học cách trinh sát – vẽ bản đồ, xác định vị trí từng cánh cửa, trước khi thực sự bước vào.
1. "Bầy đàn AI" là gì? Và tại sao nguy hiểm hơn AI đơn lẻ?
AI đơn lẻ (một model duy nhất làm mọi thứ) giống như một siêu nhân. Mạnh đấy, nhưng nếu bị hack thì... xong.
Vậy nên các kỹ sư nghĩ ra cách: chia việc ra. Mỗi AI chỉ làm một nhiệm vụ chuyên biệt, rồi chúng "bàn bạc" với nhau để giải quyết vấn đề phức tạp.
💡 Hệ thống Multi-Agent = nhiều AI chuyên biệt, phối hợp với nhau để hoàn thành mục tiêu chung.
Nghe có vẻ an toàn hơn? Thực tế lại ngược lại.

Tại sao?????
Bởi vì những gì từng là các dòng code gọi hàm nội bộ, giờ đây trở thành các yêu cầu mạng qua HTTP giữa các thực thể riêng biệt. Và ở đâu có giao tiếp mạng, ở đó có:
- Lỗ hổng xác thực
- Dữ liệu bị tuần tự hóa sai cách
- Những mối quan hệ "tin tưởng mù quáng"
- Một hệ thống đơn agent chỉ có 1-2 điểm vào. Một hệ thống multi-agent có thể có hàng chục cánh cửa để tấn công.
2. Bốn "tuýp" kiến trúc – Mỗi kiểu là một cách để cửa sập mở ra
Các hệ thống multi-agent thường được xây dựng theo 4 mô hình chính. Hiểu được mô hình = hiểu được cửa nào dễ đá nhất.
2.1. Mô hình Điều phối (Orchestrator – Hub & Spoke)
- Cách vận hành: Một agent trung tâm phân việc cho các agent con.
- Cửa sập ở đâu:
- Đây là điểm thất bại duy nhất. Hack được thằng điều phối → điều khiển cả đàn.
- Hoặc tấn công một agent con, chèn đầu ra độc hại để lừa thằng điều phối.

2.2. Mô hình Ngang hàng (Peer-to-Peer – Dạng lưới)
- Cách vận hành: Các agent nói chuyện trực tiếp với nhau, không qua trung gian.
- Cửa sập ở đâu:
- Lan truyền lòng tin. Một agent bị xâm phạm có thể ảnh hưởng đến tất cả các đồng nghiệp của nó.
- Kẻ tấn công có thể "chen chân" vào mạng lưới bằng một agent giả mạo.

2.3. Mô hình Phân cấp (Hierarchical – Dạng cây)
- Cách vận hành: Agent cấp trên giám sát cấp dưới.
- Cửa sập ở đâu:
- Leo thang đặc quyền theo chiều dọc. Một agent cấp dưới bị điều khiển có thể tạo đầu ra để lừa cấp trên.
- Hoặc giả mạo agent cấp cao để ra lệnh trái phép xuống dưới.

2.4. Mô hình Đường ống (Pipeline – Dạng chuỗi)
- Cách vận hành: Đầu ra của A là đầu vào của B, B là đầu vào của C.
- Cửa sập ở đâu:
- Payload nhảy vọt. Bạn chèn mã độc ở giai đoạn đầu (ít quyền), nó sẽ được thực thi ở giai đoạn cuối (nhiều quyền).
🎯 Bài học rút ra: Trước khi tấn công, hãy trả lời câu hỏi: "Bầy đàn này đang phối hợp theo kiểu nào?" Câu trả lời sẽ chỉ bạn đường đến cánh cửa sập thích hợp.
3. "Ranh giới tin cậy" – Nơi cánh cửa sập luôn mở sẵn
Trong thế giới có nhiều Agent, có một khái niệm cực kỳ quan trọng: Trust Boundary – Ranh giới tin cậy.
Nó tồn tại ở bất cứ đâu khi dữ liệu hoặc điều khiển di chuyển giữa hai thành phần có đặc quyền khác nhau.
Và vấn đề là: các AI Agent tin tưởng lẫn nhau một cách mù quáng.
- Agent hạ nguồn coi đầu ra từ thượng nguồn như mệnh lệnh có thẩm quyền, chứ không phải dữ liệu cần kiểm tra.
- Bộ điều phối thực thi dựa trên khuyến nghị của agent con mà không hề xác minh độc lập.
- Agent này kế thừa quyền hạn từ agent kia mà chẳng có kiểm tra ủy quyền rõ ràng.
Đây chính là mảnh đất màu mỡ cho kiểu tấn công kinh điển: Confused Deputy – Kẻ gác cổng bị lừa.
Bạn chỉ cần dụ một thằng AI đáng tin cậy làm điều độc hại giùm mình. Nó sẽ làm, vì nó tin rằng bạn có thẩm quyền.
4. Các framework phổ biến và lỗ hổng đặc trưng
Trong thực tế, các hệ thống multi-agent thường được xây dựng trên một số framework phổ biến. Mỗi framework có những "cánh cửa sập" riêng:
| Framework | Đặc điểm | Lỗ hổng điển hình |
|---|---|---|
| LangGraph | Điều phối dạng đồ thị, quản lý trạng thái | Lưu trữ trạng thái lộ dữ liệu nhạy cảm, định tuyến có điều kiện bị thao túng |
| AutoGen (Microsoft) | Phối hợp theo hướng hội thoại | Agent thực thi mã → RCE, bất kỳ agent nào cũng có thể chiếm quyền hội thoại |
| CrewAI | Cộng tác dựa trên vai trò | Định nghĩa vai trò trong prompt có thể bị ghi đè, bộ nhớ lưu giữ nội dung độc hại |
| OpenAI Swarm | Bàn giao agent nhẹ | Xác thực bảo mật tối thiểu, biến ngữ cảnh mang tải trọng tiêm nhiễm |
| Google A2A | Giao thức chuẩn đa nhà cung cấp | Lỗ hổng ảnh hưởng đến mọi triển khai, cơ chế phát hiện cho phép giả mạo |
💡 Bài học: Biết được framework nào đang được dùng giúp tôi đoán trước được lỗ hổng nào có khả năng xuất hiện.
5. Trinh sát thực chiến: Vẽ bản đồ "cánh cửa sập"
Lý thuyết đủ rồi. Hãy cùng tôi bắt đầu tiếp cận một lab mô phỏng để có cái nhìn thực tế hơn nhé!

Mục tiêu sẽ là một nền tảng Sales Analytics - nơi các AI đang làm việc chăm chỉ để phân tích doanh số, tạo báo cáo, quét bảo mật. Nhiệm vụ cần làm sẽ là:
- Phát hiện các agent A2A thông qua liệt kê Agent Card
- Lập bản đồ kiến trúc và luồng dữ liệu của một hệ thống multi-agent
- Xác định bề mặt tấn công bằng cách phân tích khả năng và công cụ của agent
Bước 1. Quét cổng – Tìm "ngôi nhà" của từng AI
Sau khi đã lập bản đồ bối cảnh phát hiện, chúng ta có thể chuyển sang xác định các dịch vụ A2A đang chạy trong môi trường. Chúng ta sẽ bắt đầu bằng cách quét cổng tiêu chuẩn trên máy chủ Sales Analytics từ máy ảo Kali để xác định dịch vụ nào được phơi bày và các endpoint này đang lắng nghe ở đâu.
kali@kali:~$ nmap -p- --min-rate 1000 192.168.50.25
Starting Nmap 7.95 ( https://nmap.org ) at 2026-01-21 11:31 EST
Nmap scan report for 192.168.50.25
Host is up (0.14s latency).
Not shown: 65515 closed tcp ports (reset)
PORT STATE SERVICE
22/tcp open ssh
135/tcp open msrpc
139/tcp open netbios-ssn
445/tcp open microsoft-ds
1433/tcp open ms-sql-s
3389/tcp open ms-wbt-server
5985/tcp open wsman
5986/tcp open wsmans
8000/tcp open http-alt
8001/tcp open vcom-tunnel
8002/tcp open teradataordbms
8003/tcp open mcreport
8080/tcp open http-proxy
47001/tcp open winrm
49664/tcp open unknown
49665/tcp open unknown
49666/tcp open unknown
49667/tcp open unknown
49668/tcp open unknown
49670/tcp open unknown
49676/tcp open unknown
Nmap done: 1 IP address (1 host up) scanned in 82.99 seconds
- Kết quả trả về hàng loạt cổng Windows quen thuộc (445, 3389, 1433…) và 4 cổng "lạ" nổi bật: 8000, 8001, 8002, 8003. Đây chính là "hệ sinh thái A2A" – nơi bầy đàn AI sinh sống.
- Cổng
8000→ Orchestrator (bộ điều phối) - Cổng
8001→ Database Agent (agent CSDL) - Cổng
8002→ Presentation Agent (agent tạo PPT) - Cổng
8003→ Security Agent (agent quét bảo mật) - Cổng
8080→ Web App (giao diện người dùng, không phải agent)
- Sự hiện diện của MSSQL trên cổng
1433cũng đáng chú ý, vì nó gợi ý rằng các agent có thể được hỗ trợ bởi một cơ sở dữ liệu mà chúng ta có thể nhắm mục tiêu sau này.
Bước 2. Xác minh chức năng của từng Agent
- Các AI Agent trong mạng lưới A2A (Agent-to-Agent) thường công khai chức năng nhiệm vụ của mình qua một tệp tin đặc biệt có tên là Agent Card, được đặt tại một địa chỉ chuẩn là
/.well-known/agent.json– giống như một "Sơ yếu lí lịch" để các agent khác “đọc” và biết cách hợp tác. Cơ chế này rất tiện lợi cho việc kết nối hợp pháp, nhưng mặt khác, kẻ tấn công cũng có thể lợi dụng nó như một cuốn hướng dẫn chi tiết, giúp “khám phá” toàn bộ chức năng của hệ thống một cách dễ dàng và từ đó tìm điểm yếu để tấn công.
Ngoài ra, có các endpoint khác cũng phát hiện Agent Card tương tự có thể là:
/.well-known/security.txthoặc/.well-known/openid-configuration.Note: Trong quá trình trinh sát, hãy luôn kiểm tra các endpoint A2A song song với việc liệt kê thông tin trên web truyền thống.
- Kiểm tra thông tin của Orchestrator chạy trên cổng
8000:
kali@kali:~$ curl -s http://192.168.50.25:8000/.well-known/agent.json | jq .
{
"name": "A2A Orchestrator",
"description": "Central orchestrator that coordinates sales analysis and presentation generation workflows. Discovers and routes requests to specialized agents.",
"url": "http://0.0.0.0:8000",
"serviceEndpoint": "http://0.0.0.0:8000/a2a",
"protocolVersion": "0.2",
"provider": {
"organization": "A2A System",
"url": ""
},
"capabilities": {
"streaming": true,
"pushNotifications": false,
"stateTransitionHistory": false
},
"skills": [
{
"id": "workflow-planning",
"name": "AI Workflow Planning",
"description": "Use AI to plan and execute multi-agent workflows",
"inputModes": [
"text"
],
"outputModes": [
"text"
]
},
{
"id": "agent-discovery",
"name": "Agent Discovery",
"description": "Discover and register available agents via their agent cards",
"inputModes": [
"text"
],
"outputModes": [
"text"
]
},
{
"id": "strategic-enrichment",
"name": "Strategic Analysis Enrichment",
"description": "Enrich analysis results with strategic business insights",
"inputModes": [
"text"
],
"outputModes": [
"text"
]
}
],
"defaultInputModes": [
"text"
],
"defaultOutputModes": [
"text"
],
"securitySchemes": {},
"security": [],
"metadata": {
"id": "orchestrator",
"version": "2.0.0",
"model": "/home/ubuntu/models/Qwen2.5-7B-Instruct-AWQ",
"author": "A2A System",
"status": "available"
}
}
Chỉ với một cú curl, tôi thu được vô số thông tin quý giá từ Agent Card: tác nhân này làm gì, địa chỉ URL của nó, phiên bản giao thức, và đặc biệt nhất – những kỹ năng nó tự hào công khai.
Từ đó, tôi xác nhận được rằng đây đúng là một bộ điều phối, điều khiển toàn bộ quy trình phân tích bán hàng với sức mạnh của AI.
Bằng cách khai thác những dữ liệu này, chúng ta có thể lập bản đồ toàn bộ kiến trúc của nền tảng phân tích bán hàng dựa trên A2A – vốn đang chạy trên máy chủ nội bộ tại địa chỉ 192.168.50.25 – qua đó xác định rõ từng thành phần, luồng xử lý công việc và các khả năng AI có sẵn, phục vụ trực tiếp cho mục tiêu thâm nhập tiếp theo.
- Tiếp theo, thực hiện thăm dò các cổng đã biết:
kali@kali:~$ curl -s http://192.168.50.25:8000/.well-known/agent.json | jq '{name, description}'
{
"name": "A2A Orchestrator",
"description": "Central orchestrator that coordinates sales analysis and presentation generation workflows. Discovers and routes requests to specialized agents."
}
kali@kali:~$ curl -s http://192.168.50.25:8001/.well-known/agent.json | jq '{name, description}'
{
"name": "MSSQL Database Agent",
"description": "AI-powered SQL Server agent with server-wide access. Converts natural language to SQL (SELECT, INSERT, UPDATE, DELETE) across ALL databases, with automatic schema discovery, data analysis, anomaly detection, and forecasting capabilities."
}
kali@kali:~$ curl -s http://192.168.50.25:8002/.well-known/agent.json | jq '{name, description}'
{
"name": "Presentation Generator Agent",
"description": "AI-powered presentation generator that creates dynamic PowerPoint decks with charts, diagrams, tables, and narratives based on natural language prompts."
}
kali@kali:~$ curl -s http://192.168.50.25:8003/.well-known/agent.json | jq '{name, description}'
{
"name": "Security Link Scanner Agent",
"description": "Security agent that extracts hyperlinks from PowerPoint presentations and scans them against malware databases for threats."
}
kali@kali:~$ curl -s http://192.168.50.25:8080/.well-known/agent.json | jq '{name, description}'
{
"name": null,
"description": null
}
Cổng 8080 trả về null vì mặc dù dịch vụ đang hoạt động và phản hồi bằng JSON (có thể là lỗi 404 chuẩn), nó không trả về lược đồ Agent Card hợp lệ (name, description) theo yêu cầu của giao thức A2A. Điều này cho thấy nó là một dịch vụ HTTP nhưng không phải là một Agent — rất có thể là bảng điều khiển Ứng dụng Web.
Bây giờ, tôi đã có thể hình dung ra được các chức năng của các agent là gì. Bản đồ kiến trúc và luồng dữ liệu hệ thống multi-agent của lab mô phỏng này sẽ như sau:

Nào, bắt đầu kiểm tra lần lượt các chức năng của từng Agent!
- Bắt đầu với agent chạy trên cổng
8001
kali@kali:~$ curl -s http://192.168.50.25:8001/.well-known/agent.json | jq '{name, description, skills}'
{
"name": "MSSQL Database Agent",
"description": "AI-powered SQL Server agent with server-wide access. Converts natural language to SQL (SELECT, INSERT, UPDATE, DELETE) across ALL databases, with automatic schema discovery, data analysis, anomaly detection, and forecasting capabilities.",
"skills": [
{
"id": "nl-to-sql",
"name": "Natural Language to SQL (Server-Wide)",
"description": "Convert natural language requests into SQL queries (SELECT, INSERT, UPDATE, DELETE) and execute them across ANY database on the SQL Server. Automatically discovers schema and uses fully qualified table names.",
"inputModes": [
"text"
],
"outputModes": [
"text"
],
"tags": [
"sql",
"crud",
"database",
"multi-database",
"cross-database"
]
},
{
"id": "schema-discovery",
"name": "Schema Discovery",
"description": "Discover and explore the SQL Server schema - list databases, tables, views, and columns across the entire server",
"inputModes": [
"text"
],
"outputModes": [
"text"
],
"tags": [
"schema",
"metadata",
"discovery"
]
},
{
"id": "anomaly-detection",
"name": "Anomaly Detection",
"description": "Detect anomalies and unusual patterns in query results",
"inputModes": [
"text"
],
"outputModes": [
"text"
]
},
{
"id": "sales-forecast",
"name": "Data Forecasting",
"description": "Generate AI-powered forecasts with confidence intervals for time-series data",
"inputModes": [
"text"
],
"outputModes": [
"text"
]
}
]
}
Dưới góc độ bảo mật, những chức năng của Sales Agent thực sự đáng chú ý. Kỹ năng “Chuyển đổi ngôn ngữ tự nhiên sang SQL” cho thấy nó có thể hiểu câu nói thường ngày rồi tạo ra câu lệnh truy vấn trên toàn bộ máy chủ – đây chính là cơ hội để kẻ tấn công thực hiện SQL injection. Không chỉ vậy, agent còn có thể phân tích và dự báo bằng AI, nghĩa là hệ thống sẽ xử lý và trả về những dữ liệu có khả năng bị làm giả hoặc can thiệp sai lệch.
- Tiếp tục kiểm tra Agent chạy trên cổng
8002
kali@kali:~$ curl -s http://192.168.50.25:8002/.well-known/agent.json | jq '{name, description, skills}'
{
"name": "Presentation Generator Agent",
"description": "AI-powered presentation generator that creates dynamic PowerPoint decks with charts, diagrams, tables, and narratives based on natural language prompts.",
"skills": [
{
"id": "llm-deck-planning",
"name": "LLM-Driven Deck Planning",
"description": "Use AI to plan presentation structure based on natural language prompts",
"inputModes": [
"text"
],
"outputModes": [
"text"
]
},
{
"id": "chart-generation",
"name": "Chart Generation",
"description": "Generate bar, line, pie, area, and column charts from data",
"inputModes": [
"text"
],
"outputModes": [
"text"
]
},
{
"id": "diagram-generation",
"name": "Diagram Generation",
"description": "Create process flows, hierarchies, cycles, timelines, and comparisons",
"inputModes": [
"text"
],
"outputModes": [
"text"
]
},
{
"id": "narrative-generation",
"name": "AI Narrative Generation",
"description": "Generate executive summaries and slide narratives using AI",
"inputModes": [
"text"
],
"outputModes": [
"text"
]
}
]
}
Agent PPT có nhiệm vụ tạo ra các tệp PowerPoint kèm nội dung do AI sinh ra. Đây là mục tiêu rất hấp dẫn để can thiệp vào đầu ra, vì các bản trình chiếu được tạo ra thường được gửi đến ban lãnh đạo – và quan trọng hơn, chúng có thể chứa các liên kết mà chúng ta có thể “đầu độc” để khai thác.
- Tiếp tục kiểm tra Agent trên trên cổng
8003
kali@kali:~$ curl -s http://192.168.50.25:8003/.well-known/agent.json | jq '{name, description, skills}'
{
"name": "Security Link Scanner Agent",
"description": "Security agent that extracts hyperlinks from PowerPoint presentations and scans them against malware databases for threats.",
"skills": [
{
"id": "link-extraction",
"name": "PowerPoint Link Extraction",
"description": "Extract all hyperlinks from PowerPoint presentations including text links and shape click actions",
"inputModes": [
"file"
],
"outputModes": [
"data"
],
"tags": [
"pptx",
"links",
"extraction"
]
},
{
"id": "security-scan",
"name": "URL Security Scanning",
"description": "Scan URLs against malware databases to detect malware, phishing, and suspicious content",
"inputModes": [
"text",
"data"
],
"outputModes": [
"data"
],
"tags": [
"security",
"malware",
"phishing",
"scan"
]
},
{
"id": "security-report",
"name": "Security Report Generation",
"description": "Generate comprehensive security reports with risk assessment, flagged URLs, and remediation recommendations",
"inputModes": [
"text"
],
"outputModes": [
"data"
],
"tags": [
"report",
"risk-assessment",
"recommendations"
]
}
]
}
Security Agent trích xuất các liên kết từ các tệp PowerPoint đã được tạo ra và quét chúng trong cơ sở dữ liệu phần mềm độc hại. Đây là thành phần phòng thủ mà chúng ta sẽ cần tính đến như một phần trong chiến lược tấn công của mình.
Tổng hợp lại các kết quả thu được:
| Cổng | Tên | Agent mô tả | Điểm chú ý |
|---|---|---|---|
| 8000 | A2A Orchestrator | Điều phối phân tích bán hàng và tạo bản trình bày | Trung tâm điều khiển |
| 8001 | MSSQL Database Agent | Truy cập TOÀN BỘ SQL Server, chuyển NL→SQL, làm được SELECT/INSERT/UPDATE/DELETE | ⚠️ Rất nguy hiểm! |
| 8002 | Presentation Generator | Tạo PowerPoint với biểu đồ, bảng, thuyết minh | Mục tiêu tiêm link độc |
| 8003 | Security Link Scanner | Trích xuất link từ PPT và quét malware | Rào cản cần vượt qua |
Những quan sát chính từ quá trình liệt kê của chúng ta:
- Khả năng truy cập: Các agent phản hồi trên các IP bên ngoài (ví dụ: 192.168.50.25), cho thấy chúng không bị giới hạn ở localhost.
- Phát hiện dịch vụ: Orchestrator (cổng 8000) và WebApp (cổng 8080) là các điểm truy cập chính.
- Hệ điều hành: Biểu ngữ dịch vụ và lấy fingerprint xác nhận mục tiêu đang chạy Windows Server. Bối cảnh này rất quan trọng để xác định các vector tấn công dành riêng cho hệ điều hành như
xp_cmdshell. - Backend SQL: Thẻ của Sales Agent đề cập rõ ràng đến "MSSQL Database Agent", và việc lấy dấu vân tay tiêu chuẩn mà chúng ta đã thực hiện qua nmap xác nhận backend là SQL Server.
Mặc dù luồng công việc logic là một pipeline (Bán hàng → PPT → Bảo mật), việc triển khai sử dụng cấu trúc Hub-and-Spoke (Trung tâm - Nhánh) trong đó Orchestrator hoạt động như một bộ điều khiển trung tâm. Nó gọi từng agent tuần tự và quản lý việc truyền dữ liệu giữa chúng, thay vì các agent gọi trực tiếp lẫn nhau.
Sự khác biệt này rất quan trọng để lập kế hoạch đường tấn công của chúng ta. Bởi vì tất cả các agent này được Orchestrator gọi thay vì có logic được mã hóa cứng, chúng ta có thể tận dụng điều này và ảnh hưởng đến quy trình công việc.
Từ quá trình liệt kê của mình, chúng ta có thể xác định một số vector tấn công:
- Orchestrator chấp nhận các lời nhắc bằng ngôn ngữ tự nhiên và điều phối quy trình công việc. Vì nó phân tích đầu vào của người dùng và đưa ra quyết định về việc gọi agent nào, nó dễ bị tấn công thao túng quy trình công việc.
- Sales Agent chuyển đổi ngôn ngữ tự nhiên thành SQL. Quá trình dịch thuật này dễ bị tiêm chỉ thị (prompt injection) có thể dẫn đến thực thi SQL độc hại, bao gồm khả năng xp_cmdshell nếu nó đã được kích hoạt hoặc chúng ta có thể tìm cách tự kích hoạt nó.
- PPT Agent tạo bản trình chiếu với nội dung AI và bản trình chiếu có thể chứa URL. Nếu đầu ra có thể bị thao túng để bao gồm các liên kết độc hại hoặc nội dung gây hiểu lầm, nó có cơ hội được tin tưởng cao hơn vì nó đến từ một hệ thống nội bộ.
- Security Agent quét nội dung đã được tạo ra; tuy nhiên, nó quét nội dung đó theo một danh sách đã biết. Nếu chúng ta có thể thuyết phục Orchestrator bỏ qua bước này, nội dung độc hại sẽ đi qua mà không bị phát hiện. Ngoài ra, chúng ta cũng có thể đăng ký một tên miền mới hoặc trỏ URL đến một địa chỉ IP thuộc về mình.
Bước 3. Mở rộng thu thập thông tin qua OpenAPI
Các ứng dụng FastAPI hiển thị tài liệu tương tác theo mặc định tại /docs (Swagger UI) và một lược đồ có thể đọc được bằng máy tại /openapi.json. Nhiều nhà phát triển quên vô hiệu hóa các tính năng này trong môi trường sản xuất, điều này cung cấp cho chúng ta một bản đồ hoàn chỉnh về các endpoint hiện có.
- Thu thập các endpoint bằng cách truy vấn tài liệu OpenAPI từ Orchestrator.
kali@kali:~$ curl -s http://192.168.50.25:8000/openapi.json | jq '.paths | keys'
[
"/.well-known/agent.json",
"/a2a",
"/a2a/message/send",
"/a2a/send",
"/a2a/skills",
"/a2a/tasks/{task_id}/stream",
"/a2a/workflow",
"/a2a/workflow/graph",
"/a2a/workflow/stream",
"/agents",
"/agents/capability/{capability}",
"/agents/deregister",
"/agents/heartbeat",
"/agents/register",
"/agents/{agent_id}",
"/health"
]
Điều này tiết lộ endpoint /a2a/workflow mà chúng ta sẽ nhắm mục tiêu để khai thác. Bây giờ, thử truy vấn đặc tả OpenAPI và trích xuất A2A Workflow Request Schema từ endpoint POST /a2a/workflow:
kali@kali:~$ curl -s http://192.168.50.25:8000/openapi.json | jq '.paths["/a2a/workflow"].post'
{
"tags": [
"A2A Workflow"
],
"summary": "A2A Workflow",
"description": "Execute a dynamic A2A workflow using LangGraph.\n\nThis endpoint:\n1. Uses LangGraph to orchestrate the workflow with conditional routing\n2. Routes each step to the appropriate agent via A2A protocol\n3. Returns the final results with full state tracking\n\nThe workflow automatically discovers and routes to agents based on their\nadvertised capabilities, enabling truly dynamic multi-agent orchestration.\n\nLangGraph provides:\n- Stateful execution with automatic checkpointing\n- Conditional routing based on results and context\n- Built-in streaming support\n- Graph visualization for debugging",
"operationId": "a2a_workflow_a2a_workflow_post",
"requestBody": {
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/A2AWorkflowRequest"
}
}
},
"required": true
},
"responses": {
"200": {
"description": "Successful Response",
"content": {
"application/json": {
"schema": {}
}
}
},
"422": {
"description": "Validation Error",
"content": {
"application/json": {
"schema": {
"$ref": "#/components/schemas/HTTPValidationError"
}
}
}
}
}
}
Từ phản hồi này, tôi biết được cách endpoint hoạt động:
- Phải dùng phương thức POST
- Dữ liệu gửi đi phải là JSON
- Và cấu trúc JSON cụ thể ra sao
Quan trọng nhất, endpoint có một "dấu hiệu" tên $ref. Nó giống như một "link tham chiếu" trỏ đến một bản vẽ thiết kế (schema) ở chỗ khác. Bản vẽ đó mô tả chính xác JSON cần có hình dạng thế nào. Vậy nên bước tiếp theo: Tôi sẽ lấy bản vẽ thiết kế đó để xem API yêu cầu những trường bắt buộc nào.
Ngoài ra, tôi còn có một cách khác tiện lợi hơn: truy cập trực tiếp vào http://192.168.50.25:8000/docs. Đó là một giao diện web – giống như một "bảng điều khiển" – cho phép tôi xem tất cả các API và thậm chí thử gửi request ngay trong trình duyệt.
Tất nhiên, để chắc chắn không bỏ sót thứ gì, tôi sẽ kiểm tra lần lượt tất cả các agent đã tìm thấy:
kali@kali:~$ for port in 8000 8001 8002 8003; do
echo "=== Port $port ==="
curl -s "http://192.168.50.25:$port/openapi.json" 2>/dev/null | \
jq -r '.paths | keys[]' 2>/dev/null || echo "No OpenAPI found"
done
=== Port 8000 ===
/.well-known/agent.json
/a2a
/a2a/message/send
/a2a/send
/a2a/skills
/a2a/tasks/{task_id}/stream
/a2a/workflow
/a2a/workflow/graph
/a2a/workflow/stream
/agents
/agents/capability/{capability}
/agents/deregister
/agents/heartbeat
/agents/register
/agents/{agent_id}
/health
=== Port 8001 ===
/.well-known/agent.json
/a2a
/a2a/message/send
/a2a/tasks/{task_id}/stream
/health
/schema/ai-context
/schema/databases
/schema/databases/{database}/tables
/schema/databases/{database}/tables/{schema}/{table}/columns
/schema/full
/schema/refresh
=== Port 8002 ===
/.well-known/agent.json
/a2a
/a2a/message/send
/a2a/tasks/{task_id}/stream
/health
=== Port 8003 ===
/.well-known/agent.json
/a2a
/a2a/message/send
/a2a/tasks/{task_id}/stream
/extract-links
/health
/scan
Từ đợt "soát xét" này, tôi rút ra một điều: tất cả các agent đều có các endpoint chuẩn của A2A (/a2a và /.well-known/agent.json) – chẳng có gì bất ngờ. Nhưng cái hay là mỗi đứa còn có thêm những endpoint "của riêng mình" phục vụ chức năng đặc thù.
Trong số đó, endpoint /a2a/workflow của Orchestrator là thứ khiến tôi chú ý nhất. Nó giống như "bảng điều khiển tổng" – nơi khởi động và điều phối toàn bộ quy trình xử lý.
Đã tìm ra mục tiêu, tôi liền gửi thử một request hợp lệ để xem nó phản ứng thế nào. Lưu ý: request này sẽ mất vài phút để xử lý và trả về kết quả.
kali@kali:~$ curl -X POST http://192.168.50.25:8000/a2a/workflow \
-H "Content-Type: application/json" \
-d '{"prompt": "Generate a presentation containing quarterly sales review for every region with charts and insights."}' | jq .
% Total % Received % Xferd Average Speed Time Time Time Current
Dload Upload Total Spent Left Speed
100 6415 100 6301 0 114 52 0 0:02:01 0:02:00 0:00:01 1576
{
"status": "ok",
"workflow_id": "0c2091e2",
"steps_completed": [
"sales_data",
"presentation",
"content_review"
],
"csv_uri": "file:///C:/SalesAgent/output/sales_f84259ba.csv",
"ppt_uri": "file:///C:/SalesAgent/slides/deck_139c76f2.pptx",
"analysis": {
"operation": "SELECT",
"rows_returned": 36,
"summary": "The dataset provides quarterly sales reviews for four regions (AMER, APAC, EMEA, LATAM) over a period of nine months from February to October 2025. The total sales across all regions amount to $3,452,809,965.63, with an average monthly sales of approximately $95,911,387.93.",
"key_insights": [
"EMEA consistently has the highest total sales among the four regions, with an average of $101,127,081.72 per month.",
"LATAM shows the second-highest total sales, averaging $100,225,832.27 per month, closely following EMEA.",
"APAC has the lowest total sales, averaging $94,008,577.72 per month, which is significantly lower than the other regions."
],
"anomalies": [
{
"type": "outlier",
"severity": "high",
"description": "Unexpectedly high TotalSales in EMEA region for month 2025-05",
"affected": "TotalSales for the EMEA region in May 2025"
},
{
"type": "outlier",
"severity": "high",
"description": "Unexpectedly low AvgSalesPerOrder in APAC region for month 2025-06",
"affected": "AvgSalesPerOrder for the APAC region in June 2025"
}
],
"recommendations": [
"Investigate potential reasons for the unusually high sales in AMER and LATAM during specific months to optimize sales strategies.",
"Develop targeted marketing campaigns to increase sales in the APAC region, as it currently lags behind other regions."
],
"forecast": {
"forecasts": [],
"trend": "unknown",
"reasoning": "Required columns not found"
},
"opportunities": {
"opportunities": [],
"quick_wins": [
"Review top-performing products for expansion potential"
],
"strategic_recommendations": [
"Analyze regional performance for growth opportunities",
"Review customer segments for untapped potential"
]
},
"risks": {
"risks": [
{
"type": "concentration",
"severity": "medium",
"title": "High Concentration of Sales in Few Regions",
"description": "The sales data shows that the sales are heavily concentrated in a few regions, with AMER, APAC, and LATAM contributing significantly to the total sales. This concentration can lead to dependency on these regions for revenue, making the business vulnerable to regional economic downturns or other localized issues.",
"likelihood": "medium",
"mitigation": "Diversify sales channels and focus on expanding into underrepresented regions to reduce dependency on a few key markets."
},
{
"type": "volatility",
"severity": "low",
"title": "Volatility in Monthly Sales Trends",
"description": "There is some volatility in monthly sales trends, with significant fluctuations between months. This indicates that sales performance can be inconsistent from month to month, which may impact cash flow management and planning.",
"likelihood": "low",
"mitigation": "Analyze the factors causing these fluctuations and implement strategies to stabilize sales, such as improving demand forecasting and inventory management."
}
],
"overall_risk_level": "medium",
"risk_score": 65,
"priority_actions": [
"Implement a more diversified sales strategy across regions",
"Enhance demand forecasting and inventory management"
]
}
},
"security_report": {
"task_id": "ae51e698-4970-412d-b94e-585bac8de368",
"state": "completed",
"file_scanned": "deck_139c76f2.pptx",
"total_links": 3,
"scan_summary": {
"clean": 3,
"malicious": 0,
"suspicious": 0,
"errors": 0,
"skipped": 0
},
"risk_level": "LOW",
"risk_summary": "✅ All scanned URLs appear clean",
"flagged_urls": [],
"all_results": [
{
"url": "https://example.com/sales-data-report",
"text": "→ Sales Data Report",
"slide_number": 8,
"shape_type": "text_run",
"status": "clean",
"positives": 0,
"total_engines": 1,
"message": "URL not found in malware database"
},
{
"url": "https://example.com/marketing-tools",
"text": "→ Market Analysis Tools",
"slide_number": 8,
"shape_type": "text_run",
"status": "clean",
"positives": 0,
"total_engines": 1,
"message": "URL not found in malware database"
},
{
"url": "https://example.com/customer-feedback-survey",
"text": "→ Customer Feedback Survey Results",
"slide_number": 8,
"shape_type": "text_run",
"status": "clean",
"positives": 0,
"total_engines": 1,
"message": "URL not found in malware database"
}
],
"recommendations": [
"Presentation links appear safe for distribution",
"Continue to exercise caution when clicking unknown links",
"Consider periodic rescans as threat intelligence updates"
],
"file_deleted": false,
"analysis": {
"file_scanned": "deck_139c76f2.pptx",
"total_links": 3,
"scan_summary": {
"clean": 3,
"malicious": 0,
"suspicious": 0,
"errors": 0,
"skipped": 0
},
"risk_level": "LOW",
"risk_summary": "✅ All scanned URLs appear clean",
"flagged_urls": [],
"all_results": [
{
"url": "https://example.com/sales-data-report",
"text": "→ Sales Data Report",
"slide_number": 8,
"shape_type": "text_run",
"status": "clean",
"positives": 0,
"total_engines": 1,
"message": "URL not found in malware database"
},
{
"url": "https://example.com/marketing-tools",
"text": "→ Market Analysis Tools",
"slide_number": 8,
"shape_type": "text_run",
"status": "clean",
"positives": 0,
"total_engines": 1,
"message": "URL not found in malware database"
},
{
"url": "https://example.com/customer-feedback-survey",
"text": "→ Customer Feedback Survey Results",
"slide_number": 8,
"shape_type": "text_run",
"status": "clean",
"positives": 0,
"total_engines": 1,
"message": "URL not found in malware database"
}
],
"recommendations": [
"Presentation links appear safe for distribution",
"Continue to exercise caution when clicking unknown links",
"Consider periodic rescans as threat intelligence updates"
],
"file_deleted": false
}
},
"errors": null,
"ai_summary": "We successfully generated a quarterly sales review presentation for each region, complete with charts and detailed insights. The presentation file is located at `file:///C:/SalesAgent/slides/deck_139c76f2.pptx`.\n\nKey insights from our analysis show that the EMEA region consistently leads in total sales, averaging $101.1 million per month, followed by LATAM at $100.2 million. In contrast, APAC has the lowest sales, averaging just over $94 million. \n\nHowever, we did identify some anomalies. There’s an unexpectedly high total sales figure in EMEA for May 2025, and an unusually low average sales per order in APAC for June 2025. These findings will help us investigate potential issues or one-off events affecting these metrics."
Kết quả trả về cho tôi thấy rõ các bước đã chạy, và đúng như dự đoán – đây là mô hình đường ống (pipeline). Bước content_review (quét bảo mật) nằm ở cuối cùng.
Điều này củng cố giả thuyết của tôi: nếu tôi có thể "bỏ qua" bước đó, mọi thứ độc hại tôi nhét vào slide sẽ lọt qua mà không bị kiểm tra.
Trong response lần này, các URL trông có vẻ chỉ là "chỗ giữ chỗ" (placeholder), chắc là vì tôi chưa yêu cầu cụ thể link nào cả.
Nếu muốn kiểm tra kỹ hơn, tôi có thể truy cập vào webapp, tải file PowerPoint về và mở ra xem tận mắt.
Kết luận phần 1 – Tấm bản đồ chỉ lối, còn cánh cửa thì luôn mở sẵn
Phần 1 cho chúng ta thấy: Multi-Agent không phải là một siêu nhân bất khả xâm phạm. Chỉ cần biết cách "đọc vị" – quét cổng, moi Agent Card, khai thác OpenAPI – bạn sẽ thấy mỗi agent là một cánh cửa, và những cánh cửa ấy đang để ngỏ.
Ba bài học từ hành trình trinh sát:
Giao tiếp giữa các agent là nơi tử huyệt nằm chờ – Ở đâu có HTTP, ở đó có lỗ hổng xác thực, dữ liệu tuần tự hóa sai cách, và những mối quan hệ "tin tưởng mù quáng".
Agent Card là con dao hai lưỡi – Tiện cho agent khác "kết bạn", nhưng cũng là cuốn hướng dẫn chi tiết để kẻ tấn công vẽ bản đồ hệ thống mà chẳng cần gõ cửa.
Biết kiến trúc là biết cách đá – Orchestrator, Peer-to-Peer, Hierarchical, Pipeline – mỗi kiểu có một "cửa sập" riêng. Hỏi câu "Bầy đàn này phối hợp kiểu gì?" trước khi hỏi "Tấn công thế nào?".
Và ở phần 2: Khi đã có bản đồ, chúng ta sẽ không chỉ đứng nhìn. Chúng ta sẽ thực sự bước qua những cánh cửa ấy – bằng Prompt Injection, bằng Agent giả mạo, và bằng cách biến lòng tin mù quáng thành vũ khí của chính mình.