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

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

大家好,又见面了,我是你们的朋友全栈君。如果您正在找激活码,请点击查看最新教程,关注关注公众号 “全栈程序员社区” 获取激活教程,可能之前旧版本教程已经失效.最新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)
全栈程序员-站长的头像全栈程序员-站长


相关推荐

  • 苹果x充电慢是什么原因_苹果手机充不进去电?什么原因?怎么解决?

    突然发现苹果手机充不进电了?难道是手机坏了?还是其它方面的原因呢?今天蜜罐蚁小编给大家介绍一个有关苹果手机使用方面生活小妙招。下面是几种常见苹果手机充不进电原因总结。1、充电线损坏不知道是不是有一些朋友像小编一样,家里的苹果手机原装充电线早就找不到了,从网上买的数据线,结果这种网上买的数据线不耐用,用了几次发现就不好用了,怎么充电都没反应。这种情况就只能更换一根新的数据线了。2、充电器损坏其实这个…

    2022年4月7日
    327
  • 首选dns服务器地址最快,各地首选dns地址大全【图解】

    首选dns服务器地址最快,各地首选dns地址大全【图解】又是dns,小编最近写了好多关于dns的话题。当然小编今天写的与以往也略有不同,今天小编来告诉大家我们中国各地首选的dns地址各是什么。首选dns地址,顾名思义是是我们电脑上网时首选的地址。如果我们想要查看,我们就打开我们电脑的网络设置,然后就可以看到我们的首选电脑上地址了。下面就是小编为大家整理的各地首选dns地址了。天津市首选DNS:202.99.104.68重庆市首选DNS:61.128….

    2022年6月12日
    104
  • 静态变量存储在那个区? – 转[通俗易懂]

    静态变量存储在那个区? – 转[通俗易懂]一时间忘咯然后就去转载..静态变量存储在__区A全局区B堆C栈D常量区参考答案:A知识点内存到底分几个区?1、栈区(stack)—由编译器自动分配释放,存放函数的参数值,局部变量的值等。2、堆区(heap)—一般由程序员分配释放,若程序员不释放,程序结束时可能由os回收。注意它与数据结构中的堆是两回事,分配方式倒是类似于链表。3、全局区(静态区)(static)—全局变量和静态变量的存储是放在一块的,初始化的全局变量和静态变量在一块区域…

    2022年6月14日
    43
  • Linux常用命令:chmod修改文件权限 777和754

    Linux常用命令:chmod修改文件权限 777和754常用下面这条命令:chmod777 文件或目录示例:chmod 777/etc/squid运行命令后,squid文件夹(目录)的权限就被修改为777(可读可写可执行)。如果是Ubuntu系统,可能需要加上sudo来执行:sudochmod 777/etc/squid故事的开始,都会先留一个悬念。只有程序员能懂的冷笑话系列中,有个比较经典的段子:请用最简洁的语言描述我国FL。754。…

    2022年7月27日
    5
  • 在CodeBlocks 开发环境中配置使用OpenCV (ubuntu系统)「建议收藏」

    在CodeBlocks 开发环境中配置使用OpenCV (ubuntu系统)

    2022年1月20日
    58
  • JVM、JRE和JDK的区别 及 环境变量的作用 什么是垃圾回收机制

    JVM、JRE和JDK的区别 及 环境变量的作用 什么是垃圾回收机制

    2021年9月29日
    55

发表回复

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

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