1. blockwatchdog.py
该文件用以处理对应的命令行输入和相应的输出
输入对应的检测合约地址、公链以及对应区块即可。
1)流信息的构建
调用Contract.py中的Contract()
实例化对应的合约。
获得分析合约中所有的函数签名,以及函数签名的中的外部调用
1 | original_contract = Contract( |
2)跨合约调用图的构建
对合约中每个外部调用进行跨合约调用图的构建
1 | while len(external_call_in_func_sigature) > 0: |
3)污点分析
首先调用FlowAnalysis()
实例化对应的检测器,并进行相应的检测
1 | detector = FlowAnalysis( |
2. Contract.py
该文件主要用于对输入的合约地址进行处理,获取相应的字节码,并且调用gigahorse反编译的引擎进行相应的处理
最关键的是self.analyze()
函数
1 | def analyze(self): |
self.set_external_calls()
调用链的获取,主要依赖于gigahorse的分析能力
1 | def set_external_calls(self, func, func_sign): |
3. flow_analysis.py
实例化过程传入了合约地址,函数签名,外部调用函数签名,调用路径上的合约以及函数
目前针对 bad_randomness、DOS、reentrancy和price_manipulation四种漏洞进行检测
1)bad_randomness
1 | def intraprocedural_br_analysis(self): |
看了Datalog中Leslie_SensitiveOpOfBadRandomnessAfterExternalCall
的实现,感觉这里的检测可能不太准确。
2) DOS
1 | def intraprocedural_dos_analysis(self): |
datalog对应的Leslie_SensitiveOpOfDoSAfterExternalCall
规则如下:
1 | // sensitive operations related to dos |
通过跟踪从外部调用返回的值,检查这些值是否流向了进行关键判断(如地址断言)的操作,代码可以识别可能导致合约执行非预期中断的模式。
这种中断可能因资源耗尽(如无限循环)、执行跳转(如错误处理),或其他异常行为而引起合约服务中断,构成 DoS 漏洞。
但感觉这里的检测也不是很精确。
3)price manipulation
价格操作漏洞的检测与ISSTA2023DefiTainter的检测方法一致
分为两种检测,一是合约内的污点检测,二是跨合约的污点分析
- intraprocedural_analysis:
1 | def intraprocedural_analysis(self): |
进入datalog中Leslie_FLTaintedVarToSensitiveVar
查看检测细节:
具体逻辑为:
首先检测
balanceOf()
这样外部函数调用的返回值,将其作为攻击者可操控的source,随后攻击者查看transfer的敏感的调用地址攻击者是否可操控,如果可以的话,那么transfer函数的转账金额就被认为是一个敏感变量
- 随后判断source和sink之间是否有对应的传播路径,如果有的话,则认为存在漏洞,保存在对应的csv文件中
1 | .decl Leslie_FLTaintedVarToSensitiveVar(funcSign:symbol, taintedVar:Variable, sensitiveVar: Variable) |
- interprocedural_analysis:
1 | pps_near_fl_source = self.get_pps_near_fl_source() |
得到了对应source所污染的函数参数和函数返回值,和sink所依赖的函数调用返回值,依据上述的source和sink,分析对应的rule:
1 | def find_potential_price_manipulation_attack(self, source, sink): |
下面介绍一下tainted source污点传播的过程
1 | def transfer(self, pp): |