代码安全审计及静态安全分析软件的原理分析

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

# (presumably because it creates & destroys temporary tuples) hit = Hit(c_ruleset[word]) hit.name = word hit.start = startpos hit.end = endpos hit.line = linenumber hit.column = find_column(text, startpos) hit.filename=filename hit.context_text = get_context(text, startpos) hit.parameters = extract_c_parameters(text, endpos) //提取参数 if hit.extract_lookahead: hit.lookahead = text[startpos:startpos+max_lookahead] apply(hit.hook, (hit, )) //应用回调函数 def c_buffer(hit): //回调函数中的判断,这里可以看出当检测到参数为常量字符串时,调整 warning级别。 source_position = hit.source_position if source_position <= len(hit.parameters)-1: source=hit.parameters[source_position] if c_singleton_string(source): hit.level = 1 hit.note = "Risk is low because the source is a constant character." elif c_constant_string(strip_i18n(source)): hit.level = max( hit.level - 2, 1) hit.note = "Risk is low because the source is a constant string." add_warning(hit) 总结: 通过上面对一个strcpy函数的检测可以看出,flawfinder的检测很简单,它只检查参数是 否为常量,而没有精确判断src的长度是否大于dst的长度,从而会产生很多的误报。 2、Swaat Swaat是一个专门针对Web脚本语言的检测工具,主要语言有php、asp、jsp。它与flawfinder的不 同在于实现了lex分析。 swaat定义了两种检测规则,第一种即语言相关性规则,第二种即危险关键字的规则,如delete exec等危险字的引用。 php语言的检测规则: <vuln match="system" type="userinput" severity="high" /> 危险字的检测规 则: <vuln match=".*select .* from .*" type="sqlstring" /> 一些关键函数的分析: public Scanner(Options options) { this.targets = new ArrayList();
SetOptions(options); } public void SetOptions(Options options) { dbs = new ArrayList(); foreach(string langfile in options.LangFiles())
dbs.Add(new VulnDB(langfile)); //对各种语言检测规则配置文件的分析。 msgs = new MessageDB(options.MessageFile); string_db = new VulnDB(options.StringsFile);//危险字规则配置文件的分析 regex_options = options.GetRegexOptions(); suffix_ma来自百度文库 = options.GetSuffixMapping(); } public void AddVuln(string match, string vuln_type, //加入到vuln队列,准备关键字的对比。
Sinks(echo printf 等可能造成危险输出函数)时是经过过滤的,精华的Sanitization Routines。 Xss.php <? $user=$_GET['USR']; // taint var echo $user; //dangerous echo htmlspecialchars($user); //safe ?> 从xss.php来看这个过程,首先$user=$_GET['USR']是危险变量,也即taint类型,通过定义 htmlspecialchars为Sanitization Routines净化过程,表明当 经过htmlspecialchars处理后$user变成了untaint类型,echo这个(Sensitive Sink)调用是安全的。 如下图有个更清晰的理解,重点理解几种规则之间的区别: page 102,Addison Wesley - Secure Programming with Static Analysis - 2007.pdf
首先看一下flawfinder定义的rule set,所有的rule set会成为list中的一员。
c_ruleset = { "strcpy" :
(c_buffer, 4, "Does not check for buffer overflows when copying to destination", "Consider using strncpy or strlcpy (warning, strncpy is easily misused)", "buffer", "", {}), 我们知道strcpy是一个常见的危险函数,有可能造成buffer overflow的安全隐患,也即src的可能 长度远远大于dst的长度,造成溢出。 这个rule的定义中重要的即,strcpy是关键字,c_buffer是当检测到关键词strcpy时调用的函数, 检查参数是常量字符串还是变量, process_c_file函数通过读取程序源码到变量后开始进行关键字的检测,因为没有进行lex分析, 所以需要通过适当的判断过滤了字符串、注释、include指令状态中的关键字检测。
): # FOUND A MATCH, setup & call hook. # print "HIT: #%s#\n" % word # Don't use the tuple assignment form, e.g., a,b=c,d # because Python (least 2.2.2) does that slower
代码审计及静态安全分析软件的原理分析
吴建强 (wujianqiang@gmail.com) 简述: 通过分析几种开源工具了解静态代码分析的原理及实现,重点集中于对于Web应用代码(解释 型)的分析。 分析的工具包括: Flawfinder:C语言 Rats:C 、Php、Python等语言 Swaat:Php、Asp、Jsp语言 Pixy: Php语言
if c_ruleset.has_key(word) and c_valid_match(text, endpos): //检测list中是否有关键字 if ( (patch_infos == None) or ((patch_infos != None) and patch_infos[f].has_key(linenumber))
2. Web应用脚本检测的难点
请参考pixy_techreport V ANALYSIS BACK-END
3. 代码审计工具的原理分析
一个成熟的代码分析工具主要有如下几个步骤: 1、lex分析:通过对程序的词法分析,拆分语言结构,提取重点的关键符号、同时为yacc提供
符号表。 2、yacc分析:通过对语言程序结构的定义,建立parase tree 以及ast语法树。 3、通过对parase tree的分析,建立tac结构,定义节点的类型。 4、通过对变量的持续跟踪、分析变量是否是taint类型,是否经过净化才到达sensitive sink函数 的处理。 我们可以看到从上至下,每多做一步,分析效果会越精确、误报会越低。 三、几种工具的分析: 这里只摘要了关键实现部分。 1、flawfinder flawfinder是一款很早出现的C语言的简易检测工具,虽然代码实现很简单,但也发现过如 realplayer buffer overflow的低级错误,是初学者非常值得参考的一个例子。 从分析工具原理看 其只实现了第一步lex分析,当然flawfinder都没有通过lex的定义来分析源代码,而是通过简单 regex的分析来实现了对关键字(危险函数)的提取以及特定变量定义如char类型变量的提取(主要 是针对static array buffer overflow)
1. 代码"安全"的原理
静态分析可以分为多种方式,我们更加关注安全分析的方面。首先介绍一下"安全"的原理。 通 过对Web应用所产生的主要漏洞如Xss/sql injection/command exec这几种类型的安全问题分析 后,我们可以把这些漏洞都可以看成是taint-style的安全漏洞。简单来说 可以把Web应用的静 态分析可以看成是一种是对来自外部输入变量(按照需求我们可以把来自用户的输入定义为危 险、同样也可以把来自数据库的内容定义为危险)持续跟踪的 检查,也就是说我们希望程序在 调用危险函数如echo函数时,参数是"干净"的、是经过"净化"处理的,是不会产生Xss攻击的。 首先对Taint-style解释如下(摘自pixy-techreport): Tainted data denotes data that originates from potentially malicious usersand thus, can causesecurity problemsat vulnerablepoints in the program (called sensitive sinks). Tainted data may enter the program at specific places, and can spread across the program via assignments and similar constructs. Using a set of suitable operations, tainted data can be untainted (sanitized),removing its harmful properties. Many important types of vulnerabilities (e.g., cross-site scripting or SQL injection) can be seen as instances of this general class of taint-style ulnerabilities. An overview of these vulnerabilities is given in. 一个XSS漏洞的检测如下:
Entry Points into the program: GET, POST and COOKIE arrays. Sanitization Routines: htmlentities(), htmlspecialchars(), and type casts that destroy potentially malicious characters or transform them into harmless ones (such as casts to integer). Sensitive Sinks: All routines that return data to the browser, such as echo(), print() and printf(). 首先获得识别程序的输入变量,范围包括来自用户、数据库等外部环境的输入,这些输入变量 依据需求将其定义为危险变量也即被污染的变量(taint),为了保障变量在进入敏感函数Sensitive
相关文档
最新文档