关于 create-pass-through-approximation
面向 OpenTaint 的安全技能,根据源码描述不透明方法中的数据传播,并写入对应配置与构建记录,适用于方法级污点分析。
主要功能
- 01追踪接收者和参数的数据流
- 02描述返回值、参数及接收者流向
- 03用虚拟字段表示对象存储
- 04按包编写 passThrough 配置
- 05更新 build.done 记录
适用场景
- 01恢复不透明调用中丢失的污点流
- 02建模通过存储数据的 setter 和 getter
- 03添加或修复指定方法的近似规则
安装
复制下面的命令,在终端中运行。
npx skills add https:/ / github.com/ seqra/ opentaint --skill create-pass-through-approximation安装后在 Claude Code 中输入/create-pass-through-approximation确认已加载。
附带文件references/java.md
详细介绍
技能:创建 PassThrough 近似配置
将被丢弃方法的污点传播建模为 PassThrough 近似配置——这是一种配置,用于告知引擎数据如何从方法的输入流向输出,从而恢复分析器因不透明调用而丢失的数据流。
输入
由调用方提供;未提供时使用默认值。仅当缺少必需输入且没有合理默认值时才询问
project-root(可选)——目标项目的根目录。Opentaint 会将所有分析产物保存在固定的<project-root>/.opentaint/目录下,因此下方的每个.opentaint/...路径都会解析到该目录。默认值:当前目录language(必需)——此项目的目标语言及特定于该语言的说明batch(必需)——批次 ID;其passthrough条目位于.opentaint/tracking/approximations/<batch>.yaml,并将你构建的条目追加到该文件的build.donemethods(可选)——指定的{ method, signature }子集;当调用方只需要处理这些方法时,用它们替代整个 passthrough 分组
工作流
1. 了解传播方式
对于批次中尚未列入 build.done 的 passthrough 方法(或指定给你的 methods),请依据语言参考,阅读每个方法的实际源码并进行分析。只根据方法自身的代码建模,不考虑项目如何使用该方法——配置描述的是方法固有的传播方式。回答:输入数据去了哪里?到达接收者或参数的数据,是否会通过返回值、方法写入的参数、接收者,或其存入的对象或字段传出?还要注意对象是否会在多次调用之间保留数据(例如,setter 暂存数据,getter 之后将其取出;或构建器不断累积数据)——这种情况需要虚拟字段。这种传播形态就是配置要表达的内容。
2. 编写配置
在 .opentaint/pass-through 下,每个包编写一份 passThrough 配置(格式和模式见语言参考)。已列入 build.done 且未在 methods 中明确指定的方法已构建并可信——保持其本身及其配置不变。在现有配置中修复明确指定的方法;向对应包的现有配置添加新方法,而非重写整个文件。复制规则由两个要点决定:
- 覆盖每个位置——
this和每个参数:将每个位置复制到数据流向的位置;如果数据没有流向别处,则复制到其自身 - 当数据在多次调用之间保存在对象中时,让写入方和读取方通过同一个虚拟字段传递数据——这是一个两者命名完全相同的名义存储位置。写入方暂存的数据就是读取方取回的数据;如果两者命名不同,污点就会丢失。
3. 重新检查配置
返回前,确认每个需要建模的方法都有 passThrough 配置,并且每份配置中的复制规则确实符合方法源码中的数据流向——覆盖每个位置,且写入方和读取方使用完全相同的虚拟字段。按照 Tracking,将每个尚未列入 build.done 的已编写方法追加进去;修复的方法仍保留在其中。
输出
简短、精炼地报告完成的工作
产物:
.opentaint/pass-through/<package-kebab>.yaml——passThrough 配置文件;每个包一份(一个依赖可以跨多个包),文件以包名命名(完整文件格式见语言参考)- 批次文件
build.done中已成功构建的方法(追加新方法;修复的方法已记录在其中,遵循 Tracking)
摘要:
- 写入的配置路径及已建模的方法
跟踪
.opentaint/tracking/approximations/<batch>.yaml — 一个批次的可调用项分类,<batch> 为计划文件名的主体。每个可调用项恰好属于一个判定类别,并使用计划中的精确语言专属 method 和 signature 作为键,以便区分不同变体:
passthrough、dataflow— 已建模的传递项;每个条目为{ method, signature }skipped— 终止性非传递项;每个条目为{ method, signature, reason }engine_issues— 单独的类别,用于引擎已证实无法传播的传递项(已构建但仍被丢弃);每个条目为{ method, signature, reason }。它们是终止性的,处理方式与skipped完全相同——唯一区别在于原因。merge-skipped会将其作为独立的engine_issues组并入skipped.yaml,与常规的methods跳过项并列。
dependencies 列出数据流测试项目所需的依赖标识符。build 块用于跟踪构建情况——test_project 记录每个数据流方法的测试项目状态(如果已将样例写入该批次的测试项目,则为 done;如果无法写入样例、因此该方法未纳入其中,则为 failed),而 done 存放已完成的 { method, signature }。通过注释明确说明
passthrough:
- { method: "<qualified-member-a>", signature: "<language-signature-a>" }
dataflow:
- { method: "<qualified-member-b>", signature: "<language-signature-b>" }
skipped:
- { method: "<qualified-member-c>", signature: "<language-signature-c>", reason: "retains none of its input data" }
engine_issues: []
dependencies: []
build:
test_project:
- { method: "<qualified-member-b>", signature: "<language-signature-b>", status: done }
done: []
此技能只会在方法成功构建后,且 build.done 中尚无该方法时,将其追加为 { method, signature }。新分配的方法若未能写入,就不会被记录,因此循环会返回处理它;明确修复的方法则保留其现有条目不变。绝不触碰分类类别,也不编辑 build.done 中已有的条目。
约束
OpenTaint 是一种全程序、过程间、字段敏感的别名分析引擎。它已经能通过可见的应用代码、调用、别名和独立字段传播;自定义规则和近似仅用于建模指定的源、汇或不透明方法边界。编译时常量和字面量不携带污点,因此,输出仅为常量的源或传递项不会引入任何内容。
- 每条规则只建模一个函数——绝不要使用正则表达式/通配符匹配器,也不要使用覆盖多个参数的位置;过度建模会让污点通过未经审核的方法传播,并制造误报
- 生成的配置中不要包含注释