聚焦源代码安全,网罗国内外最新资讯!

专栏·供应链安全

数字化时代,软件无处不在。软件如同社会中的“虚拟人”,已经成为支撑社会正常运转的最基本元素之一,软件的安全性问题也正在成为当今社会的根本性、基础性问题。

随着软件产业的快速发展,软件供应链也越发复杂多元,复杂的软件供应链会引入一系列的安全问题,导致信息系统的整体安全防护难度越来越大。近年来,针对软件供应链的安全攻击事件一直呈快速增长态势,造成的危害也越来越严重。

为此,我们推出“供应链安全”栏目。本栏目汇聚供应链安全资讯,分析供应链安全风险,提供缓解建议,为供应链安全保驾护航。

注:以往发布的部分供应链安全相关内容,请见文末“推荐阅读”部分。

说到PHP,无需多言,Composer 就是御用软件包管理器。它快速、易用、维护活跃而且非常安全,至少多数人是这么想的。

2021年4月21日,Composer 中被发现命令注入漏洞,震惊了整个 PHP 社区。好在它并没有带来多大的影响,但它具备这个能力。该漏洞的问题在于,它影响的是 Composer 供应链的最核心部分:Packagist 服务器。

要不是及时发现了这个漏洞,后果将不堪设想,因为 PHP 支持着80%的 web 且它们多数使用的就是 Composer。

如 Packagist 服务器受陷,则可导致维护人员的凭据遭泄露或者下载内容被重定向到恶意服务器,导致难以预测的行为如蠕虫传播、后门等。好在,Composer 和 Packagist 的维护人员立即响应,在12小时内修复该问题。目前并未发现该漏洞遭利用的迹象。

但美中不足的一点是,虽然多数基于 php 的项目使用的是公开库 (packagist.org),但也存在被私下托管的可能性。如果私营组织机构出现了这个情况,则Packagist 的维护人员显然无法应用修复方案。

如何在 Packagist 服务器上执行恶意代码?

要了解如何在 Packagist 服务器上执行恶意代码,必须懂一点 Composer 的内部运行原理。

Composer 是一个 Php 脚本,必须出现在托管着Php 项目的且依赖它管理依赖关系的所有服务器中。部署应用程序新版本后,必须提取依赖关系。在实践中,这就意味着调用一个 Composer 命令——composer install 的某种变体。当要求安装新的软件包时,Composer 就会联系仓库(很可能是 https://packagist.org)查找集成到项目中的库的元数据。

该元数据的一个重要内容是库代码的 URL,它将被下载并本地存储在 vendor/sub-directory中。该RUL 一般指向一个 CVS,如:

{“name”: “abdielcs/expanded-collection-bundle”,“version”: “v0.1.2”,“source”: {“type”: “git”,“url”: “https://github.com/abdielcs/ExpandedCollectionBundle.git”,“reference”: “3e535cee26825982f9b60d1ffb72a0ddccb6b542”}}

上述 json 结构是 Packagist 按照包含 abdielcs/expanded-collection-bundle 的库请求返回的。其中,它告知本地 Composer 安装程序从属性 url 指向的 URL 中找到的仓库中查看,本案例中为:

https://github.com/abdielcs/ExpandedCollectionBundle.git.

由此可见,Packagist 仅仅是元数据仓库,实际托管库代码是每个个体维护人员的责任。因此,Packagist 作为庞大的目录,以某种方式将包名称翻译为下载URL。

由于 Packagist 是一个公开目录,因此任何人都能轻松上传新包,实际上只要有邮件地址就能上传。而这正是它快速增长并流行起来的原因。但同时它也带来了漏洞。Packagist 不会执行很多验证,而只是验证json结构是正确的,这就可疑在“来源”定义中放置除了 URL 的东西。当然 Composer 脚本确实对 URL 进行了一些清理,但最终该信息直接进入外部VCS命令,从而带来了利用机会。

恶意命令注入通过未验证选项完成,如:

return ‘git ls-remote –heads ‘ . ProcessExecutor::escape($url);

在本例中,git 被调用为操作系统命令,而外部输入 ($url) 得到正确清理。

但,如果url 以 “-“ 开头呢?

在本例中,实际被调用的真正命令并非开发人员预想的,而这就是问题浮现的地方。当 Packagist 发现新软件包时会立即查询仓库URL,以获得一些基础信息并让所有人知晓。这意味着如果 URL 中包含恶意代码,则将在 Packagist 上执行,而研究员 Thomas Chauchefoin 就是这么做的。

使用构造精良的源URL,再结合 Mercurial 不太知名的特性,Thomas 及其团队可在 Packagist 服务器上执行任意命令,有效地证实了它的可行性。

而有意思的是,该漏洞在十多年前就已经出现了!

为何之前未测出?

漏洞存在如此长的时间说明了“参数注入”类威胁的隐秘性。不过防御此类威胁的最佳方式仍然是避免执行从包含用户提供输入的字符串创建的外部命令。

然而,在本例中尚不清楚,既然Composer 的其中一个目标是 VCS (版本控制系统)独立,为何会产生这类漏洞。因此,考虑到多个 VCS 版本的存在,可能并非每个版本都是原生的PHP实现。

结论

随着软件开发流程变得愈加复杂,覆盖开源供应链中的每个阶段极其困难。如果项目规模庞大,它们多数一定会依赖于可被攻陷的第三方组件。本文提到的 Composer 漏洞就说明了用于管理此类依赖关系的工具也可能易受攻击。


确保自己安全的最佳方法就是依靠自动化工具监控并尽快提供安全漏洞警报,而奇安信开源卫士就是这样一款工具。


开奖啦!!!!!】

限时赠书|《软件供应链安全—源代码缺陷实例剖析》新书上市

上次的限时赠书活动中奖名单已出炉,恭喜以下同学中奖,请未填写地址的同学在微信后台私信地址,我们已经发出部分书籍啦。

@whyseu @。@HFwuhome@惊蛰 @nimo @XuZ @淡然 @Marco韬 @王孟 @Wecat@nwnλ @MOBE @湘北二两西香葱@※ @搬砖小土妞@云烟过眼 @r00t@小风 @傲雪@最好走的路是套路 @Zhao.xiaojun @浅笑淡然 @X-Star @Erick2013 @小秦同学 @X @王骏 @欢寻 @nbp@Mr. Guo

大家可移步京东电子工业出版社一睹为快!或直接点击“原文链接”购买。

如下是本书相关讲解:

奇安信代码安全实验室主任黄永刚在2021年北京网络安全大会上也发布了实验室在软件供应链安全方面相关的研究成果。

推荐阅读

微软在 Linux 虚拟机偷偷安装Azure App,后修复严重漏洞但Linux虚拟机难以修复

在线阅读版:《2021中国软件供应链安全分析报告》全文

因使用五年前的老旧代码,Azure 容器险遭黑客接管,微软已修复

微软“照片”应用Raw 格式图像编码器漏洞 (CVE-2021-24091)的技术分析

速修复!热门npm 库 netmask 被曝严重的软件供应链漏洞,已存在9年

SolarWinds 供应链事件后,美国考虑实施软件安全评级和标准机制

找到软件供应链的薄弱链条

GitHub谈软件供应链安全及其重要性

揭秘新的供应链攻击:一研究员靠它成功入侵微软、苹果等 35 家科技公司

谷歌Linux基金会等联合推出开源软件签名服务 sigstore,提振软件供应链安全

Linus Torvalds 警告:勿用 Linux 5.12 rc1,担心供应链攻击?

微软和火眼又分别发现SolarWinds 供应链攻击的新后门

找到恶意软件包:Go 语言生态系统中的供应链攻击是怎样的?

拜登签署行政令,要求保护美国关键供应链(含信息技术)的安全

坐火车太无聊,我溜入微软 VS Code官方GitHub仓库,但没敢发动供应链攻击

SolarWinds 供应链攻击中的第四款恶意软件及其它动态

OpenWRT开源项目论坛遭未授权访问,可被用于供应链攻击

FireEye事件新动态:APT 攻击 SolarWinds 全球供应链(详解)

FireEye 红队失窃工具大揭秘之:分析复现SolarWinds RCE 0day (CVE-2020-10148)

FireEye红队失窃工具大揭秘之:分析复现Zoho ManageEngine RCE (CVE-2020-10189)

FireEye 红队失窃工具大揭秘之:分析复现 Zoho 任意文件上传漏洞(CVE-2020-8394)

FireEye 红队失窃工具大揭秘之:分析复现 Confluence路径穿越漏洞 (CVE-2019-3398)

FireEye 红队失窃工具大揭秘之:分析复现 Atlassian RCE (CVE-2019-11580)

Ripple 20:严重漏洞影响全球数十亿IoT设备,复杂软件供应链使修复难上加难

被后爹坑:开源 JavaScript 库沦为摇钱树

速修复!开源企业自动化软件 Apache OFBiz 出现严重的 RCE 漏洞

谷歌提出治理开源软件漏洞的新框架:知悉、预防、修复

开源软件漏洞安全风险分析

开源OS FreeBSD 中 ftpd chroot 本地提权漏洞 (CVE-2020-7468) 的技术分析

集结30+漏洞 exploit,Gitpaste-12 蠕虫影响 Linux 和开源组件等

原文链接:

https://www.whitesourcesoftware.com/resources/blog/supply-chain-attack-against-composer/

题图:Pixabay License

奇安信代码卫士原创出品。转载请注明 “转自奇安信代码卫士 https://codesafe.qianxin.com”。

奇安信代码卫士 (codesafe)

国内首个专注于软件开发安全的

产品线。

 觉得不错,就点个 “在看” 或 "赞” 吧~

漏洞10年深藏不露,PHP 项目依赖关系管理工具Composer安全吗?相关推荐

  1. 90%的人都不知道的Node.js 依赖关系管理(上)

    转载请注明出处:葡萄城官网,葡萄城为开发者提供专业的开发工具.解决方案和服务,赋能开发者. 引言 Node.js中的一个重要概念是依赖关系管理.本文就将带大家了解依赖管理的各种模式以及Node.js如 ...

  2. 【转载】Kano模型在用户调研中的应用:客户关系管理工具调研实例

    原文链接:http://www.alibuybuy.com/posts/77204.html 1.Kano模型简介 1.1 Kano模型起源:满意度的二维模式 著名市场营销学大师.美国西北大学教授菲利 ...

  3. Go (Golang) 工具之依赖包管理工具goimports | Go语言规范-import规范(导入)排序 |GoLand:设置gofmt与goimports,保存时自动格式化代码

    文章目录 Go (Golang) 工具之依赖包管理工具goimports Go语言规范-import(导入)排序 什么是goimports 安装和使用 Golang 使用goimports unrec ...

  4. Android注解使用之Dagger2实现项目依赖关系解耦

    Dagger2 一句话:一款快速的注解框架,应用于Android.Java,由 Google 开发和维护,是 Square 的 Dagger 项目的分支. gitHub:https://github. ...

  5. android两个项目依赖关系图,关于android:Android组件化项目搭建遇到的问题记录

    1. ARouter 的依赖问题 What went wrong: Execution failed for task ':app:kaptDebugKotlin'. A failure occurr ...

  6. 项目依赖关系分析中的数据结构

    项目中常见问题 源码依赖可能导致相互直接或间接依赖形成环,对此应该如何快速检测呢? 源码依赖对于如commonLib大版本升级需要放开依赖该commonLib的其他aar源码验证,我们如何快速获取呢? ...

  7. java maven 项目依赖关系,java – 关于依赖关系共享的Maven多模块项目组合

    有几个类似的问题,但没有这样的.你如何处理这种情况(典型情况): 一个由8-11个子项目组成的项目,具有父工件/项目和一个主要项目,主要使用/声明其他项目作为模块. 问题是所有项目"严格&q ...

  8. Golang 依赖包管理工具---glide

    安装glide $ go get github.com/Masterminds/glide $ go install github.com/Masterminds/glide 验证 $ glide N ...

  9. window下PHP依赖管理工具Composer的安装与使用

    一.什么是Composer? Composer 是 PHP 的一个依赖管理工具.我们可以在项目中声明所依赖的外部工具库,Composer 会帮你安装这些依赖的库文件,有了它,我们就可以很轻松的使用一个 ...

最新文章

  1. 如何让普通进程获得 root 的洪荒之力?
  2. ajax异步查询demo,ASP.NET中AJAX的异步加载(Demo演示)
  3. 虚幻4蓝图快速入门(二)
  4. 如何在Golang中返回错误?
  5. [css] position跟margin collapse这些特性相互叠加后会怎么样?
  6. [转]一个老工程师给年轻工程师的忠告
  7. 笔记本html怎么插入图片,将图像嵌入到jupyter笔记本中并导出为HTML
  8. Path画直线与弧线
  9. 电话号码正则表达式 (包含电话号码 和 手机号码)
  10. Tensorflow——Session机制(矩阵相乘小实例)
  11. (转)细说JDK动态代理的实现原理
  12. 航班预定系统java源代码_飞机订票系统源代码(Java)
  13. 园区IP地址规划(非常详细)
  14. android netd的工作流程解析
  15. win7下MyEclipse装Nutch1.7
  16. windows Server2016 关闭135端口
  17. java无法双击打开.jar文件/jar包以压缩文件显示
  18. 【编程书籍】《The Nature of Code》笔记 -《代码本色》2.力 5.物理函数库
  19. php计算一年多少周,同时计算出这一周的开始时间和结束时间(可选返回时间戳或日期)
  20. 解决系统中没有ASPNET用户的烦恼

热门文章

  1. uboot常用命令详解 2
  2. SpringMVC RedirectView的使用以及源码分析
  3. 新浪微博自动发送微博 功能已实现(net)
  4. 分分钟使用Retrofit+Rxjava实现网络请求
  5. CF813E Army Creation
  6. 小米手机困境,米粉伤心,黄牛伤钱
  7. Flash Player版本相关问题
  8. 好奇:WayOs破解、OEM、修复、打包等工具大全,满足大家的好奇心发下截图
  9. tomcat事件处理机制
  10. JQuery与springmvc实现多个文件上传操作