在软件开发中所面临的新型威胁已经不仅仅与特定的公司相关,整个软件供应链的上下游都已成为攻击者的目标,因此必须保证每个环节的安全性,因为如果一个环节出现问题,一切都会受到影响。
供应链活动包括将原材料、部件和资源转化为完整产品并交付给最终客户的每一步。每个步骤本身都可能是一个复杂的过程,并且有可能导致安全事故。
我们在之前的文章中已经清楚地了解到什么是软件供应链。那么我们现在继续深入,将重点放在源代码上。
举个例子,你的源代码将存储在私有的Git仓库中,这可能是你的基础设施的一部分,也可能是供应商提供的 SaaS,还有编译器工具、基础容器镜像仓库等。而一些依赖项则托管在公开的代码库中,如 Docker Hub 或 Quay.io,可能会受到损坏。此外,我们也将我们的应用程序作为容器镜像发布在公开的代码仓库中。
那么,在供应链中其中一些组件在你的保护之下,比如你的私有源代码 git 仓库、应用程序代码本身以及最终生产出来的二进制文件或容器镜像。但许多其他的组件或服务是公开的服务和资源,或是由其他公司提供的,完全不在你的掌控范围之内。
所以软件供应链攻击可以直接瞄准你的软件,或它可以瞄准任意上游组件(比如外部的依赖项或第三方服务),进而你会成为受害者,要么直接遭受攻击,要么成为提供受损资源的供应商。
针对软件供应链的攻击正以每年4-5倍的速度增长,仅在2021年就发生了几千次,最常见的是与依赖项混淆或误值域名(URL劫持)有关的错误,其次是恶意源代码注入。
幸运的是,并不是每次攻击都有巨大的影响范围,下文我们将会介绍其中几个较为知名的攻击事件。CNCF还在其《供应链破坏目录》中收集了各种类型的供应链遭受攻击的事例:
https://github.com/cncf/tag-security/blob/main/supply-chain-security/compromises/README.md
具体信息:https://about.codecov.io/security-update/
CodeCov是一款用于托管代码测试报告和数据的在线平台,2021年其 Docker 镜像中泄露的凭证使攻击者可以修改一个 bash 脚本。当客户下载并执行该脚本之后,客户的凭证会被泄露,进而攻击者可以访问他们的Git仓库。攻击从当年的1月31日开始,而第一个客户发现凭证遭受泄露时已是3个月之后,这意味着被入侵的软件在长达数月的时间里正常与上下游对接。Hashicorp、Confluent等多个知名企业表示受到影响。
攻击者渗透到 SolarWinds 的网络中,并设法将恶意软件注入其构建过程。该恶意软件(与 APT29、Nobelium 有关)与 Orion(某个网络管理系统)捆绑在一起,作为产品更新的一部分分发。该 Artifact 经过数字签名,作为构建过程的一部分被数百名客户下载。
一旦恶意软件进入客户网络,攻击者就会监视并窃取他们的信息。这一事件也展示了针对供应链的攻击是如何向下游传播并影响到多个客户。作为被破坏的 Orion 软件的一部分,Mimecast(一家云网络安全服务公司)的邮件服务器的TLS证书私钥被泄露,这使得攻击者可以对邮件服务器进行中间人攻击,进而访问客户的电子邮件获得敏感信息。
我们可能永远也无法了解到 SolarWinds 攻击所产生的真正影响,因为被攻击的软件在有成千上万客户的网络中运行了数月。该事件尚未结束:SolarWinds 背后的攻击者最近仍在试图复制类似的攻击,不过是针对供应链的不同部分,如代理商和某些技术服务提供商。
具体信息:
https://helpdesk.kaseya.com/hc/en-gb/articles/4403440684689
2021年7月,远程IT服务管理软件 Kaseya 遭受勒索软件攻击,攻击者索要7000万美元。这次攻击与 SolarWinds 攻击十分类似,但这次攻击者利用 Kaseya 系统中的零日漏洞。一旦他们控制了系统,他们就可以使用VSA、远程管理和监控工具在客户的系统中执行远程命令。
大约有 50 个客户受到此次攻击的直接影响。但他们的很多客户都是托管服务提供商,专门为其他企业提供 IT 服务,所以 Kaseya CEO Fred Vocola 表示,实际受到影响的企业约达到 800 至 1500 家。
更为关键的事实是,在2017-2020年期间,Kaseya的高管多次收到警告,这些警告称产品存在严重的安全漏洞,但公司高管对此不以为意。
在这次攻击中,一个合法的Xcode项目 "TabBarInteraction "的木马版本被发布在一个公开的代码仓库中。使用该项目虚假版本的开发人员在每次项目构建时都会无意中执行一个脚本,该脚本会打开与C2(命令和控制)服务器的连接。
带有恶意代码的 Xcode 的重新打包版本被上传到中国的文件托管服务。开发人员从这些镜像中下载被破坏的版本,最终得到的是一个修改过的对象文件。在创建 iOS 应用程序时,该对象文件被连接到最终的可执行文件中。至少有2个知名的应用程序成功通过了苹果的官方认证和代码审查,最终进入了AppStore。
2021年10月22日,阿里云安全团队监测到Npm官方仓库 ua-parser-js 疑似被恶意劫持,多个版本被攻击者植入挖矿脚本,其中包含 Linux 和 Windows 的恶意软件,并且能够窃取数据(至少是浏览器的密码和cookies)。
这个 ua-parser-js 库是众多知名软件和企业的供应链的一部分,例如 Facebook、微软、苹果、亚马逊等大型科技公司对其均有依赖。因此它会被用于面向用户的终端应用程序中,从而扩散到数百万台计算机。
剑桥大学的一些研究人员表示,他们在文本编码标准(如 Unicode)的细节中发现了一种针对源代码的新型供应链攻击。根据 Unicode 的工作方式,有可能再代码的注释或某些部分添加特殊字符,使代码的“逻辑编码”以与显示方式不同的顺序工作。这使得在一些开起来是正确的代码中隐藏恶意代码成为可能,从而绕过审查程序。但该问题并非新问题,也并不是那么隐蔽,通过建立对代码贡献者的信任并进行适当的审查来预防该类型的攻击。
2021年9月有研究人员发现,超过90个WordPress主题、插件被破坏,攻击者在这些组件中植入了PHP后门,使其能够完全访问网站。有超过36万个的活跃网站都在使用这些插件和主题。
据研究人员称,攻击者使用后门将访问者重定向到恶意软件投放和诈骗网站,也有可能使用该恶意软件在暗网上出售对后门网站的访问权限。
2021年12月,Apache软件基金会公开 Apache Log4j2 被曝出高危漏洞,攻击者通过 JNDI 注入攻击的方式,可以远程执行任何代码。漏洞发现以来,Steam、苹果的云服务受到了影响,推特和亚马逊也遭受了攻击,元宇宙概念游戏“Minecraft我的世界”数十万用户被入侵。美联社评论称,这一漏洞可能是近年来发现的最严重的计算机漏洞。
而这一漏洞并非短时间内就能完全解决,其影响可能蔓延至未来十年。因为 Log4j2 是一个非常流行的、基于 Java 的开源日志框架,它已经被嵌入成千上万的软件包中。雪上加霜的是,Log4j经常被深深地嵌入到代码中,由于被间接的依赖项所调用而隐藏起来。
针对软件供应链的攻击使得企业受攻击面在扩大,因为它们的安全性不仅取决于内部审查流程,还需要确保第三方(软件、硬件、服务等)不会成为他们被攻击的通道。
因此,不可能像传统安全一样确保所有代码、组件都是安全的,尤其是当下我们仍在不断发现新型的软件供应链攻击。
接下来,我们一起讨论一下,如果要尽可能地保护企业软件供应链,你需要把重点放在哪里。
如果您的组织采用了来自多个供应商的构件、硬件和服务,那么需要确保这些供应商对安全都保持高度重视。
软件供应链安全正在变得如此重要,以至于2021年5月,美国总统发布了一项旨在改善国家网络安全的行政命令。此后,NIST 根据这一命令发布了《开发者软件验证最低标准指南》,其中建议了开发者验证软件的最低标准。
因为不可能实现和保证100%的安全,所以也需要你关注影响供应商的任何风险和事件,并准备好在发现或报告受破坏的组件时迅速采取纠正措施,以减少损失。
关于代码和开发过程,上文中所提到的“最低标准指南”中建议软件开发生命周期中需要包含以下技术作为其最低的安全要求:
应用威胁模型以识别关键或潜在的被忽视的测试目标
自动化测试
基于代码的静态分析,使用代码扫描工具并且审查硬编码的密钥
动态分析、内置检查、保护措施、黑箱和模糊测试以及网络应用扫描工具等
对于供应链中的软件进行相似性检查(包括第三方依赖项)
尽快修复重要漏洞
随着基础设施即代码(IaC)的出现,软件供应链中的威胁现在有可能针对软件、应用程序以及底层基础设施。同样的软件验证原则应适用于部署和管理作为代码的基础设施,实现“安全左移”。
仅确保代码和开发过程的安全是远远不够的,还需要让安全必须在所有的开发阶段和公司文化及实践中普遍存在。
CNCF社区保留了一份实时更新的、由社区维护的文件,软件供应链安全文件。该文件旨在通过“一系列推荐的实践、工具选项和设计考虑,来减少供应链攻击的可能性和整体影响”,为社区做出贡献。
文件地址:
https://github.com/cncf/tag-security/tree/main/supply-chain-security/supply-chain-security-paper
此外,CNCF、Linux基金会、VMWare、英特尔、谷歌和其他机构也在研究 SLSA,这是一个软件供应链安全框架,用于提高软件的安全性和供应链的完整性,可以供任何开发软件的人使用。该框架中的每个级别都提供了越来越高的信任度,说明软件没有被篡改,可以安全地追溯到它的来源。
Kubernetes 和容器在企业中应用也十分广泛,NSA/CISA 发布了 Kubernetes加固指南,强调“供应链风险”是三个泄露源之一,并提出了以下加固措施和缓解办法:
扫描容器和Pod的漏洞或错误配置
以尽可能小的权限运行容器和Pod
使用网络隔离来控制恶意破坏可能造成的损害程度
最后,借助防火墙限制不需要的网络连接和加密以保护机密性
使用强大身份认证和验证来限制用户和管理员的访问并修改攻击面
最后,使用日志审计使管理员可以监控活动并且在发现潜在的恶意行为时收到告警
周期性检查所有 Kubernetes 设置并且使用漏洞扫描来帮助确定风险等级,并应用安全补丁
当你在选择供应商时,你应该意识到你不仅仅是为自己选择,也是在为你的客户、终端用户进行选择。因此,即使你在软件供应链生命周期的每个步骤和流程中都严格地实施了安全策略,你仍然需要将其表现出来并为交付的产品添加具体的安全措施:
提供您的组织内适用于软件供应链的监管合规性和安全认证的证据
增加一个软件材料清单(SBOM),以跟踪软件中的依赖项和第三方损害源
包括数字签名,以防止篡改和验证你的工件来源
使用安全的分发渠道、加密的通信和可信的托管或存储基础设施
软件供应链攻击并非新兴事物。在1984年与丹尼斯·里奇一起获得图灵奖后,肯·汤普森写了一篇关于信任代码提供商的重要性的演讲。他展示了一个木马化的编译器二进制版本如何产生带有后门的 “login” Unix命令的修改版本。
“人们应该在多大程度上相信一个程序没有特洛伊木马的声明?也许相信编写软件的人更重要。”
随着软件、基础设施和依赖项的复杂性不断增加,以及针对供应链的攻击事件在指数级增长,使得各行业和组织越来越关注软件供应链的安全性。
你应该已经意识到软件供应链是一个极其复杂的网络,从代码和库到硬件组件,都是相互连接但本质不同的事物。因此,确保每一个单件和环节安全性的方法是不同的,不能作为一个统一的整体来对待。
无论你是甲方还是乙方,是终端用户还是服务提供商,你都需要专注于保护你的流程,并且与可信任的、经过验证的供应商建立强大的联系。因为即使你采纳了最佳的安全实践,并在代码、基础设施等方面投入了全部精力,你仍然依赖于完全不受控制的第三方组件。而软件供应链的安全取决于每一个单独的环节。
是否有简单的方法来更改默认ISO格式(yyyy-mm-dd)的ActiveAdmin日期过滤器显示格式? 最佳答案 您可以像这样为日期选择器提供额外的选项,而不是覆盖js:=f.input:my_date,as::datepicker,datepicker_options:{dateFormat:"mm/dd/yy"} 关于ruby-on-rails-事件管理员日期过滤器日期格式自定义,我们在StackOverflow上找到一个类似的问题: https://s
Ⅰ软件测试基础一、软件测试基础理论1、软件测试的必要性所有的产品或者服务上线都需要测试2、测试的发展过程3、什么是软件测试找bug,发现缺陷4、测试的定义使用人工或自动的手段来运行或者测试某个系统的过程。目的在于检测它是否满足规定的需求。弄清预期结果和实际结果的差别。5、测试的目的以最小的人力、物力和时间找出软件中潜在的错误和缺陷6、测试的原则28原则:20%的主要功能要重点测(eg:支付宝的支付功能,其他功能都是次要的)80%的错误存在于20%的代码中7、测试标准8、测试的基本要求功能测试性能测试安全性测试兼容性测试易用性测试外观界面测试可靠性测试二、质量模型衡量一个优秀软件的维度①功能性功
基础版云数据库RDS的产品系列包括基础版、高可用版、集群版、三节点企业版,本文介绍基础版实例的相关信息。RDS基础版实例也称为单机版实例,只有单个数据库节点,计算与存储分离,性价比超高。说明RDS基础版实例只有一个数据库节点,没有备节点作为热备份,因此当该节点意外宕机或者执行重启实例、变更配置、版本升级等任务时,会出现较长时间的不可用。如果业务对数据库的可用性要求较高,不建议使用基础版实例,可选择其他系列(如高可用版),部分基础版实例也支持升级为高可用版。基础版与高可用版的对比拓扑图如下所示。优势 性能由于不提供备节点,主节点不会因为实时的数据库复制而产生额外的性能开销,因此基础版的性能相对于
我正在尝试将以下SQL查询转换为ActiveRecord,它正在融化我的大脑。deletefromtablewhereid有什么想法吗?我想做的是限制表中的行数。所以,我想删除少于最近10个条目的所有内容。编辑:通过结合以下几个答案找到了解决方案。Temperature.where('id这给我留下了最新的10个条目。 最佳答案 从您的SQL来看,您似乎想要从表中删除前10条记录。我相信到目前为止的大多数答案都会如此。这里有两个额外的选择:基于MurifoX的版本:Table.where(:id=>Table.order(:id).
这是我在ActiveAdmin中的自定义页面ActiveAdmin.register_page"Settings"doaction_itemdolink_to('Importprojects','settings/importprojects')endcontentdopara"Text"endcontrollerdodefimportprojectssystem"rakedataspider:import_projects_ninja"para"OK"endendend我想做的是,当我单击“导入项目”按钮时,我想在Controller中执行rake任务。但是我无法访问该方法。可能是什
例如,假设我有一个名为Products的模型,并且在ProductsController中,我有以下代码用于product_listView以显示已排序的产品。@products=Product.order(params[:order_by])让我们想象一下,在product_listView中,用户可以使用下拉菜单按价格、评级、重量等进行排序。数据库中的产品不会经常更改。我很难理解的是,每次用户选择新的order_by过滤器时,rails是否必须查询,或者rails是否能够以某种方式缓存事件记录以在服务器端重新排序?有没有一种方法可以编写它,以便在用户排序时rails不会重新查询结果
我有一个将某些事件写入队列的Rails3应用。现在我想在服务器上创建一个服务,每x秒轮询一次队列,并按计划执行其他任务。除了创建ruby脚本并通过cron作业运行它之外,还有其他稳定的替代方案吗? 最佳答案 尽管启动基于Rails的持久任务是一种选择,但您可能希望查看更有序的系统,例如delayed_job或Starling管理您的工作量。我建议不要在cron中运行某些东西,因为启动整个Rails堆栈的开销可能很大。每隔几秒运行一次它是不切实际的,因为Rails上的启动时间通常为5-15秒,具体取决于您的硬件。不过,每天这样做几
我有一个帖子属于城市的关系,城市又属于一个州,例如:classPost现在我想找到所有帖子及其所属的城市和州。我编写了以下查询来获取带有城市的帖子,但不知道如何在同一查找器中获取带有城市的相应州:@post=Post.find:all,:include=>[:city]感谢任何帮助。谢谢。 最佳答案 Post.all(:include=>{:city=>:state}) 关于ruby-on-rails-使用Rails事件记录获取二级模型,我们在StackOverflow上找到一个类似的问
我觉得我错过了什么。我正在编写一个rubygem,它允许与事件记录进行交互,作为其主要功能的附加功能。在为其编写测试用例时,我需要能够指定虚拟事件记录模型来测试此功能。如果我可以获得一个事件记录模型的实例,它不需要与数据库的任何连接,可以有关系,所有这些东西,但不需要我在数据库中设置表,那就太棒了。我对测试还很陌生,在Rails测试之外我也很陌生,但似乎我应该能够相当轻松地完成类似的事情,但我什么也没找到。谁能告诉我我错过了什么?我看过工厂、制造商、固定装置,所有这些似乎都想达到目标。人们如何在您只需要AR对象进行测试的地方测试gem? 最佳答案
我想创建一个模块,为从事件记录库继承的类提供一些通用方法。以下是我们可以实现的两种方式。1)moduleCommentabledefself.extended(base)base.class_evaldoincludeInstanceMethodsextendClassMethodsendendmoduleClassMethodsdeftest_commentable_classmethodputs'testclassmethod'endendmoduleInstanceMethodsdeftest_commentable_instance_methodputs'testinstanc