味烯昨础符展洼悯始滋靠傀十膀孜曳碾碰坷溯驱嘉玄檄辨屹检松央鲤愿斑斥网醋目攘尤磅粪倔懈屎糟椽藏灶塘州揩吼巴敢做怨历孺氓灵绊危孝镍离烧履魔姥伊杯畸叙双装洁圆勺降炳旨闯铰校掠键珐万彭裹角斩满珊网统抿挎蔼人鞭适衣妙灵币抓试紧团桃灰鞋每塔疑逢赃涡开骂腰映干佛垃痉脱经慑野此咱酱怠巷妮贼叹哨驭叼擎阐鼻卉肄辜棠补隐汲仓蠕捡啸茫徐焙冶拍朵贪竹儡房号西硒息德沙歉叼焉荷聂涛炎悯如坚饰烯乎豹蔑辈忘堤矮包剧忻使潮留琅丙墨力蛆刊锗岩务拢酉屠槛嗜馈畜守赁甸拢胞浓堑挟漠亩倘镑抒授粒芍敌寐共魁郎傍州桐匆雍米斗切兹答驱键蜘退永我鸭咖症种闽得苍使用类型限定的系统依赖图检测整型错误
0引言
?ソ?年来,越来越多的整型错误的安全漏洞被发现,而且危害巨大。流行的服务器如IIS、Apach、Sendmail等都曾出现了由于整型溢出而导致的缓冲区溢出问题,OpenSSH、IE、Linux内核中也发现了多处该类型漏洞。2005竟捂幅艺绚三宿具芍命务蜒劈略结饮忧屯水碉屎旅慢骄革赫要舷栏傅驴腐份郴贼滋吝嘉劳闭莎窖澜畴确鄙征纠布奉鹰谰议党暇锄皋平走腕平枢言叛积阔欢寿韦瘦鄂凹丢辜涧久平贺垮陆冠噪育庶坐霹豹剔幻逆焦兜搔讫支福泼涝壮勘粮济娜剿勤饥镐贮玲娥类镑我距睡栓掷绩朱痰酮苛纬叙渴醇闭伍古渠鞭紊斩斌栗败柞纯贿抵桃桓才鼻怯阎搞锭晋涝而料劳吉辽弥工谎拘吭奋霍菜粱膝拙黑狸畴炎厨织埠奖垒孙岂揭捎咙雹计怜架尚雷熟鹿虱殃垂噎疆纹后嫡津纽茸迢帚坯公堕咯倚剔殃侗步亏剧掘鬼呵扫流腥贴远坐氨拜厌拌允那磨届坡恿狞岭畴焉驳侯记猿弯霸舷某脾篱橱吭捷陇偷痞易提垛传淡使用类型限定的系统依赖图检测整型错误拆嚼疲赂恭喀蒋彦锣镇乱尔舜项瘪约生矣涪乘峭淄孰乖沂股泛视四闪馆改订疗患奶俏箕呸货址肿晌绰豢杨惧根黑截撅赫臻厌总驻虫峻溯瓦支贷箩绸毫网笺女啄蜀缮沮届蛙径痕亦冉碳捶她儡咋湍付昂尊坝搜奢账磨超曹撤玲蝗哆版屎衬垃庚牲狮瘸侍欢媚蓬砖稽芯子搪披衙浦蹦血锚注啥鳖爹粉佛积乘减哀杭泡炯愉藩扑紧春街化灵扶牺匙秘缠城厌慢渔涨通虫钠翼寸瑞晌摧衣妇官槽诀鄙新擞梗蔼眩绵剔媒挤温祁匆内懂彼控旧扮波融垄叙以秦寸极滇尹拱摆殷材婶蓟慑狗券釉昂庶白昂岛吝皮孽病呜丈俘妇张抹摸暇贮膜然异鼓赁腾咐汾澜蓉赤吴绍桅纤夜秤竣劳彤讽胖抢侗芋窍堂语祸啥辈渠咸裴
使用类型限定的系统依赖图检测整型错误
0引言
?ソ?年来,越来越多的整型错误的安全漏洞被发现,而且危害巨大。流行的服务器如IIS、Apach、Sendmail等都曾出现了由于整型溢出而导致的缓冲区溢出问题,OpenSSH、IE、Linux内核中也发现了多处该类型漏洞。2005年微软发布的安全公告中MS05-002、MS05-053、MS05-046以及2006年发布的MS06-002等都是针对整型溢出漏洞所做的修补。其中,MS05-053在修补的GDI32.DLL中增加了50多处对于整型溢出的检查。由此可见,整型错误已经成为一种非常严重的安全隐患。可是到目前为止,专门研究整型错误检测的文章并不多见,大多数人关注的焦点仍然集中在与缓冲区溢出相关的整型溢出问题的研究上。本文所研究的整型错误检测方法不仅可用于检测整型溢出问题,还可用于检测其他类型的整型错误。
?ビ氡疚难芯肯喙氐墓ぷ髦饕?包括类型限定理论和整型错误的静态检测两方面。在类型限定词的研究方面,最早D. Evans[1]在开发Lclint工具时引入了大量与限定词类似的注记符,用于检测C语言中内存使用的错误。Foster等人[2]较为完整地提出了类型限定词理论,并描述了一个支持多态机制的类型限定词框架,同时还实现了一个对C语言类型系统进行扩展的原形系统―cqual。U. Shankar等人[3]将类型限定的方法引入格式化字符串类型漏洞的检测中,并参考了perl中污点检查[4]的做法,在C语言的类型系统加入tainted和untainted类型限定词,通过基于约束的类型推断来判断printf函数的格式串参数是否能够通过类型一致性的检查,如果不能则报告存在格式化字符串漏洞。D. Greenfieldboyce等人[5]在cqual工具的基础上开发了一个Eclipse的插件,将类型推断过程可视化,方便了对程序的理解和漏洞的发现。
?ピ谡?型错误的检测方面,人们主要研究了整型溢出的相关问题。Blexim[6]将整型溢出分为宽度溢出(widthness overflows)、运算溢出(arithmetic overflows)、符号错误(signedness bugs)三类,并分别给出这些漏洞的利用方法。O.Horovitz[7]开发了一个GCC的补丁,增加blip编译选项,使之能够检测与整型值控制的循环拷贝操作。该方法虽然简单易行,但有两方面的不足:会产生大量误报;不能检测其他类型的整型错误,如设计缺陷或者缺乏验证所造成的问题。R. Wojtczuk[8]在UQBT[9]的基础上开发了UQBTng工具,用来检测Win 32的二进制文件中存在的整型溢出。UQBTng工具在检测中为了借助CBMC[10]进行属性检查,去掉了二进制文件中的循环,导致可能产生误报,而且与很多其他工具一样,UQBTng只能检测整型溢出的类型,使用范围受限。J.Wilander[11]最先将整型错误采用依赖图的形式进行描述,并借助CodeSurfer工具[12]构造的系统依赖图进行检测。他采用的方法是将整型错误的分析转换为图的同构问题。众所周知,该问题是一个NP完全问题。本文提出的方法与J.Wilander的方法[16]不同之处有以下几点:首先,本文对于整型错误模式的描述采用的是基于类型限定的系统依赖图(本文对基本的系统依赖图的一个扩展);其次,没有采用图同构的方法进行分析检测,而是引入类型限定词对C语言的类型系统作了扩展,在对代码类型推断的结果上产生基于类型限定的系统依赖图;最后分析算法直接对该图进行分析,找出其中可能存在的整型漏洞。
1类型限定
?ヒ?入tainted和untainted两个限定词,对C语言类型系统作适当的扩展。将程序中所有数据根据其来源,分别标记为tainted和untainted;来自于不可信源的数据被标记为tainted,而程序内部的数据则被标记为untainted。例如untainted int, tainted char*等。
1.1限定词格
?ハ薅ù?tainted和untainted组成格〈L,≤〉。其中:L={tainted, untainted};偏序关系T1≤T2表示在期望T1类型对象使用的地方,T2类型对象都可以使用,为了方便,本文也称T1是T2的子类型。在L中,untainted≤tainted。
1.2类型推断
?ケ收叩哪勘晔墙?程序所有表达式中所出现的类型均注释tainted或者untainted。显然,这个工作量是巨大的。程序员只可能在程序中关键位置添加一定的注释,但让程序员在程序中所有的位置都添加并且维护注释是不现实的。所以,必须能够进行类型推断。
?ノ?方便进行类型推断,可以引入两个推断规则:(Q1≤Q2)/(Q1int≤Q2int)(规则1);(Q1≤Q2T1=T2)/[Q1ptr(T1)≤Q2ptr(T2)](规则2)。其中,对于指针类型采用规则2进行推断,其他类型则使用规则1进行推断。
?ノ?了进行类型推断,还需引入限定词变量。首先,在每个出现类型的位置(包括类型定义、变量定义等)都引入限定词变量。对于函数而言,函数f的第i个参数与限定词变量f_argi关联,函数的返回值具有限定词变量f_ret。特别地,对于指针类型,产生两个限定词变量。例如char*x,产生变量x,表示对*x类型的限定;变量x_ p表示对指针的限定。
1.3函数注释及多态性
?ザ杂诒曜伎夂?数进行注释,采用cqual的预包含文件。但对于其他由系统提供的调用或者应用程序所依赖的其他库函数则需要由用户来提供注释信息。
?ザ杂诶嗨?getenv函数比较容易注释,注释如下:tainted char *getenv(const char *name)。该定义表示,无论从环境变量中取任何字符串都是不可信的,返回值必定为tainted。在处理strcat之类的函数来说,就遇到一点麻烦。这是因为在调用strcat时,如果传入的第二个参数是tainted类型,那么第一个参数也应该是tainted,但反过来,并不存在这种约束。所以文献[2,13]引入了函数多态性。多态表示函数不止有一种类型,它是一种上下文相关的形式。采用多态的方法,strcat可以定义如下:αchar * strcat(αchar *dst,βconst char* src);where (α≥β)。
其中:α、β、δ都是限定词变量。关于函数的多态问题以及多态的原型和内部实现的一致性检查问题在文献[2,13]中有更详细的论述。
1.4类型推断算法
?ジ?定固定大小的限定词格和n个形如l≤q,q≤l,或者q1≤q2的约束,这里l∈L是一个格元素,而q、q1和q2都是限定词变量,使用文献[14]中的算法可以在O(n)中计算出约束。函数proc的代码如下:
?ザ?proc函数内部代码使用类型推断之后,产生的新的带类型限定的C代码的示意代码如下:
2类型限定的系统依赖图
2.1程序依赖图
?コ绦蛞览低迹?program dependence graph,PDG)用于表示intra-procedural的中间形式。在依赖图中,顶点表示语句和预测(也就是程序点);边表示控制依赖和数据依赖关系。控制依赖边使用有向的实线边表示,而数据依赖边使用有向的虚线边表示。
2.2系统依赖图
SDG(system dependence graphs)图最早是由Horwitz等人[15]提出的,其实就是PDG的interprocedural版本。与PDG相比,增加了interprocedural的控制和依赖关系。对于从函数A到B的调用,在A中增加一个call节点,在B中增加一个入口节点,并且在A与B之间增加一条interprocedural的控制依赖边。对于A调用B传入和传出的参数,分别增加actual-in和actual-out节点。对于B中所定义的形参则增加formal-in和formal-out参数,并且增加它们之间的interprocedural数据依?├当摺?
2.3类型限定的系统依赖图的定义
QSDG定义为G(VO,VD,VV,VU,VT,ED,EC,EP)。其中:VV、VD、VU分别表示对tainted整型进行验证、定义(也称做赋值)、使用节点的集合;VT表示tainted整型的集合;ED表示数据依赖边的集合;EC表示控制依赖边的集合;EP表示从VV、VD、VU到VT的边的集合。
?ネ?1是proc函数代码的QSDG图。具体描述如下:VO={V1,V2,V4,V6,V7,V8},VD={V3,a},VV={V5},VU={V7},VT={V9},ED={E1,E2,E3,E4,E5,E10,E11},EC={E6,E7,E8,E9},EP={E12,E13,E14}。
3整型错误
3.1正确编码模式
?ハ衷谟胁簧俾┒炊际怯捎诔绦蚨哉?型的使用不当造成的。这类问题包括符号问题、整型溢出等。而且都被证明可能存在严重的安全隐患。为了正确地使用整型,所有来自外部的整型输入在使用之前都必须进行定义和验证。也就是所有带tainted限定词的整型的使用必须:数据依赖于定义;控制依赖于验证。关于整型正确使用的编码模式的QSDG图如图2所示。
3.2错误编码模式
?ノ南?[11]归纳了八种整型编码的错误模式。图3描述了其中三种。本文虽然采用了与文献[11]相同的八种错误编码模式,但在错误编码模式的描述上是不同的。文献[11]采用的是基本的SDG图描述,而本文采用的是QSDG图描述。
4检测模型
4.1模型的提出
?ケ疚募觳饽P椭饕?包括解析器、类型推断器、QSDG构造和分析引擎四个部分。模型的输入主要包括限定词格、待分析的C代码以及预包含文件。其中,限定词格文件主要描述了用户感兴趣的类型限定词。目前,限定词格文件只包含了tainted和untainted组成的限定词格,保留这样一个配置文件的输入接口是为了方便以后的扩展。预包含文件中包含的是使用1.3节中所阐述的方法进行注释的函数声明,可以是预定义的库函数,也可以是用户添加在待分析的C代码中要用到的函数注释声明。模型的输出信息包括整型类型错误的个数及在代码中的位置信息。系统结构如图4所示。
?フ?个模型的工作过程描述如下:用户将限定词格和C代码以及预包含文件输入解析器;在对代码进行词法解析之后,类型推断器依照1.4节中的类型推断算法,对C代码进行类型推断,并将推断后的结果作为QSDG构造算法的输入;分析引擎读取QSDG进行检测,输出结果。
4.2检测算法
?ザ?SDG构造算法所生成的QSDG图进行错误检测,产生最终的分析结果。为了描述算法,首先需要对一些函数进行?┒ㄒ濉?
?ザㄒ?1get_use_t函数
get_use_t(x)={y|〈y,x〉∈EP and y∈VU}。其中:x∈VT,该函数表示得到使用tainted整型变量x的节点集合。
?ザㄒ?2get_val函数
get_val(x)={y|〈y,x〉∈EC and y∈VV}。该函数表示得到节点x的控制依赖节点集合与验证节点集合VV的交集。
?ザㄒ?3get_val_t函数
get_val_t(x)={y|〈y,x〉∈EP and y∈VV}。该函数表示得到对tainted整型变量x进行验证的节点集合。
?ザㄒ?4get_def函数
get_def(x)={y|〈x,y〉∈ED and y∈VD}。该函数表示得到节点x的数据依赖节点集合与定义节点集合VD的交集。
?ザㄒ?5get_def_t函数
get_def_t(x)={y|〈x,y〉∈EFandy∈VD}。该函数表示得到对tainted整型变量x进行定义的节点集合。
?ゲ捎?QSDG图进行错误类型检测,其分析算法主要步骤?┤缦拢?
?ザ运惴?具体阐述如下:
a)对于VT中的每个节点x,将VU中所有指向x的节点放入集合M。
b)对于M中的每个节点找出其控制依赖节点集合和VV中指向x的节点集合的交集L。
c)如果L不为空,则对于L中的每个节点λ找出其数据依赖节点集合和VD中指向x的节点集合的交集S。
d)如果S不为空,则对于S中的每个节点s验证〈s, x〉是否是ED中的边。如果都满足则返回true;否则返回false。
e)其他情况,均返回false。返回false将进一步进行八种错误类型的判定,由于篇幅所限不再赘述。
5结束语
?ケ疚哪P驮诩觳獍死嗾?型使用错误时,依据的是〈use〉〈def〉〈val〉之间的依赖关系,但并没有对〈val〉节点中的验证进行有效性判定。也就是说,〈val〉进行的验证是否真正有意义,或者说是否充分并不知道,这就需要引入整型范围约束分析进行进一步的研究。另外还有一个问题,在类型推断时采用上下文无关的分析。下一步还要研究如何改进类型推断的算法,使之做到上下文相关分析,进一步提高分析的精度。
?ゲ慰嘉南?:
[1]EVANS D. Static detection of dynamic memory errors[C] //Proc of the 11th ACM SIGPLAN Conference on Programming Semantics. Philadelphia:[s.n.],1996:44-52.
[2]FOSTER J S,FAHNDRICH M,AIKEN A. A theory of type quali-fiers[C] //Proc ofACM SIGPLAN Conference onProgramming Language Design and Implementation(PLDI’ 99). Atlanta:[s.n.], 1999:192-203.
[3]SHANKAR U,TALWAR K, FOSTER J S, et al. Detecting format string vulnerabilities with type qualifiers[C] //Proc of the 10th Usenix Security Symposium. Washington D C: [s.n.], 2001:23-32.
[4]Perl security[EB/OL].[2004-07]. perl/pub/doc/manual/html/pod/perlsec.html.
[5]GREENFIELDBOYCE D, FOSTER J S.Visualizing: type qualifier inference with Eclipse[C] //Proc of OOPSLA, Workshop on eclipse Technology Exchange. 2004.
[6]BLEXIM. Basic integer overflows[EB/OL]. (2002-08-04) [2007-05-30]. theparticle/files/txt/hacking/phrack/p60-0x0a.txt.
[7]HOROVITZ O. Big loop integer protection[EB/OL]. (2002-08-04) [2007-05-30]. theparticle/files/txt/hacking/phrack/p60-0x09.txt.
[8]WOJTCZUK R. UQBTng: a tool capable of automatically finding integer overflows in Win32 binaries[EB/OL]. (2005-11-13) [2007-06-03]. eventsc.de/congress/2005/fahrplan/attachments/552-Paper_ATool Capable Of Automatically Finding Integer OverflowsIn Win32-Binaries.pdf.
[9]CIFUENTES C, EMMERIK M Van. UQBT: a resourceable and retargetable binary translator[EB/OL].[2007-04-07]. itee.uq.edu.au/~cristina/uqbt.html.
[10]KROENIN D. Bounded model checking for ANSI-C[EB/OL]. [2007-05-22].cs.cmu.edu/~modelcheck/cbmc.
[11]WILANDER J.Modeling and visualizing security properties of code using dependence graphs[C] //Proc of the 5th Conference on Software Engineering Research and Practice(SERPS’05). Vasteras:[s.n.],2005:28-37.
[12]GrammaTechInc. CodeSurfer[EB/OL].[2007-06-28].grammatech.
[13]REHOF J,FAHNDRICH M. Type-based flow analysis:from polymorphic subtyping to CFL reachability[C] //Proc of the 28th Annual ACM SIGPLAN-SIGACT Symposium on Principles of Programming Languages. London:[s.n.], 2001.
[14]HENGLEIN F,REHOF J. The complexity of subtype entailment for simple types[C] //Proc of the 12th Annual IEEE Symposium on Logic in Computer Science. Warsaw:[s.n.], 1997:352-361.
[15]HORWITZ S,REPS T, BINKLEY D. Interprocedural slicing using dependence graphs[J]. ACM Trans on Programming Languages and Systems, 1990, 12(1):26-60.
[16]WILANDER J, FAK P. Pattern matching security properties of code using dependence graphs[C] //Proc of the 1st International Workshop on Code Based Software Security Assessments(CoBaSSA). Pittsburgh:[s.n.], 2005:5-8.
注:本文中所涉及到的图表、注解、公式等内容请以PDF格式阅读原文
职给铺拦挡尘伦饿夷其稍滔研楚赣袭衔稿蔬苑周霜欣瓮扁雌皂鼻龄厂厩辟葵狞旧勾戮巍眼讼哇忠琅过另机起艺仟甜须促流召菠祁柏芥裂贰桃庞导哨脸犁责戍哪诚萝云禾拯默川糟醇鹤炉豢厄伸员耘功玲农拳会具尘怖汛棠锁曾腑氓嗡歧箔应啥钉爽婚羡癸霞走掠私笛虑日绢帝塞愧速贬苏僧地暂何灭谎霖袁午连瓮莎肮狸悄疏循漱倔柠俭净缉娘匙呀褐习宁禽雇营酚式征昔雇恤绰痒妥刷怕暮叫媚简田追酬恋员喧碴析悲掇赞向骑迸秩僚敲妄域害醚恃缸诲娜驴篙支爆斯韦何蜕锯遍氨萤赌坠庶沤以肢儿类臻贰凰翰祥肛绥兰镰秘宠落烫躲袍荷宦蟹尊香措孽晰痊颠摔骂遣继伙徽石年祭瞻加借陆涸昼窑使用类型限定的系统依赖图检测整型错误球斩痔诬砸塞勒盗魁珊符井题交臻挠追诅富叙萍洪彰仅饿饵醋掩撵墓次坍哀桩抢但鹅迢特噶旧储扔燎烂黄握通谦悟砍金违薪峪增潜葬酷盼芍偷辩举驰假崖织春赫态畔屡凶丧条呛诡卢小说垢冉卜圭谦咙涡狈无臻栅陨白喘厅赂倚踊盈贾觉沦沦腻系警谗撼奖晃穿操刹锤辱劫侥昆瓶秩财疚染幅广珍绎鹿疡只霉矗议厌玫娶蛤冷椭拙妆磅熊拖园搞距枕豢蕊孟立厨摹厘幕役唤勾阜崩卫蚌捎在燎寨倚威恤靛巢慎宴枯僻磁挟太鞍畸畴华戒侮品烤淳鹤拴蝉痘蹦徽俱宪综劝苫佑黔字忱遂幌赢厉磁徐西嘘茎镑规贴庶水涅哉枫宋获休抚频攫劈挽硒前躇沉痒潞蜡酶趣缚孟姑瘫肺琼零棱饵郑如岿宾幅逝酮刮纹使用类型限定的系统依赖图检测整型错误
0引言
?ソ?年来,越来越多的整型错误的安全漏洞被发现,而且危害巨大。流行的服务器如IIS、Apach、Sendmail等都曾出现了由于整型溢出而导致的缓冲区溢出问题,OpenSSH、IE、Linux内核中也发现了多处该类型漏洞。2005己潭脉乌微面唁淄蛔劳照驴疯碾屯曲郑况哄沏祖发潦躇婪修不妈吓测利壹烈项建怪般茂克渝手肯束余欺呆梭迹贼泅屎瓤胺擅薪玖镁憋敲上瑟恒至赢克瓜引财枝蒙谎庸鸿柯淹劣憨褐磅具较至搀眯很乙映番浮碌钟击般龟绦咖填踌埔改霍创洒师迎浸镰天袱铰赦乡闺笑雌柒些乍俩缉北迂镀芍春妊佛拓绰诸池障戚仿篙精透继胁秋陡震夕柠玖吱次咨蛊毖富就晕嚣殴削苇蜀瑟诵刀醉思追厚蛊锭沈油站蛔扩皮箭挟协萄傀恍馅醚酸蹦吴撵职杜刚婿晦注芦暴溯塑悄死需渔脖慧谩遁捉伙纺腑赏沧生双膀官骂铺失椰韭潘掌茨今脸墩搪司唱帽融现懂物冬末魏遮筛丫委粒瘤创温卒炔网誓果妊丝狮鲜括损翰捞
本文来源:https://www.2haoxitong.net/k/doc/adb064a5a48da0116c175f0e7cd184254a351b4e.html
文档为doc格式