写点什么

10 万 npm 用户账号信息被窃、日志中保存明文密码,GitHub 安全问题何时休?

  • 2022-06-01
  • 本文字数:3020 字

    阅读完需:约 10 分钟

10万 npm 用户账号信息被窃、日志中保存明文密码,GitHub安全问题何时休?

5 月 26 日,GitHub 披露4月中旬一次安全漏洞的更多调查细节,描述了攻击者如何抓取包括大约 10 万个 npm 用户的详细登录信息。同时,这也显示了在将 JavaScript 包注册中心整合到 GitHub 的日志系统后,GitHub 在内部日志中存储了 “npm 注册中心的一些明文用户凭证”。

 

“明文密码”的发现过程

 

今年 4 月 15 日,GitHub 披露了有攻击者通过偷来的 OAuth 用户令牌(原本发放给 Heroku 和 Travis-CI),可以有选择地从私人仓库下载数据。自官方在 4 月 12 日首次发现这一活动以来,攻击者已经从几十个使用 Heroku 和 Travis-CI 维护的 OAuth 应用程序的组织中访问并窃取数据,其中包括 npm。

 

该行为被发现后,GitHub、Travis CI 和 Heroku 撤销了所有 OAuth 令牌,以阻止进一步的黑客攻击。

 

5 月 26 日,GitHub 产品安全工程高级总监 Greg Ose 表示,该公司在调查期间发现,攻击者可以获得 npm 的内部数据和客户信息,比如 AWS 访问密钥。通过访问 npm 的 AWS 基础设施,攻击者能够窃取 skimdb.npmjs.com 镜像的旧备份信息,具体包括:

 

  • 一份来自 2015 年的用户信息存档,包含大约 10 万个 npm 用户名、密码哈希和电子邮件地址。

  • 截至 2021 年 4 月 7 日的所有私有 npm 包清单和元数据。

  • 截至 2022 年 4 月 10 日的所有私有 npm 包的已发布版本的名称和版本号 semVer。

  • 来自两个组织的私人包。

 

经过日志和事件分析以及检查所有 npm 软件包版本的哈希值后,GitHub“目前确信攻击者没有修改注册表中的任何已公开的软件包,也没有对现有软件包发布任何新版本”。GitHub 重置了所有受影响用户的密码,并向受影响组织和用户发送了通知

 

GitHub 强调,攻击者不是通过入侵 GitHub 或其系统获得了这些令牌,因为 GitHub 未以原始可用的格式存储相关令牌。由于 npm 使用与 GitHub.com 完全独立的基础架构,GitHub 在这次原始攻击中没有受到影响。

 

另外,在这次的事件调查中,GitHub 还表示发现了存储在 npm 注册表内部日志中的一些明文凭证。

 

按照 GitHub 的说法,“经过内部发现和与 OAuth 令牌攻击无关的额外调查,GitHub 发现将 npm 整合到 GitHub 日志系统后,在内部日志中发现了一些 npm 注册表的明文用户凭证。”具体内容包括“npm 访问令牌和少量用于尝试登录 npm 账户的明文密码,以及一些发送到 npm 服务的 GitHub 个人访问令牌。”

 

不过,只有 GitHub 员工可以访问这些信息。“这个问题已经得到缓解,在对 npm 的攻击之前,包含明文凭证的日志已经被清除了。”

 

“虽然这种记录凭证的做法违背了我们的安全最佳实践,但 GitHub 或 npm 并没有遇到会暴露这些含有纯文本凭证日志的损害或数据泄露问题。”GitHub 在报告中补充道。

 

这是由来已久的安全隐患。在 github 上执行一次搜索删除密码操作可以发现,在 repo 中存储密码的情况非常普遍,简单的搜索就返回来 51 万次 commit 记录,这还没有覆盖到没有填写详细的 commit 信息,或者已经通过删除历史记录来掩饰活动的情况。

 

GitHub 安全问题不断

 

GitHub 在全球拥有超过 8000 万个存储库,无疑是最受欢迎的开源代码管理系统。但不断爆出的安全问题也一直困扰着 GitHub。

 

2021 年,Github 日前遭到大规模暴力破解密码的攻击,一些帐号被成功攻破;2020 年,Github 存储库中发现了臭名昭著的 Octopus Scanner 恶意软件;2018 年,Github 更是遭遇了大规模 DDoS 攻击。

 

根据北卡罗来纳州立大学的研究,通过对超过 100 万个 GitHub 帐户为期六个月的连续扫描,发现包含用户名、密码、API 令牌、数据库快照、加密密钥和配置文件的文本字符串可通过 GitHub 公开访问。

 

今年 GitHub 在安全问题上再次加码。5 月初,GitHub 宣布在 2023 年之前,所有使用 GitHub 平台存储代码、做贡献的开发者都需要启动一种或多种形式的双因素身份验证(2FA),否则将无法正常使用该平台。促使 GitHub 做出这项决策的直接原因便是,未启用 2FA 的开发人员帐户去年遭到入侵,导致 npm 包被接管。

 

“大多数安全漏洞并非来自非常复杂的攻击事件或是零日漏洞,相反,往往是一些低成本的攻击,如社会工程、密码泄露,以及其他为攻击者提供访问受害者账户的攻击。”GitHub 首席安全官 (CSO) Mike Hanley 在发布的博文中写道。

 

虽然有很多场景已经验证了 2FA 的有效性,但是 2FA 在整个软件生态系统中的采用率仍然很低。GitHub 内部研究表明,目前只有大约 16.5% 的活跃用户(大约六分之一)对其帐户启用了增强性的安全措施,只有 6.44% 的 npm 用户启用了 2FA。

 

使用 GitHub 的一些建议

 

即便 GitHub 自身在不断加强安全防护,但是每个 GitHub 用户也应该了解一些安全常识,尽量避免因为个人疏忽等原因造成不必要的损失。

 

  1. 切勿将凭据和敏感数据存储在 GitHub 上

 

GitHub 的目的是托管代码存储库。除了设置账户权限外,没有其他安全方法可以确保密钥、私人凭据和敏感数据可以一直处于可控和安全的环境中。

 

git 代码提交会维护已添加和删除内容的历史记录,从而使敏感数据永久保存在分支上。当分支被合并和再分叉时,潜在的数据或基础设施泄露问题可能会呈指数级增长。

 

减轻这种风险最简单方法是在提交到分支之前不在代码中存储凭据和敏感数据。但是,可能会发生一些错误。为从编程层面防止错误情况的发生,可以在 CI 和 CD 管道中使用 git-secrets 等工具,通过中断构建过程来防止带有敏感数据的代码到达 GitHub。另外,也可以使用机密和身份管理工具,例如 Vault 和 Keycloak。

 

  1. 删除文件中的敏感数据和 GitHub 历史记录   

 

一旦在 GitHub 仓库中发现了敏感数据,就需要采取一些应急处理措施。首先要使曾经公开的令牌和密码无效。一旦秘密公开就要做好已被攻击者掌握的准备。

 

当然,肯定需要从存储库中删除敏感数据。但 GitHub 非常擅长保留所有提交的完整历史记录,包括敏感信息的变更日志。有关详细信息,可以参阅“从存储库的历史记录中清除文件”。

 

  1. 限制访问控制   

 

开发者专注在分析更复杂的攻击手段时,往往一些最简单的事情都没有做好,比如在显示器上贴着记录密码的便利贴等。

 

无论是在 GitHub 平台,还是一般的场景,开发者都应当遵守基本的安全准则:在每个贡献者的 GitHub 帐户上启用双因素身份验证、永远不要让用户共享 GitHub 帐号和密码、必须适当保护任何可以访问源代码的笔记本电脑或其他设备等等。

 

  1. 严格验证 GitHub 上的应用程序   

 

所有好的平台都可以扩展,GitHub 及其应用程序市场也不例外。在将它们添加到代码仓库时要记住第三方应用扩展是由组织和第三方开发人员编写的。

 

在选择和安装 GitHub 应用程序时注意:不要给应用程序过多的访问权限、询问应用所需访问级别的原因及可能带来的危害、在让应用背后的作者或组织访问代码库之前验证他们的合法性和可信性等。

 

安全性取决于最薄弱的环节,因此,如果要访问的应用的安全性较差,那么攻击者可以通过攻击它们的应用来访问你的代码——这是开发者最敏感的资产之一。最后,确保定期检查或审计第三方应用及其贡献者,以确保仍然需要他们、信任他们、认为他们值得赋予权限去访问代码。

 

  1. 及时更换 SSH key 和个人访问 token   

 

GitHub 访问通常使用 SSH 密钥或个人用户令牌 (代替密码,因为已启用了双因素身份认证) ,开发者可以定期更新密钥和 token,来降低密钥泄露造成的任何损失。

 

参考链接:

 

https://www.bleepingcomputer.com/news/security/github-attackers-stole-login-details-of-100k-npm-user-accounts/

https://www.theregister.com/2022/05/27/github_publishes_a_post_mortem/?td=rt-3a

https://snyk.io/blog/ten-git-hub-security-best-practices/

2022-06-01 11:175067

评论

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

新年开工新气象|OceanBase 祝大家开工大吉!

OceanBase 数据库

开源 OceanBase 社区版 开工大吉

[JAVA冷知识]为什么动态加载不适合数组?如何动态加载一个数组?

山河已无恙

Java 2月月更

鸿蒙轻内核源码分析:文件系统FatFS

华为云开发者联盟

鸿蒙 Fat 文件系统 鸿蒙轻内核 FatFS

教你从零搭建Web漏洞靶场OWASP Benchmark

华为云开发者联盟

渗透测试 漏洞 安全测试 漏洞靶场

混合云模式下,如何定义一款好的 API 网关

API7.ai 技术团队

流量控制 api 网关 微服务治理 Apache APISIX

try{}catch居然可以隐藏?让我们用函数式接口来实现吧

山河已无恙

Java 2月月更

Nodejs内置模块path与fs模块简单使用

编程江湖

nodejs

HarmonyOS canvas绘制“飞机大战”小游戏,真香!

HarmonyOS开发者

HarmonyOS

火遍网络的KPI异常检测到底什么梗?

乌龟哥哥

2月月更

Mybatis常用注解中的SQL注入

编程江湖

云原生时代,软件交付有何不同 | 研发效能提升36计

阿里云云效

阿里云 云原生 持续交付 云平台 研发

王者荣耀商城异地多活架构设计

swallowluo

架构实战营 #架构实战营 「架构实战营」

你使用的是数据结构还是对象?

蜜糖的代码注释

Java 后端开发 2月月更

第1章:初识数据库与MySQL----数据库基本概念

乌龟哥哥

MySQL 2月月更

也谈向上管理

wood

向上管理 300天创作

金3银4面试前,把自己弄成卷王!

小傅哥

面试 小傅哥 金三银四 项目学习

vivo直播应用技术实践与探索

vivo互联网技术

RTMP 直播技术

JVM进阶(十三):阶段学习回顾

No Silver Bullet

JVM 2月月更 回顾

经验分享 | TDengine在智能船舶领域的实践手册

TDengine

数据库 大数据 tdengine 物联网 时序数据库

关于大数据计算框架Flink内存管理的原理与实现总结 | 社区征文

张浩_house

大数据 flink 新春征文

JVM进阶(十二):JAVA 可视化分析工具

No Silver Bullet

JVM 监控工具 2月月更

营销MM让我讲MySQL日志顺序读写及数据文件随机读写原理

华为云开发者联盟

MySQL 磁盘 数据读写 日志顺序读写 数据文件随机读写

浅谈数仓建设及数据治理 | 社区征文

五分钟学大数据

数仓 新春征文

知名云计算厂商云宏加入龙蜥社区,共同打造信息安全坚实“地基”

OpenAnolis小助手

云计算 Linux 开源 社群运营

golang 面试总结

yuexin_tech

golang 面试

Go 语言入门很简单:技巧和窍门(Tips and Tricks)

宇宙之一粟

Go 语言 2月月更

DDD[0]·序

陆乘风

领域驱动设计 领域驱动设计DDD 领域驱动设计思想

第八节:SpringBoot指定配置文件配置三

入门小站

Java

在线IEEE浮点二进制计算器工具

入门小站

工具

Nacos服务注册与发现的2种实现方法!

王磊

nacos SpringCloud Alibaba

蚂蚁大规模 Kubernetes 集群无损升级实践指南【探索篇】

SOFAStack

云原生 etcd #Kubernetes# #k8s SIGMA

10万 npm 用户账号信息被窃、日志中保存明文密码,GitHub安全问题何时休?_语言 & 开发_褚杏娟_InfoQ精选文章