代码审计训练-序

对于提升C语言代码审计能力的一些训练经验的探索和总结。

为什么要训练代码审计能力

目的——训练挖洞的双技能

  • 看洞,历史漏洞的git log、bug报告、代码质量报告等;
  • 识洞,即代码审计,难点也就是在这上面。

如何训练

  1. 根据自己目标定位,寻找相应的历史漏洞案例进行学习,比如我给自己定的最初目标就是c语言实现的应用程序中的内存相关漏洞(如堆栈溢出等)。

  2. 掌握漏洞所在的模块或子系统,但不看完整的漏洞细节描述,尝试在漏洞版本中找出对应的漏洞

  3. 如果2中未能找出漏洞,就去看漏洞细节描述,对比自己的审计过程,思考为什么没有找出漏洞

  4. 不断重复上述训练,直至相信:挖洞只是体力消耗,而非能力问题。

  5. 在坚持进行代码审计一段时间后(1年或者2年),有了大量的经验,此时可考虑结合自己审计过程中积累的经验,尝试开发或者改进Fuzzer,进行自动化漏洞挖掘。

寻找训练对象-初

在最开始寻找训练对象时,是cve网站上根据关键词进行搜索,然后从搜索结果中,挨个寻找感兴趣的,搜索查看能否下载到其漏洞版本的软件,然后再进行分析。但由于下述原因,该方法效率太低——

  • 关键词搜索结果太多,而且对于漏洞的细节描述并没有很好的格式,并不能很快的定位到出现的最频繁的具体漏洞类型等信息。
  • 很多漏洞,都没有寻找到对应的漏洞版本的软件(主要原因)
  • 有部分漏洞细节中并未指出存在漏洞的具体模块,只是指出了对应软件,这不利于前期的训练。

针对上述原因中的各条进行思考改进——

  1. 可以考虑通过词频统计工具,统计得到搜索结果中出现频率较高的关键词,加深对于整体的搜索结果情况的了解。

  2. 后面2条原因是硬伤,考虑寻找有没有能解决这2个问题的其他网站或库。

在尝试寻找新的训练对象的过程中,意识到对于那些漏洞细节描述的不是很详细的漏洞,可以考虑利用开源的代码审计工具对其进行审计,然后将审计结果作为类似于参考答案一样的东东,这样应该可以提高分析的完善度。

自动化的静态代码审计工具虽然可以在某种程度节省代码审计的人力成本,时间成本。是提高代码审计效率的重要手段。然而需要注意的是,自动化工具并非是完全智能准确的,跟所有的检测扫描工具一样,误报率的存在仍然是必须面对的现实问题。因此,检测结果中显示的漏洞还是需要审计人员,手动验证或者手工进一步确认是否真的存在。

寻找训练对象-终

最终寻找确定的训练程序集如下——

(1)exploit-db,提供关键词搜索、漏洞描述、漏洞对应版本应用程序下载、利用脚本EXP等功能;
(2)fuzzgoat,一个用于测试fuzzers的漏洞C程序;
(3)源代码审计;
(4)ida6.6 bugs;
(5)gameofhacks,一个测试代码审计能力的游戏平台,但感觉更多涉及的是web相关的安全漏洞,看看能不能寻找或者积累创建一个类似的二进制漏洞代码审计能力的测试平台;

参考资料

1.下载寻找旧版应用程序的网站

(1)OLDVERSION;
(2)oldapps;
(3)filehippo;

2.其他

(1)安全研究者的自我修养;
(2)一系列用于Fuzzing学习的资源汇总;

3.在审计过程中要多总结和积累,如下述参考链接所示

(1)C/C++典型漏洞产生原理与Demo;
(2)C语言代码漏洞审计技巧笔记分享;