12个月前,一个由50名Google员工组成的团队使用GitHub修补了数千个开源项目中的“Apache Commons Colltions反序列化漏洞”(或我们所称的“Mad Gadget漏洞”)。我们最近明白了为什么我们的努力如此重要。旧金山市运输局的软件系统被一个贪婪的黑客加密并关闭。根据对这起事件的报道,黑客使用了完全相同的漏洞。他要求政府支付比特币赎金。他威胁说,如果不支付赎金,他将泄露从旧金山公民那里窃取的私人数据。这是对我们最关键的公共基础设施的攻击;基础设施是支撑美国一个大城市经济的基础设施。Mad Gadget是我们见过的最有害的漏洞之一。通过仅存在于Java类路径上,Apache Commons Collection(版本3.0、3.1、3.2、3.2.1和4.0)中的7个“gadget”类使用EXEC函数完成了整个JVM进程图灵的对象反序列化。由于许多业务应用程序使用对象反序列化在网络上发送消息,这就好比雇佣了一名训练有素的银行出纳员,如果要求他礼貌地交出保险库中的所有钱,然后将密钥委托给该出纳员。在这种情况下,唯一能保证银行安全的事情就是大多数人不会考虑问这样的问题。Mad Gadget的发布引发了寒武纪时期企业安全披露的爆炸式增长。甲骨文、思科、红帽、詹金斯、VMWare、IBM、英特尔、Adobe、惠普和SolarWinds都正式披露他们受到了这一问题的影响。但与大企业不同的是,开源项目没有员工整天阅读安全建议,而是依靠志愿者让他们随时了解情况。直到五个月后,谷歌的一名员工才注意到几个著名的开源库还没有听到这个坏消息。这些项目仍然依赖于易受攻击的集合版本。因此,早在2016年3月,她就开始向那些更新代码的项目发送拉取请求。这很容易做到,通常只需要更改一行。在GitHub图形用户界面的帮助下,任何人都可以在不到一分钟的时间内对任何人的代码库进行这样的更改。考虑到这些变化看起来相对容易,她在谷歌招募了更多的同事来帮助这一事业。随着更多的工作完成,问题显然比我们最初意识到的更大。例如,在修补像Spring Framework这样的项目时,很明显我们不仅仅在修补Spring,还在修补所有依赖于Spring的项目。此外,我们正在修补所有依赖于这些项目的项目等等。但是,即使这些用户升级后,他们仍然可能受到引入易受攻击版本的集合的其他依赖项的影响。更糟糕的是,不能依靠构建像Maven这样的系统来驱逐旧版本。这就是我们意识到Mad Gadget特别病毒式的本质的时候。我们得出的结论是,为了改善全球软件生态系统的健康状况,应该从尽可能多的代码库中删除旧版本的集合。我们使用BigQuery来评估损失。它允许我们用正则表达式编写SQL查询,在几分钟内搜索GitHub上的所有公共代码。#StandardSQLSELECT POP,REPO_NAME,pathFROM(从`bigquery-public-data.github_repos.files`中选择id,repo_name,path from`bigquery-public-data.github_repos.files`作为文件,其中路径类似';%pom.xml';并且存在(从`bigquery-public-data.github_repos.contents`中选择1,其中不是二进制,内容类似';%commons-Collection<;%';和内容类似'。和id=files.id))JOIN(选择Difference.new_sha1作为id,array_length(Repo_Name)作为POP from`bigquery-public-data.github_repos.comms`CROSS JOIN UNNEST(Difference)AS Difference)using(Id)ORDER BY POP DESC;