安全软件工程・Security Software Engineering 源代码安全漏洞检测方法探讨 马虹哲 (广西电网有限责任公司电力科学研究院 广西南宁530023) 【摘要】随着计算机网络的快速发展,有关于软件的安全性问题越发的突显出来。源代码安全漏洞检测正是 基于计算机软件安全为出发点研发出来的相关技术。论文分析了源代码安全漏洞的几种常见检测方法,并对 这些方法的优缺点进行了比较,以期能为计算机网络安全提供一些参考意见。 【关键词】源代码;漏洞;安全检测方法 【中图分类号】TP309.2 【文献标识码】A Discussion on Detection Method of Source Code Security Vulnerabilities Ma Hong-zhe (Institute ofElectric PowerResearch,GuangxiPowerGild CompanyLimited GuangxiNanning 530023) 【Abstract】With the rapid development of computer network,there are more and more prominent on the security of software.Source code securiyt vulnerabiliyt detection is based on the computer software security as the starting point of the research and development of related technologies.This paper analyzes several ommon cdetection methods of source code securiyt vulnerabilities,and compares the advantages and disadvantages of these methods in order to provide some reference for ompcuter network securiy.t 【Keywords】source ocde;vulnerabiliyt;securiyt detection method 1引言 身处于现代信息时代.网络的安全问题已成为全 社会关注的热点问题。计算机系统中的任何漏洞都可 能造成包括经济、政治、军事、社会、科技等多方面的严 2源代码漏洞的形成原因和具体表现 源代码漏洞是指在程序设计之初,由于考虑不周 等问题,导致写代码的时候,一些代码写的不完善,由 此留下了可以被侵入的后门,从而产生的可能会对程 重安全隐患。只有从本质上解决计算机软件的安全漏 洞问题,才能从根本上确保网络信息的安全。然而软 件安全漏洞有极大的隐藏特性,如不形成对它的触发, 很难注意到它的存在。 序本身、系统或数据带来潜在危害的代码问题。源代 码问题一旦被不法分子发现、利用,所造成的危害不可 估量。代码漏洞可以表现在很多方面,算法本身或者 代码本身的问题都可能会造成代码漏洞。 代码漏洞的具体表现主要包括几个方面。 对输入的数据没有进行有效的检查。或者是进行 网络空间安全・2016年11—12月・55・ 因此.目前世界各国都投入了大量精力,用于源代 码安全漏洞检测方法的开发研究。 Security Software Engineering・安全软件工程 过检查但是检查不周,也可能是处理不当,此类问题 最常造成缓冲区漏洞的出现。比如在对某账号进行密 码的设置输入时,如果程序未对密码的长度进行限 制,用户则可能出于安全考虑输入超长的密码,由此 3.3规则检查 安全性一直是程序编程过程中必需考虑的部分, 因此在编程时就会从安全性的角度设定一些必须遵 可能会导致存储密码时对其它的数据进行覆盖,引发 一系列的问题。 循的规则。而通过对这种规则的检查,就能找到源代 码中的某些漏洞。规则检查在进行大规模的程序安全 代码逻辑设计缺陷或错误。这类问题一般是由程 序员的疏忽大意造成的。比如判断时因考虑不周而少 漏条件,当遇到特殊数据和情况时,导致程序出现不 检测时,可以通过选取相关的规则对某一类型的安全 问题进行快速分析,但正是受这种检查法自身特点的 束缚,使得它只能对特定类型的问题进行检查,无法 可预估的错误。 算法本身的漏洞。实现源代码的安全无漏洞,首 先应确保在写代码时进行严密的算法,算法本身出现 了漏洞,则必然导致诸多问题的存在。比如采用比较 简单的加密算法,会为信息泄漏留下操作的可能性。 实现全面的源代码漏洞检测。 3.4类型推导 如果将安全属性看成一种类型,那么通过类型推 3常见的源代码安全检测方法 3.1抽象解释 抽象解释是把程序代码的执行过程看成各种抽 象状态的迁移过程,并通过对抽象状态进行分析来确 定程序的性质。初始抽象状态必须是初始实际状态的 安全近似,而且每次状态迁移需要保持正确的关系, 导检查,就能找出源代码中的不安全漏洞类型。这种 方法忽略了代码执行条件和顺序,只是利用定型规则 确定代码中部件的的类型,所以在进行源代码漏洞检 测时处理速度很快。 一般情况下,类型推导可分为三个阶段:首先是定 型断言,确定变量的初始类型:其次是推导规则,即进 行推论系统规则集的建构;最后是检查规则,即判断 推论结果是否具有“危害性”。 类型推导法对于软件安全漏洞的快速检测量方面 具有很大的优势,能进行大规模程序的安全性分析,但 这样才能保证分析结果的正确。理论上,正确的抽象 能够找出程序中所有可能的缓冲区溢出漏洞。但也相 应的带来较多的误报。在实际使用中,为降低误报率, 用户应当根据被测程序的特性,选择合适的解释函数 和抽象域等。 由于约束变量取值为无穷,所以这种方法也只能用来 检测特定类型的源代码漏洞。 3.5数据流分析 3.2词法分析 数据流分析在源代码的安全检测中,用途比较广 词法分析是最早被用来进行缓冲区溢出漏洞检 泛。这种方法从对源代码的语义信息进行构造变量切 人,采用代数方法对变量进行定义和使用的确定。 测的方法之一。这种方法是对软件源程序进行扫描分 析,同时与特征库进行匹配.当发现某个片与“危险片 段库中的数据”匹配时.则可找出软件程序中可能存 数据流分析方法基于这样一个事实,数据流沿程 序控制图传播。当所有程序点的分析状态达到不动点 时,传播停止,同时得到程序性质的解。但是数据流分 析方法不能精确跟踪指令的控制条件,所以这种检测 方法得到的结果不够精确。 在的溢出漏洞。这种方法的局限性在于容易产生漏报 或误报,并且它也不能理解软件程序的语义。因此需 要进一步的进行上下文分析 ・56・2016年11—12月・网络空间安全 安全软件工程・Security Software Engineering 微的逻辑错误都能被找到,对于某些特定问题的检测 3.6约束分析 通过产生、求解程序的约束条件,约束分析即可确 定程序的性质。约束分析方法建立的局部化约束产生 很有必要。 3.8模型检测 作为形式化的验证技术的一种.模型检测采用的 的规则能清楚的描述指令副作用乃至控制条件。 约束分析检测分为约束产生和约束求解两个阶 段。约束产生阶段是进行包括变量类型和分析状态在 内的约束系统的构建,对这个系统进行求解的过程即 为了约束求解阶段。 这种检测法常用于可能造成缓冲区溢出的字符 串操作的检测。但是,这种方法不容易处理精确循环: 是通过状态迁移描述程序的行为。这种方法用时序逻 辑和计算树逻辑等来表示程序系统的性质,将系统属 性(安全与否)的检验问题变换为搜索不符合逻辑公 式的状态问题。首先,进行抽象模型的构建,这里必需 注意,只有有限状态的程序才能进行模型构建;然后模 型验证要遍历程序的所有状态空间进行验证。这种检 程序中存在循环,且循环控制条件之间存在依赖关系 时,则建立的约束条件可能无解。 测有两种常见的方法:符号化模型检测和模型转换自 动机,两者均为并发系统方法。符号化模型检测是通 过将抽象模型中的状态转变为语法树描述的逻辑公 3.7符号执行 符号执行是通过采用抽象符号代替变量。对路径 敏感的程序控制流进行模拟,在约束求解中对可能发 生的错误解进行检测的方法。在检测中,如果出现象 一式,对公式进行可满足性验证,而模型转换自动机则 是通过在安全时序的基础上,构建一个新的自动机进 行验证。 在协议验证和硬件检测领域,模型检测的应用较 为常见。模型检验能够发现程序中存在复杂语义上的 错误,从而准确发现程序中潜在的安全性漏洞,但现存 组抽象符号的解满足,则可判定程序中存在错误。 符号执行法的检测能力完全取决于求解工具的约束 条件和求解能力。虽然这种方法的检测时间较长,但 它的优点是可以进行比较精准的检测,程序中很多细 的模型检验工具普遍分析源程序的形式化的表示(数 学描述),而不是以源程序作为输入,如需要源程序的 数学模型。通常可以通过程序分析(数据流分析,控制 表1 检测方法 抽象解释 优点 缺点 可将一个对象域的计算映身到另一个对象域,使计 算更容易。是其他检测分析法的理论基础。 词法分析 规则检查 效率高。 分析不精确,漏洞覆盖有限。 有针对性的对不同问题的规则进行分析.适合大规 受规则描述机制的局限。扩展性差。 模的程序检测分析。 类型推导 能够处理大规模的程序检测,效率高。适合检测有限 可检测的漏洞有限.引入安全属性时需重 的属性域,和与控制流无关的安全属性。 新定义类型,分析能力弱。 速度慢。 数据流分析 可以检查变量的所有属性。分析能力强。 约束分析 拥有较强的检测能力,适用于模块化、符号化的分 速度慢。 析,以及复杂的属性静态分析。 符号执行 检型检测 通过模拟程序进行分析,可以发现细微的逻辑错误。 执行路径会随着程序规模的变大而增长。 对程序时序的漏洞比较敏感。 可以造成状态空间的爆炸。 网络空间安全・2016年11—12月 ・57・ Security Software Engineering・安全软件工程 流分析,程序切片工具)来自动完成源程序的模型的 生成。程序切片提取程序的精简了的模型,其中程序 分析是基础.除了语法分析之外.更需要涉及语义的 分析。包括控制流分析和数据流分析。 由于程序的复杂性导致了模型过于庞大的问题, 采取几种方法的综合检测,能更好地完成源代码安全 漏洞检测工作。关于这些方法的优缺点,如表1所示。 参考文献 [1】周诚,张涛,马媛媛,李伟伟.一种高效检测源代码安全漏洞的 代码审查方法『J].现代电子技术,2015,05:83—86. [2】时志伟,赵亮.一种关于PHP源代码安全漏洞的静态检测方 因此模型检测除了只能分析那些有限状态的系统,还 有只能针对程序中的某一个属性构造抽象模型的弱 点,有较大的局限性。 法[J】.信息安全与通信保密,2011,l1:80—82. [3】朱圣才,徐御,王火剑.常见源代码安全漏洞分析与研究[J】.信 息网络安全.2014.02:48—52. 4各种检测方法的比较分析 以上介绍的几种源代码安全漏洞检测法.既有区 别又存在内在的联系。比如抽象解释就是其他方法的 理论基础。这些方法都有各自的优缺点,不可能处理 所有的源代码安全漏洞检测问题.因此需要对这些方 法的特征有一个综合的了解,在实际应用时,合理的 【4]忽朝俭,张甲,李舟军,时志伟,张龚.基于可执行代码的漏洞 检测技术fJ].清华大学学报(自然科学版),2009,¥2:2176-2180. 作者简介: 马虹哲(1987一),女,汉族,研究生,硕士,工程师;主要研究方向 和关注领域:信息安全。 【上接第46页】 参考文献 [1]陈功贵,陈金富.含风电场电力系统环境经济动态调度建模 与算法【J].中国电机工程学报,2013(10):65-66. [2]刘自发,张伟,王泽黎.基于量子粒子群优化算法的城市电动 研究[J].徐州工程学院学报(自然科学版),2014.4,p.51—55 作者简介: 姚晔(1973一),女,汉族,上海人,硕士,辽宁行政学院,教授;主要 汽车充电站优化布局叨.中国电机工程学报,2012(22):112—113. 【3】齐钦.一种改进Apri 算法在高校课程相关性分析中的应用 研究方向和关注领域:大数据。 。58・2016年11—12月。网络空间安全