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": , # count of tainted instruction records
"tainted_instructions": [
{
"address": ,
"mnemonic": "0x401000: mov eax, [rbp-4]",
"tainted": , # instruction reads or writes tainted data
"tainted_registers": ["eax"], # registers that are tainted after this instruction
"tainted_memory": [[0x7ffff000, 4]]
},
...
],
"stopped_on": "|null",
"error": "|null"
}工作原理(简述)
- LIEF将可加载段映射到Triton内存中。
- 基本堆栈被播种(RSP/RBP)以保持执行正常。
- 污染源被应用于请求的寄存器/存储器。
- 线性步进:最多可读取16个字节
rip,通过Triton解码/执行,遵循更新的rip. - 每个步骤都记录了最终被污染的写入(寄存器或内存)以及任何被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的运行时地址)。
