漏洞可解释性定位

利用可解释性做定位,用可解释的方法来做定位。

首先在建模的时候要包括能体现漏洞的特征,结合污点分析的原理,可以这样说,如果在source和sink中间没有sanitizer操作,这才可能会导致漏洞发生,数据完整性或数据私密性被破坏。

都说借助自然语言的处理方法来对程序处理,是为了程序的语义信息。可是,程序的语义到底是指什么信息。一般来说语义信息是指,符号所表示的含义(具体的内容)。那么程序中的语义可以说是程序中的符号的含义。程序中的符号可以分为以下几种,操作符,分隔符,标识符,关键字。

对于操作符来说,类似于加减乘除这一类的算术运算,或是与或非的逻辑运算等等,这些符号的含义比较明确,基本上不会出现一个符号在不同的场景会有不同的意思,而且符号的形式相对是固定的。对于分隔符,比如括号,分号,空格,引号等,这些符号的形式和含义也相对来说比较固定。然而,对于标识符来说,这个语义信息则是多变万化的,编程人员根据自己的需要可以编写出各式各样的函数名和变量名。这些名字当然目的是为了辅助编程人员更好的来理解代码的功能。那么这些语义信息对安全人员来找漏洞是什么样的帮助呢?我觉得主要就是来理解程序功能,理清代码逻辑。如果同样将程序源码转换成只用ABCD这样的字母符号来替换所有的函数名,变量名,整个程序的功能不会变。因为程序的功能不会由同一变量name A变为name B而发生改变。但是此时变量A和变量B在命名上的语义就不同了。比如当我们来对内存型漏洞进行分析,我们首先会找程序中能对内存进行操作的敏感操作。这些可以称之为内存操作,当然我们是通过其的命名来识别的,比如memcpy等等,又或者对指针的一些操作。这些操作带给我们的反应应该是这样的。

我们举一个栈溢出的例子。栈溢出是指在内存栈中的数据发生了越界到了不属于其的内存地址。栈结构是在函数调用时系统自动开辟的内存空间,按照一定的数据进出顺序进行排列。因此,我们首先要找到能发生溢出的危险操作,比如数组循环赋值,内存拷贝等等。那我们是如何来理解这些操作的具体含义的?如果是调用了库函数来进行,比如memcpy,strcpy等等,这些函数本身的含义是我们所熟知的,不看其源码,只通过函数名也能知道其功能;但是如果同样是这些函数,将其封装换个其它的函数名比如,Hugememorycopy,Longstringcopy后,这些函数名并不是标准的库函数名,虽然函数名有辅助理解的作用,但不看其源码不能准确的知道其功能。所以函数名的语义信息,是在我们已有某些库函数功能的准确认识上(这里可以理解为已有的确定知识),来辅助我们对非库函数的功能理解。包括我们对程序源码进行理解,那也是


构建一个句子的特征矩阵,这些特征包括,是否为函数调用,是哪种函数调用;是否为赋值操作,为哪种赋值操作;是否为变量声明。


当我们已经知道该程序有漏洞时,用打补丁前后的源码做比对进行漏洞定位。补丁前后的差异就是漏洞所在点。如果直接将这些漏洞片段选出来,将一类漏洞的片段(从source点到sink点之间的所有语句)作为一个类别,通过训练来提取这些共同特征向量。

分别用补丁前后的程序来训练神经网络,

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值