追踪简介
软件安全测试新武器–追踪二进制代码审计系统
—- 基于动态污点传播的测试技术
南京翰海源信息技术有限公司
信息系统与网络特别是互联网的发展,促进了社会各个领域的发展,也使得人类社会对此产生了极大的依赖。而由于网络通信协议及信息系统软、硬件及其他 方面存在的漏洞,也使得信息系统与网络特别脆弱,直接威胁到国家安全、经济建设、社会秩序、公众利益及公民的个人利益。目前,对于漏洞信息的公布已经逐渐 商业化,成为国与国之间在现代战争中的秘密武器之一,造成漏洞无法及时得到修复或者根本得不到修复,网络安全形势日趋严峻。
软件安全测试是修复安全威胁,保证软件能够安全使用的最主要的手段,如何进行高效的安全测试成为业界关注的话题。多年的安全测试经验告诉我们,做好 软件安全测试的必要条件是:一是充分了解软件安全漏洞,二是拥有高效的软件安全测试技术和高可扩展性的测试工具。
1. 安全主要漏洞与测试方法分析
软件安全保证的主要目的就是为了防止黑客或者恶意的内部人员对软件进行攻击,并保证软件在受到恶意攻击的情况能够正常运行。而攻击者主要是通过对软 件系统输入恶意的数据来进行攻击。因此,软件主要的安全问题来源于外部的输入数据。国际CVE组织收录的安全漏洞基本上都是跟外部输入数据有直接或间接的 关系。其构成严重安全漏洞主要有:
命令注入(Command Injection)
跨站脚本(Cross-Site Scripting)
格式化串(Format String )
缓冲区溢出 (Buffer Overflow)
整型溢出(Integer Overflow)
整数符号扩展(Signed Integer Extern)
双重释放内存(Double Free)
释放内存后再使用(Use After Free)
数组索引越界(Array Index Overflow)
Directory Traversal
Sql Injection
所以做好外部输入数据安全测试是软件安全测试中最重要的工作,那么目前主要安全测试方法有:
1.静态的代码安全测试:主要是通过对软件系统的源代码进行安全扫描,根据程序中数据流,控制流,语义等信息与其特有软件安全规则库进行匹对,从中找出代 码中潜在的安全漏洞。静态的源代码安全测试是非常有用的方法,它可以在编码阶段找出所有可能存在安全风险的代码,这样开发人员可以在早期解决潜在的安全问 题。而正因为如此,静态代码测试比较适用于早期的代码开发阶段,而不是测试阶段。同时,由于关系到开发部门,测试部门,管理部门等多个部门的工作,在实际 的贯彻实施工作上有一定的难度。
2.动态的渗透测试:渗透测试也是我们常用的安全测试方法。使用自动化工具或者人工的方法模拟黑客的输入, 对应用系统进行攻击性测试,从中找出运行时刻所存在的安全漏洞。这种是测试的特点就是真实有效,一般找出来的问题都是正确的,也是较为严重的。但渗透测试 一个致命的缺点就是,但由于模拟的测试数据只能到达有限的测试点,覆盖率很低。根据美国权威机构统计,渗透测试的覆盖率只能达到20%-30%。漏报率比 较高。
2. Dynamic Taint Propagation方法
分析两种常用的安全测试的方法,对于外部输入数据的测试都有一定的不足之处,那么如何才能对外部输入数据进行较好的安全测试呢?业界提出了动态污染 传播的方法(Dynamic Taint Propagation)。
动态污染传播方法,主要通过跟踪外部输入的数据在程序中的传播过程,和最终执行的情况来分析是否存在安全漏洞和存在什么类别的漏洞。如下图1,它不需要任 何特殊的攻击性的测试数据,它假定由外部输入的数据都是不可信的、污染的数据,为数据打上污染的标记,在程序中传播的过程中,如果经过了严格的,我们可以 依赖的安全验证,我们就认真它不再是污染的,去掉污染标记,否则污染标记在整个传播过程都会被继承下来。一旦有污染标的数据被送到执行代码中执行的时候 就判断这里可能存在一个安全漏洞。
图1:污染数据的传播过程图
实现动态污染传播方法来进行测试,首先要对污染源的标记,在程序运行过程中碰到外部输入的数据,需要标记污染源;其次污染数据进行传播, 数据在程序中传播的过程中,当数据从污染源传入,标记上污染标记,污染数据在程序中传播的过程中,无论是被赋给另一个数据被拼接到另一个数据之中,污染标 记都要被继承下来;最后进行安全检测,当碰到我们预定义好的规则的时候,就会触发安全检测.例如程序执行到下列函数时候
mysql_query(MYSQL *mysql, const char *stmt_str)
预定义好的规则检查stmt_str此数据是否带有污染标记,如果没有,则没有安全问题。反之,则此处可能存在安全问题。
recv(s, username,sizeof(username), flags);
……
snprintf(sql,sizeof(sql), “SELECT * FROM users WHERE id=’%s’”,username);
……
mysql_query (mysql,sql);
动态执行过程中,recv方法会把username标记为污染源,使用snprintf进行sql语句的拼接,但是由于username是污染的, 所以sql数据也被传染,被标记为污染数据;最后当执行mysql_query的时候,安全检查规则检测到了sql为有污染标记,从而判定此处可能引发一 个SQL—Injection安全问题.
3. 追踪二进制代码审计系统
中国专业的软件安全测试解决方案提供商翰海源公司根据从事十多年的软件安全领域研究的基本上,依托全球知名的Code Audit Labs(代码审计实验室),根据上文讲述的动态污染传播的方法(Dynamic Taint Propagation)成功开发出来了新型安全测试产品——追踪二进制代码审计系统。目前支持任何生成Windows二进制代码的语言.例 如:C,C++,VC,BCB,DELPHI.
但不支持解释语言和中间语言编写的代码,如下:
解释语言 : Php, jsp,asp,perl,python,ruby
中间语言 : java,.net,VB
追踪二进制代码审计系统利用动态污染传播方法的特点,全自动化的进行污点源的标记,污染的传播,以及安全检测。测试过程不需要测试人员输入任何带攻 击性的测试数据,就可以进行安全测试 了,追踪二进制代码审计系统会根据功能测试自动地找出软件中所有可能因外部输入数据而造成的安全问题,并根据漏洞类类清晰地报告出来。总结追踪代码审计的 主要特点有:
1.无需特殊的攻击性测试数据,让QA/开发人员都可以做安全测试。解决测试缺乏安全知识,攻击知识的难题.
2.由于直接跟踪外部输入数据,所以能够很真实、有效地找出系统中最严重,最关键的安全问题。
3. 可发现当前市面上的安全测试软件不能发现的二进制的潜在漏洞,内嵌上百个检测规则.
4.可定位到该漏洞在什么地方产生的,能快速修复该漏洞;而且依托系统提供的信息,可快速构造出测试样本来验证该漏洞.
5.支持强大的插件,可根据用户需求自定义标记污染源的规则和检测规则.
4. 追踪二进制代码审计系统部分成果展示
Code Audit Labs(代码审计实验室)在追踪二进制代码审计系统的帮助下,确认了很多软件的bug或者是vulnerability(漏洞).帮助很多软件厂家修复了不少安全漏洞。下面列出部分成果:
CAL-20070912-1 Multiple vendor produce handling AVI file vulnerabilities |
|
CVE-2007-4145 |
CAL-20070730-1 BlueSkyChat ActiveX Remote Heap Overflow vulnerability |
CVE-2007-4218 |
CAL-20070502-1 Trend_Micro_ServerProtect_New_Vulnerabilities |
CAL-20070502-2 Trend Micro ServerProtect Pre-Auth Stack Overflow Vulnerability(0day,fixed? ) |
|
CVE-2008-2238 |
CAL-20070520-1 OpenOffice_EMF_multiple_vulnerabilities |
CAL-20090417-1 Microsoft four infinity loop D.o.S vulnerabilities |
|
CVE-2008-3997 |
CAL-20080101-1 Oracle Database 10g R2 Summary Advisor Arbitrary File Rewrite Vulnerability |
CVE-2009-3955 |
CAL-20090611-1 Adobe Reader and Acrobat JpxDecode Memory Corruption Vulnerability |
CAL-20090611-2 Adobe Reader JpxDecode QCD Heap Buffer Overflow Vulnerability(0day,now fixed) |
5. 强大的分析能力
追踪二进制代码审计系统不仅可以做代码审计,还有一个强大的分析样本能力。当捕获一个病毒/蠕虫/攻击样本利用0day漏洞攻击时,由于分析 0day漏洞的复杂性,难度是比较高的。有了追踪二进制代码审计系统后,就变得事半功倍了。可辅助分析执行路径,从而快速定位出漏洞所在,更有时候,追踪 二进制代码审计系统可直接报告漏洞触发的点。大大简化我们的分析工具。下面事例样本分析CVE-2009-1537– Microsoft DirectX DirectShow QuickTime Video Remote Code vulnerability
CVE-2009-1537样本分析
a) 样本文件
获得一个病毒/蠕虫/攻击样本crash.avi
b) 利用分析引擎得到报告信息
使用我们的分析引擎分析得到一些报警信息,从中过滤出最有可能造成安全漏洞的地方。
[CHECK_MODULE][SECURITY_WARNING]rep movsd memcpy(0EA04F78,0E69F034,0×16*4) src is tainted 0×7D05BAA3
[PRINT_INFO]tainted buff addr at 0EA04F78:
0 0 0 0 6a 70 65 67 0 0 0 0 0 0 0 0 0 0 0 18 73 74 74 73 0 0 0 0 0 0 0 0
[CHECK_MODULE][SECURITY_WARNING]MOVSX 0×3f sign extend [tainted] at EIP 7D05BAA5
[CHECK_MODULE][SECURITY_WARNING]array index (eax(32bits),unkown(no-32bits)) tainted,Resolve32 [ebp+eax<<0+(-57)] at EIP 7D05BAA9
c) 定位dll和代码
从分析报告中我们可以得知,7D05BAA5和7D05BAA9这两个地址属于quartz.dll
c:\winxp\system32\quartz.dll 0×7CF70000 0×168000 version 6.5.2600.5731
这样我们就可以快速定位到quartz.dll,使用IDA Pro再次确认。
text:7D05BA9D loc_7D05BA9D: ; CODE XREF: CQTStream::BuildMediaType(long,CMediaType *)+47j
.text:7D05BA9D push 16h
.text:7D05BA9F pop ecx
.text:7D05BAA0 lea edi, [ebp+var_6C]
.text:7D05BAA3 rep movsd
.text:7D05BAA5 movsx eax, [ebp+var_3A_check]
.text:7D05BAA9 mov [ebp+eax+var_39], 0
.text:7D05BAAE movzx ax, byte ptr [ebp+var_4A+1]
.text:7D05BAB3 mov ah, byte ptr [ebp+var_4A]
d) Which Filed in the file?
现在需要定位到是文件的哪个字段或者是哪个offset导致了该漏洞。
7D05BAA5处eax来自var_3A_check, var_3A_check来自7D05BAA3 的rep movsd操作,因为rep movsd的时候ESI是污点数据。从警告信息来看var_6C处的数据为
0 0 0 0 6a 70 65 67 0 0 0 0 0 0 0 0 0 0 0 18 73 74 74 73 0
那么var_3A_check和var_6C相距的距离为0×32,找到以上那串数据后在加上一个0×32的偏移量,就是我们要找的那个字段。
在这个样本中为offset 0×1a2,数值为0×3F. 再使用一些文件格式分析器,就可以定位出这个是什么字段。可惜quartz.dll对quicktime格式分析有点问题,当STSD的 number_of_entries为0的情况下,也认为有一个GSSD的结构。
{
DWORD idSize;
ID cType;
byte reserved[6];
WORD dataRefIndex;
ushort version;
ushort revisionLevel;
ID vendor;
DWORD temporal_quality;
DWORD spatial_quality;
WORD width;
WORD height;
DWORD horizontal_resolution;
DWORD vertical_resolution;
DWORD data_size;
ushort frame_count;
name_string name_of_codec;
ushort depth;
ushort color_table_id;
}
typedef struct
{
UBYTE len;
if ( len > 31)
{
Warning(“Detected CVE-2009-1537 Microsoft DirectShow quicktime Could Allow Remote Code Execution”);
MessageBox( idYes , “QIFF parser”, “Detected ‘%s’ ,Press any to exit “, “CVE-2009-1537 Microsoft DirectShow quicktime Could Allow Remote Code Execution” );
Exit(2);
}
char data[len];
char padding[31-len];
}name_string;
offset 0×1a2,数值为0×3F的字段为name_string的len.
6. 总结:
良好的测试方法加上优秀的测试工具一定能够更好地帮助软件企业做好软件安全测试。对于一个软件企业,如果能将软件质量测试与软件安全测试有效地结 合,不但能很好地解决软件安全测试问题,同时也可以使得测试团队的工作效率更高,那么基于Dynamic Taint Propagation测试方法的追踪二进制代码审计系统将是一个不错的选择。

