陈柏政,窦立君
(1.南京林业大学信息科学技术学院;2.南京林业大学网络安全和信息化办公室,江苏南京 210037)
在当今社会,软件与网络安全相关问题已成为热门话题。与机械器材厂商不同,软件的安全检测到目前为止并没有形成统一标准,不同厂商有着不同的检测评估系统,导致软件安全问题层出不穷[1]。这些问题给数据安全及人们的生活隐私带来了极大隐患。
目前针对软件安全的研究很多,但是较少有研究对这些问题及相关解决方法进行总结。基于上述情况,本文通过对当前存在的主要软件安全问题进行总结分析,并提出相应防护措施与解决方案,如静态分析[2]、动态分析[3]、脆弱性评估[4]等,这些措施能够有效应对当前主要的软件安全问题,保障用户在软件使用过程中的安全性。最后分析了未来软件安全可能面临的挑战,并针对这些问题提出可能的应对方法。
互联网兴起初期,公司缺乏完善的管理体系,早期的软件安全问题大多是由于安全加密系统不完善或技术人员素质不高引起的。
首先,互联网公司自身存在的管理问题是软件安全问题产生的主要原因之一。早在1986 年,世界上第一个计算机木马病毒[5]就已出现,并且随着互联网的发展,第三代木马病毒兼具伪装和传播两种特征,并结合TCP/IP 网络技术[6]四处传播。早期关于网络安全的研究尚处于空白,杀毒软件与防火墙技术[7]尚未成熟,导致了木马病毒的泛滥。
其次,用户安全意识较差下也是早期软件安全问题频发的主要原因之一。早期的用户通常把自己的软件账户密码设为类似“123456”的简单密码,黑客只需用穷举法即能破解这些密码。此外,某些企业也缺乏对技术人员安全意识方面的培训,在进行企业机密文件传输时,有些技术人员仍使用保密性一般的邮箱,导致企业泄密问题频繁发生。
此外,国家早期也缺乏针对软件安全问题相关的法律法规,因此很多流氓软件[8]趁机大肆传播。流氓软件是介于病毒与正规软件之间的一种软件,这些软件可能不会给用户计算机造成直接的破坏,但会严重影响用户体验。其管理难点并不在于难以发现与查杀,而是其模糊的定义标准,法律法规与行业规范的缺失给了流氓软件可乘之机。我国尚未有完善的法律法规对流氓软件进行管理约束,所以流氓软件至今仍是一个难以解决的问题。
如今互联网公司都对自身的管理体系进行了完善,普遍拥有严格的管理制度,并且也会对工程师及开发人员进行全面、严格的安全意识培训,但软件安全问题仍然没有显著减少,利用互联网进行的违法活动相较之前甚至更加猖狂。主要原因在于厂商在完善其安全防护系统的同时,黑客群体也具有了更加多样化的攻击手法和工具。
网络空间的开放性也为软件安全带来了极大隐患。人工智能与大数据的发展使网络主体之间需要传输更多信息,令黑客的攻击更容易实现。
软件攻击[9]手段日益多样化,要达到某一目的的软件攻击行为也并不是单一的,本节将结合软件攻击对象简述主要软件攻击方式的原理。根据软件攻击对象,可将软件攻击类型分为6 种,具体见表1。
Table 1 Software attack classification表1 软件攻击分类
如表1 所示,软件攻击技术主要包括反汇编[10]和运行时内存监控[11]两种。
反汇编攻击的原理是使用一段特殊构造的代码欺骗反汇编工具,使其产生错误的程序代码,其目的是拖延软件分析师对病毒的解析进程,为病毒的变种争取时间,使该病毒的解密算法更难被解析出来。
运行时内存监控指对内存发起的攻击方式,主要通过耗尽资源、软件故障、物理损坏等方式达到攻击目的。其中资源耗尽是最常用的攻击方式,其原理是通过对用户主机内存不断发起大量攻击,导致其主机内存耗尽或CPU 被应用程序占满,从而无法提供网络服务。目前最难防御的内存攻击方式为分布式拒绝服务攻击(Distributed Denial of Service Attack,DDoS)[12]。
软件攻击和软件防御技术是相辅相成的,本节将简述针对反汇编与内存攻击的软件防御技术原理。
目前所使用的主要的防反汇编技术是代码混淆技术[13],其原理是使代码共享一条指令代码,从而使共享段的代码可被不同的指令控制流调用。其目的是混淆反汇编得到的代码,使黑客由反汇编得到错误代码,以此达到保护软件的目的。
由于DDoS 攻击发起成本低、攻击威力大,到目前为止针对其防御仍是一个世界级的难题。目前主要的缓解DDoS 攻击的方式是加强DDoS 攻击检测,保证能在第一时间发现DDoS 攻击,从而尽快更新安全补丁,以减少损失。Huang 等[14]对DDoS 的攻击结构进行分析,为针对DDoS 攻击的防御策略优化设计提供了建议;Alzahrani 等[15]提出一种用于检测DDoS 攻击的系统,其与基于特征和神经网络的检测方法相比,具有更高的检测率与检测精度。
2.1.1 软件漏洞
软件漏洞是当前软件安全面临的最大挑战。目前比较常见的软件漏洞大致可分为缓冲区溢出漏洞[16]、整数溢出漏洞[17]、逻辑错误漏洞等[18],下面将从3 个方面对软件漏洞问题进行具体分析。
(1)缓冲区溢出。在软件开发过程中,开发人员通常会预先分配出一个临时空间用于存储特殊信息,即缓冲区。向缓冲区中输入数据时,如果数据过大,则会溢出缓冲区,覆盖靠近该缓冲区内存上存储的合法数据。在理想情况下,程序会检查数据长度,不允许开发者输入超过缓冲区长度的字符。但实际上,大多数程序都会假设已输入数据与缓冲区的空间大小匹配,并且不作检查。由于C/C++语言在编译时,不会对数组及指针自动进行边界检查,使得编译时很难发现程序中的漏洞,所以采用C/C++编写的程序中往往存在缓冲区溢出漏洞。下面给出一个经典的缓冲区溢出漏洞的例子。
例子中的函数p()通过strcpy 函数将字符串b 直接拷贝给字符数组c,在执行这段代码时并没有进行任何判断,最后执行的结果是程序崩溃。
黑客利用缓冲区溢出漏洞发起攻击,输入超过缓冲区长度的数据,使缓冲区溢出,进而破坏程序的堆栈。之后的攻击一般分为两种,一种是直接使程序崩溃,拒绝服务请求,另一种是在函数返回时改变函数返回的地址,使程序跳转到一个任意的地址,执行黑客输入的恶意代码。缓冲区溢出漏洞攻击的目的大多是获取某些具有特权的程序控制权,从而对整个主机进行操控。
(2)整数溢出。整数溢出是在执行程序过程中,计算得到的结果超过了存储结果位向量所能表达的最大整数范围。由于整数变量存在上界和下界,整数溢出会出现上溢和下溢两种情况。上溢是指若计算结果超过整数变量的上界,计算结果就会由本来的一个极大值变为一个极小值或零,下溢则反之。整数溢出漏洞通常是由有符号整数之间的混合使用或开发人员对数据运算边界问题的疏忽引起的。
黑客往往会利用整数溢出漏洞发起针对代币资产的攻击,在攻击时向账户中转入一个数额巨大的代币量,使其超出软件中整数类型的最大数值,从而以极小甚至零代价得到高额利润。
(3)逻辑错误。常见的逻辑漏洞有越权访问、密码找回逻辑漏洞、支付逻辑漏洞、多线程条件竞争漏洞等,这些漏洞大多是由于程序本身逻辑不严谨造成的。
2.1.2 软件安全设计缺陷
软件安全设计是指开发人员通过设计各种安全机制预防软件可能遭受的攻击。
首先,由于当下激烈的商业竞争环境,比起质量安全,很多厂商更注重软件开发速度,导致软件在开发过程中往往会仓促完成安全设计甚至舍弃安全设计,转而选择在软件发布后不断发布补丁来维护软件安全,即penetrate-andpatch[19]方法。这种方法可让厂商更好地把握住商业机会,但会为软件的长久安全带来隐患,等黑客发起攻击时才进行补丁研发会对软件安全造成极大威胁,从而严重破坏用户的使用体验。
其次,软件安全设计上的缺陷不同于软件本身出现的漏洞,后者可由自动代码审查工具进行筛查,而前者往往存在于软件架构设计中,这些错误无法由代码审查工具扫描发现。所以软件安全设计往往交由专门的人员进行研究,但由于技术门槛较高,很多企业缺乏相应的人员,使得软件安全设计一直是一个难以解决的问题。
目前常见的软件安全设计缺陷主要有密码技术使用不当、结构性安全薄弱等。开发者有时会将过多精力投入到密码算法设计上,而忽略了其他安全性问题。即便如此,在密码技术的使用上也存在很多问题。有的开发者在进行安全设计时会选用不当的密码技术,这不仅会为软件安全架构带来隐患,也为日后软件的维护与修复工作带来很多问题。对于结构性安全方面的问题,通常都是违反了软件安全设计的四大原则,具体如下:
(1)过大的攻击面[20]。黑客往往耗费大量时间和精力在信息收集上,而过大的攻击面给了黑客更好的收集信息的机会。
(2)在过高的权限级别上运行进程。为了维护方便,只用一个root 账户操作所有系统,但是黑客只要成功攻击了任意一个系统,就相当于拿到了所有系统权限。
(3)没有进行纵深防御[21]。开发者将所有精力放在一种防御手段上,然而即使防御技术再先进,也会有出现0day 漏洞[22]的可能性,仅仅一层防御无法确保软件安全,黑客在攻破一层防御系统之后即可直接破坏整个系统。
(4)故障安全缺陷。黑客在信息收集阶段往往会对系统输入异常的信息,若系统在故障安全方面存在缺陷,黑客则有可能收集到关键的信息和数据,为下一步攻击作好准备[23]。
由于开发者在进行软件安全设计时往往会忽视以上问题,导致软件在结构性安全方面存在很大漏洞,从而为之后的软件开发带来隐患。
2.1.3 软件安全评估系统问题
软件漏洞是不可避免的,因此对软件的安全评估将起到至关重要的作用。软件安全评估是对软件安全的评价度量,对软件中可能存在的安全漏洞作出预测,并提出软件可能遭受的攻击,从而作好预防措施。但由于当今软件规模不断增长,逻辑功能也日渐复杂,这意味着对软件进行安全评估的成本不断增加。而且由于代码复杂度过高,在对代码进行安全分析时,许多针对大规模软件进行分析的技术对上下文、控制流及路径信息进行了简化,从而降低了计算复杂度,但同时也意味着分析结果的精度会大幅下降。就目前而言,想要研发出一个成本低廉且精度较高的软件安全评估系统十分困难。
2.2.1 针对软件漏洞的防护
目前针对大部分软件漏洞,通用的防护措施分为漏洞挖掘[24]、漏洞分析[25]及漏洞利用缓解[26]3 个阶段。下面将从这3 个方面总结国内外在软件漏洞防护方面的研究进展。
软件漏洞挖掘的目的是为了确认软件漏洞的存在。早在20 世纪70 年代,美国南加州大学就发起了保护分析项目(Protection Analysis Project,PA)研究计划,针对操作系统的安全漏洞进行分析与研究[27],以提高软件的安全性。之后人们开始对软件源代码进行分析,检测在软件中是否存在可能被利用的漏洞,即软件漏洞挖掘。软件漏洞挖掘技术可大致分为4 种,分别是基于源代码的漏洞挖掘、基于补丁对比的漏洞挖掘、基于模糊测试的漏洞挖掘与基于代码特征的漏洞挖掘。
每种技术同样也存在不足之处,如基于源代码的漏洞挖掘技术只适用于开源软件或开发者自身进行的测试,由于其要求拥有软件源代码,所以并不适用于如Windows 旗下的Office 等闭源软件[28]。基于补丁对比的软件漏洞挖掘技术,对比方法主要分为基于文本的对比、基于汇编指令的对比和基于结构化的对比,但由于其精度较低、复杂度较高,还有很大的改进空间。基于模糊测试的漏洞挖掘技术原理是输入非正常数据之后对系统进行检测,再发现软件漏洞,因此需要大量测试用例。目前这种方法只适用于小型程序或代码片段中,如何生成测试用例是模糊测试研究中的一个难点。基于代码特征的漏洞挖掘技术相较于其他方法可适用于较复杂的大规模软件,但有较高的误报率,所以十分依赖于人工筛选。Wang 等[29]提出一种基于动静结合的Android 应用漏洞挖掘方法,该方法相较于静态分析误报率更低,提高了漏洞挖掘的稳定性和准确度,但其分析框架应用范围较窄;Zhang 等[30]提出基于Fuzzing 技术的网络协议自动漏洞挖掘技术,解决了人工分析效率低下的问题,但仍然没有解决如何生成高质量测试用例的问题。
在完成软件漏洞挖掘之后,下一步是对发现的漏洞进行分析。通过软件漏洞分析技术,对软件漏洞形成原因进行研究分析,最终目的是判断出软件漏洞类型及其具体位置。吴世忠等[31]将当前的软件漏洞安全分析技术分为软件架构分析技术、代码静态分析技术、代码动态分析技术、动静结合的分析技术和漏洞定位技术共5 种,其中软件架构分析技术尚未成熟,而代码的静态与动态分析技术已进入瓶颈期,所以动静结合的分析技术将成为未来的研究重点。Almorsy 等[32]研究了一种自动化的漏洞分析工具,提高了漏洞分析的覆盖率与正确率,但在速度上仍需改进;Yan 等[33]介绍了一种新的PHP 代码静态漏洞分析算法,该算法有效解决了传统方法中误报率高的问题,但由于缺少描述所有Web 应用程序漏洞的通用模型,其误报率难以进一步降低。
在锁定软件漏洞的位置及类型后,开始对利用该软件漏洞发起的攻击进行缓解,目前可将攻击方式分为面向数据流与面向控制流两种。George 等[34]提出一种基于图的工业物联网安全框架漏洞利用方法,可将安全问题表述为图论问题,为网络风险评估提供了一个安全框架,但是目前缺少针对成本模型的泛用性标准,难以对漏洞进行修补;魏强等[35]总结了软件漏洞利用缓解技术,主要包括堆保护、地址随机化、沙箱保护等,这些技术可以有效化解大部分面向控制流的攻击,但其不足之处在于基于数据流的攻击很难进行防御。
2.2.2 完善软件安全设计
为了规范软件安全设计,开发者在软件开发过程中必须遵守软件安全设计的5 项原则[36],包括保护最薄弱环节、纵深防御、故障安全、最小特权与分隔原则。
保护最薄弱环节即对软件进行安全分析时,要重点关注系统中最薄弱的地方;纵深防御即开发者应实施多重防护措施来防御可能的攻击;故障安全即需要开发者考虑到可能出现的各种故障,并在开发过程中提前设计好针对系统故障的安全保护机制;最小特权是软件安全设计中最基本的原则,即将用户特权限定在最小范围内,在保证用户正常进行管理操作的同时,不能越权使用系统;分隔原则是指将系统分隔为尽可能独立的系统单元,如果系统一部分出现了安全隐患,也不会对其他部分造成较大影响。
除传统的5 项安全设计原则外,目前提出了更多需要遵守的规范,如默认设置安全性、不信任第三方系统、公开设计、简化系统设计、使用白名单等。Sion 等[37]提出一种基于风险的设计安全性分析方法,该方法提出的威胁模型解决了系统设计与具体数据脱节的问题,但其无法随着时间推移动态更新安全目录,时效性不强。
2.2.3 改善软件安全评估系统
软件安全评估系统是修复软件漏洞的前提,其旨在尽量发现软件可能存在的安全风险,提高软件的安全标准,在进行安全评估时应从需求、结构设计、编程、详细设计、编码、测试等方面对软件进行完整的安全性分析。具体如表2 所示。
Table 2 Software security assessment system表2 软件安全评估系统
未来在软件的不断发展过程中,软件交互与协同会更加频繁,软件功能会更加智能化,其结构也会更加复杂,这意味着软件安全会面临更严峻的挑战。
2010 年6 月,“震网”病毒[38]首次被检测发现,被称为有史以来最复杂的网络武器。该病毒具有极强的传播性、隐藏性和破坏力,会定向攻击核电站、水坝及国家电网,危害极大。之后,2011 年的“Duqu”病毒[39]和2012 年的“沙蒙”病毒[40]等超级病毒的相继出现也意味着针对工业控制系统的大规模复杂攻击已成为现实。这些攻击与以往攻击的不同之处在于,传统的安全攻击普遍是利用通用软件的漏洞发起的,其目的大多是通过盗取用户隐私信息谋取非法利益,而以“震网”病毒为代表的攻击则是针对行业专用软件及内部专用网络,对传统的软件安全观念造成了很大冲击。攻击发起者不再是一般的个人或组织,其攻击目的上升到针对国家的关键敏感行业,这可能成为未来软件攻击新的发展趋势。一旦这种复杂的网络攻击开始大规模出现,传统的软件安全防御措施将很难再发挥作用,届时需要提出全新的软件安全理念以支撑新的软件安全防御技术的研究。
“震网”病毒的出现意味着传统的工业控制网络系统不再安全,未来应更加关注专业系统及专业网络的安全检测。由于现场总线控制系统中的组态软件等行业软件产品被少数公司所垄断,如西门子公司的SIMATIC WinCC 系统,即“震网”病毒攻击的主要目标,伊朗将其广泛应用于基础国防设施中,所以伊朗成为遭受攻击损失最惨重的国家。因此,工业控制网络安全不能依赖于单一的行业软件。
深度学习的不断发展也为软件安全防护提供了新的实现方法。如郑炜等[41]采用深度文本挖掘模型TextCNN与TextRNN 构建安全缺陷报告预测模型,以辅助发现软件测试中的安全问题。
此外,国家应加强对软件安全的管控,大力发展漏洞挖掘技术相关研究,对重要的软件系统使用自主可控的信息安全技术。同时国家之间应加强交流合作,进行网络战的应对演习,成立软件安全应急组织,研究针对大规模攻击的应急措施。如果有高危的软件安全问题出现,能够及时发现并加以应对,从而将危害降到最低。
随着如今软件逐渐朝着智能化与自动化方向发展,软件应用范围已从日常生活扩展到航空航天、核技术控制等重要领域,但是软件安全问题也日益增加,传统的安全防护措施已逐渐无法应对新型的软件安全攻击。本文通过对主要软件安全问题及其应对措施的分析,总结了软件安全问题现状,探讨了未来可能会出现的软件安全问题及相应解决措施。不仅公民应提升自身的安全意识,而且企业和国家也要加强软件安全管理,做好安全检测工作,做到防患于未然。针对大规模复杂攻击的防护措施将会是未来研究的重点,对于所有的软件企业而言,这都是一个新的挑战,没有很多成功经验可以借鉴,所以需要针对相关问题进行深入探索与研究。