一,何为静态代码扫描
静态源代码扫描是近年被人提及较多的软件应用安全解决方案之一。它是指在软件工程中,程序员在写好源代码后,无需经过编译器编译,而直接使用一些扫描工具对其进行扫描,找出代码当中存在的一些语义缺陷、安全漏洞的解决方案。静态扫描技术已经从90年代时候的,编码规则匹配这种由编译技术拓展过来的分析技术向程序模拟全路径执行的方向发展,由此,这种模拟执行相对的执行路径比动态执行更多,能够发现很多动态测试难以发现的缺陷。
其原理是把代码劈开,把待分析的代码及代码之间的关系以对象的方式存放在内存中,同时也使用了一种可以接受的算法在有效的时间里描绘出应用的路径图形,并采用了一种特殊的查询语言CxQL来查找安全问题,每一个查询语句就针对一类安全漏洞问题,因此几乎可以达到完美的结果,消除了误报(false positive).(其原理有点像建立在数据库为基础的查询引擎、查询语言和查询语句一样)用户可以利用CxQL语言定制自己的查询语句(规则),查找特定的安全和逻辑的问题,解决漏报(false Negative)问题。使得代码扫描变得更加现实和可用。也可以给项目开发节省大量的时间各人力成本,大大提升软件的安全性能。
二,为什么需要静态代码扫描
软件工程有一个词,叫质量左迁,所谓质量左移是指代码在测试之前,在编码阶段就已经介入了代码的质量检测,提前发现并修复代码问题,有效减少测试时间,提高研发效率,发现BUG越晚,修复的成本越大。
源代码作为软件的最初原始形态,其安全缺陷是导致软件漏洞的直接根源。因此,通过静态方法分析发现源代码中的安全缺陷是降低软件潜在漏洞的重要方法。相比于人工代码审查,静态代码扫描具有以下优点:
1、速度更快:静态代码扫描可以自动化地分析代码,极大地提高了检查效率。
2、检查范围更全面:静态代码扫描可以覆盖整个代码库,并检查出所有可疑的问题,一般不会漏检。
3、减少人为失误:人工审查代码容易疲劳和忽视问题,而静态代码扫描则可以严格按照预设规则进行检查。
三,静态代码扫描的使用场景
静态代码扫描在以下场景中比较适用:
1、代码重构:在进行大规模代码改动的时候,静态代码扫描可以及时发现潜在的问题,帮助开发人员确认代码改动是否符合预期。
2、持续集成:在持续集成过程中,将静态代码扫描作为构建流程的一部分,可以及时发现问题并阻止失败的构建。
3、代码评审:将静态代码扫描运用于代码评审中,可以大大缩短代码审查的时间,并减少漏审的情况。
当前成熟的做法一般是持续集成,通过不断的自动化流水线,针对每一次的代码修改进行扫描,及时发现可疑的地方,及时修复,将问题扼杀再摇篮里。
四,静态代码扫描主流工具
市场上静态代码扫描工具百花齐放,种类繁多,本文通过相关云厂商咨询、互联网峰会资料查阅和主流技术网站检索得出初步结论,和大家分享讨论。
1、TScanCode(C/C++、C#、Lua)
TscanCode是腾讯出品的开源静态代码扫描工具,旨在助力开发与测试人员从代码层面挖掘问题,将那些长期困扰项目的诸如空指针宕机等问题,扼杀于萌芽阶段。支持用户根据不同需求自定义配置检查项,有极强的扩展性和可维护性。平均扫描速度10W行/分钟。
官方下载地址:https://github/Tencent/TscanCode
详细使用博客参考:https://blog.csdn/liweibin812/article/details/84544750
2、pclint(C/C++)
PCLint是GIMPELSOFTWARE公司研发的C/C++软件代码静态分析工具(付费),可以说,PCLint是一种更加严格的编译器。其主要分为PCLint和FlexeLint,PCLint主要应用于Windows平台,以二进制可执行文件提供,而FlexeLint应用于其他平台,例如Linux,以源代码形式发布。 PCLint不但能够对程序进行全局分析,识别没有被适当检验的数组下标,报告未被初始化的变量,警告使用空指针连同冗余的代码,还能够有效地提出许多程序在空间利用、运行效率上的改进点。
官网:http://www.gimpel/html/index.htm
最新安装包:http://download.csdn/detail/winking324/8162819
安装配置参考:https://blog.csdn/feng_ma_niu/article/details/40631521
详细介绍文档参考:http://www.docin/p-31343126.html?docfrom=rrela
3、Cppcheck(C/C++)
Cppcheck是C/C++代码的静态分析工具(开源),支持图形界面和命令行 。它提供独特的代码分析来检测bug,并着重于检测未定义的行为和危险的编码结构,目标是只检测代码中的实际错误。它提供独特的代码分析来检测错误,并专注于检测未定义的行为和危险的编码结构。目标是减少误报。Cppcheck 旨在能够分析您的 C/C++ 代码,即使它具有非标准语法(在嵌入式项目中很常见)。
官方网站:http://cppcheck/
一些使用方法博客:https://www.oschina/p/cppcheck
4、SourceInsight_Scan
SourceInsight_Scan是一款集成在 SourceInsight 中的c/c++代码静态分析插件,集成了cppcheck,coverity,pclint等业界优秀的静态分析工具的优点。旨在帮助开发人员,在 IDE 中快速发现编译器无法发现的非语法错误,降低修复成本。无需编译,平均扫描速度高达10W行/分钟,快速发现潜在的质量风险,平均准确率高达80%。
官方网站:https://sourceforge/projects/siscan/
安装使用说明参考:https://blog.csdn/sheji105/article/details/88988619。
5,Splink
splint是一个GNU免费授权的 Lint程序,是一个动态检查C语言程序安全弱点和编写错误的程序。Splint会进行多种常规检查,包括未使用的变量,类型不一致,使用未定义变量,无法执行的代码,忽略返回值,执行路径未返回,无限循环等错误。
官网:http://splint/
安装参考文档:https://blog.csdn/sunjiajiang/article/details/7368684
splint需安装automake-1.6支持
6、Flake8(Python)
它综合以下三者的功能,在简化操作的同时,还提供了扩展开发接口。(开源)
PyFlakes:静态检查Python代码逻辑错误的工具。
pep8: 静态检查PEP 8编码风格的工具。
Ned Batchelder’s McCabe script:静态分析Python代码复杂度的工具。
官方网站:https://flake8.pycqa.org/en/latest/index.html
使用参考:https://zhuanlan.zhihu.com/p/614429048
7、PhpMetrics(PHP)
PhpMetrics 分析您的 PHP 代码并提供 HTML、JSON、CSV ......关于复杂性、依赖关系、耦合、违规等的报告。(开源)
官方网站:https://github.com/phpmetrics/PhpMetrics
8、golangci-lint(go)
GolangCI-Lint是一个lint聚合器(开源),它的速度很快,平均速度是gometalinter的5倍。它易于集成和使用,具有良好的输出并且具有最小数量的误报。而且它还支持go modules。最重要的是免费开源。
官方网站:https://github.com/golangci/golangci-lint