软件代码漏洞的电子取证技术综述

2016-01-24 08:05印杰李千目
软件 2015年12期
关键词:信息安全

印杰++李千目

摘要:软件漏洞是当今信息系统最主要的安全漏洞来源。本文综述了软件漏洞的概念和特点,同时归纳和分析了当前主流的代码漏洞分类标准,在此基础上叙述了代码漏洞分析方法的技术原理和国内外的研究现状,并分析了常见的漏洞取证方法的优缺点。

关键词:软件漏洞;电子取证;信息安全

中图分类号:TP391.41

文献标识码:A

DOI:10.3969/j.issn.1003-6970.2015.12.012

本文著录格式:印杰,李千目.软件代码漏洞的电子取证技术综述[J]软件,2015,36(12):49-59

0 引言

软件漏洞是信息安全风险的主要根源之一,是网络攻防对抗中的重要目标,无论从国家层面的网络安全战略,还是社会层面的信息安全防护,安全漏洞已经成为信息对抗双方博弈的核心问题之一。2014年,国家信息安全漏洞库收集并公布漏洞6824个,高危漏洞2440个,比例逐步上升,相关报告显示境外有近7.3万个IP地址作为木马或僵尸网络控制服务器参与攻击我国境内主机,境内被控制主机数量高达1419万台,增幅近60%。信息安全形势不容乐观。

同时,针对源代码漏洞的取证成为构建安全体系的重要战略之一,国内信息安全体系的建立和实施需要安全平台的技术支持与安全管理的体系支撑,为了保障信息基础平台,有必要进行源代码漏洞取证的深入研究,来确保应用程序或者Web程序在信息平台上的安全性,而另一方面,对于源代码的漏洞取证研究已然不仅仅局限在PC端和Web层面上,随着移动互联网大力发展的趋势,国家对于Android,IOS等移动平台上的源代码漏洞取证也同样重视。因此,从某种程度上来说,源代码漏洞取证的研究工作对于信息基础平台的安全性保障十分重要。

1 软件漏洞

程序或硬件逻辑中设计和实现上的缺陷、人为设计和实现的隐蔽功能以及因使用管理不当造成的安全隐患统称为漏洞,其主要特征是被人利用后会造成控制权的部分或全部转移,往往使系统遭到非法操控或破坏,丧失合法控制权。

软件漏洞是当今信息系统绝大多数安全漏洞的来源。软件漏洞是软件中存在的一些缺陷,这些缺陷可以被第三方或程序利用来进行未经授权的资源访问,或改变控制权限来执行其他操作。软件漏洞轻则造成相应的经济或财产损失(如敏感信息被盗,不可用的服务),重则导致严重的灾难,尤其是发生在被人类生活和生计所依赖的关键基础设施的软件系统上(如核,生物,化学实验室,电网,水处理和分配系统,空中交通控制和交通信号系统)。

目前代码安全审查和白盒安全测试被广泛用于分析源代码并检测安全漏洞。可这些代码安全审查解决方案有很多不足(例如精度问题,产生大量的误报和漏报;可扩展性问题,为复杂的应用程序支持不足,无法处理的大型应用程序;适用性问题,需要大量的额外的人工操作的工作量等),导致它们无法广泛的为程序员或测试人员应用。

自动代码安全审查技术利用分析工具来执行所有的代码检查,这就避免了安全审查人员手动代码审查的过程,也节省了很多高度密集的工作量。但在自动代码安全审查实践中,会存在精度和可扩展性之间的权衡。目前有两种不同的解决方案:

(1)牺牲精确度,一些自动化代码审计工具利用字符串匹配或其它简单的方法来快速检查代码,但它会产生大量的误报和漏报。这些解决方案都是基于词法检查,只将检测危险库函数和系统调用的源代码中进行对比而没有进一步的分析,也就是RATS和ITS4语义分析。这是最简单的方法,但会产生大量的误报。例如,一个局部变量的名称包含strcat都可以导致错误的报警。

(2)其他一些基于模型检测的自动化代码审计工具,把更多的注意力放在了精密性而不是可扩展性。它们的程序经常要进行大量繁重的计算和分析,这就导致在处理大型应用程序时容易产生故障。

惰性抽象化技术展示了其不断建立和改善需求的单一的抽象模型,它通过模型检查器驱动,因此模型的不同部分可能会出现验证了终止性的不同精确度的检测方法。其他一些技术,如MOPS也存在不同的模型检测的解决方案,但模型检测的局限是,在进行核查过程中有很多的注释和谓词会被插入到程序中,整个过程都需要程序员的参与。同时,由于程序分析要消耗大量资源,处理大型应用程序的能力十分欠缺。

2 代码漏洞分类

2.1 通用弱点枚举CWE

通用弱点枚举(CWE,Common WeaknessEnumeration)是由美国国家安全局首先倡议的战略行动,该行动的组织发布了《CWE/SANS最危险的程序设计错误》,其中列举了最严重的25种代码错误,同时也是软件最容易受到攻击的点。这个列表是SANS学院、MITRE以及“美国和欧洲很多顶级软件安全专家”共同合作的成果。在CWE站点上列有800多个编程、设计和架构上的错误,CWE文档首先列举的是针对程序员最重要的25项,从而帮助他们编写更安全的代码。同时文档还适用于软件设计师、架构师、甚至CIO,他们应该了解这些可能出现的弱点,并采取恰当的措施。CWE是继CVE(Common Vulnerabilities andExposures)之后的又一个安全漏洞词典。通过这一词典,Mitre希望提供识别、减轻、阻止软件缺陷的通用标准。CWE也可以作为人们购买软件的安全衡量标准,尤其是在购买旨在阻止或发现具体安全问题的安全工具时。

跨站脚本攻击

跨站脚本攻击(Cross Site Scripting),为不和层叠样式表(Cascading Style Sheets,CSS)的缩写混淆,故将跨站脚本攻击缩写为XSS。恶意攻击者往Web页面里插入恶意html代码,当用户浏览该页之时,嵌入其中Web里面的html代码会被执行,从而达到恶意攻击用户的特殊目的。

SQL注入攻击

SQL注入攻击指的是通过构建特殊的输入作为参数传人Web应用程序,而这些输入大都是SQL语法里的一些组合,通过执行SQL语句进而执行攻击者所要的操作,其主要原因是程序没有细致地过滤用户输入的数据,致使非法数据侵入系统。

当应用程序使用输入内容来构造动态sql语句以访问数据库时,会发生sql注入攻击。如果代码使用存储过程,而这些存储过程作为包含未筛选的用户输入的字符串来传递,也会发生sql注入。sql注入可能导致攻击者使用应用程序登陆在数据库中执行命令。相关的SQL注入可以通过测试工具pangolin进行。如果应用程序使用特权过高的帐户连接到数据库,这种问题会变得很严重。在某些表单中,用户输入的内容直接用来构造动态sql命令,或者作为存储过程的输入参数,这些表单特别容易受到sql注入的攻击。而许多网站程序在编写时,没有对用户输入的合法性进行判断或者程序中本身的变量处理不当,使应用程序存在安全隐患。这样,用户就可以提交一段数据库查询的代码,根据程序返回的结果,获得一些敏感的信息或者控制整个服务器,于是sql注入就发生了。

缓冲区溢出

缓冲区溢出是指当计算机向缓冲区内填充数据位数时超过了缓冲区本身的容量,使得溢出的数据覆盖在合法数据上,理想的情况是程序检查数据长度并不允许输入超过缓冲区长度的字符,但是绝大多数程序都会假设数据长度总是与所分配的储存空间相匹配,这就为缓冲区溢出埋下隐患。操作系统所使用的缓冲区又被称为“堆栈”。在各个操作进程之间,指令会被临时储存在“堆栈”当中,“堆栈”也会出现缓冲区溢出。

通过向程序的缓冲区写超出其长度的内容,造成缓冲区的溢出,从而破坏程序的堆栈,造成程序崩溃或使程序转而执行其它指令,以达到攻击的目的。造成缓冲区溢出的原因是程序中没有仔细检查用户输入的参数。

跨站点伪造请求

CSRF(Cross-site request forgery跨站请求伪造,也被称为“one click attack”或者session riding,通常缩写为CSRF或者XSRF,是一种对网站的恶意利用。尽管听起来像跨站脚本(XSS),但它与XSS非常不同,并且攻击方式几乎相左。XSS利用站点内的信任用户,而CSRF则通过伪装来自受信任用户的请求来利用受信任的网站。与XSS攻击相比,CSRF攻击往往不大流行(因此对其进行防范的资源也相当稀少)和难以防范,所以被认为比XSS更具危险性。

不当的访问控制授权

假设一个给定的身份的用户,授权的过程是决定用户是否可以访问给定的资源,根据用户的权利以及任意的许可或者可以应用在资源上的特殊访问控制权限。

当访问控制的检查不一致或完全不做检查时,所有的用户都可以访问数据或执行数据,这是他们不应该被允许执行的操作。这可能会导致广泛的问题,包括信息的泄露,拒绝服务攻击,以及任意代码的执行。

在安全决策中信赖不被信任的输入

开发者可以假设诸如cookies,环境变量,表单隐藏域等这些输入不能被更改,然而,攻击者可以利用自定义的客户端或者其他的攻击来改变这些输入。这些改变可能不会被检测到。当诸如验证和授权等安全决策建立在这些输入的基础之上时,攻击者可以绕过软件安全实施攻击。

不当地将路径名限制为受限的目录(路径穿透)

许多文件的操作是试图是在一个受限制的目录中发生。通过使用特殊的元素,如“..”和“/”分隔符,攻击者可以跳出限制访问系统其他地方的文件或目录。最常见的一种特殊的符号是“../”,这在大多数现代操作系统被解释为当前位置的父目录,这属于相对路径遍历。遍历路径还包括使用绝对路径名如“/usr/local/bin”,这也可能是有用的文件意外访问,这属于绝对路径遍历。

在许多程序设计语言中,一个空字节注射(0或NULL字符)可以让攻击者截断生成的文件名来扩大攻击范围。例如,该软件可以添加“.txt”到任何路径,从而限制了攻击者的文本文件,但空字符注射可有效去除这个限制。

对危险类型文件的上载不加限制

对文件的上传不做检查,不加以限制,攻击者可以利用这一漏洞上传含有恶意代码的文件,从而执行恶意命令,对服务器产生破坏,甚至获取到操作权限,重要的数据,必须对上传的文件类型加以限制以防止此类攻击产生。

OS命令注入

允许攻击者执行意外的,直接作用在操作系统上的危险命令。这个缺点可以导致系统环境中,这个漏洞会导致原本无法直接进入操作系统的攻击者找到一个易被破坏的环境,比如web应用程序,如果缺陷发生在一个有特权的程序,它可以允许攻击者使用通常不能被访问的命令或者攻击者原本没有权利执行的命令。问题是如果过程不遵循最小特权原则,攻击者控制命令可以运行特殊的系统特权,增加系统的伤害量。

缺少对敏感数据的加密

对诸如登陆密码等敏感数据采用明文的方式存储,攻击者可能会通过内部攻击获取到这些数据,采用安全的加密算法加密敏感数据总是正确的,以防止攻击者通过各种攻击方式获取到关键数据源。

使用硬编码的证书

硬编码证书通常会产生一个显著的漏洞,该漏洞允许攻击者绕过软件管理员配置的认证。该漏洞对系统管理员来说难以检测。即使检测到了也难以修复,这样一来,系统管理员不得不被迫停止产品的使用。

使用不正确的长度值访问缓冲区

这类漏洞是相当不安全的,因为使用错误的数据访问缓冲区容易造成严重的后果,如缓冲区溢出攻击,对缓冲区的使用一定要谨慎小心,在编写程序时,你需要考虑到内存管理以及堆栈的问题,使用过长的值访问缓冲区,造成越界的错误可能引发意想不到的后果。

PHP文件包含漏洞

文件包含漏洞即当程序员在包含文件的过程中引入了外部提交的数据参与包含的过程所产生的漏洞,这个漏洞是目前Web攻击中最利用率最高的一个漏洞,攻击者可以轻松获取服务器的访问权限(即拿到webshell)。而文件包含通常又有本地文件包含(Local File Inclusion)和远程文件包含(Remote File Inclusion)之分。allow_url_fop en和allow_url_include是决定包含属于本地文件包含(LFI)还是远程文件包含(RFI)的条件,在PHP4中则只有一个allow_url_fop en选择。其中allow_url_fopen和allow_url_include为On的情况为远程文件包含漏洞,相反为本地文件包含漏洞。

对数组索引检查不当

对数组的索引检查不当,访问了超出数组长度的索引,引发未知的错误,在编写程序时,没有对索引变量进行检查,误以为访问数组没有越界,在程序运行时产生错误的结果,抛出意外的异常,甚至产生破坏。同样攻击者可以利用这点构造缓冲区溢出的攻击。

对非正常或异常的条件检测不当

程序员可能会认为某些事件或者条件永远不会出现,所以不需要担心这类情况发生,比如内存不足,由于权限限制缺少对资源的访问,或者行为不端的客户端或组建等情况。然而,攻击者可能会试图触发这些不寻常的条件,从而破坏程序程序员原有的设想并引起异常,错误的行为或者对程序产生破坏。

通过错误消息透露信息

敏感信息可能是对自己有价值的信息(如密码),或者可以利用它发起更致命的攻击。如果攻击失败,攻击者可以使用服务器提供的的错误信息发起集中攻击。例如,试图利用一个路径遍历的弱点(cwe-22)可能产生应用程序的安装全路径。反过来,这可以用来选择“..序列定位到目标文件的适当数量。使用SQL注入攻击(cwe-89)可能最初不能成功,但显示畸形查询的一个错误消息,并将在查询中使用的查询逻辑甚至密码或其他敏感信息暴露JLH来。

整型溢出和环绕

整型溢出顾名思义,就是由用户提交的整型数据超出程序内部对整型数的安全要求,造成违反原来的程序限制,导致其他类型的溢出。一般来说,整型溢出并不能直接导致改变程序流程,它是由整型溢出造成字符串类型的溢出,从而导致覆盖系统数据结构,改变程序流程。值得注意的就是程序内部对整型数的安全数据范围要求,而不是仅仅字符串数据范围的要求,这是整型溢出的根本原因。

对缓冲区大小计算错误

对缓冲区的大小计算错误,产生潜在的漏洞风险,开发者在设计程序时没有考虑到要分配缓冲区的合理大小,分配了一个不恰当或者较小的内存空间,在面对精心构造的数据时,可能会产生缓冲区溢出,淹没原有的数据。攻击者可以利用该漏洞构造缓冲区溢出攻击。

缺少对重要功能的授权

对于一些重要的功能,如管理用户日志,管理备份数据等系统功能,没有设置权限检测,导致一些重要功能被除管理员以及更高级别的用户访问外,能被攻击者以某些方式访问甚至恶意修改,恶意删除。对于系统重要功能,需要授权访问,保证关键数据不会被泄露和恶意篡改。时刻保持对敏感数据访问源的可信度进行授权检查,以确保系统重要功能的使用安全。

下载代码却不做完整性检查

攻击者可以通过影响主机服务器执行恶意代码,如DNS欺骗,或者在传输中修改代码。对于手机应用的代码最为普遍,尽管在任何管理自己的更新的软件中都可能存在。攻击者可以通过修改下载源的代码,使得用户下载并执行了被精心修改过的代码,从而产生严重后果。

对重要的资源赋值不当

当资源被授权获得更大的被请求访问范围时,可能会使得敏感数据暴露,或者资源被意外的方式所修改,当该资源和程序的配置以及用户的敏感数据相关联时,这是非常危险的行为。

分配资源却不做限制和调节

在预定的安全策略中,给相关请求分配资源不做限制和调节,可能会导致资源抢占,资源耗尽,或者死锁的情况产生。攻击者可以通过对某一重要资源的请求使得该资源被过度使用,从而使得系统瘫痪。而对于内建资源管理的程序,此类问题可以有效避免。

重定向到不受信任站点的URL(开放重定向)

一个http参数可能含有URL值并且可能造成Web程序重定向到这个特殊的URL参数请求。通过修改URL的值到一个恶意站点,攻击者可以成功的启用挂马窃取用户的机密信息。而因为修改后的服务器名和原战点链接相同,使得这种钓鱼网站有更高的可信度,从而产生更大的危害。

使用被破解或者有风险的加密算法

使用不标准的加密算法或者有风险的加密算法对数据加密,攻击者可以通过字典构造或者其他相对的破解算法对加密数据进行破解,诸如一些被技术所攻破的算法不要使用,对敏感数据的加密要使用更为安全和复杂的加密算法。

竞争条件

在安全关键代码中进行预期同步,诸如对记录用户是否被授权认证或者修改重要的敏感信息不应爱由外部人员所影响。竞争条件发生在并行环境,并有效地作为适当的代码序列属性。竞争条件违反这些属性:独一无二的代码序列进行资源共享,即独占访问,没有其他的代码序列可以在原始序列完成执行修改的共享资源的特性。竞争条件存在时,一个“干扰码”仍然可以访问共享资源,违反垄断。程序员可能会假定某些被干扰码序列影响的代码序列执行太快;当竞争条件不在的时候,这违反了原子行为。例如,单一的“X++”的声明可能会出现在原子代码层,但它实际上是在非原子的指令层,因为它涉及到一个读取(原始值X),随后计算(x+1),其次是写入(保存结果到X)。干扰码序列可以是“可信的”或“不可信的”。一个可信的干扰码序列发生在程序中且它不能被攻击者修改,它只能间接地被使用。一个不受信任的干扰码序列可以直接编写攻击命令,产生的通常是脆弱的程序。

2.2 开放式Web应用程序安全OWASP

开放式Web应用程序安全项目(OWASP,Open Web Application Security Project)是一个非盈利组织,不附属于任何企业或财团,因此由OWASP提供和开发的所有设施和文件都不受商业因素的影响。它提供有关计算机和互联网应用程序的公正、实际、有成本效益的信息。其目的是协助个人、企业和机构来发现和使用可信赖软件。OWASP支持商业安全技术的合理使用,它有一个论坛,在论坛里信息技术专业人员可以发表和传授专业知识和技能。

OWASP目前全球有130个分会近万名会员,其主要目标是研议协助解决Web软体安全之标准、T具与技术文件,长期致力于协助政府或企业了解并改善网页应用程式与网页服务的安全性。由于应用范围日广,网页应用安全已经逐渐的受到重视,并渐渐成为在安全领域的一个热门话题,在此同时,黑客们也悄悄的将焦点转移到网页应用程式开发时所会产生的弱点来进行攻击与破坏。

2013年版的OWASP Top 10文档所基于的8个数据组由7家专业的应用安全公司提供,其中包括:4家咨询公司,3家产品OR SaaS提供商(其中,1家提供静态工具,1家提供动态工具,1家两者都提供)。数据涵盖了来自上百家组织上千个应用,超过500,000个漏洞。Top 10根据所有这些相关数据挑选和排序,并与可利用性、可检测性和影响程度的一致评估相结合。OWASP Top 10的首要目的是培训开发人员、设计人员、架构师、经理和企业组织,让他们认识到最严重的web应用程序安全漏洞所产生的后果。Top 10提供了防止这些高风险问题的基本方法,并提供了获得这些方法的来源。

注入

注入攻击漏洞,例如SQL,OS以及LDAP注入。这些攻击发生在当不可信的数据作为命令或者查询语句的一部分,被发送给解释器的时候。攻击者发送的恶意数据可以欺骗解释器,以执行计划外的命令或者在未被恰当授权时访问数据。

任何能够向系统发送不信任数据的人都是潜在的攻击者,包括外部用户,内部用户和管理员。攻击者利用有针对性的解释器语法发送简单的、基于文本的攻击。几乎任何数据源都能成为注入载体,包括内部来源。注入漏洞发生在应用程序将不可信的数据发送到解释器时。注入漏洞十分普遍,尤其是在遗留代码中。通常能在SQL查询语句、LDAP查询语句、Xpath查询语句、OS命令、XML解析器、SMTP头、程序参数等中找到。注入漏洞很容易通过审查代码发现,但是却不容易在测试中发现。扫描器和模糊测试工具可以帮助攻击者找到这些漏洞。注入能导致数据丢失或数据破坏、缺乏可审计性或是拒绝服务。注入漏洞有时甚至能导致完全主机接管。所有的数据都有可能被偷窃,篡改和删除。

失效的身份认证和会话管理

与身份认证和会话管理相关的应用程序功能往往得不到正确的实现,这就导致了攻击者破坏密码、密匙、会话令牌或攻击其他的漏洞去冒充其他用户的身份。

任何匿名的外部攻击者和拥有账号的用户都可能试图盗取其他用户账号。同样也会有内部人员为了掩饰他们的行为而这么做。攻击者使用认证或会话管理功能中的泄露或漏洞(比如暴露的帐户、密码、或会话ID)来假冒用户。开发者通常会建立白定义的认证和会话管理方案。但要正确实现这些方案却很难,结果这些自定义的方案往往在如下方面存在漏洞:退出、密码管理、超时、记住我、秘密问题、帐户更新等等。因为每一个实现都不同,要找出这些漏洞有时会很困难。这些漏洞可能导致部分甚至全部帐户遭受攻击。一旦成功,攻击者能执行受害用户的任何操作。因此特权帐户是常见的攻击对象。需要考虑受影响的数据及应用程序功能的商业价值。还应该考虑漏洞公开后对业务的不利影响。

跨站脚本

当应用程序收到含有不可信的数据,在没有进行适当的验证和转义的情况下,就将它发送给一个网页浏览器,这就会产生跨站脚本攻击(简称XSS)。XSS允许攻击者在受害者的浏览器上执行脚本,从而劫持用户会话、危害网站、或者将用户转向至恶意网站。

任何能够发送不可信数据到系统的人,包括外部用户、内部用户和管理员。攻击者利用浏览器中的解释器发送基于文本的攻击脚本。几乎所有数据源都能成为攻击媒介,包括内部数据源比如数据库中的数据。XSS是最普遍的web应用安全漏洞。当应用程序发送给浏览器的页面中包含用户提供的数据,而这些数据没有经过适当的验证或转义(escape),就会导致跨站脚本漏洞。有三种已知的跨站漏洞类型:1)存储式;2)反射式;3)基于DOM的XSS。大部分跨站脚本漏洞通过测试或代码分析很容易找到。攻击者能在受害者的浏览器中执行脚本以劫持用户会话、破坏网站、插入恶意内容、重定向用户、使用恶意软件劫持用户浏览器等等。考虑受影响的系统及该系统处理的所有数据的商业价值。还应该考虑漏洞公开后对业务的不利影响。

不安全的直接对象引用

当开发人员暴露一个对内部实现对象的引用时,例如,一个文件、目录或者数据库密匙,就会产生一个不安全的直接对象引用。在没有访问控制检测或其他保护时,攻击者会操控这些引用去访问未授权数据。

考虑系统的用户类型。对于某些系统数据类型,是否有的用户只具有部分访问权限。作为授权的系统用户,攻击者只需要修改指向一个系统对象的直接引用参数值,让其指向另一个无权访问的对象,系统是否会允许这样的访问。当生成web页面时,应用程序经常使用对象的实名或关键字。而应用程序并不会每次都验证用户是否有权访问该目标对象,这就导致了不安全的直接对象引用漏洞。测试者能轻易操作参数值以检测该漏洞。代码分析能很快显示应用程序是否进行了适当的权限验证。这种漏洞能破坏通过该参数引用的所有数据。除非对象引用是不可预知的,否则攻击者很容易访问该类型的所有数据。考虑暴露的数据的商业价值。还应该考虑漏洞公开后对业务的不利影响。

安全配置错误

好的安全需要对应用程序、框架、应用程序服务器、web服务器、数据库服务器和平台定义和执行安全配置。由于许多设置的默认值并不是安全的,因此,必须定义、实施和维护这些设置。这包含了对所有的软件保持及时地更新,包括所有应用程序的库文件。

考虑外部的匿名攻击者和拥有自己帐户的内部用户都可能会试图破坏系统的。另外考虑想要掩饰他们的攻击行为的内部攻击者。攻击者访问默认帐户、未使用的网页、未安装补丁的漏洞、未被保护的文件和目录等,以获得对系统未授权的访问或了解。安全配置错误可以发生在一个应用程序堆栈的任何层面,包括平台、Web服务器、应用服务器、数据库、框架和白定义代码。开发人员和系统管理员需共同努力,以确保整个堆栈的正确配置。自动扫描器可用于检测未安装的补丁、错误的配置、默认帐户的使用、不必要的服务等。这些漏洞使攻击者能经常访问一些未授权的系统数据或功能。有时,这些漏洞导致系统的完全攻破。系统可能在你未知的情况下被完全攻破。你的数据可能会随着时间推移被全部盗走或者篡改。恢复的花费可能会很昂贵。

敏感信息泄露

许多Web应用程序没有正确保护敏感数据,如信用卡,税务ID和身份验证凭据。攻击者可能会窃取或篡改这些弱保护的数据以进行信用卡诈骗、身份窃取,或其他犯罪。敏感数据值需额外的保护,比如在存放或在传输过程中的加密,以及在与浏览器交换时进行特殊的预防措施。

考虑谁可以访问您的敏感数据和这些数据的备份。这包括静态数据、传输中的数据甚至是客户浏览器中的数据。攻击者通常不直接攻击加密系统。他们往往通过诸如窃取密钥、发起中间人攻击或从服务器窃取明文数据等方式对传输中的或者客户浏览器中的数据进行破解。在这个领域最常见的漏洞是应该加密的数据不进行加密。在使用加密的情况下,常见的问题是不安全的密钥生成和管理和使用弱算法是很普遍的,特别是使用弱的哈希算法来保护密码。浏览器的漏洞也很普遍,且可以很轻易的检测到,但是很难大规模的利用。外部攻击者因访问的局限性很难探测这种漏洞,并且难以利用。这个领域的错误频繁影响那些本应该加密的数据。这些信息通常包括很多敏感数据,比如医疗记录,认证凭证,个人隐私数据,信用卡信息,等等。考虑丢失数据和声誉影响造成的商业损失。如果这些数据被泄露,那你要承担的法律责任是什么,另外考虑到对企业造成的声誉影响。

功能级访问控制缺失

大多数Web应用程序在功能在UI中可见以前,验证功能级别的访问权限。但是,应用程序需要在每个功能被访问时在服务器端执行相同的访问控制检查。如果请求没有被验证,攻击者能够伪造请求以在未经适当授权时访问功能。

任何人具有网络访问权限的人都可以向你的应用程序发送一个请求。匿名用户可以访问私人网页吗,又或者普通用户可以访问享有特权的网页吗。攻击者是被授权的系统用户,很容易就把网址更改成享有特权的网页,这样的访问会被允许吗。匿名用户可以访问未受保护的私人网页。应用程序并不总是能正确地保护页面请求。有时功能级的防护是通过配置来管理的,而系统的配置是错误的。开发人员必须要做相应的代码检查,然而,有时他们忘记了。检测这些漏洞是很容易的。最难的是确定应用程序存在哪些可被攻击的网页或者链接(URI)。这种漏洞允许攻击者访问未经授权的功能。管理性的功能是这类攻击的主要目标。考虑被暴露的功能及其处理的数据的商业价值。另外考虑如果这样的弱点被公布于众而对你造成的名誉影响。

跨站请求伪造

一个跨站请求伪造攻击迫使登录用户的浏览器将伪造的HTTP请求,包括该用户的会话cookie和其他认证信息,发送到一个存在漏洞的web应用程序。这就允许了攻击者迫使用户浏览器向存在漏洞的应用程序发送请求,而这些请求会被应用程序认为是用户的合法请求。

考虑可能将内容载入你用户的浏览器并迫使他们向你的网站提交请求的任何人。你的用户所访问的任何网站或者HTML源(feed)都可以这样做。攻击者创建伪造HTTP请求并通过图片标签、跨站脚本或许多其他技术诱使受害用户提交这些请求。如果该受害用户已经经过身份认证,那么攻击就能成功。CSRF是利用某些web应用程序允许攻击者预测一个特定操作的所有细节这一特点。由于浏览器自动发送会话cookie等认证凭证,攻击者能创建恶意web页面产生伪造请求。这些伪造请求很难与合法请求区分开。跨站请求伪造漏洞可以很容易通过渗透测试或代码分析检测到。攻击者能欺骗受害用户完成该受害者所允许的任意状态改变的操作,比如:更新帐号细节,完成购物,注销甚至登录等操作。考虑受影响的数据和应用功能的商业价值。试想如果并不知道这些操作是否是用户的真正意愿会产生什么后果,同时考虑带来的声誉影响。

使用含有已知漏洞的组件

组件,比如:库文件、框架和其它软件模块,几乎总是以全部的权限运行。如果一个带有漏洞的组件被利用,这种攻击可以造成更为严重的数据丢失或服务器接管。应用程序使用带有已知漏洞的组件会破坏应用程序防御系统,并使一系列可能的攻击和影响成为可能。

一些含有漏洞的组件(如:框架库)可以被自动化工具发现和利用。这使得威胁代理部分引入了“混乱”的角色,而不仅仅是攻击者了。攻击者通过扫描或手动分析识别问题组件,然后根据需要定制攻击代码并实施攻击。在应用中使用组件越深入,实施攻击的难度越大。事实上,大多数的应用都存在这些问题。因为大多数的开发团队并不会把及时更新组件/库作为他们的工作重心。在很多情况下,开发者都不了解他们所使用的全部组件,更不用说组件的版本了。组件的依赖性使情况更加糟糕。可能是由低到高全系列的漏洞,包括注入,破损的访问控制,XSS等。受影响范围也从最低的受损到主机被完全接管和数据的泄漏。考虑一下受影响的应用中,每个脆弱点对业务控制来说意味着什么。可能是非常细微的影响,也有可能意味着被完全攻破。

未验证的重定向和转发

Web应用程序经常将用户重定向和转发到其他网页和网站,并且利用不可信的数据去判定目的页面。如果没有得到适当验证,攻击者可以重定向受害用户到钓鱼软件或恶意网站,或者使用转发去访问未授权的页面。

考虑所有能诱使用户向网站递交请求的人。用户使用的任何网站或其他HTML源(feed)都可以这样做。攻击者链接到未验证的重定向并诱使受害者去点击。由于是链接到有效的网站,受害者很有可能去点击。攻击者利用不安全的转发绕过安全检测。应用程序经常将用户重定向到其他网页,或以类似的方式进行内部转发。有时,目标网页是通过一个未经验证的参数来指定的,这就允许攻击者选择目标页面。检测未经验证的重定向很容易,只需寻找那些允许你指定整个URL的重定向。但检测未经验证的转发困难些,因为它们的目标是内部网页。这种重定向可能试图安装恶意软件或者诱使受害者泄露密码或其他敏感信息。不安全的转发可能允许绕过访问控制。

3 软件代码安全漏洞取证方法

近年来,国外的研究热点集中在对漏洞取证的建模、针对已知漏洞的安全编程技术、针对安全漏洞的路径敏感分析、应用数据流分析到漏洞检测的研究中和漏洞特征的快速匹配等。除了科研机构,国外的黑客在这方面也做了大量的工作。国外顶级的黑客会议,如Black Hat大会、Defcon大会,在会上有很多与安全相关的议题,都是当前安全研究的热点。著名的Phrack黑客杂志也是专注于安全技术的有名刊物。Bugtraq邮件组和CVE都致力于收集软件的脆弱点。Security Focus的Bugtraq邮件组是很多安全研究人员首选的讨论区,CVE则是专家们所选择的分类方式讨论区。

相对来说国内起步较晚,但同样取得不错的成绩。在国内,网络安全焦点(xfocus)、绿盟科技、启明星辰和CCERT(中国教育和科研计算机网紧急响应组)等是国内安全研究机构的代表,并且维护了自己的漏洞数据库。xcon大会被誉为国内最顶级的探讨安全问题的大会。在2013年的xcon大会上就有关于软件安全漏洞的议题,比如夏超的二进制环境下的缓冲区溢出漏洞动态取证技术。2015年的xcon会议上也出现了关于软件安全的探讨。

目前软件安全漏洞的检测技术包括静态分析检测技术和动态检测技术。静态检测技术是利用二进制比对技术、词法分析、形式化验证技术或者手工测试技术,对被测程序的源程序或二进制代码进行扫描,然后从语法、语义上理解程序的行为,并分析程序的特征,找出可能导致程序异常的漏洞。这类技术具有简单高效自动化的优势,但只是对代码本身的特征进行检查,不能很好检测出漏洞间复杂的逻辑关联,并且存在大量的误报和漏报;动态检测技术是通过自动化生成测试数据,以仿真攻击应用程序来判断是否存在漏洞,主要手段是利用各种输入对程序进行探测,并分析程序运行环境等。这类技术效率不如静态分析检测技术,但它能准确的定位漏洞。本文详细综述了常见的源代码安全漏洞取证方法。

3.1 非执行栈技术

基于栈进行攻击的事件最近几年经常发生,原因就是很多操作系统的栈是可以写与执行的,而且内部变量尤其是数组变量都保存在栈中,攻击者向栈中注入恶意代码,然后想方设法来执行这段代码。栈攻击技术的文档也比较全面,这从某种程度上加速了基于栈的攻击。一个最直接的防范栈攻击的方法就是使得栈不能执行代码。这样即使攻击者在栈中写入了恶意代码,这个恶意代码也不会被执行,在一定程度上防住了一些攻击者。只是这个方法需要在操作系统层进行修改,同时,不可执行栈的技术涉及到的一个大问题就是性能问题。此外,在既有栈溢出漏洞又有堆溢出漏洞的程序中,易出问题。可以利用栈溢出使程序跳转至攻击代码,该代码是被放置在堆上。没有实际执行栈中的代码,而是执行了堆中的代码。该技术所付出的代价就是对操作系统内核引入一个微小的改变:把栈页标记为不可执行。

该技术的检测不够全面,它仅能检测并阻止摧毁栈攻击。一个攻击者可以通过把恶意代码注入到数据段来绕过该技术的检测,他只需要把栈中返回地址覆盖掉,使得这个返回地址指向数据段中的恶意代码就可以了。该技术可能会造成小量的兼容性问题,因为有个别的应用程序就是依靠栈执行来正确运行的。该技术对性能的消耗可以被忽略,有报告称这项技术仅仅在上下文切换时增加了2到3个CPU的指令周期。

3.2 非执行堆与数据技术

由于堆是程序运行时动态分配内存的区域,而数据段则是程序编译时就初始化好了的。很长时期以来,由于担心非执行的堆与数据段会破坏软件的正常运行,所以该方法进展缓慢,最近几年才有些进展和文章。如果堆和数据段都不能执行代码,攻击者注入其中的恶意代码将不能被执行。这项技术和前面的非执行栈技术结合能起到更全面的作用,使得恶意代码彻底失去执行机会。使用该技术所付出的代价要比非执行栈技术大一些,因为它对内核的修改要多一些。现在已经有了大量的实例可以使用,这个技术还是可以接受的。

从全面性上来看,该技术对于几乎所有的利用把恶意代码注入进程内存中的攻击都可以检测并阻止。但是,对于恶意修改函数指针和函数参数的攻击没有办法检测和防范。该技术改变了传统程序在堆或数据段中动态生成代码的方式,会造成很多应用程序的不兼容性。另外,使用这个技术来检测并排除漏洞对很多的应用不会产生太大影响,性能上的消耗也可以忽略。

3.3 内存映射技术

有些攻击者通过使用NULL结尾的字符串来覆盖内存,以达到攻击的目的。通过使用映射代码页方法,将使得攻击者很难通过NULL结尾的字符串来跳转到较低的内存区,而且这些代码本身又可能含有NULL字符。再者,把代码页随机地映射到不同的内存地址,在某种程度上防止了那些靠猜地址来进行攻击的攻击方法。比如对于缓冲区溢出的漏洞,攻击者就是要寻找目标进程在内存中的某些地址,然后构造自己的数据来覆盖这些地址。这些地址在很多操作系统上都是有规律可以计算出的。如果使用内存映射技术,把代码页映射到随机的地址,将给攻击者增加很大的困难,不做大量的尝试是不可能查出所需地址的。使用内存映射技术所付出的最大的代价就是要修改操作系统内核、使得操作系统可以把代码页映射到较低的内存空间。虽然这个技术不需要对代码进行修改,但要重新链接,因为二进制的地址在程序链接阶段就确定了。

内存映射技术可以检测并阻止基于内存中地址跳转的攻击。但它对于注入新代码并执行新代码的攻击不能检测和预防。除此之外,因为低端内存是有大小限制的,想把所有的代码页都映射到低端内存在有些应用中是不可行的。内存映射技术仅仅对那些依靠固定地址或使用高端地址的应用程序有影响。而这样的应用程序并不多。内存映射技术对性能的消耗也可以忽略,它仅仅是在程序装载的过程中工作,运行起来之后对程序没有任何影响。

3.4 安全共享库技术

很多软件的安全漏洞来源于使用了不安全的共享库,尤其是C&C++,当中有很多的函数都不够“安全”,比如:strcpy、strcat、gets等等。这些函数使用不好就会带来灾难性的后果。用安全共享库技术,能在一定程度上阻止攻击者的攻击。安全共享库技术就是依靠动态链接技术,能在程序运行期间拦截对不安全的函数的调用,并对函数参数等进行检测,这在Windows和UNIX上都被广泛应用。特别的是,这个技术能对当前内存大小的上限给出一个评估值,这在一定程度上阻止了把数据写到评估边界的外面。安全共享库技术从技术的角度很容易开发和配置,而且不需要对已有的应用程序作任何的修改和再编译。从理论上讲,安全共享库技术可以检测并防止所有的基于标准库函数的攻击。但是它不能保护本地变量的安全,而且它也不能防止数据段和代码段数据的溢出攻击。安全共享库技术对于非标准的库函数无能为力。安全共享库技术不会造成任何兼容性问题,在标准库下运行正常的程序在安全共享库技术下面也同样运行良好。安全共享库技术对于那些和安全没有关系的标准库中函数不做任何处理。性能瓶颈主要在这些有安全弱点的函数上。这样可以大幅度提高程序的性能。如果所有的库中的函数都被拦截并检查,性能上的消耗将提高15%。现在安全共享库的研究项目中的某些特性已经整合到某些标准库中了,如glibc。使用glibc库的应用程序能提供隐式的安全性。

3.5 沙箱技术

通过限制一个进程所访问的资源来预防某些攻击行为。例如:在C语言中有execv、system等系统调用函数,一个软件可能根本不会存在这些系统调用,如果发现某一大该运行软件有了这些系统调用,可能就是被攻击了。在攻击之前如果能使用沙箱技术限制住对这些资源的访问,则攻击就不会得逞。沙箱技术不需要对操作系统内核和应用程序作任何改变。然而,要给每一个需要安全检测的应用程序定义一个资源访问策略。对于一个复杂的应用程序而言,定义这样的一个策略将是很麻烦的工作。

沙箱技术检测的全面性主要看定义的策略的全面性。一个严格定义的策略可以更好的保护程序不受攻击。但该技术对于通过改写关键的木地变量(例如用户的身份ID等)而修改程序逻辑流程的攻击束手无策。沙箱技术依赖于安全策略。它不会带来兼容性方面的问题。但是一个过于严格的策略可能会限制应用程序的合法行为,最终导致程序不能使用。而且对系统调用函数的审查可能会带来竞争条件问题的出现。

沙箱技术的主要性能消耗是在每个系统函数调用的检测开关上和查询策略表上。这个性能消耗在系统函数调用不频繁的应用程序中并不明显。沙箱技术目前主要集中于系统调用方面。在不知道一个应用程序逻辑的情况下限制它的行为是很困难的,而且可以通过不在策略中的函数而绕过检测。

3.6 程序解释技术

在程序运行之后来监视其行为并且强制进行安全检查是最显而易见的好方法,这就需要解释程序的执行。但程序解释技术方法,通常会消耗大量性能。最近也有很多的动态优化技术来弥补这个缺陷。程序监视器是使用这种方法的一个较好的例子。它使得进行额外的安全检测却不牺牲太多的性能成为可能。

程序解释技术不需要对操作系统内核和应用程序代码作任何改变,应用程序只要重新链接产生一个新的起动代码就可以了,然后有这个起动代码来调用动态优化的程序解释框架。有了严谨的安全策略,几乎所有已知的改变程序控制流程或修改危险函数的参数的攻击都可以被检测到并防范住。但是,通过对关键变量(如身份ID)的修改、覆盖来改变程序逻辑流程的攻击没有好的办法防范,除非对每一个读写指令都进行解释,而这样又会带来不能接受的性能上的消耗。使用程序解释技术的又一个优点是它能对动态生成的代码执行安全检测,例如JIT代码。

3.7 二进制文件分析技术

针对非开源的软件程序,通过自动审核工具对程序的二进制文件进行自动分析。其中应用最广泛的工具便是IDA反汇编工具,该工具是专用的二进制文件分析工具,它可以通过目标程序反汇编得到汇编代码,然后对汇编代码进行扫描,从而去识别可能存在的安全漏洞缺陷。IDA之所以被广泛应用,其中一个很重要的因素就是该工具可以识别程序的关键结构,它可以自动识别高级语言的关键结构,如new和delete操作符、函数的返回值、局部堆栈变量、文本与字符串、IF-THEN-ELSE条件语句等,从而进一步对目标程序进行分析。但是IDA反汇编工具采用的反汇编技术需要大量的人工分析,且具有很强的复杂性,因此其自动化程度也不会高。

二进制文件分析技术通过分析软件反汇编后的汇编代码,来发现软件中存在的安全漏洞。汇编代码不利于人的理解,这是不争的事实,但是,针对不公开源代码的软件进行漏洞的分析,只能以汇编代码为源代码。对汇编代码的理解深度就决定了软件安全漏洞取证工作的深度。静态分析技术的优点是,由于是从机器的角度去理解安全漏洞的机理,理解更深刻、更到位,对细节的把握也更加透彻。缺点在于软件反汇编后的汇编代码量巨大、结构复杂,即使是一个小型的应用程序产生的汇编代码其复杂性也不可小觑,对漏洞发生现场不易进行准确的定位。同时,由于汇编代码与机器码基本一一对应,晦涩难懂,对研究人员的技术能力和技术积累要求较高。

4 软件漏洞取证技术对比分析

通过对现有常见的源代码漏洞取证方法的详细描述,经过深入分析可得到这些方法各自存在的优点和缺点,本文归纳结果如下表2所示:

可以看到,虽然现有的源代码漏洞取证方法有较多的优点,但是也普遍存在着不能覆盖全部安全漏洞、扩展性较差、效率较低等多种缺点。为了克服这些已有漏洞取证方法存在的缺点,能够使得源代码漏洞取证更加准确、全面、高效、灵活地进行,研究基于大数据分析的软件代码漏洞取证技术是必要且迫切的工作。

5 结论

本文综述了软件漏洞的概念和特点,同时归纳和分析了当前主流的代码漏洞分类标准,在此基础上叙述了代码漏洞分析方法的技术原理和国内外的研究现状,并分析了常见的漏洞取证方法的优缺点。

猜你喜欢
信息安全
《信息安全与通信保密》征稿函
基于三级等级保护的CBTC信号系统信息安全方案设计
《信息安全研究》2018年(第4卷)总目次
信息安全专业人才培养探索与实践
计算机网络信息安全及防护策略
保护信息安全要滴水不漏
高校信息安全防护
保护个人信息安全刻不容缓
WebSocket技术在信息安全系统中的应用
中国信息安全认证中心