软件供应链安全及防护工具研究

软件供应链安全及防护工具研究,第1张

文 中国信息通信研究院云计算与大数据研究所云计算部工程师 吴江伟

随着 5G、云计算、人工智能、大数据、区块链等技术的日新月异,数字化转型进程逐步推进,软件已经成为日常生产生活必备要素之一,渗透到各个行业和领域。容器、中间件、微服务等技术的演进推动软件行业快速发展,同时带来软件设计开发复杂度不断提升,软件供应链也愈发复杂,全链路安全防护难度不断加大。近年来,软件供应链安全事件频发,对于用户隐私、财产安全乃至国家安全造成重大威胁,自动化安全工具是进行软件供应链安全防御的必要方式之一,针对软件供应链安全及工具进行研究意义重大,对于维护国家网络空间安全,保护用户隐私、财产安全作用深远。

一、软件供应链安全综述

软件供应链定义由传统供应链的概念延伸扩展而来。业界普遍认为,软件供应链指一个通过一级或多级软件设计、开发阶段编写软件,并通过软件交付渠道将软件从软件供应商送往软件用户的系统。软件供应链安全指软件供应链上软件设计与开发的各个阶段中来自本身的编码过程、工具、设备或供应链上游的代码、模块和服务的安全,以及软件交付渠道安全的总和。软件供应链攻击具有低成本、高效率的特点,根据其定义可知,相比传统针对软件自身安全漏洞的攻击,针对软件供应链,受攻击面由软件自身扩展为了软件自身内部的所有代码、模块和服务及与这些模块、服务相关的供应链上游供应商的编码过程、开发工具、设备,显著降低了攻击者的攻击难度。同时,软件设计和开发所产生的任何安全问题都会直接影响供应链中所有下游软件的安全,扩大了攻击所造成的影响。

近年来,软件自身安全防御力度不断加大,攻击者把攻击目标由目标软件转移到软件供应链最薄弱的环节,软件供应链安全事件频发,对用户隐私及财产安全乃至国家安全造成重大威胁。最典型的如 2020 年 12 月,美国网络安全管理软件供应商“太阳风”公司(SolarWinds)遭遇国家级 APT 组织高度复杂的供应链攻击,直接导致包括美国关键基础设施、军队、政府等在内的超过 18000 家客户全部受到影响,可任由攻击者完全 *** 控。

软件供应链安全影响重大,各国高度重视,纷纷推行政策法规推动软件供应链安全保护工作。2021 年 5 月 12 日,美国总统拜登签署发布《改善国家网络安全行政令》,明确提出改善软件供应链安全,要求为出售给政府的软件开发建立基线安全标准,不仅提供应用程序,而且还必须提供软件物料清单,提升组成该应用程序组件的透明度,构建更有d性且安全的软件供应链环境,确保美国的国家安全。同年 7 月,美国国家标准与技术所(NIST)发布《开发者软件验证最低标准指南》,为加强软件供应链安全加码,明确提出关于软件验证的 11 条建议,包括一致性自动化测试,将手动测试最少化,利用静态代码扫描查找重要漏洞,解决被包含代码(库、程序包、服务)等。

我国对软件供应链安全问题也给予了高度重视,2017 年 6 月,我国发布实施《网络产品和服务安全审查办法》,将软件产品测试、交付、技术支持过程中的供应链安全风险作为重点审查内容。2019 年12 月 1 日,《信息安全技术 网络安全等级保护基本要求》20 版本正式实施,在通用要求及云计算扩展部分明确要求服务供应商选择及供应链管理。

二、软件供应链安全挑战

目前,软件供应链安全受到高度重视,但仍面临多重现实挑战,可以总结分为以下五大类。

1 软件设计开发复杂化成为必然趋势

随着容器、中间件、微服务等新技术的演进,软件行业快速发展,软件功能及性能需求也不断提升,软件设计开发复杂化已经成为必然趋势。这一现状同时带来了软件设计、开发及维护难度陡增,设计与开发过程不可避免的产生安全漏洞,为软件供应链安全埋下隐患。

2 开源成为主流开发模式

当前,开源已经成为主流开发模式之一,软件的源代码大多数是混源代码,由企业自主开发的源代码和开源代码共同组成。根据新思 科技 《2021 年开源安全和风险分析》报告显示,近 5 年,开源代码在应用程序中所占比例由 40% 增至超过 70%。开源的引入加快了软件的研发效率,但同时也将开源软件的安全问题引入了软件供应链,导致软件供应链安全问题多元化。

3 快速交付位于第一优先级

由于业界竞争环境激烈,相较于安全,功能快速实现,软件快速交付仍处于第一优先级,虽然软件通常实现了安全的基本功能需求,如身份认证鉴权、加解密、日志安全审计等,但整体安全防护机制相对滞后,以后期防护为主,前期自身安全性同步建设往往被忽视,软件自身代码安全漏洞前期清除存在短板。

4 软件交付机制面临安全隐患

软件交付指软件由软件供应商转移到软件用户的过程。传统软件交付以光盘等存储设备为载体,随着互联网等技术的发展,通过网络对于软件进行快速分发已经成为基本模式,不安全的分发渠道同样会对软件供应链安全产生重大影响。

5 使用时软件补丁网站攻击

针对软件供应链安全防护,软件的生命周期并非结束于软件交付之后,而是直到软件停用下线。软件在设计及开发过程中难免存在安全缺陷,通过补丁下发部署是修复软件缺陷漏洞的最通用方式。软件补丁的下发部署同样受分发渠道影响,受污染的补丁下载站点同样会造成软件供应链安全问题。

三、软件供应链安全防护工具

软件供应链安全涉及众多元素及环节,参考业界常见划分,软件供应链环节可抽象成开发环节、交付环节、使用环节三部分。针对交付环节及使用环节安全防护,主要通过确保分发站点及传输渠道安全。开发环节与软件源代码紧密相关,安全防护较为复杂,囊括编码过程、工具、设备及供应链上游的代码、模块和服务的安全,涉及四类安全工具,包括软件生产过程中的工具和软件供应链管理工具。

1 静态应用程序安全测试工具

静态应用程序安全测试(SAST)是指不运行被测程序本身,仅通过分析或者检查源程序的语法、结构、过程、接口等来检查程序的正确性。源代码静态分析技术的发展与编译技术和计算机硬件设备的进步息息相关,源代码安全分析技术多是在编译技术或程序验证技术的基础上提出的,利用此类技术能够自动地发现代码中的安全缺陷和违背安全规则的情况。目前,主流分析技术包括:(1)词法分析技术,只对代码的文本或 Token 流与已知归纳好的缺陷模式进行相似匹配,不深入分析代码的语义和代码上下文。词法分析检测效率较高,但是只能找到简单的缺陷,并且误报率较高。(2)抽象解释技术,用于证明某段代码没有错误,但不保证报告错误的真实性。该技术的基本原理是将程序变量的值映射到更加简单的抽象域上并模拟程序的执行情况。因此,该技术的精度和性能取决于抽象域对真实程序值域的近似情况。(3)程序模拟技术,模拟程序执行得到所有执行状态,分析结果较为精确,主要用于查找逻辑复杂和触发条件苛刻的缺陷,但性能提高难度大。主要包括模型检查和符号执行两种技术,模型检查将软件构造为状态机或者有向图等抽象模型,并使用模态/时序逻辑公式等形式化的表达式来描述安全属性,对模型遍历验证这些属性是否满足;符号执行使用符号值表示程序变量值,并模拟程序的执行来查找满足漏洞检测规则的情况。(4)定理证明技术,将程序错误的前提和程序本身描述成一组逻辑表达式,然后基于可满足性理论并利用约束求解器求得可能导致程序错误的执行路径。该方法较为灵活性,能够使用逻辑公式方便地描述软件缺陷,并可根据分析性能和精度的不同要求调整约束条件,对于大型工业级软件的分析较为有效。(5)数据流分析技术,基于控制流图,按照某种方式扫面控制流图的每一条指令,试图理解指令行为,以此判断程序中存在的威胁漏洞。数据流分析的通用方法是在控制流图上定义一组方程并迭代求解,一般分为正向传播和逆向传播,正向传播就是沿着控制流路径,状态向前传递,前驱块的值传到后继块;逆向传播就是逆着控制流路径,后继块的值反向传给前驱块。

2 动态应用程序安全测试工具

动态应用程序安全测试(DAST)技术在测试或运行阶段分析应用程序的动态运行状态。它模拟黑客行为对应用程序进行动态攻击,分析应用程序的反应,从而确定该应用是否易受攻击。以 Web 网站测试为例对动态应用程序安全测试进行介绍,主要包括三个方面的内容:(1)信息收集。测试开始前,收集待测试网站的全部 URL,包括静态资源和动态接口等,每一条 URL 需要包含路径和完整的参数信息。(2)测试过程。测试人员将测试所需的 URL列表导入到测试工具中。测试工具提供“检测风险项”的选择列表,测试人员可根据测试计划选择不同的风险检测项。测试工具在测试过程中,对访问目标网站的速度进行控制,保证目标网站不会因为同一时刻的请求数过高,导致网站响应变慢或崩溃。测试人员在设定测试任务的基本信息时,根据目标网站的性能情况填入“每秒请求数”的最大值。测试工具在测试过程中保证每秒发送请求的总数不超过该数值。(3)测试报告。在安全测试各步骤都完成后,输出测试报告。测试报告一般包含总览页面,内容包括根据测试过程产生的各种数据,输出目标网站安全性的概要性结论;测试过程发现的总漏洞数,以及按照不同安全等级维度进行统计的漏洞数据。

3 交互式应用程序安全测试工具

交互式应用程序安全测试(IAST)通过插桩技术,基于请求及运行时上下文综合分析,高效、准确地识别安全缺陷及漏洞,确定安全缺陷及漏洞所在的代码位置,主要在三方面做工作:流量采集、Agent监控、交互扫描。(1)流量采集,指采集应用程序测试过程中的 >

但C#已经在快步进逼BASIC,可能再过两年就可以进入前五名。C#上升,BASIC下降,某种程度上反映出微软的VB程序员正转换到C#语言。C#正在逐渐累积和Java抗衡的能量。

在2009年,最值得重视的编程语言好消息,应该就是C了。C0x的x最终被设定为9,将于2009年推出这个标准。经过十年的经验累积,许多C既有的缺点都将在这个标准中获得改善,值得我们期待。

得益于Google的强力背书下,Python这几年小有斩获,现在已经变成通用型脚本语言的第一选择,Python兴起,导致Perl风华难再,两者消长的态势相当明显。而且在2008年末,大家期待已久的Python30也终于推出了。

现今,我们生活在Web的时代,Web后端或许百家争鸣(Java、PHP、NET、),但Web前端还是JavaScript一枝独秀。尽管JavaScript语言存在许多为人所诟病的地方,但JavaScript的重要性仍会持续上升。

对Delphi来说,我承认我过去看走了眼,认为它会持续触底,但2008年显然是Delphi重新被群众拥抱的一年。Delphi曾经拥有许多高手级的使用者,甚至对VisualBasic造成威胁,但是过去这几年在Java和NET的出现之后,以及Web应用席卷全球后,Delphi明显地被边缘化了。外患加上内忧(Borland公司内部的变动),使得Delphi的形势相当不佳,连原文书都找不到几本。在Borland将开发工具部门切割出CodeGear,接着CodeGear又被Embarcadero买下之后,Delphi好像又渐渐有起色了,但说它拨云见日还太早。

如果说Delphi触底反d,那么遭遇完全相反的就是Ruby了,近期Ruby的招聘大幅降低。对于一个窜升太快的语言,需求稍微有跌落,是正常现象。Ruby长期应该仍会是缓慢上升的格局。

今年是Lua丰收的一年,能见度大增,除了用在游戏软件开发之外,也陆续被一些重要的商业软件商所采用(例如Adobe公司)。我看好Lua,因为在嵌入式语言领域,还没有其他语言可以与之匹敌。

说到Adobe,今年推出AIR之后,好像市场的热度还没起来,所以Adobe的官方语言依然载浮载沉。我希望它能在2009年有更好的表现。

Erlang在2008年的表现不错,持续缓慢上升。Java平台上的两个语言Groovy与Scala也开始受到关注。这些新语言某些程度也相对地呼应了函数式编程(functionalprogramming)与动态语言崛起的现实状况。

根据Net在2009年1月的数据显示,Apple计算机的市场占有率已经达到963%,而且iPhone在过去这一年半的销售数字更是相当抢眼。受其影响,开发MacOS应用软件的官方语言Objective-C也大有斩获,越来越受到重视。要不是Apple的笔记本太贵我买不起,否则我早就开始学Objective-C了。

我注意到过去一年有一个奇怪的语言忽然冒出头,叫做Alice。Alice是一个3D动画的制作环境,适合用来辅助说故事。这个语言之所以叫做Alice,该不会是和“Alice'sAdventuresinWonderland(爱丽斯梦游仙境)”的故事有关?

容我在此有一点私心介绍一下REBOL语言。根据目前的开发进度来看,2009年将会是REBOL30发布的一年。我希望大家多多关注这个语言。你可以到我的REBOLOGY博客(blogspot)上看看它的动态。

分析完重点语言之后,就整体来看,我们会发现动态语言和函数式语言越来越受欢迎。我自己就是从C、C到Java、C#,再到Erlang、REBOL,我使用的语言越来越动态、越来越偏函数式编程。

动态语言受欢迎

由于动态语言越来越受欢迎,NET和Java都注意到这样的现象,试图让动态语言可以更容易地整合到自己的平台上。Java阵营的DaVinciMachine,微软的DLR(DynamicLanguageRunti-me)都是这种趋势下的产物。我们可以预期在不久的未来,动态语言会更加蓬勃发展。

动态语言势力之广,可能远远超出你的想象,下面列出常见的动态语言:D、JavaScript、、Erlang、Groovy、Lisp、Lua、Objective-C、Perl、PHP、Python、Ruby、Scala、Smalltalk、Tcl、VBScript。

究竟动态语言有什么样的魅力?因为动态语言可以用更简单的方式,做到静态语言很难做到的事。我很难用三言两语介绍动态语言的特点,而且动态语言的定义也似乎见仁见智,值得写一篇专文好好地介绍。

函数式语言崭露头角

除了动态语言,函数式语言也是一种趋势,连微软都推出了F#。去年年中我在台湾微软讲过两场F#的讲座,听众不少,显示大家对这类编程技术相当好奇。

函数编程(FP)长期以来没有出现在主流的商业软件世界,真正让FP无法被接受的原因可能是“执行效率”。传统上,函数式编程语言的效率确实比命令式(imperative)编程语言来得差,这在商业系统上是不能忍受的。但是这个原因却有了变化。今天,我们有了新的衡量标准:“简单”、“快速开发”比其他因素都更重要,因为现在软件的复杂度已经到了我们无法忍受的地步,而IT产业的竞争也比以往激烈许多。

想要“简单”、“快速开发”,就要用比较高阶的抽象,因此函数式编程比命令式编程更适合现在的开发环境。这些年来硬件的进步,使得函数式编程的效率不再是大问题;甚至由于编译技术的进步,函数式编程语言的执行速度,现在也已经不再是吴下阿蒙。

近年来硬件的发展,使得局势似乎180度反转成为对FP有利的局面:多CPU、多核心、超线程(HyperThreading)的硬件架构普及,以及分布式运算的流行,这根本就是专为滋养FP繁殖而打造的环境。

但是,大多数的程序员想从OO或者procere式的编程方式,转到FP,难度是不小的。

语言联合国

当一个系统比较大的时候,使用混合语言编程是很常见的,因为:

每个语言都有适合使用的时机,一个大系统可以分成多个次系统或模块,每个次系统都有不同的特质,适合采用不同的语言。

大系统开发时,开发者的人数变多。每个人倾向于使用自己熟悉的语言和工具。

以我自己的例子来说,基于上面的考虑,我规划的系统,同时使用C、C#、REBOL、Lua,未来可能还会加入Erlang。我们用C进行系统编程(处理低阶的,和 *** 作系统相关的部分),使用C#写跨平台的服务器(未来考虑用Erlang取代),使用REBOL写解析器和编译器,使用Lua作内部脚本语言。每个语言各适其所。

使用混合语言的开发方式,另一个好处是程序员擅长什么就用什么。学习一个语言到精通的地步,需要很长的时间。我们无法要求自己团队的程序员都能使用某个我所熟悉的语言,可以退而求其次,让他们用自己最熟悉的语言,只要开发出来的东西符合我们规定即可。

使用混合式语言开发,只要模块切割得当,接口定义清楚,架构设计正确,那么绝对是可行的。这是我的经验之谈。

但是也请注意,混合多语言可能会导致维护难度的提高。当开发某模块的人离职,且当初他所使用的语言没有其它人会,这个时候麻烦就来了。

混合多种语言开发系统,有可能要面对语言之间的阻抗(impedance)问题,就好像不同国家之间会有不同的文化隔阂一样。好的系统设计应该要考虑到这一点,减少模块之间的接触点,设法让语言之间的阻抗降到最低。

我的建议

如果你想培养一个全能的联合国梦幻开发团队,我的建议是要集合下面的语言人才:

C:进行系统开发

C:进行COM与传统的微软技术开发

C#:进行现代的微软技术开发

PHP:进行Web后端开发

JavaScript:进行Web前端开发

Objective-C:进行Mac或iPh-one开发

Java:毕竟许多地方还是会用到Java

Python:进行脚本开发

图形处理软件,显卡扫描软件。

程序静态分析是与程序动态分析相对应的代码分析技术,它通过对代码的自动扫描发现隐含的程序问题,主要具有以下特点:

(1)不实际执行程序。动态分析是通过在真实或模拟环境中执行程序进行分析的方法,多用于性能测试、功能测试、内存泄漏测试等方面。与之相反,静态分析不运行代码只是通过对代码的静态扫描对程序进行分析。

(2)执行速度快、效率高。目前成熟的代码静态分析工具每秒可扫描上万行代码,相对于动态分析,具有检测速度快、效率高的特点。

代码如下:

void f1(int p1, int p2, int p3)

{

p1 = p3 - p2;

}

main()

{

int a,x,y;

printf ("Type in a value for a");

scanf ("%d",&a);

printf ("\n");

y = 0;

if (x != 0)

{

f1 (&y,a,x);

}

printf ("A is %d\n",a);

}

对上面代码进行数据流分析,结果如下:

变量 x: UR(未初始化就引用)

变量y: DU(初始化后未被引用就出作用域了)

变量y: DD(初始化后未被引用就再次被初始化)

1)x 的 UR异常是由于在“if“的条件之前未给x 赋初值引起的。

修正:

在原码中给x 赋初值或从键盘输入一个值给 x。

2)Y的 DU异常是由于 Y被赋初值0 后,或是在f1 函数中再次赋值后,都

没有被引用就出了其作用域。

修正:

在程序末尾,在打印语句中加入 y。

3)y 的 DD 异常是在 Y 被赋初始值 0 后如果是走 if 的真分支那么 Y 在没有

被引用的情况下就再次被赋了初值。这是由于使用了不完整的 if 语句造

成的。

修正:

用 if-then-else结构重写if语句。

静态仿真是指在Caxa线切割软件中,通过模拟线切割过程中的刀具运动,模拟线切割过程中的切削力,模拟线切割过程中的切削温度,以及模拟线切割过程中的切削烟尘等,来预测线切割过程中可能出现的问题。

设置静态仿真的步骤如下:

1、打开Caxa线切割软件,点击“仿真”按钮,进入仿真界面;

2、在仿真界面中,点击“静态仿真”按钮,进入静态仿真设置界面;

3、在静态仿真设置界面中,设置刀具运动、切削力、切削温度、切削烟尘等参数;

4、点击“开始仿真”按钮,开始静态仿真;

5、根据仿真结果,调整参数,直至满足要求;

6、点击“保存”按钮,保存静态仿真设置,完成静态仿真设置。

以上就是关于软件供应链安全及防护工具研究全部的内容,包括:软件供应链安全及防护工具研究、现在做程序主要用哪些软件、动态分析包括哪些扫描工具等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zz/10215018.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2023-05-06
下一篇 2023-05-06

发表评论

登录后才能评论

评论列表(0条)

保存