AICon全球人工智能与机器学习技术大会周四开幕,点击查看完整日程>> 了解详情
写点什么

npm 安全事故频频发生,程序员都绝望了

  • 2019 年 8 月 01 日
  • 本文字数:1645 字

    阅读完需:约 5 分钟

npm 安全事故频频发生,程序员都绝望了

在 npm 刚刚发生了一次软件包灾难之后,有一个独立开发者杀死了数十个 CI 构建,导致很多其它开发者收到了严重警告通知,开发者社区有人表示:“这样的事情经常发生,我们也没有办法阻止。”全栈开发人员 Bob Dynald 在 Reddit 上表示:“这是个可怕的悲剧,但有时有些事情就是发生了,任何人都无法阻止。”


npm 真的如开发者描述的那样经常发生事故吗?我们搜集了近期 npm 的安全事件。


purescript npm 安装程序中的恶意代码


2019 年 7 月,有开发者在 purescript npm 安装程序中发现了一些恶意代码。这些恶意代码可以被


插入到安装程序的依赖项中,特别是由@shinnn(purescript npm 安装程序的原始作者)以及维护者(直到大约一个月前)维护的软件包。@shinnn称该恶意代码是由获得他 npm 账户的攻击者发布的。


发现该恶意代码的开发者表示:“恶意代码的唯一目的是破坏 purescript npm 安装程序以防止它成功运行。”据了解,在最新版本的 purescript npm 安装程序中,恶意代码现已被删除,@ shinnn的所有依赖项都被删除了。


npm 安全团队阻止数字货币盗窃企图


2019 年 6 月, npm 安全团队与 Komodo 合作阻止了一种恶意软件对 Agama 数字货币钱包用户的攻击企图,保护了价值超过 1300 万美元的数字货币资产。


这次攻击的逻辑是将恶意程序包放入 Agama 的构建链中,并窃取应用中保存的钱包密码和其他登录密码。先向 npm 发布一个“useful”的包(electron-native-notify),等到它被目标使用后更新包内容,加入恶意代码。


GitHub 用户 sawlysawly 在 3 月 8 日提交了这个更新,其中添加了 electronic-native-notify ^ 1.1.5 作为对 EasyDEX-GUI 应用程序的依赖(后者是 Agama 钱包的一部分组件)。


electron-native-notify 的下一个版本在 15 天后发布,是第一个包含恶意代码的版本。之后在 4 月 13 日,Agama 发布了 0.3.5 版本。


一家大型国际银行意外在公共 npm 注册表中发布了私有包


一家大型国际银行不小心向公共 npm 注册表发布了自己的私有包,3 年之后才发现,并向 Amazon 和 Cloudflare 发送了 DMCA 删除通知,称其托管了“被盗代码。”2019 年 3 月,npmjs 联合创始人Laurie Voss发布推特回应此事件:“客户应该仔细研究 npm Enterprise,而不是让我们的律师向你解释 npm 如何发布。”


周下载量过 200 万的 npm 包被注入恶意代码,Vue、Node 项目恐受影响


2018年11月,有网友发推特称,npm 下载量超过 200 万的 package 被注入了恶意代码,黑客利用该恶意代码访问热门 JavaScript 库,目标是 copay(开源比特币钱包)及其衍生产品的用户,以此窃取用户的数字货币。


这个被注入恶意代码的 package 名为 event-stream,它是一个用于处理 Node.js 流数据的 JavaScript 软件包,而且 Angular、Vue、Bootstrap、Gatsby 等都在使用 event-stream,所以使用这些库的开发者都应该检查一下自己是否受到了影响。



在过去的 9 年中,类似于上述例子中的令人恼火的软件包管理灾难频繁发生,该社区的成员比其它社区更容易经历意外的软件包更新,并且还有数据显示,npm 社区遇到意外软件包更新的几率是其它社区的 200 倍。有一个社区开发者表示,有两个包管理器在过去的 4 年中,每个月都会发生这样的事情,这让他们感到很无助。


如何解决这些问题呢?对于未来可能发生的问题,我们无法预知,但是我们可以改进现在存在的问题,网友Sebastian K列出了他认为 npm 目前存在的隐患的不完全列表,他认为 npm(客户端和注册表)是一个有缺陷的系统,需要完全替换,新系统应具有以下功能,以减少此类事件的可能性:


  • 没有 unscoped 的包;

  • 作用域是 1 对 1 绑定到单个用户或组织;

  • 发布包必须要双因子验证,包必须通过 GPG 签名;

  • 除注册表维护人员外,任何人都不允许取消发布包;

  • 不允许在最终版本中使用模糊依赖项版本,我曾多次目睹在新克隆之后,运行 npm install 时修改项目的包锁定文件,下载了比锁定文件中指定的更高版本的可传递依赖项。


针对整个生态系统,Sebastian K表示:“TC39 应该考虑为 JS 本身添加一个更好的标准库,这将减少 one-liner 包的数量。”


2019 年 8 月 01 日 10:183256
用户头像

发布了 497 篇内容, 共 245.1 次阅读, 收获喜欢 1684 次。

关注

评论

发布
暂无评论
发现更多内容

Java中多线程启动,为什么调用的是start方法,而不是run方法?

Java 编程 架构

进程管理:kill命令之-9与-15

程序员架构进阶

Java Linux 进程 七日更 2月春节不断更

阿里面试这样问:redis 为什么把简单的字符串设计成 SDS?

程序员内点事

Java redis 面试

真牛皮!2021最新Android大厂面试真题大全,BAT大厂面试总结

欢喜学安卓

android 程序员 面试 移动开发

山东党建系统!组织部智慧管理平台搭建

源中瑞-龙先生

智慧党建 组织部 山东

我用 go-zero 一周实现了一个中台系统,已开源!

万俊峰Kevin

Go 微服务 go-zero

探究Python源码,终于弄懂了字符串驻留技术

华为云开发者社区

Python 字符串 Python解释器 字符串驻留 字符

温故而知新!腾讯Android开发面试记录,薪资翻倍

欢喜学安卓

android 程序员 面试 移动开发

新闻|2021 FOSDEM为期两天的活动成功举办,一大波学习资源来袭!

PostgreSQLChina

数据库 postgresql 软件 开源社区

LeetCode题解:63. 不同路径 II,动态规划,JavaScript,详细注释

Lee Chen

算法 LeetCode 前端进阶训练营

28天写作再次开启,你准备好来挑战了吗?

TGO鲲鹏会

活动专区 28天写作

Java架构大牛之路必备“微服务架构笔记”

Java架构之路

Java 程序员 架构 面试 编程语言

腾讯云大神用这份“redis深度笔记”把Redis入门到精通全部精髓全部展现出来了

redis 架构 计算机

2021程序员修炼内功必备:阿里新产Java并发编程原理笔记(全彩版)限时开源!

程序员小毕

Java 程序员 面试 多线程 高并发

程序员成长第九篇:真实项目中的注意事项

石云升

程序员 项目实战 2月春节不断更

初识 Go 的第一印象是薪水可观

5分钟技术

Go

ubuntu 18 及以上版本配置 IP 的方法

5分钟技术

网络

话题讨论 | 今年,你回家过年了吗?

xcbeyond

话题讨论 春节 就地过年

十四五期间我国区块链技术趋势特征分析

Geek_987812

区块链 大数据

不满于CRUD,五面阿里成功斩获Offer!鬼知道我怎么过来的!

程序员小毕

Java 程序员 面试 分布式 微服务

技术实践 | 新思路!解决线上系统异常问题

百度开发者中心

4.从legacy或concurrent开始(从入口开始,然后让我们奔向未来)

全栈潇晨

React React Hooks react源码

OAuth:每次授权暗中保护你的那个“MAN”

华为云开发者社区

前端 协议 权限 Oauth web服务

大厂必问算法!查漏补缺LeetCode必考“1024道技术点面试题”

Java架构之路

Java 程序员 架构 面试 编程语言

2021新年最新分享:阿里Java岗5轮技术面经整理

比伯

Java 编程 架构 面试 程序人生

资本之外,区块链破圈正当时

Geek_987812

区块链

区块链难在落地,亟需补人才缺口迎爬升期

Geek_987812

区块链

offer稳了!四面阿里面经分享,定级P6之路。

Java架构之路

Java 程序员 架构 面试 编程语言

01 | Mysql基础架构

zach

MySQL

被说烂了的Java垃圾回收算法,我带来了最“清新脱俗”的详细图解

Crud的程序员

Java 架构

百度Hydra工具在移动端UI兼容性测试上的高效应用

百度Geek说

测试 UI

数据cool谈(第2期)寻找下一代企业级数据库

数据cool谈(第2期)寻找下一代企业级数据库

npm 安全事故频频发生,程序员都绝望了-InfoQ