目录

一、SAST

二、什么是SAST FPs

三、出现FPs的原因

四、如何尽可能避免SAST FPs


SAST(静态应用程序安全测试)是一种行之有效的应用程序安全测试技术,它有助于开发人员创建高质量和更安全的软件,以便抵御近年来越来越普遍的各种攻击。

然后,SAST最大的不足之处在于它往往会产生大量的假正例(False Positives),浪费开发团队大量的时间。接下来,我会介绍关于SAST FPs的一些基础知识,以及如何避免这些麻烦。

一、SAST

SAST是一种应用程序测试方法,它通过扫描源代码来发现潜在的设计缺陷,并利用静态程序分析来发现漏洞。在SAST中,我们不需要运行应用程序代码就可以进行扫描,因此SAST也被称为白盒测试。

SAST是AST(应用程序安全测试)中使用的几种方法之一,其他的还有DAST、IAST和SCA。(这部分内容具体的可以看我之前发的文章,这里就不赘述了)

在理想情况下,SAST在SDLC的早期阶段执行。通过将安全性左移,开发人员能够快速修复问题,而不会破坏架构,也不会将漏洞传递到开发后期阶段,这样可以有效的节约安全成本。

与DAST、IAST相比,SAST的一个最大的优点是能够几乎100%的识别代码库中的缺陷。例如,DAST无法检测到不恰当的加密,但SAST很容易就可以检测到。

二、什么是SAST FPs

尽管SAST有许多优点,但它不可避免的会产生较多的FPs(假正例)。

简单的来说,FPs看上去像漏洞但实际上并不是漏洞,或者直白的说就是误报。但考虑到信号检测论的相关知识,将FPs和误报直接画上等号并不严谨,不过从理解层面上来说二者几乎一致。为了更好的说明FPs的基本概念,让我们来看两个典型的例子。

1.一个SQL注入的示例:

final var allowedColumns = List.of(“col1”, “col2”, “col3”);if(allowedColumns.contains(userInput)){stmt.executeQuery(“SELECT ” + userInput + ” FROM table”)

在本例中,userInput是一个来自外部的字符串,这就是所谓的“受污染数据(taint data)”。这种数据很容易被攻击者控制,并且可能会导致SQL注入。

当这个受污染的数据到达一个可能造成损害的代码位置时,这里就被称为污染槽(taint sink)。在上面的代码中,executeQuery method就是SQL注入的污染槽。如果没有进一步的保护措施,攻击者可以通过userInput添加一个有害的字符串来攻击数据库,然后使用它来进行恶意攻击,比如删除所有用户、获得管理员权限等等。

通常,SAST工具检测是否存在到污染槽的路径,即污染流(taint flow)。如果存在,则报告检测到了一个漏洞。但是,如果对该流采取了一些措施,以便只有无害的数据可以到达接收器,那么实际上是没有漏洞的。这种措施被称为污染无害处理(taint sanitizers),即通过数据加密或者移除危害操作等手段使数据传播不再对系统的信息安全产生危害。通过这种方法,攻击者就不能使用有害字符串访问executeQuery调用。

一般来说sanitizers可以是一些典型的库函数,也可以是“自制”函数。在上述情况下,allowedColumns.include(userInput)充当的是sanitizers,它来检查userInput是不是被允许的字符串。

但是,在SAST的视角里,防止SQL注入的最佳方法是使用预处理语句。你在这里没有使用,所以它就认为这里存在漏洞。但实际上,你用了sanitizers不是吗,于是乎,FPs产生了。

2.特定的上下文漏洞:

安全工具根本无法预先知道某个软件是否足够敏感,需要身份验证和授权。因此,许多工具对每种类型的未经身份验证的访问都进行报告,这会产生FPs,但实际上这些访问时无害的。例如,对提供每日时间查找的软件的未经身份验证的访问可能并不是一个真正的漏洞。

三、出现FPs的原因

接下来我们可以来探讨FPs出现的真正原因了。

所有SAST工具产生的结果都可以分为四类:(为了方便理解,接下来的相关描述不与信号检测论进行区分,因为正如开头所说,它们在理解层面几乎一致)

1.True Positives(TPs):真正例、正确接受——正确识别存在的漏洞;

2.True Negatives(TNs):真负例、正确拒斥——正确识别不存在的漏洞;

3.False Positives(FPs):假正例、虚报——错误的认定某个漏洞存在,但实际上它并不存在;’

4.False Negative(FNs):假负例、漏报——未检测到漏洞的存在,但实际上它是存在的。

任何SAST工具的目标都应该是最大限度的增加TPs和TNs的数量,同时最大限度的减少FPs和FNs的数量。然而,从工程学的角度来说,这是不可能实现的。因此,工程师需要做出一个设计决策:他是否应该让SAST来产生更多的TPs,同时也产生更多的FPs?又或者他应该让SAST减少FPs,代价是错过一些TPs?

OWASP建立了一个免费和开源的Benchmark项目,它是一个示例应用程序,其中包含数千个可利用的漏洞,有些是真的,有些是假的。你可以运行各种SAST工具并对结果进行评分然后绘图:

理想状况下,最佳结果应该是在最左上角——表示最小的FPs和最大的TPs。但实际上,ROC是一条曲线,你永远无法达到最左上角。因此,FPs是不可避免的,而且为了实现较高的TPs,往往会导致较高的FPs。这也就是SAST扫描结果的实质——即TPs和FPs之间的动态平衡。

从外在表现形式来说,在SAST测试中,有两个主要的误报原因:

1.超过scanners的假设

为了支持好几种编程语言,一些SAST工具包含了太多的假设,在大多数情况下,这些假设是通用的,不能准确的应用于所有编程语言。

如果一些源代码对这些工具没有意义,或者缺少一个依赖项,那么SAST就会认为代码一定存在问题。因此,这些工具会产生大量的误报。

2.设计不当的规则

一些传统的SAST工具设计很差,不能准确的标记漏洞。为了弥补这一点,厂商为了安全起见,往往会将工具设置成即使只有一点点迹象表明可能存在问题,也会发出漏洞警报。

例如,一些SAST工具在字符串变量名中搜索某些单词,以确定它们是否包含敏感数据,如身份验证凭据、密钥和密码。让我们来看看下面的代码:

userPasswordLabel.Text = “Please enter your password”;

虽然变量名包含“password”,但这并不一定意味着它包含敏感信息。这可能只是个标签,如果SAST不能执行进一步的分析,已确定变量是否显示敏感数据,它很可能会产生FPs。

四、如何尽可能避免SAST FPs

1.选择一个好的工具

衡量一个SAST工具的最简单的方法就是用它的TPs去减FPs。但是,这一方法是不全面的,例如有这两个SAST工具,每个工具都与上文提到的OWASP项目进行对比检测:

A.检测出了10个TPs和3个FPs,准确率为70%;

B.检测出了100个TPs和30个FPs,准确率为70%。

尽管这两个工具的准确率得分相同,但你可能会偏爱其中的一款。因此,我们需要引入一些额外的指标,例如:

a.完整性:TPs与实际存在的漏洞总数之比。较高的完整性评分(理论上最大值为1)表明SAST工具能够检测应用程序中存在的更多问题,提供更好的代码可见性。

b.深度:指工具检测各种漏洞的能力。如果一款SAST工具支持大量的编程语言,并有一个全面的漏洞数据库,那它的覆盖深度是很好的。

2.定制规则

将定制的规则集应用于 SAST 工具将有助于减少误报的数量。使用工具的默认设置可能不适合组织的特定需要。如果您将 SAST 工具配置为您的首选项,它可以帮助检测正确的问题并最大限度地减少误报。实现一个没有自定义的工具可能会产生很多垃圾,这可能会让您错过困扰您的软件的真正问题。

3.过滤和优先排序

您还可以过滤掉对软件的健康无关紧要的结果。例如,您可以忽略来自组成“dead code”的软件部分或未被调用的包的结果。这将有助于根据对组织最重要的内容对测试结果进行优先排序。您可以根据威胁的严重程度、漏洞的状态以及解决问题的能力对它们进行优先排序。这将使您能够集中精力解决最关键的异常情况,而不是浪费精力处理影响很小或没有影响的问题。

如何在AppSec测试中处理SAST FPs相关推荐

  1. java如何保存初始化数据_java – 如何在JUnit测试中初始化数据

    我的任务是为服务层编写压力(负载)测试.主要是CRUD操作.我们使用JUnit作为测试框架,使用JUnitPerf构建负载测试,使用 Spring注入服务bean,使用hibernate访问数据库. ...

  2. java清除浏览器记录_java – 如何在Selenium测试中清除浏览器缓存

    我正在使用WebDriver运行我的Selenium测试.我正在用一些循环重复测试,所以现在我想在JAVA中开始新的测试之前清除缓存. @Test public void ffAndIe() thro ...

  3. selenium 示例_Selenium测试中所需的功能和示例

    selenium 示例 所需功能是用于声明一组基本要求(例如浏览器,操作系统,浏览器版本等的组合)的类,以对Web应用程序执行自动跨浏览器测试. 当我们尝试通过Selenium自动化测试来自动化测试脚 ...

  4. 硒测试中所需的功能和示例

    所需功能是用于声明一组基本要求(例如浏览器,操作系统,浏览器版本等的组合)的类,以对Web应用程序执行自动跨浏览器测试. 当我们尝试通过Selenium自动化测试来自动化测试脚本时,我们需要考虑这些组 ...

  5. junit测试起名字规则_如何在JUnit 5中替换规则

    junit测试起名字规则 最近发布的JUnit 5(又名JUnit Lambda) alpha发行版引起了我的兴趣,在浏览文档时,我注意到规则以及运行程序和类规则都消失了. 根据文档,这些部分竞争的概 ...

  6. 如何在JMeter负载测试中模拟不同的网络速度

    移动终于超越了桌面流量 - 这种趋势看起来有望上升.但这对我们意味着什么? 对于初学者来说,这意味着现在,我们比以往任何时候都更需要在运行性能测试时关注移动用户.如果我们的移动网站或应用程序表现不佳 ...

  7. Android单元测试读写文件,如何在Android单元测试中读取仅测试文件

    对于我的Android应用程序,我正在编写需要读取一些文件的单元测试. 由于这些是仅测试文件,因此我不希望它们出现在res文件夹中,因为我不希望它们最终出现在最终的.apk文件中. 我想做与此问题类似 ...

  8. 测试中如何管理外包质量_如何从测试自动化中实现价值

    如果几年前,质量管理部门都试图通过ROI指标来证明对测试的投资是合理的,那么现在情况发生了变化,是时候重新审视这个问题了.当实施连续测试,并且每天在不同的环境下以不同的角色运行多次测试自动化时,由于测 ...

  9. 如何在Tensorflow.js中处理MNIST图像数据

    by Kevin Scott 凯文·斯科特(Kevin Scott) 如何在Tensorflow.js中处理MNIST图像数据 (How to deal with MNIST image data i ...

最新文章

  1. 实现一个完美符合Promise/A+规范的Promise
  2. Java数据结构--有序表
  3. AWS S3宕机的启发: 云必须分散化
  4. python实现抓取必应图片设置桌面
  5. Linux文件的复制、删除和移动命令
  6. SpringBoot入门篇之properties中定义user.name失效解决
  7. Javascript表达式中连续的 和 || 之赋值区别
  8. 新增成功到编制为空bug_36 个JS 面试题为你助力金九银10
  9. CompTIA IT Fundamentals认证考试的相关信息【2018.06.05更新】
  10. 波形捕捉:(8)使用“捕捉缓冲区”
  11. 谁说Python慢来着?不用Python,这个问题难倒了无数的程序员
  12. 仪表指针样式_PPT标准图表太丑?试试仪表盘图表!
  13. cad字体安装_史上最全CAD字体库,3000+种字体!没有人能安装全!
  14. Python下载拼接地图
  15. CRACK小试牛刀:关于GALGAME银色遥远爆破记录
  16. 基于Python实现自然间断点批量处理
  17. 若琪智能音响Rokid硬件拆解及系统架构分析
  18. 天天爱跑步【NOIP2016 T4】
  19. 如何降低研究生硕士论文的查重率
  20. emmc和SPI共舞

热门文章

  1. servlet的认识和了解(3)
  2. 设计师:室内设计师的简介、工作内容、工作要求、设计常识(硬装/软装/榻榻米/马卡龙/地台/公共空间/玄关/闭水实验、家具知识(欧式雕花家具-欧式雕花家具)、室内设计常用尺寸之详细攻略
  3. 从现实世界的角度去理解计算机领域的知识
  4. golang: 密码中允许出现数字、大写字母、小写字母、特殊字符,但至少包含其中2种且长度在8-16之间(四种符号任意满足三种即可)
  5. 最近爆火的电子血氧仪是什么原理?测的准吗?
  6. php 序列化转义冒号,Json数据中有冒号以及其它特殊字符序列化总结
  7. 小米手机扩容教程_小米note手机扩容,16G升级64G
  8. linux单片机用什么数据库,基于ARM-Linux的SQLite嵌入式数据库的研究 -单片机-电子工程世界网...
  9. java从输入中获取经纬度_java从百度后台接口获取经纬度
  10. 云计算day04-Docker容器