Cover

圣诞节与“供应链安全”

Wenxuan Shi /
December 24, 2021
14 min read

圣诞节又到了。中国的前端程序员一定不会忘记这个节日。3 年前的这一天,阿里巴巴 AntD 团队在开源项目中掩埋的圣诞彩蛋引发了开源世界信任链的崩溃。前端程序员在节日当天面对客户投诉、老板指责,甚至有人被直接开除……

🎄 圣诞节的程序员故事

2018 年 12 月 25 日,星期二,深圳略有寒意。今天是圣诞节,街道上没有丝毫节日氛围。地铁站台上挤满了工人。印刷机器开足马力,民粹主义者大声宣扬着抵制 “洋节”。圣诞节就是普通的另一天。坐在咖啡店里完成作业的我不会料到,今天在前端历史上会留下如此深刻的痕迹。

首先发现事情有些不对的,是第二第三产业的客户。企业公司、事业单位、政府部门的内部都用着专门设计的网页系统,这些网页系统不会对外部公开,大多数运行在封闭的内网系统中。早晨,这些兢兢业业的工人们打开系统,发现网页的外观与之前使用的完全不同:网页按钮上覆盖了一层积雪,移动到按钮上还有 “Ho Ho Ho” 的提示。

按钮覆盖一层积雪
按钮覆盖一层积雪

网络安全部的小伙子们非常紧张 —— 网页外观的改变通常意味着企业内部网络已经遭受攻击。他们还记得在互联网发展初期的 “熊猫烧香” 病毒,一个把所有应用程序图标换成熊猫的蠕虫病毒,席卷了几乎中文互联网的全部土地,造成了数以亿计的经济灾难。安全部的主管颤抖着指挥着对影响范围的排查。排查的结果将决定这个可怜的中年人能否保留自己的工作、女儿的钢琴班,以及能否偿还剩下的 600 万房贷。如果积雪从网页按钮上蔓延到公司内部数据库、邮件系统,甚至财务系统,它也将落到这个不曾感受过寒冬的深圳家庭上。时代的一粒雪花,就是压倒个人的一座大山。

之后是害怕且愤怒的事业单位部门。他们打开网页后心跳一沉。中层干部们开始后悔:每个月三番五次的网络安全宣讲会议,当时不以为意,现在终于发生到了自己部门的头上。这是思想松懈的表现。负责和外包对接的小姑娘吓紫了嘴,不知所措 —— 这是她汉语言文学专业毕业刚到部门的第二年。

上午 11 点,外包公司的程序员们正在晨会,讨论下星期的项目排期。主管接完电话面色铁青:老板一连接到了三家客户的电话。自己团队开发的系统接连出现类似的问题。最关键的是,系统被部署在严格隔离的内网环境中,通过了安全公司重重检验。他的经验判断 —— 客户担心的遭受外部攻击的情况可能性很小,反而是团队内部出现问题的可能性更大。

公司迅速组织了一批前端开发老将,成立紧急部门定位问题。写字楼的电梯繁忙起来,47 楼进进出出。秘书用 A4 纸打印 “作战中心” 四个大字贴在会议室的门上。两个程序员拿着白板笔,在白板旁边争吵。更多的程序员用着 F12 工具在网页源代码里上下翻找。食堂送来了盒饭 —— 冒着热气,塑料盒盖上沾着水珠 —— 这毕竟还是冬天。

主管快步踏入会议室,大声宣布:“是上游的问题”。

所有人都松了一口气,接着又紧张起来。上游问题,也就是依赖问题。一个项目不可能从头开始搭建,往往都是 “站在巨人的肩膀上”。现在巨人倒下了,小公司也无能为力。上游出现问题,影响范围有多广?辐射面积有多大?什么时候能有修复方案?

程序员论坛已经炸开了锅,事件讨论的帖子叠上了几百条回复。不少公司都成功定位出了问题:前端项目使用了阿里巴巴 Ant Design (蚂蚁设计)团队开源的 AntD 设计框架。而所有使用 AntD 框架的项目,今天的按钮上都出现了积雪。这个积雪效果是 AntD 故意设计的 “圣诞彩蛋”,只在圣诞节当天触发。

为了保证惊喜效果,蚂蚁设计团队对于埋藏彩蛋的事情只字未提,也就导致了使用 AntD 框架的程序员对圣诞彩蛋毫不知情,原封不动地打包进了生产环境,分发给了企业、事业单位,甚至政府部门。虽说蚂蚁设计团队本意上是想给所有人一个 “圣诞惊喜”,可在现实生活中,却成了 “圣诞惊吓”。

尽管 “受到攻击” 的误会解除,程序员们却惊魂未定。愤怒的老板指责:团队开发的系统给客户造成了严重不良影响。受事件影响,一些外包公司失去了客户的后续订单;在国家公职系统中庆祝圣诞,这一事故需要有人担责;不少前端团队在 12 月月底被取消年终奖,甚至还有程序员被直接开除。

当天晚些时间,AntD 团队在 GitHub 上更新了修订版本,并且发布了道歉声明。彩蛋作者 @afc163 称:“这完全是我个人的一意孤行且愚蠢的决定,是我的错误给大家造成了不良影响,非常抱歉”。道歉声明获得了 508 个赞和 485 个踩。

众说纷纭

故事讲完。2018 年的圣诞节是我印象最为深刻的节日。周末刚从 Google DevFest 回到学校,周二当天全程在网络上关注事情的发酵与收尾。这次事件包括了很多视角,也产生了很多观点。

程序员的无妄之灾 / 技术选型应当慎之又慎

此次事件中,被取消年终奖,甚至被开除的程序员们有苦说不出。AntD 框架由阿里巴巴背书,发展至今已经是全球排名第二的设计框架。作为行业通用解决方案,是一个非常著名且优秀的选择。AntD 加入彩蛋导致它的使用者被开除,确实是程序员的无妄之灾。

程序员也应当反思。在这次事件中,使用 AntD 的项目不乏有事业单位和政府部门的内部系统。这些对安全性要求极高的系统,是否有使用第三方设计框架的必要?技术选型直接影响成品的效果和安全性。在面对不同的需求时,应当非常慎重的进行技术选型,杜绝经验主义、教条主义。

开源项目不需要担责 / 但应当更有责任心

尽管不少愤怒的程序员指责 AntD 开源框架应该承担本次事件的责任,但 AntD 作为开源项目,无偿、免费地提供使用,而且与使用者之间不存在任何法律上的约定。项目设计中,因为使用第三方库导致的问题应当由程序员自行负责。

作为全球排名第二的设计框架,蚂蚁设计团队在加入彩蛋时完全不考虑后续影响,是缺乏责任心的表现。尽管法律上没有要求,但维护社区的健康和谐发展是开源精神的要求。对开源精神的违背,必然会遭至社区的谴责。

供应链安全

如果 AntD 有健全的代码评审机制,那么这次事件就不会发生。可惜在 GitHub 提交里,彩蛋代码的评审只说了一句 “这里少了一处空格”,随后就并入了 master 分支,嵌入到后续的版本中,最终造成了大范围影响。

🤔

公开检查=公开绕过检查?

在 CI 过程中嵌入检查代码在开源项目中非常常见。这些检查可以在早期筛除不符合规范、有明显错误、有明显安全漏洞的代码。然而,开源项目的代码检查部分也是开源的,防君子不防小人。对于恶意提交者而言,公开对代码进行检查,也就是公开了如何绕过代码检查的方法。

今年我和不少安全领域的教授聊天,他们都不约而同地提到了供应链安全的问题。开源项目的安全性很大程度上受到供应链的影响。所有程序员都可以向开源项目提出 Pull Request,提交自己的代码。这些代码的安全性只能由 Reviewer 肉眼判断。开源项目越来越庞大,Reviewer 的审查周期变长、审核力度下降,进而导致了供应链安全问题。

🔑

代码提交实名化

目前程序员只需要注册一个邮箱,就可以在 git 里提交代码。恶意提交者可以无限次数创建新邮箱来逃避黑名单制度。为了约束恶意提交者,实名化提交是一种解决方案。但是它也潜在地违背了开源社区的自由主义精神。

供应链安全是目前研究的热点问题,一篇有关 “供应链安全热点研究文章导读” 的专题文章已经在选题列表中。如果你喜欢这篇博客,或想第一时间获得通知,可以通过 RSS 订阅更新。也欢迎关注我的 GitHub 和推特账号,我将分享更多关于计算机安全的优质内容。如果你对这篇文章有任何疑问或建议,请在下方留言。再会~

© LICENSED UNDER CC BY-NC-SA 4.0

Subscribe to the blog via RSS