南大软分实验笔记|A8 污点分析
内容提要
本文介绍了南大软件分析课程第八个实验中的污点分析方法,通过添加污点传播规则和处理source和sink实现。作者解决了污点传播问题,并通过修改代码通过了所有测试用例。文章还介绍了如何使用StringAppend.java进行测试,并提供了正确的TaintFlow结果。作者总结了不放弃的经验,并表示污点分析很有意思。
延伸解读
污点传播与指针分析的本质区别
文章指出,污点分析虽基于指针分析,但污点传播不能仅依赖指针分析的PFG。因为污点对象是虚拟的,其传播需遵循特定规则(如base-to-result、arg-to-base等),这些规则在PFG中没有对应边。作者最初忽略这一点,导致StringAppend测试失败。这提醒我们,在扩展分析时,需明确新分析特有的传播关系,并构建独立的图结构(如TFG)来管理。
调试复杂分析的有效策略
作者在调试污点传播问题时,没有盲目打印或脑内模拟,而是借助指针分析的结果,检查变量指向集合,从而定位到污点对象未传播的环节。这种方法将问题分解到已有分析的基础上,降低了调试复杂度。对于过程间分析,利用中间结果进行验证,比直接追踪worklist更高效。
TFG:污点传播的显式建模
文章提出用TFG记录污点传播边,并在propagate中基于TFG传播污点对象。这相当于为污点分析增加了独立的传播通道,与PFG并行。这种设计使污点传播规则与指针分析解耦,代码更清晰,也便于扩展。但需注意,TFG的边需在doTaintTransfer中动态添加,并确保与worklist机制协同。
实验实现的局限与反思
作者通过所有测试用例,但指出代码未考虑污点类型变化(如StringBuilder到String),因此不能证明完全正确。这反映了静态分析中类型敏感性的重要性。实验虽简化了规则,但实际场景中类型转换可能影响污点传播。读者在实现时,可思考如何结合类型信息提升精度。
Q&A
南大软件分析课程的第八个实验主要研究什么内容?
主要研究污点分析方法,包括污点传播规则和处理source与sink。
在污点分析中,如何处理invoke语句?
在处理invoke语句时,需要添加对source和污点传播规则的实现。
作者在调试过程中遇到了什么问题?
作者发现污点传播存在问题,导致初始版本未能通过StringAppend.java测试。
如何通过StringAppend.java进行污点分析测试?
通过分析StringAppend.java的源码,检查污点对象是否正确传播到sink。
作者是如何解决污点传播问题的?
作者通过引入Taint Flow Graph (TFG)来记录污点传播边,并修改了相关方法。
污点分析的趣味性体现在什么方面?
作者总结了调试过程中的经验,强调了污点分析的趣味性和挑战性。