通过混合编程分析的方法和机器学习预测Web应用程序的漏洞

由于时间和资源的限制,web软件工程师需要支持识别出有漏洞的代码。一个实用的方法用来预测漏洞代码可以提高他们安全审计的工作效率。在这篇文章中,作者提出使用混合(静态和动态)代码属性来识别输入验证和输入检查的代码模式以用来标识web应用程序的漏洞。因为静态和动态程序分析相互补充,因此经常通过这种方法来提取合适的属性。现在的漏洞预测技术依靠带有数据标签的漏洞信息进行训练。对于很多真实的应用,过去的漏洞数据经常获取不到,或者至少不能完全地获取。因此为了解决获取过去数据漏洞的问题,作者同时使用监督学习和半监督学习的方法来构建基于混合代码属性的漏洞预测系统。半监督学习的方法从来没有在这个领域进行运用,作者给出了如何有效的使用该方法来进行预测。作者在7个开源的项目中进行评估。在交叉验证的过程中,监督学习的模型实现了平均达到77%的召回率,在预测SQL注入,跨站脚本攻击,远程代码执以及文件漏洞中存在5%的错误率。在小的标签数据量下,同监督学习的模型相比,半监督学习平均提高了24%的召回率,和降低了3%的错误率。因此建议半监督学习用于现实生活中很多漏洞数据缺失情况。

Web应用中常见漏洞有

SQL注入,

跨站脚本攻击,

远程代码执行,

文件包含

SQL注入:

SQL注入漏洞发生在用户输入数据查询的时候没有进行适当的查询。它允许攻击者使用技巧来来获取未授权的数据。

跨站脚本攻击:

百度百科的解释: XSS又叫CSS  (Cross Site Script) ,跨站脚本攻击。它指的是恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意用户的特殊目的。

远程代码执行:

远程代码执行允许攻击者可以随意的在服务端上执行应用程序代码。允许以管理员的身份执行远程代码。

文件包含漏洞:

文件包含,包括本地文件包含(Locao file inclusion, LFI)和远程文件包含(Remote File Inclusion,RFI)。首先本地文件包好就是通过浏览器引进(包含)Web服务器上的文件,这种漏洞一般发生在浏览器包含文件时没有严格的过滤,允许比那里目录的字符注入浏览器并执行(比如:asp?file=index.html)。这类漏洞看起来并不严重,一旦被恶意利用则会带来很大的危害。本地文件包含不仅能够包含web文件目录中的一些配置文件(比如Web应用,数据配置文件,config文件),还可以查看一些Web动态页面的源代码,为攻击者进一步发掘web应用漏洞提供条件。

常用的检测方法有

static taint analysis:Static taint analysis approaches are scalable in general but are ineffective in practice due to high false positive rates.

dynamic taint analysis: can be highly accurate, but have scalability issues for large systems due to path explosion problem.

modeling checking

symbolic

concolic testing

Shin et al: scalable vulnerability prediction approaches.

但是现在预测方法是粗粒度的,他们在软件模块或者组件的级别进行预测。

从web开发人员的角度来看,输入验证和输入检查是两个安全的代码技术用来防止出现这样的漏洞。

输入验证:数据的长度,范围,类型和符号。

输入检查:只接受预先定义的字符,拒绝其他字符(包括字符对于解释器有特殊的含义)

从直观上看,如果开发人员没有实现正确的实现这些技术或者没有在一定程度上实现这些技术,那么应用将会存在漏洞。

从上面的角度来看,混合(静态和动态)代码属性来识别输入验证和输入检查的代码模式以用来标识web应用程序的漏洞

基于以上的假设,作者提出了一系系列代码属性称为(input validation and sanitization IVS属性)

通过这些可以构建漏洞预测模型,这个模型是细粒度的,准确的,可扩展的。因为是在语句级别进行识别所以是细粒度的。

作者同时使用静态的和动态的分析技术进行IVS属性的提取。静态分析方法可以帮助获取程序的通用属性。动态分析方法可以作为静态方法的互补,来获取更加细节的代码。使用动态方法仅仅是用来获取属性,而不是用来判判断他们的正确性。获取完属性后再通过机器学习的方式来进行漏洞的预测。

漏洞预测框架如下图所示

漏洞测试框架主要由两个组成部分构成

混合程序分析:对于每一个安全铭感点(sink),会有一个后台的静态分析程序分析安全铭感点(sink)的语句和变量通过混合程序分析的方法获取上面提到的IVS属性

创建漏洞预测模型:通过这些属性基于监督学习以及半监督学习的方法进行模型的构建。

混合程序分析

混合程序分析是基于控制流图(control flow graph,CFG),程序依赖图(program dependence graph,PDG),系统依赖图(system dependency graph,SDG)对web应用程序进行编程。控制流图中的每一个节点代表一个源代码语句。

安全铭感点(sink)是控制流图中的一个节点使用的变量是来自外部,因此可能遭受到攻击。这允许我们在语句级别预测漏洞。Input nodes是一个节点用来获取外部数据。一个变量是污点(tainted)如果它是定义来自输入的节点。

漏洞测试框架的第一步是通过程序切片的方法对每一个安全铭感点k和安全铭感点使用的污点变量。切片<K,V>包含了可能影响节点k的变量值V的所有的节点(包括预测的节点)。

关于安全铭感点以及切片论文给出了一个例子

在安全铭感点7以及安全铭感点10对污点变量进行切片操作得到了如下图所示的控制流图。切片技术去除了与感兴趣的程序点无关的,不能影响到程序点变量取值的语句,因此消减了程序规模。

典型的一个web应用程序获取输入的内容,并且通过污点变量进行传播来执行将来程序的逻辑。这些操作可能包括铭感的程序操作比如数据库更新,HTML输出,文件获取。如果程序变量传递输入的数据在安全铭感点没有经过适当的检查,就可能引发漏洞。因此为了防止web应用程序的漏洞,开发人员在安全铭感点的路径会加入输入验证和检查。默认输入到应用程序的内容是字符串。输入验证和输入检查主要是针对字符串的操作。这些操作包括语言内置的方法,比如mysql_real_escape_string。字符串替换和字符串匹配方法,比如str_match以及正则表达式。

我们试图回答如下的问题"给出了安全敏感点的切片,是否可以从输入的类型和数量,以及输入验证以及输入检查方法的类型和数量,来对安全敏感点进行预测?"

对于属性的提取分析经过下面两个步骤:

步骤1:提取安全铭感点的所有可能结果。为了避免无限的可能性,只对循环提取一次,比如在上图中只有一条路径,有两条路径。

步骤2:对于每一个提取的路径根据IVS属性进行分类。分类是通过强制的静态分析以及可选的动态分析。

强制静态分析:我们对每一条路径根据IVS进行分类。一些标准的安全函数以及一些内建的函数以及操作可以准确的进行分类。下面进行举例说明,在上面的PHP代码中:

语句4,根据POST可以得出是一个输入类型。语句8,语句(.)对输入的数据进行了操作,因此我们可以将(.)分类为污点传播类型。

下面可以举另一个例子,在图3中,安全铭感点7和安全铭感点10都包含了路径的标准安全函数。因为安全铭感点7只有一条路径,因此只需要静态分析。

语句5中,is_numeric()被用来验证是否为数字。Mysql_real_escape被用来去除特殊的字符。根据内置的方法,我们可以将它们进行静态的分类。

可选的动态分析:如果路径包含非标准的安全函数以及内置的函数,比如复杂的正则表达式,函数的目的不能使用静态分析进行简单的推断,因此就需要使用动态的分析方法分析路径。

有一个数据维护着不同类型的测试用例。测试用例是由不同类型的攻击字符串包含着恶意字符。

在动态执行和分析的过程中,首先会从路径中提取代码,然后根据提取的代码生成测试代码。如下图所示

对于IVS每一种类型在数据库中都有相应的测试代码,如果测试代码不能通过,就可以将其分类到该类别中。

建立预测模型

数据表示

因为我们再表1中提出了33个IVS属性,因此对于数据流图中的每一条路径都可以表示成一个33维的属性向量。下图展示了安全敏感点7和安全铭感点10在它们的路径中提取的属性。最后一列是用来标识在给定的路径中是否存在漏洞,用来进行预测。

数据预处理

剔除一些相关性比较小的特征

监督学习方法

根据提供的属性论文采取了逻辑回归和随机深林的方法进行分类。

逻辑回归

是安全铭感点在路径A下存在漏洞的条件概率。

是IVS属性。

是参数,可以通过梯度下降的方法进行求解

随机森林:随机森林(Random Forest)是Bagging的一个扩展变体。RF在以决策树为基学习器构建Bagging集成的基础上,进一步在决策树的训练过程中引入了随机属性选择。具体来说,传统决策树在选择划分属性时是在当前节点的属性集合(假设有d个属性)中选择一个最优属性,而在RF中,对基决策树的每个节点,先从该节点的属性集合中随机选择一个包含k属性的子集,然后再从这个子集中选择一个最优属性用于划分。这里的参数k控制了随机性的引入程度:若令k=d,则基决策树的构建与传统决策树相同;若令k=1则是随机选择一个属性用于划分;一般情况下,推荐值

进行预测:对于一个新的没有标签的web程序,可以混合编程的分析方法获取代码属性IVS,再将IVS放入到训练好的模型中进行预测。

通过混合编程分析的方法和机器学习预测Web应用程序的漏洞的更多相关文章

  1. 批处理与python代码混合编程的实现方法

    批处理可以很方便地和其它各种语言混合编程,除了好玩,还有相当的实用价值, 比如windows版的ruby gem包管理器就是运用了批处理和ruby的混合编写, bathome出品的命令工具包管理器bc ...

  2. ARM中C和汇编混合编程及示例(转)

    在嵌入式系统开发中,目前使用的主要编程语言是C和汇编,C++已经有相应的编译器,但是现在使用还是比较少的.在稍大规模的嵌入式软件中,例如含有OS,大部分的代码都是用C编写的,主要是因为C语言的结构比较 ...

  3. mpi和cuda混合编程的正确编译

    针对大数据的计算,很多程序通过搭建mpi集群进行加速,并取得了很好的效果.算法内部的加速,当前的并行化趋势是利用GPU显卡进行算法加速.针对并行性非常好的算法,GPU加速效果将远大于集群带来的加速效果 ...

  4. QML与C++混合编程详解(转)

    原文转自:http://blog.csdn.net/ieearth/article/details/42243553 原文转自:https://www.cnblogs.com/findumars/p/ ...

  5. QML与C++混合编程详解

    1.QML与C++为什么要混合编程 QML与C++为什么要混合编程,简单来说,就是使用QML高效便捷地构建UI,而C++则用来实现业务逻辑和复杂算法,下面介绍了两者间交互的方法与技巧. 2.QML访问 ...

  6. 算法库:Matlab与C++混合编程

    算法库:Matlab与C++混合编程 最近做光流算法预演过程中,下载的源码中涉及到了Matlab和C++的混合编程.在同事Matlab2014的环境下,程序到是一下就运行通过了.但在我这Matlab2 ...

  7. FFT原理及C++与MATLAB混合编程详细介绍

    一:FFT原理 1.1 DFT计算 在一个周期内的离散傅里叶级数(DFS)变换定义为离散傅里叶变换(DFT). \[\begin{cases} X(k) = \sum_{n=0}^{N-1}x(n)W ...

  8. JAVA文件中获取路径及WEB应用程序获取路径方法

    JAVA文件中获取路径及WEB应用程序获取路径方法 1. 基本概念的理解 `绝对路径`:你应用上的文件或目录在硬盘上真正的路径,如:URL.物理路径 例如: c:/xyz/test.txt代表了tes ...

  9. web端常见安全漏洞测试结果分析-- appscan

    基于appscan测试结果分析: 一.XSS跨站脚本 指的是攻击者往Web页面里插入恶意html代码,通常是JavaScript编写的恶意代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被 ...

随机推荐

  1. bzoj 4756: [Usaco2017 Jan]Promotion Counting【dfs+树状数组】

    思路还是挺好玩的 首先简单粗暴的想法是dfs然后用离散化权值树状数组维护,但是这样有个问题就是这个全局的权值树状数组里并不一定都是当前点子树里的 第一反应是改树状数组,但是显然不太现实,但是可以这样想 ...

  2. noip2016 小结(ac两题+学习总结)

    NOIP2016考试小结 DAY 1 T1 题目描述 小南有一套可爱的玩具小人, 它们各有不同的职业. 有一天, 这些玩具小人把小南的眼镜藏了起来. 小南发现玩具小人们围成了一个圈,它们有的面朝圈内, ...

  3. P3297 [SDOI2013]逃考

    传送门 完全看不出这思路是怎么来的-- 首先对于两个亲戚,他们监视范围的边界是他们连线的中垂线.那么对于一个亲戚来说它能监视的范围就是所有的中垂线形成的半平面交 然后如果某两个亲戚的监视范围有公共边, ...

  4. TestNG设置用例循环执行

    曾经做过一需求,需要单个集成测试用例循环执行N次,或许你会说for循环就可以了,这当然是可以的.那有没有逼格更高点的方法,当然也是有的.下面我们就说下使用TestNG注解功能实现用例的循环执行. 1. ...

  5. 51nod1298 圆与三角形

    1298 圆与三角形 题目来源: HackerRank 基准时间限制:1 秒 空间限制:131072 KB 分值: 0 难度:基础题  收藏  关注 给出圆的圆心和半径,以及三角形的三个顶点,问圆同三 ...

  6. HTML DOM getElementById() 方法

    定义和用法 getElementById() 方法可返回对拥有指定 ID 的第一个对象的引用. 语法 document.getElementById(id) 说明 HTML DOM 定义了多种查找元素 ...

  7. 268 Missing Number 缺失的数字

    给出一个包含 0, 1, 2, ..., n 中 n 个数的序列,找出 0 .. n 中没有出现在序列中的那个数.案例 1输入: [3,0,1]输出: 2案例 2输入: [9,6,4,2,3,5,7, ...

  8. MVC学习-用EF做增删改查

    在做增删改查先,先介绍几个知识点: 1.代理类 在将对象方法EF数据上下文时,EF会为该对象封装 一个代理类对象, 同时为该对象的每一个属性添加一个标志:unchanged, 当对该对象某个属性进行操 ...

  9. Java编程思想读书笔记_第三章

    本章提到的关于==的部分,一个完整的实验如下: class Test { public static void main(String[] args) { Integer i = new Intege ...

  10. 重新学习Java——对象和类(二)

    上一节回归了如何以面向对象的思想去使用一些Java中的公共类,也设计了一些自己的类并介绍了设计类的基本方法和技巧,这一节我们将继续回顾这些内容,并争取从中获得新的体验和感受. 1. 静态域与静态方法 ...