代码审计是什么意思
一、定义
软件代码审计是在一个编程中对源代码旨在发现错误、安全漏洞或违反编程约定的项目。它是防御性程序设计范例,它试图在软件发布之前减少错误。C、C++、php源代码是最常见的审计代码,因为许多高级语言,如Python,具有较少的潜在易受攻击的函数(例如,不检查边界的函数)——
代码检查是审计工作中最常用的技术手段,实际应用中,采用“自动分析+人工验证”的方式进行。通常检查项目包括:系统所用开源框架、源代码设计、错误处理不当、直接对象引用、资源滥用、API滥用、后门代码发现等,通常能够识别如下代码中的风险点:
跨站脚本漏洞、跨站请求伪装漏洞、SQL注入漏洞、命令执行漏洞、日志伪造漏洞、参数篡改、密码明文存储、配置文件缺陷、路径操作错误、资源管理、不安全的Ajax调用、系统信息泄露、调试程序残留、第三方控件漏洞、文件上传漏洞、远程命令执行、远程代码执行、越权下载、授权绕过漏洞。
二、问题
1、代码与架构复杂
一个业务几十万、几百万行代码,几十个模块几十个代码仓库,司空见惯;开发语言种类繁多,各种自研框架和流行框架应接不暇,框架还是很复杂的。
以上两个问题对审计人员、SAST工具来说无疑都是很大的挑战。
2、工具准召率
没有什么工具是所谓的银弹。官方规则和插件调用率低,需要根据开发语言和编码风格定制。工具逻辑漏洞的弱点和业务逻辑漏洞的脆弱情况之间存在矛盾。工具和系统的运营也需要专门的人力投入,不断提高工具的准确调用率。
1.心态
审计人员出于KPI的考虑,想着既然花了很长时间做了代码审计,为了体现工作量就必须说点什么,如果系统本来没有问题却在那挑刺,开发者会更加不信任你。对于甲方代码审计
人员,审计任务多、代码庞大是常态,如果不考虑后果的只提高速度,这种方式会遗漏掉细节,导致不能全面的审查。
三、审计整体思路
1.准备工作
要审计,当然要先获取相应的源代码,最好是相关文档等。信息越多,就越容易理解源代码。
本地建一个网站,边审计边调试。通过跟踪各种动态变化,了解源代码的功能。
  浏览源码文件夹,了解该程序的大致目录
index、admin文件一般是整个程序的入口,详细读一下index文件可以知道程序的架构、运行流程、包含那些配置文件,包含哪些过滤文件以及包含那些安全过滤文件,了解程序的业务逻辑。
  一般类似config等文件,保存一些数据库相关信息、程序的一些信息。先看看数据库编码,
如果是gbk则可能存在宽字节注入。如果变量的值用双引号、则可能存在双引号解析代码执行的问题。
通过详读 公共函数文件 和 安全过滤文件 等文件,清晰掌握用户输入的数据,哪些被过滤,哪些无过滤,在哪里被过滤了,如何过滤的,能否绕过过滤的数据。过滤的方式是替换还是正则?有没有GPC?有没有使用addslasher()处理?
应接不暇是什么意思2、审计方法
2.1、自动手动结合
代码扫描工具->ast/正则表达式->复核
词法分析->语法分析->(语义分析->中间代码)->AST
按照预定的规则合并成一个个的标识tokens。同时,它会移除空白符,注释,等。最后,整个代码将被分割进一个tokens列表(或者说一维数组)。将词法分析出来的数组转化成树形的表达形式。同时,验证语法,语法如果有错的话,抛出语法错误。解析器会删除一
些没必要的标识tokens(比如不完整的括号),因此AST不是100%与源码匹配的,解析器100%覆盖所有代码结构生成树叫做CST(具体语法树)。以下介绍一些主流web开发语言的ast parser:
• 在线parser
• php-parsesr
• python-parser
• go-parser
• js-parser
• java-parser
结合开源、商业sast工具进行漏洞和风险扫描输出初步检测报告,然后人工复核准确性,不断优化sast扫描规则,同时提高漏洞挖掘速度。
2.2、黑白盒结合
黑盒求覆盖->白盒求重点
通过黑盒来全部覆盖所有业务cgi,同时通过白盒测试覆盖重要业务cgi,黑盒快速验证、白盒挖掘根因或者研究绕过策略,从而实现实现效率与重要性的平衡。另外,这里建议使用被动扫描器进行快速流量回放,实现流量采集与漏洞测试的同步执行,大大提高测试效率。同时也建议将cgi与功能整理出来,不然白盒审计在理解业务和代码逻辑上的成本会非常高。
2.3、正反向跟踪
• 正向:变量->函数/敏感操作->输出
$_GET->$param->eval($param)->return $param
从参数接收入口开始跟踪数据流,是一种正向追踪的思路。优点是方便理解程序整体框架,相对容易定位逻辑漏洞。但是在代码量较大、代码结构化不强的情况下人工审计成本很高,ROI可能不明显,这种情况下结合SAST工具进行审计效果会更好。
• 反向:函数/敏感操作回溯->输出
eval($param)->$param->$GET->return $param
根据敏感关键字来回溯传入的参数,是一种逆向追踪的思路。优点是仅需要搜索相应敏感关键字,就可以快速挖掘漏洞,可定向挖掘,高效,高质量,但也因为没有通读代码,对程序整体框架不熟悉,定位时会花费时间,逻辑漏洞挖掘较为困难。同理,这种情况下也需要结合SAST工具来做,因为SAST工具对敏感函数的控制流跟踪效果较好,方便人工后续回溯变量。
2.4、动静结合
(1)静态审计
通过静态分析源码,发现源码中的逻辑、数据处理、函数使用不当来确认源码中可能存在的漏洞。可以通过规则匹配和代码解析法开展,不过这块可以交给SAST工具去做。
(2)规则匹配
通过编写正则表达式匹配开发语言或者开发框架的默认变量与高危函数进行匹配,比如php的默认变量$GET、$POST,高危函数eval()、exec()等。
(3)代码解析法
通过解析代码的语法,分析出代码执行流程,这块如果采用自动化手段便属于前文所说AST,所以说不同思路之间也有相通之处。
(4)动态审计
通过运行需要审计的代码,结合使用断点调试的方法跟踪数据的流转来判断系统中是否存在漏洞。这块可以交给DAST或者IAST工具去做。注意一开始只需要关注我们关心的漏洞类型:高危文件、高危函数以及常规Web漏洞。
2.5、过往与当下结合
• 是否采用存在漏洞的框架版本;
• 是否出自同一个存在不良编码习惯或安全意识薄弱的开发者之手;