二进制污点分析工具

Triton Taint MCP是一个基于Triton动态符号执行引擎的二进制污点分析工具,用于LLM驱动的漏洞分类,通过标记初始污染源并跟踪指令传播路径来识别用户控制数据的流向。

  • by karimodm
  • Python
  • 本地部署
  • 1 星标
  • 更新于
在 GitHub 查看 karimodm/Triton-taint-mcp

使用说明

Triton Taint MCP

模型上下文协议(MCP)stdio服务器,它公开了一个工具, taint_binary,由 特里同 动态符号执行引擎。它提供了一种适用于LLM驱动的漏洞分类的轻量级前向污染传递:给定二进制、初始污染源(寄存器和/或内存)和步骤预算,它会报告哪些指令将用户控制的数据传播到寄存器或内存中。

快速启动

uv sync          # installs mcp, lief, triton-library (PyPI), pydantic
uv run triton-taint-mcp

服务器通过stdio与MCP通信;将MCP兼容客户端指向可执行文件 triton-taint-mcp (由出口 pyproject.toml 脚本条目)。

工具接口

taint_binary 参数:

  • binary_path (str,必填):通过LIEF加载ELF/PE并映射到Triton的路径。
  • arch (str,默认值 x86_64):其中之一 x86_64, x86, aarch64.
  • entrypoint (int |十六进制字符串,可选):开始执行的地址(默认为二进制入口点)。
  • taint_registers (list[str],可选):最初注册要污染的名称,例如。 ["rdi", "rsi"].
  • taint_memory (列表[{“address”:int|十六进制字符串,“size”:int|十六进制字符串}],可选):最初要污染的内存范围。
  • initial_registers (dict[str,int|hex-string],可选):种子具体寄存器值(例如为内存加载设置指针)。
  • concrete_memory (list[{“address”:int|十六进制字符串,“data”:list[int]| bytes |十六进制串}],可选):在任意地址预填充内存;接受十六进制字符串。
  • max_instructions (int,默认值500):逐步调整预算以避免模拟失控。
  • stop_addresses (list[int|hex-string],可选):到达时停止模拟的地址。

返回值:

{
  "instruction_count": <int>,         # count of tainted instruction records
  "tainted_instructions": [
    {
      "address": <int>,
      "mnemonic": "0x401000: mov eax, [rbp-4]",
      "tainted": <bool>,               # instruction reads or writes tainted data
      "tainted_registers": ["eax"],    # registers that are tainted after this instruction
      "tainted_memory": [[0x7ffff000, 4]]
    },
    ...
  ],
  "stopped_on": "<reason>|null",
  "error": "<message>|null"
}

工作原理(简述)

  1. LIEF将可加载段映射到Triton内存中。
  2. 基本堆栈被播种(RSP/RBP)以保持执行正常。
  3. 污染源被应用于请求的寄存器/存储器。
  4. 线性步进:最多可读取16个字节 rip,通过Triton解码/执行,遵循更新的 rip.
  5. 每个步骤都记录了最终被污染的写入(寄存器或内存)以及任何被Triton标记为污染的指令。

这是有意最小化的——除了段映射之外,没有libc挂钩、SMT解决或重新定位修复。它专为快速定向答案而设计(“用户控制的数据是否在N步内到达此比较/存储?”)。将其与更丰富的反汇编程序MCP配对,以适应上下文,并与您自己的停止条件配对,以限制探索。

注释和注意事项

  • 需要Python≥3.11和可用的编译器工具链来构建Triton;它从PyPI安装为 triton-library.
  • LIEF处理ELF/PE解析;Mach-O没有连接。
  • 执行是单线程、线性的,并停止在 max_instructions 或 stop_addresses该循环可能被截断的间接控制流。
  • 如果要对本地Triton克隆进行实验,可以取消注释 triton-local 可编辑源 pyproject.toml 覆盖PyPI包。
  • PIE ELF二进制文件映射到基址 0x00100000 (按该基数移动的片段;入口点也是如此)。非PIE二进制文件在其记录的VA处映射。相应地提供地址(PIE=base+ELF VA的运行时地址)。