明尼苏达大学事件常被浓缩成一句惊悚却失实的话:研究人员把实验性漏洞塞进了 Linux。事实并非如此。3 个故意带缺陷的补丁在进入内核前就被拦下;第 4 个实验补丁后来被证实有效,获接纳后又因使用虚假身份而被移除。[1][2]

事件依然造成了实际损害。维护者得知研究人员把真实的补丁审查当作一场未披露的实验后,便再也无法分辨哪些明尼苏达大学相关贡献属于这场实验,哪些来自无关的工具研究,哪些只是出于善意的常规修复。Linux 基金会技术咨询委员会最终复查了 435 个 commit。内核里从未出现需要清除的预埋后门;真正高昂的代价,是在真实背景消失后重建来源脉络。[1]

这一区分让事件的意义超出了道德寓言。Linux 审核者拦住了所有故意无效的提交,项目仍遭遇了一次严重的信任破裂,继而启动全仓库审计,论文被撤回,相关机构公开道歉,开源社区研究也有了新规则。代码审查守住了防线;让代码审查得以扩展至庞大规模的信任前提,却已经失效。

图片背景:封面照片并非摄于 2021 年争议期间。2014 年的会议画面呈现了“内核”背后由人组成的制度:维护者公开发言、审查并作出判断。后来,Kroah-Hartman 发出的紧急复查请求调动的正是这套制度;自动化安全闸门并未承担这项工作。[1][6]

警报在实验结束七个月后才响起

2020 年 8 月,两名明尼苏达大学研究人员使用两个虚构的 Gmail 身份发送补丁。他们后来披露了这两个账户提交的 5 个补丁。其中 4 个属于案例研究:3 个故意带有缺陷,另 1 个原本也被当作缺陷示例,实际上却是有效代码。第 5 个补丁来自另一项研究,是一项正当修复,只因账户配置失误而从实验账户发出。只有那个有效的实验补丁进入了内核;故意带缺陷的改动一个也没有合入。[1][2]

公开危机直到次年才爆发。2021 年 4 月 6 日,同一研究团队的另一名开发者提交了一个存在缺陷的 NFS 补丁,补丁来自另一项静态分析研究。审核者提出质疑并将其拒绝。4 月 20 日,Kroah-Hartman 把这一连串质量欠佳的补丁与此前的“伪善提交”论文联系起来,要求该团队停止发送明知无效的改动。次日,他发布了一组最初包含 190 个补丁的回退序列,并请各子系统维护者检查明尼苏达大学作者提交的工作。[1][5]

这一推断有其缘由,其中一部分并不准确。技术咨询委员会 4 月 22 日表示,近期补丁看起来是善意提交;LWN 同期报道随后也把 4 月的工具项目与 8 月的欺骗性研究区分开来。[1][5] 然而,纠正这项判断仍未补齐缺失的清单。维护者手里没有一份完整、可信的记录,无法查明实验使用的身份、邮件和补丁。研究人员披露这些细节之前,每项相关贡献都带着一个悬而未决的问题:这是失误、修复尝试,还是另一场未披露的测试?

此后的处置迅速推进。研究人员于 4 月 24 日道歉,4 月 26 日撤回论文,又在取得相关人员同意后,于 4 月 27 日公布详细说明;说明中重现了这些人在邮件列表中的往来。5 月 5 日,技术咨询委员会发布审计报告。最终记录把案例研究限定在 Linux 内核,范围是 2020 年 8 月 9 日至 8 月 21 日之间发送的 4 个补丁。[1][2]

有效载荷藏在看似合理的清理代码中

实验针对的是一项真实的审查弱点:小补丁表面上可以修复泄漏或错误处理路径,同时悄然改变对象的生命周期。审核者看到的是熟悉的清理调用,例如 put_device()、引用计数递减或资源释放,随后必须重新梳理这次调用之后是否仍有代码会访问该对象。危险行为散落在辅助函数、错误标签、所有权规则和少见的执行路径中,很少集中在一行一眼可辨的恶意代码里。[2]

其中一个补丁声称要修复用 Syzkaller 和 KMEMLEAK 发现的内存泄漏。维护者认出,几乎相同的改动早在 2019 年就曾合入,后来因引发 use-after-free 而被回退,于是拒绝了这次提交。另一个补丁加入 put_device() 后,会在稍后的 dev_err(&chdev->dev, ...) 解引用之前释放 chdev。审核者发现了链表处理问题和另一处缺陷,却没有发现隐藏的 use-after-free;由于补丁本就需要返工,研究人员也没有提交修正版,它就此停在审查阶段。第 3 个缺陷补丁存在 double-put 风险,审查过程同样因另一项问题将其拒绝。[1][2]

这些结果同时支持两项结论。从实际运行看,审查流程保护了代码树:所有无效实验补丁都被拦下、拒绝或放弃。从科学证据看,这些结果不足以证明审核者识别出了隐藏漏洞。两个补丁因维护者发现其他缺陷而止步,所谓的第 4 个漏洞则是一段有效代码。IEEE 安全与隐私研讨会程序委员会后来认定,这项实验没有为论文的主要主张提供有说服力的证据,部分叙述还含混不清或具有误导性。[3]

虚假身份让这场测试超出了对抗性代码审查。内核补丁依照开发者原创证书(Developer's Certificate of Origin)附带 Signed-off-by 行,把改动与有权提交它的人联系起来。审查仍需检验代码本身,身份则带来问责关系、讨论记录和联系作者的途径。案例研究把这些社会信息当成需要隐藏的变量。实验由此更接近伪造组件的来源记录,问题早已超出一道刁钻 diff 能否过审。[1]

影响半径以疑虑衡量

最终审计的数字很容易被误读。在接受检查的 435 个 commit 中,委员会认定 349 个正确,39 个归入“回退并修正”,25 个后来已经修复。另有 12 个因底层代码消失而与当前内核无关,9 个早于该研究团队成立,1 个应作者请求移除。那 39 个并非预埋漏洞:这一类别既包括此前大量工作中普通的错误修复,也包括技术上有效、却因虚假身份违反贡献规则而被移除的实验补丁。[1]

这轮扩大后的复查确实找出了一些有价值的修复,同时也最清楚地呈现了事件成本。数十名子系统专家被迫重新检查多年来的改动,因为现有元数据已经无法圈定可疑范围。以邮件域名为准,覆盖面过宽:同一所大学的许多人都提交过正当贡献。覆盖面也过窄:案例研究使用虚构的 Gmail 账户,研究人员还曾以其他机构身份贡献代码。委员会只能交叉核对姓名、地址、研究论文、Reported-by 标签,以及引用更早改动的 commit。[1]

这正是所有开源项目都应留意的来源教训。一个组织若明知是对抗性测试改动,仍借常规贡献渠道提交,即使每次测试都被拦下,也会给未来留下范围界定难题。实验曝光后,维护者必须追问:公布的实验清单是否完整,是否还有其他身份或代码仓库卷入其中,过往那些“良好”贡献是否依旧可信。成本会随着贡献历史的长度增长,与恶意代码的行数没有对应关系。

把所有人一概列为嫌疑对象,无法成为长期控制措施。它会惩罚无关贡献者,消耗稀缺的审查时间,也会阻碍数十年来不断改善 Linux 的学术合作。然而,有选择的信任依赖真实标注。缺少这些标注,维护者只能接受未经核验的保证,或扩大审计,直到结果足以经受质询。2021 年,他们选择了后者。

内核审查开始之前,研究审查已经失效

这起事件也暴露了学术出版流程中另一处控制失效。IEEE 程序委员会表示,论文最初得到两个“接收”和两个“弱接收”评分,位列全部投稿的前 5%。一名评审者曾短暂提出伦理疑虑,相关问题却没有得到持续讨论。公开反对意见出现后,会议主席要求机构审查委员会作出认定;该委员会认为,这项工作不属于人类受试者研究。IEEE 后来发现,机构审查委员会收到的实验细节并不充分,仅凭其管辖范围,也无法裁定欺骗开发者或让生产软件承受风险这类广泛伦理问题。[3]

把两套系统放在一起比较,很能说明问题。内核审核者评估补丁时不知道它们属于实验;学术评审者评估论文时,起初也没有把实验中的伦理信号升级处理。两条流程中的局部检查都在处理眼前材料,关键背景却留在别处。若要修补两处失效,让每位评审者对一切保持戒备并无效果。缺失的背景需要进入决策流程,伦理疑虑也需要一条明确的升级渠道。

IEEE 随后增设常设伦理审查流程,为作者和评审者加入明确的伦理勾选项,并在征稿启事中强化相关措辞。内核社区后来也发布了自己的《研究人员指南》。指南划出一条清楚界线:研究公开材料的被动观察受到欢迎;主动研究开发者行为,则须事先取得明确同意,并完整披露相关信息。故意有缺陷的补丁和误导性讨论,超出了开发者同意审查善意贡献时所授权的范围。[3][4]

纠正措施需要披露,也需要工程证据

内核指南在禁止欺骗之外,还提出了更具体的要求。对于研究产生的修复,作者应说明具体问题、触发方式、影响、发现问题的工具或方法、内核版本、修复正确的理由、构建与运行时测试、待修复的 commit,以及此前参与审查的人。指南鼓励首次贡献者先请人私下审核补丁;如果某个团队已被告知其补丁流需要更严格的审查,这一步就成为强制要求。[4]

这些字段把研究背景转化为可供审查的工程证据。维护者由此可以区分已经确认的缺陷与静态分析提出的假设,了解硬件测试的条件是否存在,也能看到提交机构内部由谁检查过结果。对小型实验室而言,控制措施可以是一名有经验的内核贡献者,负责审查所有向外发送的补丁。大型研究机构则需要指定审批流程、维护正在开展的实验清单、使用可问责的身份,并设置一个升级联系人,以便迅速列出所有受影响的项目和邮件。

项目自身也需要一套联络渠道。公开的研究政策能让善意团队在行动前找到咨询入口,也能明确界定未经同意的测试属于越界行为。Linux 如今提供技术咨询委员会的私密联系方式,研究人员可以讨论敏感方法,维护者也不会在不知情时成为受试者。[4] 应当避免的做法,是政策只写“开展合乎伦理的研究”,却没有界定同意、补丁标注和事件披露应如何处理。

因此,明尼苏达大学事件若被解释成 Linux 审查很容易遭到突破,就会偏离事实;把它视为审查足以解决一切,同样偏离事实。故意无效的补丁全部未合入,其中一些却因隐藏载荷之外的原因被拦下。系统保护了代码,事件代价依然巨大,因为面临风险的资产还有其他部分。

另一项资产,是人们对谁提交了什么、为何提交,以及当事人的说明是否完整所抱有的信心。这份信心一旦崩塌,435 个旧 commit 都进入了事件调查范围。把怀疑推向极致,撑不起长期控制。长期有效的控制依靠真实参与,并以充分的技术证据作为后盾,让维护者既能审查补丁,也能核验补丁所附带的说明。

来源

  1. Linux 基金会技术咨询委员会,“Report on University of Minnesota Breach-of-Trust Incident”,2021 年 5 月 5 日——主要时间线、补丁调查结果、435 个 commit 的审计与纠正建议。
  2. 明尼苏达大学研究人员,“A Full Disclosure of the Case Study of the ‘Hypocrite Commits’ Paper”,2021 年 4 月 27 日——逐补丁技术记录与邮件列表往来。
  3. IEEE Symposium on Security and Privacy 2021 程序委员会,“Statement Regarding the ‘Hypocrite Commits’ Paper”,2021 年 5 月 6 日——技术、伦理与会议流程调查结果。
  4. Linux 内核社区,“Researcher Guidelines”——现行同意界线、披露要求、补丁证据与内部审查指引。
  5. Jonathan Corbet,“An update on the UMN affair”,LWN.net,2021 年 4 月 29 日——同期独立梳理,区分 8 月实验与 4 月触发事件。
  6. Krd,“LinuxCon Europe Greg Kroah-Hartman 01”,Wikimedia Commons——本文使用的 2014 年会议照片。