转自:InfoQ   刘志勇、Tina

从大公司聘请来的 CTO 太水,犯了个低级错误,事后还故意删除代码隐藏证据。

上周末,黑客组织 DDoSecrets 利用 SQL 注入漏洞,入侵了极右翼社交媒体网站 Gab,并下载了 70 GB 的数据。在 Gab 的开源代码中快速浏览一下就会发现,这个关键漏洞是由公司的首席技术官引入的。

1、CTO 犯的低级错误,CEO 来买单

黑客利用 SQL 注入漏洞从 Gab 的后台数据库中窃取了大约 70GB 的平台用户数据,包含该网站的 4000 多万条帖子,之后将所盗走的 70GB 数据交给了爆料网站 Distributed Denial of Secrets(DDoSecrets)。泄露的数据包含公开 / 私人贴文、哈希密码与用户私有讯息,涉及 1.5 万名用户,其中还包括前美国总统特朗普。DDoSecrets 已经将这些数据汇编成了一个名为 GabLeaks 的东西,打算将其提供给特定的记者、社会科学家和研究人员进行进一步分析。

作为一家初创公司,泄露 70G 数据无疑严重影响了用户权益,这个乱摊子让 Gab 的 CEO 疲于应付。2 月 26 日,最初,CEO 安德鲁·托尔巴(Andrew Torba)在 Gab 网站声明中否认了这一入侵行为,但数据泄露之后他又不得不承认已经发生了入侵行为,并且还称攻击者为“恶魔黑客”。Torba 说,该公司已意识到“该领域存在漏洞,并于上周对其进行了修补。” 并且还将着手进行全面的安全审核,在 2 月 28 日的一份声明中,他表示:“整个公司将全力调查发生的事情,并努力追踪和修补问题。”


黑客发 Twitter 嘲笑 Gab CEO 被吓坏了。

通过查看公司的 git commit 发现,导致关键漏洞的代码变更,是在 2 月份的某个时候从 Fosco Marotto 的账户上进行的,他是一名前 Facebook 软件工程师,11 月成为 Gab 的 CTO。周一,Gab 将此 git commit 从网站上删除,但网络上已有图片保存了关键代码。


这张图片显示的是 2 月份的软件变更情况,图片来自一家保存提交的快照的网站。提交的内容显示,一名软件开发人员使用 Fosco Marotto 的账户提交了代码,代码中明显存在新手错误,这种错误可能会导致报道中的泄密事件。具体来说,第 23 行删除了“reject”和“filter”的代码,这两个 API 函数实现了防止 SQL 注入攻击的编程习惯。

这一习惯允许程序员以安全的方式编写 SQL 查询,以“清理”网站访问者在搜索框和其他 Web 字段中输入的内容,确保所有恶意命令在文本传递到后端服务器之前被清除。取而代之的是,开发人员向包含 find_by_sql 方法的 Rails 函数添加一个调用,该方法直接接受查询字符串中未经清理的输入。Rails 是一套广泛使用的网站开发工具包。

“如果你知道在 Web 应用中使用 SQL 数据库,那么你将听说过 SQL 注入,而且不难发现 find_by_sql 方法不安全警告。Facebook 的前产品工程师 Dmitry Borodaenko 在一封电子邮件中提醒了我这个问题。“现在还不能 100% 肯定这就是 Gab 数据泄露事件中所使用的漏洞,但是绝对有可能是这样的漏洞,在最近提交的 GitLab 仓库中出现的代码更改被恢复,然后他们就让代码离线了。”具有讽刺意味的是,早在 2012 年,Fosco 就曾警告程序员同行们,要使用参数化查询来防止 SQL 注入漏洞。

2、删除不安全的代码,隐藏证据

Gab 开发的安全代码流程遭到质疑,同时,这家社交媒体网站因从其网站中删除提交而受到批评。批评者称,此举违反了 Affero 通用公共许可证的条款,该许可证控制 Gab 对 Mastodon 的重用(用于托管社交网络平台的开源软件包)。

译注:Affero 通用公共许可证(Affero General Public License,Affero GPL 或 AGPL),是一个广泛被使用的自由软件特许条款,最初由 Affero, Inc 撰写。此特许条款最新版本为第 3 版(v3),2007 年 11 月发布。Affero 通用公众特许条款是改自 GNU 通用公众特许条款,并加入额外条款,其目的是为了 Copyleft 条款应用于在网络上运行的应用程序(如 Web 应用),从而避免有人以应用服务提供商方式逃避 GNU 通用公众特许条款。

上述批评者称,这一删除行为违反了一条规定,即要求复刻(fork)的源代码直接从网站上链接。该要求的目的是提供透明度,让其他开源开发者也能从 Gab 同行的工作中受益。

Gab 长期以来一直在 https://code.gab.com/ 提供提交内容。然后,在周一,该网站突然删除了所有的提交:包括那些创建并修复了关键 SQL 注入漏洞的提交。取而代之的是,Gab 提供了 Zip 存档文件形式的源代码,该文件由密码“JesusChristIsKingTrumpWonTheElection”(不含双引号)保护。

Mastodon 项目的代表没有立即回复询问他们是否同意批评者的担忧的电子邮件。

此外,Gab 的 Git 提交还显示出,除了关于安全编码和许可合规的问题外,公司开发者也在努力修复他们脆弱的代码。下图显示了有人使用用户名“developer”尝试完全修复包含 SQL 注入漏洞的代码,但没有成功。


线程参与者对此的反应是讽刺地指出开发者似乎遇到的困难。


在 Gab 的安全漏洞事件,前后的代码处理为开发者提供了一个案例研究,说明如何维护站点的安全性和代码透明度。考虑到提交的文件使用了 Gab 的 CTO 的账号,这个教训就显得更有分量了,因为在所有的人当中,他知道的东西应该更多。

3、原因是 CTO 太水?

这件事情也引起了开发者的广泛关注,一位从事多年 Rails 开发的网友说:“这是不好的代码,让我感到惊讶的是这是由一位前 Facebook 工程师写的(后来他成了 CTO)。粗略检查就能看出一些错误,比如大型原始 SQL 查询完全可以使用 AREL 或 ActiveRecord 这种更惯用的方式,没有清理用户输入等等。”

2020 年 11 月,Gab 宣布聘请 Fosco Marotto 作为他们的新 CTO。Marotto 曾在 Facebook 工作七年,担任软件工程师,负责后端工具包 Parse 的开发,是 Parse 团队的关键成员,目前该工具包已经开源。同时他还利用业余时间帮助 Gab 开发了免费语音网络浏览器 Dissenter。加入 Gab 后,公司在他们网站的声明中说:“Marotto 有 23 年的行业经验,在后端基础架构上有深厚的知识和见解。这有助于 Gab 迅速发展为新的媒体巨头。”

防止 SQL 注入,在 Rails 文档中有明确的示例说明(https://guides.rubyonrails.org/security.html#sql-injection),甚至示例与该提交中所讨论的代码完全一样,所以这个技术在 Rails 里并不是什么新鲜玩意儿。在 2021 年还能让黑客利用到 SQL 注入漏洞,这很让人不可置信,一位网友在 Reddit 上评论道,“代码将要部署到生产环境中,在合并代码之前难道没有让同行审查吗?如果首席技术官审查了开发人员的代码后还犯这种错误,那么要么 CTO 和工程师都是白痴,要么工程师们在故意欺骗这位白痴。”

而且除了这是一种糟糕的实践之外,现有的每一个代码静态分析工具都会告诉你,这样编写 SQL 是一个非常糟糕的做法。CI 管道甚至会直接拒绝代码,拒绝合并代码。也就是说,即使我们的某个开发人员试图忽略了这个明显的安全漏洞,系统本身也能阻止它。因此,Gab 要么根本没有任何 SAST 工具,要么故意选择忽略他们的反馈。

也有人认为 CTO 不会关注这种细节,CTO 应该专注于战略思维,同时让公司中的一到两位开发人员负责日常工作,针对此类基本问题进行代码审查。大部分企业中,CTO 的确属于高级管理人员,善用高层次、有远见的思维制定战略,并担任企业中非常有影响力的沟通者角色。但这种情况不适合 Gab,因为 Gab 总共才只有 26 名员工,那么 CTO 就应该是该领域内对技术最熟练的人,同时也应该为项目的交付流程负责。

这件事情发生后,Marotto 不仅删除了 Gab 的代码库,连带删除了他之前在 Facebook 里负责的 Parse 工具的安全代码。这个 SQL 注入是个新手级别的错误,Gab 团队原来的代码是正确的,反而是被 CTO 搞砸了,很明显,Gab 没有聘请到正确的人。

延伸阅读:

https://arstechnica.com/gadgets/2021/03/rookie-coding-mistake-prior-to-gab-hack-came-from-sites-cto/

https://news.ycombinator.com/item?id=26319649

推荐阅读

误执行了rm -fr /*之后,除了跑路还能怎么办?!

程序员必备58个网站汇总

大幅提高生产力:你需要了解的十大Jupyter Lab插件

CTO 太水!犯了低级错误,还删除代码隐藏证据!相关推荐

  1. {2018.4.9}盘点一下荀(gou)彧(huo)同学犯的低级错误

    接触信奥也有两周多了,接下来就让荀(gou)彧(huo)来总结一下这些日子里犯的那些低级错误. 1>那些被漏掉的':'.'}'哭晕在角落: 把'i'看成'1'谁又能明白? cin和cout的大于 ...

  2. 新手敲代码经常犯的低级错误(持续更新ing)

    Hello,大家好. 本文章主要写一写敲代码时候常见的低级错误: 此文章不断的更新.(添加日常犯的低级错误导致程序运行不出来) 来源:1.别人的错误:2.自己的错误 干货不断!!!!干货不断!!!!干 ...

  3. 开发人员总是犯一些低级错误该如何解决?

    要在开发的前期就制定好一些编码规范,这样子可以减少很多由于个人习惯引起的错误.同时,测试人员在发现开发人员犯一些低级错误的时候尽量不要去指责他们,要耐心的给他们指出错误所在,让其好好的修改错误.然后在 ...

  4. 开发人员总是犯一些低级错误怎么解决?

    要在开发的前期就制定好一些编码规范,这样子可以减少很多由于个人习惯引起的错误.同时,测试人员在发现开发人员犯一些低级错误的时候不可以指责他们,要耐心的给他们指出错误所在.然后在让开发人员自己进行测试, ...

  5. 兰大计算机考研是差额复试吗,兰大考研录取名单拟公布,423分考生复试被刷,只因犯了低级错误...

    原标题:兰大考研录取名单拟公布,423分考生复试被刷,只因犯了低级错误 兰州大学考研录取名单拟公布,初试第二名的考生复试被刷,只因犯了低级错误 随着时间的不断推移,各大院校也都开始了复试,相对于初试来 ...

  6. 大厂来的水货CTO:低级bug被敲诈50万美元,事后删代码隐藏证据,最后收到死亡威胁...

    转载自:量子位 堂堂一家公司的CTO,到底能水到什么程度? 因为一个低级错误,70GB大小的信息数据被泄露,公司还被黑客敲诈了50万美元. 而被发现后,他为了隐藏证据,竟还删掉了代码- 这就是最近在一 ...

  7. 思维定势导致犯的低级错误(碎碎念)一

    2017/10/16,快要折腾吐了,一个二十多行的shell脚本,逻辑简单,统计前一天业务日志中有效请求的数量. 老板新接了个项目,所以增加了两台主机,试运行之后需要统计一些业务数据. 脚本写好在A主 ...

  8. 总结两个平常打代码犯的“低级”错误

    作者:黄鹏峰 撰写时间:2019年4月1日 开发工具和关键技术:VS:MVC 程序员打代码就像科学家搞科研,专注并且要严谨.如果马虎了一点,就会出现一些欲哭无泪的低级错误.下面我就总结两个自己平常所犯 ...

  9. 开发人员经常犯一些低级错误如何解决

    这种现象在开发流程不规范的团队里特别常见,尤其是一些"作坊式"的团队里 解决这种问题一般从以下几个方面入手: 1.开发管理 从根源来解决问题.可以制定规范的开发流程,甚至可以制定惩 ...

最新文章

  1. flask源码学习-helloworld与本地启动流程
  2. LeetCode Linked List Cycle II
  3. 21. Merge Two Sorted Lists
  4. 使用海康威视设备在Web端显示实时视频
  5. 你被大数据“杀熟”过吗?怎么解决的?丨Q言Q语
  6. strstr和strcchr查找字符串和区别
  7. linux中的dup和fcntl的用法
  8. Flink SQL 功能解密系列 —— 流式 TopN 挑战与实现
  9. 小兔的棋盘(HDU-2067)
  10. DB2对年份的处理Year()
  11. 搜索python题目的软件_Python编程快速上手——正则表达式查找功能案例分析
  12. 【实践】小红书推荐中台实践
  13. ftp信息或服务器信息,服务器:FTP报错信息怎么办
  14. 简单算法系列:快速算法/冒泡算法两则
  15. npp夜光数据介绍 viirs_基于NPP-VIIRS夜间灯光数据的南宁市GDP空间化研究
  16. gba模拟器html5源码,酷!用 JS 做的 GBA 模拟器
  17. php require找不到文件,第一次运行Fatal error: require_once找不到文件
  18. 拼多多上架助手用哪个?拼多多商家必备工具
  19. 原版安装Win10 1909专业版 64位MSDN镜像2020 05
  20. 最优化方法(学习笔记)-第二章凸集

热门文章

  1. redis根据通配符去批量删除指令
  2. mongodb性能分析方法:explain()
  3. PHP常用正则:手机 邮箱 网址
  4. c语言实验答案周信东第三章,桂林电子科技大学C语言程序设计习题答案周信东实验顺序结构与逻辑运算.pdf...
  5. linux5支持32,Red Hat发布RHEL5.3 可支持32颗虚拟CPU
  6. 怎么在android中定义泛型,android – 如何在GSON TypeToken类中使用自定义泛型?
  7. oracle 求时间差年,Oracle计算时间差常用函数
  8. Android无法运行AVD,android – 无法运行AVD(模拟器)
  9. CMD批量创建目录-配置管理
  10. 修改anaconda中conda和pip的源为清华源