<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Forem: Ngoc Phan</title>
    <description>The latest articles on Forem by Ngoc Phan (@ngoc_phan_1694c8952465020).</description>
    <link>https://forem.com/ngoc_phan_1694c8952465020</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3473077%2Fd713ad74-b4d2-4078-a107-3ad6e2e881ce.png</url>
      <title>Forem: Ngoc Phan</title>
      <link>https://forem.com/ngoc_phan_1694c8952465020</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://forem.com/feed/ngoc_phan_1694c8952465020"/>
    <language>en</language>
    <item>
      <title>Phân tích Kiến trúc: Strix Control Flow qua Caido GraphQL</title>
      <dc:creator>Ngoc Phan</dc:creator>
      <pubDate>Sat, 07 Mar 2026 14:02:18 +0000</pubDate>
      <link>https://forem.com/ngoc_phan_1694c8952465020/phan-tich-kien-truc-strix-control-flow-qua-caido-graphql-3d2f</link>
      <guid>https://forem.com/ngoc_phan_1694c8952465020/phan-tich-kien-truc-strix-control-flow-qua-caido-graphql-3d2f</guid>
      <description>&lt;p&gt;Dưới đây là tổng hợp toàn bộ các truy vấn GraphQL mà Strix sử dụng để điều khiển Caido, vai trò của từng loại và phân tích lý do tại sao kiến trúc này vượt trội so với việc truy vấn trực tiếp vào một cơ sở dữ liệu SQLite truyền thống.&lt;/p&gt;

&lt;h2&gt;
  
  
  1. Danh sách các Truy vấn GraphQL chính trong Strix
&lt;/h2&gt;

&lt;p&gt;Strix tập trung toàn bộ logic này trong file &lt;code&gt;proxy_manager.py&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Truy vấn Dữ liệu Traffic (Queries)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;GetRequests&lt;/code&gt; (&lt;code&gt;requestsByOffset&lt;/code&gt;):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Vai trò:&lt;/strong&gt; Liệt kê và lọc danh sách traffic dựa trên ngôn ngữ HTTPQL.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Tham số chính:&lt;/strong&gt; &lt;code&gt;limit&lt;/code&gt;, &lt;code&gt;offset&lt;/code&gt;, &lt;code&gt;filter&lt;/code&gt; (cú pháp HTTPQL), &lt;code&gt;order&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Dữ liệu lấy về:&lt;/strong&gt; ID, method, host, path, status code. Strix thường &lt;strong&gt;KHÔNG&lt;/strong&gt; lấy phần raw (content) ở bước này để tiết kiệm RAM và Token.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;&lt;code&gt;GetRequest&lt;/code&gt; (&lt;code&gt;request(id)&lt;/code&gt;):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Vai trò:&lt;/strong&gt; Lấy chi tiết toàn bộ nội dung của một Request hoặc Response cụ thể.&lt;/li&gt;
&lt;li&gt;  &lt;strong&gt;Điểm đặc biệt:&lt;/strong&gt; Strix sử dụng các query variant để chỉ lấy raw request hoặc raw response tùy theo nhu cầu của Agent.&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;li&gt;  &lt;strong&gt;&lt;code&gt;GetSitemap&lt;/code&gt; (&lt;code&gt;sitemapRootEntries&lt;/code&gt; / &lt;code&gt;sitemapDescendantEntries&lt;/code&gt;):&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Vai trò:&lt;/strong&gt; Khám phá cấu trúc thư mục/endpoint của ứng dụng mục tiêu theo dạng cây (Hierarchy).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h3&gt;
  
  
  B. Thao tác Cấu hình (Mutations)
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;&lt;code&gt;CreateScope&lt;/code&gt; / &lt;code&gt;UpdateScope&lt;/code&gt; / &lt;code&gt;DeleteScope&lt;/code&gt;:&lt;/strong&gt;

&lt;ul&gt;
&lt;li&gt;  &lt;strong&gt;Vai trò:&lt;/strong&gt; Định nghĩa "vùng an toàn" cho Agent. Giúp Agent chỉ tập trung tấn công vào các domain được phép (Allowlist) và bỏ qua các file rác (Denylist như &lt;code&gt;.png&lt;/code&gt;, &lt;code&gt;.css&lt;/code&gt;).&lt;/li&gt;
&lt;/ul&gt;


&lt;/li&gt;

&lt;/ul&gt;

&lt;h2&gt;
  
  
  2. So sánh: GraphQL của Caido vs. API SQLite truyền thống
&lt;/h2&gt;

&lt;p&gt;Trong các công cụ cũ (hoặc bản cũ của mitmproxy), log traffic thường được lưu vào một file SQLite. Dưới đây là lý do Strix/Caido chọn GraphQL:&lt;/p&gt;

&lt;div class="table-wrapper-paragraph"&gt;&lt;table&gt;
&lt;thead&gt;
&lt;tr&gt;
&lt;th&gt;Tiêu chí&lt;/th&gt;
&lt;th&gt;SQLite API (Truy vấn trực tiếp)&lt;/th&gt;
&lt;th&gt;Caido GraphQL API&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Độ linh hoạt (Granularity)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Phải &lt;code&gt;SELECT *&lt;/code&gt; hoặc viết SQL Join phức tạp để lấy thông tin liên quan giữa Request và Response.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Cực cao.&lt;/strong&gt; Chỉ lấy đúng các trường Agent cần (ví dụ: chỉ lấy Header Authorization). Tiết kiệm 80-90% AI Token.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Khả năng lọc (Filtering)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Phải biết schema bảng, viết các câu lệnh &lt;code&gt;LIKE '%...%'&lt;/code&gt; chậm và tốn tài nguyên.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;HTTPQL.&lt;/strong&gt; Một ngôn ngữ chuyên dụng cho Pentest (ví dụ: &lt;code&gt;req.method.eq:"POST"&lt;/code&gt;). Tốc độ xử lý hàng triệu request cực nhanh.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Xử lý dữ liệu Binary&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Lưu blob trong DB, Agent khó xử lý trực tiếp, dễ gây crash nếu request quá lớn.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Base64 + Pagination.&lt;/strong&gt; GraphQL trả về Base64, Strix thực hiện phân trang nội dung (ví dụ: chỉ xem 50 dòng đầu của Response) ngay tại tầng API.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Tính nhất quán (Real-time)&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;Việc đọc/ghi vào file SQLite khi có hàng nghìn request/giây dễ gây Lock DB hoặc corruption.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Concurrent-safe.&lt;/strong&gt; Caido (Rust) quản lý việc ghi dữ liệu, GraphQL cung cấp một interface an toàn để đọc dữ liệu mà không làm gián đoạn luồng proxy.&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;
&lt;td&gt;&lt;strong&gt;Trải nghiệm Agent AI&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;SQL quá phức tạp để AI tự tạo ra các query chính xác mà không gặp lỗi cú pháp.&lt;/td&gt;
&lt;td&gt;
&lt;strong&gt;Schema-driven.&lt;/strong&gt; GraphQL có cơ chế tự gợi ý (Introspection), Agent có thể hiểu rõ các trường dữ liệu có sẵn để đặt câu hỏi chính xác.&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;&lt;/div&gt;

&lt;h2&gt;
  
  
  3. Tại sao đây là "Điểm mạnh tuyệt đối" của Strix?
&lt;/h2&gt;

&lt;p&gt;Đối với một Agent AI như Strix, &lt;strong&gt;Token là tiền bạc và thời gian.&lt;/strong&gt;&lt;/p&gt;

&lt;h3&gt;
  
  
  Nếu dùng SQLite truyền thống:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Để quét lỗi XSS, Agent phải tải toàn bộ 1000 request (mỗi request 5KB) = &lt;strong&gt;5MB dữ liệu&lt;/strong&gt;.&lt;/li&gt;
&lt;li&gt; AI sẽ bị "ngộp" và mất dấu vết (Max context length).&lt;/li&gt;
&lt;/ol&gt;

&lt;h3&gt;
  
  
  Với GraphQL của Caido:
&lt;/h3&gt;

&lt;ol&gt;
&lt;li&gt; Agent gửi 1 query: &lt;em&gt;"Cho tôi danh sách các request có status:200 và có tham số q"&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt; API chỉ trả về 5 cái ID.&lt;/li&gt;
&lt;li&gt; Agent chỉ tải nội dung của 5 cái đó -&amp;gt; Tổng cộng chỉ mất &lt;strong&gt;~10KB dữ liệu&lt;/strong&gt;.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;&lt;strong&gt;Kết luận:&lt;/strong&gt; GraphQL biến Caido từ một "thùng chứa dữ liệu thụ động" thành một &lt;strong&gt;Search Engine thông minh&lt;/strong&gt;, giúp Strix hoạt động cực nhanh và chính xác với chi phí vận hành thấp nhất.&lt;/p&gt;




&lt;h2&gt;
  
  
  4. Tái Tạo Tấn Công (Attack Replay) Khép Kín: Vulnerability Exploitation Dataflow
&lt;/h2&gt;

&lt;p&gt;Quá trình "Tái tạo và Thử nghiệm Payload" là lúc mà sức mạnh của Proxy thể hiện rõ nhất. Thay vì bắt LLM phải tự viết code Python hay các lệnh &lt;code&gt;curl&lt;/code&gt; shell lằng nhằng để gửi HTTP Request, Strix tối ưu hóa điều đó bằng một luồng quy trình (dataflow) thao tác ngay trên các ID Request đã có sẵn.&lt;/p&gt;

&lt;h3&gt;
  
  
  A. Dataflow: Quá Trình Replay Bằng AI
&lt;/h3&gt;

&lt;p&gt;Khi Agent phát hiện một form POST khả nghi, nó thực hiện quy trình sau:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;
&lt;strong&gt;Tìm kiếm (Search):&lt;/strong&gt; Dùng &lt;code&gt;httpql_filter&lt;/code&gt; (ví dụ &lt;code&gt;req.method.eq:POST&lt;/code&gt;) để query danh sách các Request hợp lệ thông qua Caido GraphQL.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Phân tích (Analyze):&lt;/strong&gt; Gọi &lt;code&gt;view_request(id)&lt;/code&gt; để xem raw header và body.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Thao túng (Replay &amp;amp; Modify):&lt;/strong&gt; Gọi tool &lt;code&gt;repeat_request&lt;/code&gt; truyền vào cái &lt;code&gt;request_id&lt;/code&gt; cũ kèm theo Dict chứa các sửa đổi (Modifications). Ví dụ đổi tham số &lt;code&gt;"username=admin"&lt;/code&gt; thành &lt;code&gt;"username=admin' OR 1=1--"&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Băng hình (Relogging):&lt;/strong&gt; Kể cả request giả mạo (Replay) do Agent tạo ra cũng được đẩy ngược (proxy) qua cổng Caido (&lt;code&gt;127.0.0.1:48080&lt;/code&gt;), đồng nghĩa với việc Lịch sử rà quét được bảo toàn 100%.&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;Dưới đây là sơ đồ &lt;strong&gt;Sequence Diagram&lt;/strong&gt; tổng quan mô tả quá trình AI mô phỏng một cuộc tấn công khép kín từ việc truy vấn log đến việc bắt cờ (detect) lỗ hổng:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;sequenceDiagram
    participant Agent as 🤖 AI Agent (LLM)
    participant Proxy as 🛡️ Caido (ProxyManager)
    participant Target as 🎯 Target Server

    rect rgba(199, 213, 226, 1)
    Note over Agent, Proxy: 1. Tìm kiếm rà quét mục tiêu (Search &amp;amp; Analyze)
    Agent-&amp;gt;&amp;gt;Proxy: list_requests(filter="req.method.eq:POST")
    Proxy--&amp;gt;&amp;gt;Agent: Mảng [Request IDs]
    Agent-&amp;gt;&amp;gt;Proxy: view_request(id="req_123")
    Proxy--&amp;gt;&amp;gt;Agent: Trả về Raw HTTP Headers &amp;amp; Body
    end

    rect rgba(204, 179, 179, 1)
    Note over Agent, Target: 2. Tái tạo &amp;amp; Tấn công (Replay &amp;amp; Modify)
    Agent-&amp;gt;&amp;gt;Agent: Suy luận sinh Payload độc hại (ví dụ: SQLi)
    Agent-&amp;gt;&amp;gt;Proxy: repeat_request(id="req_123", modifications={"body": payload})
    Proxy-&amp;gt;&amp;gt;Proxy: Tái tạo gói tin HTTP hợp lệ từ "req_123" cũ
    Proxy-&amp;gt;&amp;gt;Target: Gửi HTTP Request độc hại 
    Target--&amp;gt;&amp;gt;Proxy: Gửi lại HTTP Response
    end

    rect rgba(215, 232, 215, 1)
    Note over Proxy, Agent: 3. Kiểm chứng &amp;amp; Ghi log (Relogging &amp;amp; Detection)
    Proxy-&amp;gt;&amp;gt;Proxy: Relogging: Ghi nhận Traffic vào cơ sở dữ liệu Caido
    Proxy--&amp;gt;&amp;gt;Agent: Trả về Response Body / Status (rút gọn nếu quá dài)
    Agent-&amp;gt;&amp;gt;Agent: Detect: Phân tích phản hồi để xác nhận lỗ hổng
    end
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;






&lt;h2&gt;
  
  
  5. Ví dụ Thực Tế: Quy Trình "Đào Bới" SQL Injection (Step-by-Step)
&lt;/h2&gt;

&lt;p&gt;Để dễ hình dung sức mạnh của cặp đôi &lt;strong&gt;Strix + Caido&lt;/strong&gt;, hãy cùng xem cách AI Agent thực hiện một đợt tấn công dò tìm lỗi SQLi tại API đăng nhập khách hàng:&lt;/p&gt;

&lt;h3&gt;
  
  
  🚶 Bước 1: Lọc Log để tìm "Con mồi" (Search)
&lt;/h3&gt;

&lt;p&gt;Agent không quét bừa bãi. Nó hỏi Caido: &lt;em&gt;"Cho tôi xem các request POST đã thực hiện thành công (200 OK) tại endpoint có chữ 'login'?"&lt;/em&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Lý do:&lt;/strong&gt; Đây là nơi thường xuyên tương tác với Database.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Dữ liệu Caido trả về:&lt;/strong&gt; Request ID &lt;code&gt;req_login_001&lt;/code&gt;, URL &lt;code&gt;/api/v1/auth/login&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  🔍 Bước 2: Khám nghiệm "Thi thể" Request (Analyze)
&lt;/h3&gt;

&lt;p&gt;Agent gọi &lt;code&gt;view_request(id="req_login_001")&lt;/code&gt;. &lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cấu trúc lưu trong Caido:&lt;/strong&gt; Caido không chỉ lưu chữ. Nó bóc tách sẵn Header (để AI biết Agent cần mang theo Cookie/JWT gì) và Body (dạng JSON: &lt;code&gt;{"user": "ngocp", "pass": "123"}&lt;/code&gt;).&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Hành động AI:&lt;/strong&gt; Nó nhận ra tham số &lt;code&gt;user&lt;/code&gt; là một input tiềm năng để chèn mã.&lt;/li&gt;
&lt;/ul&gt;

&lt;h3&gt;
  
  
  💉 Bước 3: Phẫu thuật và Tiêm Payload (Replay &amp;amp; Modify)
&lt;/h3&gt;

&lt;p&gt;Thay vì code Python, Agent gọi:&lt;br&gt;
&lt;code&gt;repeat_request(id="req_login_001", modifications={"body": "{\"user\": \"' OR 1=1 --\", \"pass\": \"123\"}"})&lt;/code&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Cơ chế Replay:&lt;/strong&gt; Caido lấy nguyên bộ khung (Header, User-Agent, Auth) của request cũ, chỉ thay đúng phần Body chứa "độc chất" SQLi rồi bắn đi.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  🚩 Bước 4: So sánh Kết quả (Detection)
&lt;/h3&gt;

&lt;p&gt;Caido trả về Response mới cho Agent.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Logic Detect của Agent:&lt;/strong&gt; 

&lt;ul&gt;
&lt;li&gt;
&lt;em&gt;Lần 1 (Bình thường):&lt;/em&gt; Trả về &lt;code&gt;{"status": "fail", "msg": "Invalid pass"}&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Lần 2 (Tiêm payload):&lt;/em&gt; Trả về &lt;code&gt;{"status": "success", "user": "admin"}&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Kết luận:&lt;/strong&gt; AI so sánh sự khác biệt và xác nhận: &lt;strong&gt;"Bingo! Lỗ hổng SQLi tồn tại vì Payload bypass được logic đăng nhập"&lt;/strong&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h3&gt;
  
  
  📝 Bước 5: Lập Hồ Sơ Bệnh Án (Reporting)
&lt;/h3&gt;

&lt;p&gt;Strix không kết thúc ở đó. Nó tổng hợp dữ liệu từ Caido:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Evidence:&lt;/strong&gt; Nó trích xuất ID request gốc và ID request tấn công làm bằng chứng.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Deduplication:&lt;/strong&gt; Nó kiểm tra xem lỗi SQLi ở &lt;code&gt;/api/v1/auth/login&lt;/code&gt; này đã có ai báo cáo chưa (Dùng module Dedupe đã nói ở trên) trước khi tạo một Vulnerability Report chính thức cực kỳ chuyên nghiệp cho Senior Dev đọc.&lt;/li&gt;
&lt;/ul&gt;


&lt;h3&gt;
  
  
  👉 Điểm khác biệt mấu chốt:
&lt;/h3&gt;

&lt;p&gt;Trong khi các tool khác chỉ bắn payload và đọc kết quả (Stateless), Strix dựa vào Caido để duy trì &lt;strong&gt;Stateful Pentesting&lt;/strong&gt;. Nó biết mình đang sửa cái gì dựa trên cái gì, giúp giảm thiểu 90% lỗi sai cú pháp khi AI cố gắng tự giả lập giao thức HTTP.&lt;/p&gt;
&lt;h3&gt;
  
  
  B. Minh Chứng Bằng Code (Điểm ăn tiền cho Developer)
&lt;/h3&gt;

&lt;p&gt;Một system prompt điển hình dạy AI cách tấn công (được trích xuất từ file &lt;code&gt;python_actions_schema.xml&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# LLM nhận diện Request cũ có ID request_details['id']
&lt;/span&gt;&lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request_details&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="sh"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;select&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;lower&lt;/span&gt;&lt;span class="p"&gt;():&lt;/span&gt;
    &lt;span class="c1"&gt;# Thay vì viết code gửi cURL phức tạp, Agent chỉ cần gọi một Tool
&lt;/span&gt;    &lt;span class="n"&gt;test_payload&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;repeat_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;body&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"'&lt;/span&gt;&lt;span class="s"&gt; OR &lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;=&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;1&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt; 
    &lt;span class="p"&gt;})&lt;/span&gt;
    &lt;span class="nf"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sa"&gt;f&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;Test response status: &lt;/span&gt;&lt;span class="si"&gt;{&lt;/span&gt;&lt;span class="n"&gt;test_payload&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="s"&gt;status_code&lt;/span&gt;&lt;span class="sh"&gt;'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Bên dưới mui xe, hàm Tool này làm gì? Request đi qua module Action (Tầng Middleware):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Trích xuất đoạn mã nhận lệnh ở proxy_actions.py
&lt;/span&gt;&lt;span class="nd"&gt;@register_tool&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;repeat_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modifications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&amp;gt;&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;Any&lt;/span&gt;&lt;span class="p"&gt;]:&lt;/span&gt;
    &lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="n"&gt;.proxy_manager&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;get_proxy_manager&lt;/span&gt;
    &lt;span class="n"&gt;manager&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;get_proxy_manager&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;manager&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;repeat_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modifications&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="p"&gt;{})&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Cuối cùng là màn ảo thuật của &lt;code&gt;ProxyManager&lt;/code&gt; ở tầng Core Dữ Liệu (&lt;code&gt;strix/tools/proxy/proxy_manager.py&lt;/code&gt;). Đây là cách nó đóng trực tiếp luồng traffic ảo vừa tạo vào Proxy nội bộ:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight python"&gt;&lt;code&gt;&lt;span class="c1"&gt;# Trích xuất từ _send_modified_request() (proxy_manager.py)
&lt;/span&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;_send_modified_request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request_data&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;request_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;modifications&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;dict&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="c1"&gt;# Dùng thư viện request của Python để bắn gói tin mới...
&lt;/span&gt;    &lt;span class="c1"&gt;# ...NHƯNG ép kết nối đi qua cổng self.proxies (Chính là con Caido 127.0.0.1:48080)
&lt;/span&gt;    &lt;span class="n"&gt;response&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;requests&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;request&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
        &lt;span class="n"&gt;method&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;method&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;url&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;headers&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;headers&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;],&lt;/span&gt;
        &lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;request_data&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt; &lt;span class="bp"&gt;None&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;proxies&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="n"&gt;self&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;proxies&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="c1"&gt;# ĐIỂM SÁNG: Ép luồng traffic Replay ghi nhận lại vào Caido
&lt;/span&gt;        &lt;span class="n"&gt;timeout&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;30&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="n"&gt;verify&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="bp"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="c1"&gt;# Rút gọn response nếu quá dài
&lt;/span&gt;    &lt;span class="n"&gt;response_body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;text&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nf"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;response_body&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;response_body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;response_body&lt;/span&gt;&lt;span class="p"&gt;[:&lt;/span&gt;&lt;span class="mi"&gt;10000&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="se"&gt;\n&lt;/span&gt;&lt;span class="s"&gt;... [truncated]&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;

    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;status_code&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;status_code&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
        &lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="s"&gt;body&lt;/span&gt;&lt;span class="sh"&gt;"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;response_body&lt;/span&gt;
    &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h3&gt;
  
  
  Tại sao Architecture Replay này lại tối ưu?
&lt;/h3&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;Chống sai sót cho LLM (Error-Proof):&lt;/strong&gt; LLM thường sai cú pháp (thiếu Header Authorization, viết sai MIME boundary hoặc quên escape JWT). Khi sử dụng hàm &lt;code&gt;repeat_request(id, modifications)&lt;/code&gt;, Strix tự động clone 90% kết cấu hợp lệ từ cái ID cũ, LLM chỉ cung cấp nội dung &lt;code&gt;body&lt;/code&gt; muốn tiêm vào. Cấu trúc gói tin HTTP luôn đảm bảo 100% hợp lệ.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Audit Logging tuyệt đối:&lt;/strong&gt; Mọi viên đạn (Payload) mà LLM bắn đi đều được ghi vào Caido Database. Bạn thao tác trên dashboard (Giao diện đồ họa) của Caido cũng có thể kiểm chứng ngay lập tức chuỗi hành vi tấn công của Agent AI đó.&lt;/li&gt;
&lt;/ul&gt;

</description>
      <category>strix</category>
      <category>graphql</category>
      <category>pentest</category>
    </item>
  </channel>
</rss>
