常见源代码安全漏洞分析与研究
2017-03-10黎新
【 摘 要 】 随着计算机在各行各业的大量普及,满足各种应用需求的应用程序越来越多,在程序实际开发过程中,由于软件规模及复杂程度的提高,不可避免地会出现安全漏洞,造成安全漏洞因素有很多。论文将主要针对源代码方面的安全漏洞进行分析和研究。
【 关键词 】 源代码;安全漏洞;漏洞检查;静态分析
【 中图分类号 】 TP309.2
【 文献标识码 】 A
Analysis and Research on Common Source Code Security Vulnerabilities
Li Xin
(Institute of Electric Power Research, Guangxi Power Grid Company Limited GuangxiNanning 530023)
【 Abstract 】 With the popularization of computers in all walks of life, to meet various application needs more and more applications in the program, the actual development process, the software scale and complexity, inevitably there will be security vulnerabilities caused by security vulnerabilities, there are many factors, in this article, we will focus on the source of security vulnerabilities the code for the analysis and research.
【 Keywords 】 source code; security vulnerability; vulnerability checking; static analysis
1 引言
隨着软件工程及网络技术的不断发展,目前在计算机领域,应用软件的规模、数量都非常大,在软件开发过程中,漏洞的产生是不可避免的,漏洞的存在会严重威胁系统的安全稳定运行,使病毒、恶意代码轻易的入侵系统,导致用户的损失。尤其是在军事、经济等领域,对于软件安全有着更高的要求,会因为软件漏洞而造成灾难性的后果及巨大的经济损失。为了避免安全漏洞的产生,在软件开发过程中,要对漏洞的类型、特点及如何防范有一个全面的了解,进而避免漏洞的产生。论文将简单介绍源代码安全漏洞的基本概念及危害性,并重点对典型的几个漏洞进行分析。
2 漏洞的类型
源代码漏洞根据不同的分类方法,有不同的类型和数量,对程序可能造成的影响也不同。通过对漏洞进行分类,能够使我们很容易地对漏洞进行全面描述,如成因、作用等。理论上我们可以用一个分类属性来表达漏洞的一个本质特征,而为漏洞的每个属性赋值的过程,就是给漏洞在该维属性上分类的过程。源代码的漏洞主要有XSS漏洞、CSRF漏洞、Info漏洞、Json-Hijacking漏洞、注入缺陷漏洞、并非漏洞、高危端口漏洞等,下面我们以注入缺陷及XSS漏洞为例,对其进行简单分析。
2.1 注入缺陷
源代码中存在的注入缺陷能够使攻击者通过操纵输入来实现改变应用程序的行为,这种行为上的改变可以使攻击者避开程序的访问控制,使其能够创建、修改、删除或阅读应用程序可以访问的任何信息。注入缺陷是一般都是由于开发者在源代码中的假设(被一个应用程序处理的输入字符串不包含语法)而造成的,这个假设会导致有效输入确认的缺失。注入缺陷主要包括系统调用、Shell命令和SQL注入。在这里我们主要对SQL注入攻击进行分析。
SQL注入是目前黑客对数据库进行攻击的常用手段之一,一般可分为SQL操纵、代码注入、函数调用注入和缓冲区溢出四种攻击方法。在程序的使用过程中为了方便快捷的管理相关数据,就需要应用到数据库,数据库可以便于程序快速的对相关数据信息进行存储、分类及查询。当用户使用程序时,程序可以自动通过对数据库的查询,将所获取的信息按照一定格式反馈给用户,同时用户也是通过交互式的对话框提交给程序数据,从而使程序按照用户想要的信息进行查询,反馈给用户想要的信息。通过控制传递给程序数据库操作语句的关键变量来获得恶意控制程序数据库,从而获取有用信息或者制造恶意破坏的,甚至是控制用户计算机系统的漏洞,就称之为“SQL注入漏洞”。
SQL注入漏洞完全是利用了将包含了某种目的的SQL语句,通过关键变量插入到程序中正常的数据库操作语句里。程序一旦发生注入漏洞,就会引发一系列安全隐患。SQL注入漏洞是不分语言的,用任何语言开发的程序,只要是会涉及到对数据库的操作,就可能会存在SQL注入漏洞。虽然有时会因为编写语言的要求或者程序设置环境的不同,导致SQL注入漏洞难以被常用方法所利用,但是总会找到方法进行突破。
通过对造成SQL注入漏洞原因的总结分析,具体包括六个原因:1)类型处理不当;2)数据库配置不安全;3)查询集处理不合理;4)错误处理不恰当;5)转义字符处理不当;6)多个提交处理不当。[2]
源代码中存在SQL注入漏洞,在软件、系统应用过程中会造成几个方面的危害:1)敏感数据被恶意获取;2)网络钓鱼;3)被获取WEB用户的网页内容;4)受到CSRF攻击;5)用户的键盘击键数据被盗;6)成为WEB僵尸。下面我们举一个最简单的例子,对漏洞的利用方式进行了解:
假设在一个登录界面,要求用户输入用户名及密码,但是由于开发人员失误将用户名及密码直接拼接在了SQL查询语句中:
Mysql_query(“select * from user where
(email=$emailand
Password=$password)”)
在存在这一漏洞的情况下,攻击者只需要构造Password为‘空or‘1=‘1的非法输入,就可将实际执行的SQL语句变为:
Mysql_query(“select * from user where
(email=attack@abc.comand
Password=‘‘or‘1=‘1)”)
在这个例子中,SQL漏洞是由于开发人员直接将用户输入当做可信部分直接和SQL语句拼接而造成的。
在实际应用过程中对于SQL漏洞的防御手段主要包括:1)使用参数化的过滤性语句;2)避免使用解释程序,因为这是黑客借以执行非法命令的手段;3)避免出现一些详细的错误消息,要使用一种标准的输入确认机制来验证所有输入数据的长度、类型、语句、企业规则等;4)使用专业的漏洞扫描工具;5)在程序开发的所有阶段都对代码进行安全检查。[3]
2.2 跨站脚本漏洞
跨站脚本攻击(XSS)是一种被动的安全攻击方式。攻击者通过在看上去安全可靠的链接中嵌入恶意代码,当用户点击这一链接时,嵌入的恶意代码作为用户请求进行提交,并在用户电脑上运行,这一漏洞常常被用来窃取用户信息。由于网络环境的复杂程度及跨站脚本攻击方式的多样性,导致这类攻击很难得到彻底防御。
攻击者通过跨站脚本漏洞可实现几种目的:1)盗取用户账号、密碼;2)控制企业数据,读取、篡改、添加、删除企业敏感数据;3)盗窃企业重要的资料;4)进行非法转账;5)强制发送电子邮件;6)安装木马、后门程序;7)控制受害者机器向其它网站发起攻击。下面我们以实例来分析如何利用跨站脚本漏洞:
在正常情况下,WEB应用与数据库之间的正常调用链接方式为:
$comments=db.get_comments(news-id):
“;
Foreach($comments as $c){
Echo“
1.”.$c.”
”;
}
echo”echo””;
如果在这段源代码中插入一条恶意JS脚本,如:
当插入的这一恶意脚本被调用,就形成了XSS攻击。
目前针对跨站脚本漏洞的防范措施主要包括:1)防堵跨站脚本漏洞;2)Cookie防盗;3)尽量使用POST而非GET提交表单;4)严格检查Refer;5;将单步流程改为多步;6)引入用户交互;7)只在允许Anonymous访问的地方使用动态的JavaScript;8)对于用户提交信息中的img等link进行检查是否有重定向本站,不是真的图片文件等可疑操作。
2.3 跨站请求伪造(CSRF)漏洞
CSRF漏洞与XSS具有很大的相似性,区别在于XSS是利用客户端存在的缺陷,而CSRF是利用网络服务器上存在的漏洞。通过这一漏洞,攻击者可强迫已登录的受害者发送请求,这就意味着,攻击者可代表用户执行商品购买、转账、运行恶意软件等操作。对于CSRF的预防非常困难,为了降低这一漏洞造成的影响,对于软件开发者,可通过几个措施:1)设定短暂的可信用户会话时间;2)每次提出一个可信行为时,对发出请求的用户进行验证;3)在应用程序中删除所有的XSS脆弱性,这是因为攻击者通过XSS漏洞可获取需要的所以信息。[4]
3 漏洞分析及检测
为了最大限度地降低源代码中存在的漏洞,在开发过程中要及时的对漏洞进行分析和检测,目前主要是应用到静态分析和动态分析两种技术。
3.1 静态分析技术
静态分析方法是对源代码进行直接扫描,提取出代码中的关键语法,通过解释其语义,理解程序行为,根据预先设定的漏洞特征、安全规则等对漏洞进行检测。侧重点在于源代码的内部特征,在分析过程中关键技术主要包括几个方面。
3.1.1流分析
在流分析技术环节,主要是分为控制流和数据流,其中控制流分析是要得出代码中控制流走向的信息,即控制流图。控制流分析关心的是代码的控制结构信息;而数据流则是要得出程序中数据流动的信息,也就是程序中变量的相关信息。
3.1.2符号执行
通过符号执行能够将程序转化为一组约束,同时对程序模拟执行过程中的状态是否出错进行检查。
3.1.3模型检测
在给定被测系统的模型和目标属性的描述后,可自动的对被测系统的状态空间进行穷尽搜索,以检测目标属性是否被满足。
3.2 动态分析方法
动态分析方法是在代码运行的状态下,通过对代码运行情况进行监测、或根据测试用例结果对漏洞进行检测。与静态分析方法相比,其最大优势在于其分析结果精确度高,这种方法的关键技术主要是:
模糊测试。模糊测试是基于缺陷注入的一种自动软件测试技术,通过将大量精心构造的数据作为应用程序的输入,通过观察程序是否出现异常来判断应用程序中可能存在的漏洞。
动态污染传播。这一技术也被称为动态信息流分析方法,是通过在程序运行时标记变量、存储单位等信息,对攻击路径进行跟踪,从而获得存在漏洞信息。[5]
4 结束语
源代码漏洞无处不在,在开发过程中,软件开发人员应高度重视漏洞这一问题,根据软件开发源代码安全指南等规范标准进行代码编写。我们只是对源代码中具有代表性的漏洞进行了简单分析,了解其侵入原理及防范。源代码安全漏洞的防治修复是一项持续不断的工作,需要开发人员不断对其完善修复,同时用户在程序应用过程中也应加强漏洞防范措施,避免应漏洞的存在造成的损失。
参考文献
[1] 朱圣才,徐御,王火剑.常见源代码安全漏洞分析与研究[J].信息网络安全,2014,(02):49-52
[2] 赵晖.面向军工应用软件的源代码漏洞分析系统的研究与实现[C].北京交通大学,2015-7-14
[3] 叶亮.基于安全规则的源代码分析方法研究[C].华中科技大学,2013-10-13.
[4] 王跃.源代码安全漏洞检测方法研究[C].华中科技大学,2013-27-41.
[5] 周诚,张涛,马媛媛,李伟伟.一种高效检测源代码安全漏洞的代码审查方法[J].现代电子技术,2015,(05):83-86.
作者简介:
黎新(1987-),男,汉族,工程师,研究生,硕士学位;主要研究方向和关注领域:信息安全。