资讯动态

VulFi 核心原理拆解:XREF 扫描与 Hex-Rays 误报过滤机制

发布时间:2026/8/16 20:47:08 来源:尧图企业网站定制
VulFi 核心原理拆解XREF 扫描与 Hex-Rays 误报过滤机制【免费下载链接】VulFiIDA Pro plugin for query based searching within the binary useful mainly for vulnerability research.项目地址: https://gitcode.com/gh_mirrors/vu/VulFiVulFiVulnerability Finder是一款专为二进制漏洞研究打造的 IDA Pro 插件它的核心价值在于通过 XREF 扫描自动定位strcpy、sprintf、system等危险函数的全部交叉引用并借助 Hex-Rays 反编译器实现智能误报过滤把安全研究员的精力从大海捞针中解放出来。本文将深入拆解 VulFi 的 XREF 扫描流程与 Hex-Rays 误报过滤机制帮助你真正理解这个漏洞挖掘插件的底层工作方式。VulFi 是什么为什么漏洞研究需要它在逆向工程中漏洞挖掘的核心工作之一就是追踪危险函数的调用点。传统做法是逐个函数人工翻看反汇编代码效率极低且容易遗漏。VulFi 的思路很直接把所有对已知危险函数的交叉引用XREF收集到一张表里再通过反编译器提供的信息自动筛掉明显不构成威胁的调用例如strcpy(dst, Hello World!)这种拷贝常量字符串的场景。插件只需三个文件即可运行vulfi.py主逻辑、vulfi_rules.json内置规则集、vulfi_prototypes.json函数原型库把它们复制到 IDA 插件目录即可完成安装。核心原理一XREF 扫描如何工作XREF交叉引用是 IDA 提供的基础能力它记录了谁在什么地址引用了某个函数。VulFi 的 XREF 扫描逻辑集中在 vulfi.py 的find_xrefs_by_name()方法中整体流程可分为四步第一步收集全部函数与导入表扫描开始前VulFi 会遍历所有段中的函数并通过enum_import_names把导入表中的外部函数也纳入列表。这一步保证了即使是动态链接的危险函数如 libc 中的memcpy也不会被漏掉。第二步匹配危险函数并设置原型VulFi 对函数名做大小写不敏感匹配MEMCPY、Memcpy、memcpy都会被识别。匹配成功后插件会从 vulfi_prototypes.json 中读取对应的 C 原型如void memcpy(void* dest, void* src, int n);并自动设置到 IDA 的类型系统里——这是后续参数分析能够成立的前提。第三步遍历 XREF 并过滤无效调用核心代码使用idautils.XrefsTo()获取函数的所有引用地址然后逐一验证引用来源是否属于某个函数排除数据段引用引用指令是否为真正的call指令通过指令的 canonical feature 判断。第四步Wrapper 追踪这是 VulFi 的特色能力之一。很多程序会封装危险函数比如自定义的mylog(strcpy(...))。开启wrappers选项后插件会利用反编译器检查某次调用是否把所有参数原样透传即包装函数并递归追踪 wrapper 自身的调用点避免漏掉隐藏在封装层背后的漏洞调用。核心原理二Hex-Rays 误报过滤机制XREF 扫描只是广撒网真正让 VulFi 与众不同的是基于 Hex-Rays 反编译器的误报过滤机制。反编译器把汇编还原成类 C 代码后VulFi 可以像静态分析器一样对每个调用点的参数进行语义级检查。以下机制构成了误报过滤的核心1. 常量参数检测is_constant这是最基础的过滤器。strcpy(dst, Hello World!)中第二个参数是常量字符串不构成溢出风险会被直接排除。VulFi 还做了两处增强能识别经过变量间接传递的常量如system(cmd)中cmd可能由if分支赋值但两个分支都是静态字符串通过string_value()与number_value()两个辅助方法提取参数的字符串值或数值better_const.gif演示的正是这种绕路常量的识别。2. 返回值检查追踪return_value_checked以malloc为例ptr malloc(size)之后如果没有判空就直接使用就是典型的空指针解引用风险。VulFi 通过检查函数调用在反编译树中的父节点判断返回值是否参与了比较运算if (!ptr)、if (ptr NULL)或赋值后又与常量比较。在无反编译器的纯反汇编模式下它退化为调用后 5 条指令内是否存在条件跳转的简化启发式。3. UAF 检测调用后置空检查set_to_null_after_call对于free函数VulFi 使用自定义的null_after_visitor遍历反编译树检查调用free后是否紧接着把指针置为NULL。如果置空了说明开发者有意识地规避了悬垂指针该调用点被判定为低风险。4. 参数使用追踪used_in_call_before / used_in_call_after判断参数是否在调用前被其他函数处理过。经典场景是strcpy(dst, src)前是否先调用了strlen(src)做长度校验——如果校验过风险级别自动降低。该机制通过解析反编译树中所有以该变量为实参的调用并结合控制流图判断调用顺序来实现。5. 符号比较检测is_sign_compared针对memcpy、read等函数的长度参数检查其是否参与了有符号比较。有符号数参与长度计算容易导致负数绕过大小的经典漏洞此机制能自动标记这类高风险调用。6. 可达性分析reachable_from如果你已经定位了某个输入处理函数如read可以要求 VulFi 只报告从该函数可达的system调用点。实现方式是从当前调用点所在函数出发沿 XREF 反向回溯调用链直到命中目标函数——这对命令注入类漏洞的排查非常实用。规则引擎误报过滤的大脑上述所有机制最终都由 vulfi_rules.json 中的规则引擎统一驱动。每条规则声明要监控的函数名、是否追踪 wrapper以及不同条件下的优先级优先级含义典型场景High极可能存在问题strcpy第二参数非常量且未先经strlen校验Medium需要人工确认格式字符串第 N 参数非常量Low低风险提示调用后指针已置空UAF 已规避Info参数无法解析反编译失败或参数个数不匹配规则表达式基于 Pythoneval执行例如内置的 Buffer Overflow 规则是not param[1].is_constant() and not param[1].used_in_call_before([strlen])——翻译成人话就是源参数不是常量且调用前没有经过 strlen 长度校验。这意味你可以用param[0].string_value()、function_call.return_value_checked()等数十种内置函数自由组合构建属于自己的误报过滤逻辑。模板文件见 rule_template_file.json。无反编译器模式退而求其次的兜底方案不是所有架构都支持 Hex-Rays 反编译。在没有反编译器的场景下VulFi 自动切换到基于反汇编的简化模式通过get_arg_addrs分析调用前的push/mov/lea指令来提取参数常量检测退化为判断操作数类型是否为立即数返回值检查退化为调用后 5 条指令内是否有比较指令。这种模式下误报会显著增多插件选择把无法准确判断的调用全部标记出来交由人工复核——宁肯多报不可漏报。自定义规则把误报过滤变成你的专属能力VulFi 允许通过两种方式扩展规则这也是它作为可成长的漏洞挖掘插件的精髓界面内添加在反汇编或反编译视图中右键任意函数选择Add name function to VulFi弹出表单填写规则表达式即可追踪自定义函数自定义规则文件编写 JSON 规则集扫描时选择加载适合一次性覆盖多个函数例如公司内部 SDK 的专有 API。总结VulFi 的误报过滤哲学回顾 VulFi 的核心设计你会发现它的误报过滤机制遵循一个朴素原则把机器能确定的判断交给机器把机器判断不了的留给人工。XREF 扫描负责全Hex-Rays 过滤负责精规则引擎负责可定制最终呈现给研究员的是一张已经按优先级排好序、剔除掉明显安全调用的问题清单——你只需要在 vulfi.py 的规则引擎基础上把时间花在真正值得分析的高风险调用点上。对于刚接触固件安全、漏洞挖掘的逆向工程师来说这无疑是最省力的入门起点。【免费下载链接】VulFiIDA Pro plugin for query based searching within the binary useful mainly for vulnerability research.项目地址: https://gitcode.com/gh_mirrors/vu/VulFi创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价