借你一双慧眼,识别代码安全审计工具「建议收藏」

借你一双慧眼,识别代码安全审计工具「建议收藏」代码安全审计产品、代码缺陷分析产品、代码安全分析等基于源代码静态分析技术的产品市场上越来越多,但是质量却层次不齐,误报率非常高,漏报率也不低,究其原因是为什么呢?因为一款静态分析类产品研发不是轻松的事,往往要经历几年时间,产品才会逐渐成熟,支持的开发语言和安全漏洞类型才能达到企业级应用水平,一般中小企业是很难投入如此长的时间进行研发的,而且静态分析类产品底…

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新Idea2022.1教程亲测有效,一键激活。

Jetbrains全系列IDE稳定放心使用

          借你一双慧眼,识别代码安全审计工具「建议收藏」

 

      代码安全审计产品、代码缺陷分析产品、代码安全分析等基于源代码静态分析技术的产品市场上越来越多,但是质量却层次不齐,误报率非常高,漏报率也不低,究其原因是为什么呢?因为一款静态分析类产品研发不是轻松的事,往往要经历几年时间,产品才会逐渐成熟,支持的开发语言和安全漏洞类型才能达到企业级应用水平,一般中小企业是很难投入如此长的时间进行研发的,而且静态分析类产品底层技术是采用的与编译器非常类似的技术,也就是说大学课堂中编译原理课程上讲得哪些分析技术(例如:抽象语法树、切片、数据流分析、符号执行、指向分析、区间计算、到达定值分析、守卫值和非守卫值等等让人理解起来头疼的技术)大多都要用上,我记得当时学这些原理时就似懂非懂的,再把这些技术应用到产品中,难度可想而知,所以说市场上国内外的主流静态分析工具必然采用这些技术,把程序代码转化为抽象语法树是必须的一步,在抽象语法树上基础上,形成控制流图、函数调用图等之后再次进行切片分析,各种守卫值计算等等,零星的技术分析在网络上大多都能找到,但是缺乏系统化的技术分析,用这些技术、算法编码实现,在工程实践中会遇到各种各样的问题,产品市场化更是具有非常高的门槛,市场很多产品并非采用这样的主流技术,大多只是通过文件遍历扫描过程中,使用规则表达式、关键字搜索等技术匹配的特征字符串,所以这样的分析工具必然误报率非常高,这种搜索方法也只能查出一些特定的缺陷或安全漏洞函数,硬编码等特定缺陷,对于很多跨越文件的缺陷和安全漏洞是根本发现不了的。对于检测出大量误报的审计报告,测评人员和开发人员要花大量时间去分析,消耗大量时间,长此以往,这种工具必然被淘汰。

       那如何来辨别一款静态缺陷分析类工具的质量优劣呢?我以国际上通用的一个Java检测的Benchmark中代码作为案例分析一下。介绍在可以OWASP官方网站(https://www.owasp.org/index.php/Benchmark)找到,在GitHub(https://github.com/OWASP/benchmark)上可以下载到最新代码,现在最新版本是Benchmark 1.2beta,目前包括2740个真假漏洞,通过一个检测工具报出的TP-真实漏洞、FN-漏报漏洞、TN-无误报漏洞、FP-误报漏洞通过约登指数(Youden Index)计算公式(真实漏洞检出率-假漏洞检出率)计算出得分,满分是1.0分。也就是评价一个检测工具最好的情况是真实漏洞全部报出,而假漏洞没有报出。在2740个案例中,有1415个真实漏洞,1325个假漏洞,对于一款非主流工具来说,可能把绝大多数假漏洞也作为漏洞报出,则约登指数得分很低。所以评价一款静态缺陷检测工具的话,最好通过国际上认可的标准案例集进行验证。当然除了Java语言之外,C/C++语言、PHP、Python等语言都有对应的案例集,详情可浏览https://samate.nist.gov/SRD/testsuite.php#sardsuites

 

      我从SQL注入漏洞中选择两个案例,BenchmarkTest00043是真实漏洞,BenchmarkTest00052是假漏洞。这个表在下载Benchmark 1.2beta根目录中。

借你一双慧眼,识别代码安全审计工具「建议收藏」

 

      首先打开BenchmarkTest00043.java文件,查看里面代码

 

借你一双慧眼,识别代码安全审计工具「建议收藏」

 

     大家可以看到一般检测工具会直接定位到54行,因为这里出现一个特征方法executeUpdate,执行sql语句。但是如果没有上下文分析,则并不能确定是否为一个真实漏洞。主流检测工具会通过代码切片后,在抽象语法树上进行向后遍历,分析sql参数是否进行注入处理,则找到第50行,第50行是sql字符串的拼接,又引入了param变量。还需要在语法树上回溯param变量的取值,则找到第46行和47行,第47行无侵入可能,在46行,param变量值是通过scr对象的getTheParameter方法传递”vector”字符串获得,再向上找到src对象,src对象来自于其它类的定义,把post报文的请求参数request传递给SeparateClassRequest方法。

    打开SeparateClassRequest.java文件

 

借你一双慧眼,识别代码安全审计工具「建议收藏」

       在构造函数中,传入了request参数,src调用getTheParameter方法时,把“vector”传给形参p,方法返回了p对应的参数值,并没有对post传入的参数进行任何处理。经过一系列的回溯和上下文分析,最后确认是存在着SQL注入漏洞。一般单文件漏洞扫描是无法跨文件去回溯和上下文分析确认是否为真实漏洞,但是通过简单的函数名称判断也会报出这个漏洞。但是对于OWASP Benchmark 作为一个专业的评价基准项目,也考虑了工具对于漏洞的分析能力,是否对于假漏洞,是否能识别出来呢?

     打开BenchmarkTest00052.java这个文件,如下:

 

借你一双慧眼,识别代码安全审计工具「建议收藏」

 

       请上面代码截图中标注,对于分析也是与上面例子一样,通过在第55行发现可能的污点后,回溯到第46行。再看对应的另一个文件中的有关getTheValue方法。

借你一双慧眼,识别代码安全审计工具「建议收藏」

 

       大家是否看到getTheValue方法返回的是固定字符串“bar”,对于具有上下文和跨文件分析能力的工具来说,分析到这里,并不会报出漏洞。因为这不存在SQL注入的可能。而对于一般扫描工具,无法做到上下文分析,没有生成抽象语法树,更难于做到跨文件分析,自然会报出这个漏洞,但是这是一个假漏洞。对于真假漏洞基本持平的Benchmark 2740 全部漏洞,存在得0.10分左右的可能,毕竟真实漏洞比假漏洞多了90个。

       好了,如果读者认真读到了这里,我相信您也具有了一双慧眼,掌握了如何对一款代码安全审计工具或代码缺陷检测工具做出评价和选择。

 

关注安全   关注作者

—————————————————————————————————————–

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请联系我们举报,一经查实,本站将立刻删除。

发布者:全栈程序员-站长,转载请注明出处:https://javaforall.net/184233.html原文链接:https://javaforall.net

(0)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • pmos开关电路原理_高频开关电源电路图

    pmos开关电路原理_高频开关电源电路图​概述负载开关电路日常应用比较广泛,主要用来控制后级负载的电源开关。此功能可以直接用IC也可以用分立器件搭建,分立器件主要用PMOS加三极管实现。本文主要讨论分立器件的实现的细节。电路分析如下图所示R5模拟后级负载,Q1为开关,当R3端口的激励源为高电平时,Q2饱和导通,MOS管Q1的VGS<VGSth导通,R5负载上电,关断时负载下电。电路中R3为三极管Q2的限流电阻,R4为偏置电阻,R1R2为Q1的栅极分压电阻,C1C2为输出滤波电容。提出问题…

    2022年9月20日
    0
  • python-元组,字典,列表

    python-元组,字典,列表

    2021年5月17日
    106
  • dom4j修改xml文件

    dom4j修改xml文件

    2021年9月13日
    182
  • 零基础学Java(13)方法参数[通俗易懂]

    零基础学Java(13)方法参数[通俗易懂]前言首先回顾一下在程序设计语言中关于如何将参数传递给方法的一些专业术语。按值调用表示方法接收的是调用者提供的值。而按引调用表示方法接收的是调用者提供的变量地址。方法可以修改按引用传递的变量的值,而不

    2022年8月7日
    7
  • 皮尔森相关系数(Pearson correlation coefficient)「建议收藏」

    皮尔森相关系数(Pearson correlation coefficient)「建议收藏」概述定义物理意义皮尔森距离机器学习中的应用代码实现概述皮尔森相关系数也称皮尔森积矩相关系数(Pearsonproduct-momentcorrelationcoefficient),是一种线性相关系数,是最常用的一种相关系数。记为r,用来反映两个变量X和Y的线性相关程度,r值介于-1到1之间,绝对值越大表明相关性越强。定义总体相关系数ρ定义为两…

    2022年4月20日
    596
  • java中scanner是什么意思_java中Scanner是什么?怎么用?

    java中scanner是什么意思_java中Scanner是什么?怎么用?在java中有一种类可以获取我们输入的信息,这也是java中的新特征,有小伙伴知道这是什么类吗?小编最近在学Scanner类,发现还需要结合正则表达式一起使用,这对我们以前知识的掌握来说,得有比较好的基础才能完成。下面我们就一起看看Scanner类如何在java中使用吧。1.概念一个可以使用正则表达式来解析基本类型和字符串的简单文本扫描器。2.语法Scanners=newScanner(S…

    2022年7月21日
    13

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

关注全栈程序员社区公众号