Transcription
(悬疑音乐)- [德里克] 2021年,一名黑客发现了一个对世界上最重要的操作系统致命的弱点。- 如果你有一个能让你进入互联网上任何服务器的钥匙,你会怎么做?- 这现在是实时公开的吗?- 是的,它在服务器上是实时运行的。- 听着,我并不满意。我希望你把它改回来。- [旁白] 当时,几乎所有人都认为入侵这个系统是不可能的,但他们错了。- 嗯,我可以告诉你会有多少系统受到损害,那将是数百万。事实上,我仍然对主流新闻媒体没有怎么报道这件事感到惊讶。- 我们离危险有多近?- 我们离数百万互联网服务器对任何制作后门的人开放只有几周的时间。从间谍活动、勒索到摧毁整个国家,你都可以用这个后门做到。- 这名黑客意识到整个操作系统依赖于一个单一的部分,由一个人维护,而通过损害那一个部分,他们就可以感染互联网上几乎所有的服务器。那么,我们怎么会让自己变得如此脆弱呢?嗯,故事始于一台卡纸的打印机。(悬疑音乐)(欢快音乐)- [旁白] 人工智能实验室里一片忙碌。他们刚刚安装了 Xerox 9700。这是最早的商用激光打印机之一。这可是一件大事。唯一的问题是它总是卡纸。- [斯托尔曼] 你会等一个小时,心想,我知道它会卡纸,我会等一个小时去取我的打印件,然后你会发现它一直卡着。烦恼得要命。- 理查德·斯托尔曼,实验室的一名研究员,认为他有一个解决方案。几年前,他通过编写一个简单的程序解决了类似的问题,该程序在发生卡纸时会发出警报。现在,这并没有从机械上解决问题,但它确实确保了卡纸不会被忽视。他认为他现在可以做类似的事情。唯一的问题是施乐公司没有提供打印机的源代码,没有源代码,斯托尔曼就无法编写他的代码。所以他找到了原始开发者。- [斯托尔曼] 我说,“你好,我来自麻省理工学院。我能得到一份打印机源代码的副本吗?”他说,“不,我答应不给你副本。”我惊呆了。我生气了。我唯一想到的就是转身就走,离开他的房间。也许我摔门了。后来我仔细想了想,因为我意识到我看到的不仅仅是一个孤僻的混蛋,而是一个重要的社会现象,影响了很多人。- [亨利] 这种社会现象已经慢慢侵入了计算机研究领域。在 60 年代末,AT&T 贝尔实验室的工程师发明了一种名为 Unix 的操作系统,他们广泛地在大学和研究实验室共享。那是一个自由的时代。但到了 80 年代,AT&T 开始因为版权侵权而追究 Unix 克隆开发者。后来,他们甚至起诉了加州大学伯克利分校。科技格局已经改变。他们想封闭软件开发。公司现在让他们的员工签署保密协议,禁止他们与任何其他程序员分享他们的代码。- [斯托尔曼] 看,这是我第一次遇到保密协议,而我是受害者。它教给我的教训是,保密协议有受害者。它们并不无辜,它们并无害。- [亨利] 斯托尔曼想知道,也许他可以适应这个新世界。- [斯托尔曼] 但我意识到,那样我就可以快乐地编码,我也可以赚钱。但最后,我不得不回顾我的职业生涯,说:“我一生都在建造墙壁来分裂人们,我将为我的一生感到羞耻。”- 所以斯托尔曼选择了另一条路。他辞去了在麻省理工学院的工作,并于 1985 年成立了自由软件基金会,致力于推广四项基本自由。你应该可以自由地为任何目的运行软件,自由地研究它,自由地修改它,以及自由地分享它。现在,为了确保这些自由,他创建了一个法律许可证,开发人员可以将其附加到他们的代码上,称为通用公共许可证。为了对抗 AT&T,他开始着手一个基于 Unix 但从头开始构建的项目,这样 AT&T 就无法起诉。他称该项目为 GNU,一个递归缩写,意思是 GNU 不是 Unix。现在,为了复制一个 Unix 系统,GNU 项目必须重新创建三个层次的功能。他们需要实用程序,这是日常工具和命令;shell,这是人们用来与机器交互的终端;最后是内核,这是与硬件通信并管理内存的核心。现在,在接下来的七年里,GNU 项目从零开始完成了其中的大部分工作。他们创建了 GCC 代码编译器、Bash shell 以及许多其他核心实用程序。但他们总是缺少一个关键组件。内核。1991 年秋天,当斯托尔曼访问赫尔辛基大学发表演讲推广该项目时,情况发生了变化。听众中有一位年轻的计算机科学学生,他碰巧正在从头开始构建自己的内核。他的版本不是免费的,但在听了斯托尔曼的演讲后,这位学生改变了主意,并采用了通用公共许可证。起初,他想称之为 Free Unix,或 Freax,但他的朋友认为这听起来很糟糕,所以他以学生本人林纳斯·托瓦兹的名字重新命名了它。林纳斯,Unix。嗯,这就是他得到 Linux 的方式。那个内核,结合 GNU 项目的其他组件,变成了一个完整的操作系统。现在,技术上讲,Linux 只指那个内核,但很多人用它来指整个操作系统,所以 GNU 和 Linux 以及其他任何东西。因为代码是开放且免费的,并且在此基础上构建的项目也是如此,一种新的软件开发模式得以确立。任何人都可以检查代码,改进它,修复缺陷,并普遍地推动所有人的发展。因此,软件分裂成两种竞争的意识形态。由公司控制的专有闭源系统,以及代码免费的开源项目。- 它有两种免费方式。它免费,因为你不需要为此付费,而且你可以自由地以任何你想要的方式修改它,这似乎是更重要的方面。人们乐于为技术付费,但他们经常会遇到一些障碍,你必须向某个大公司提交支持票,他们可能会或可能不会得到他们需要的帮助,而工程师们则渴望自己解决问题。- 开发人员可以采用免费提供的基本代码,然后添加与他们特定设备相关的自己的功能。他们不必每次都重新发明轮子。这就是为什么 Linux 传播到各种不同的应用程序中。- 你好,我是 Mac。- 我是 PC。没有别人。- 没有人。(女士清嗓子)- 你好,我是 Linux。据估计,有 3000 万 Linux 用户。- 你站了多久了?- 很久了。- 它甚至不局限于电脑。你的电子吸尘器绝对是 Linux。你的相机绝对是 Linux。大多数电视,大多数电子产品都是 Linux。- Linux 甚至运行着地球上一些最敏感的机器。- 你可以认为 Linux 几乎被用于任何需要高安全性的地方,不一定是因为微软,例如,无法构建同样安全的东西,而是因为通常在构建,比如说,一个新的武器系统时会涉及保密,而你并不一定想与某个科技公司合作。你不想涉及比绝对必要更多的人。- [亨利] 世界上排名前 500 的超级计算机中,每一台都运行 Linux。它被用于五角大楼和美国核潜艇。- 你能想到的每家银行,制造商,医院,政府,国防组织等等,它们都在运行 Linux 服务器。- 今天,Linux 无处不在,大多数人熟悉 Windows 和 macOS,但它们不是世界上最流行的操作系统。不,它们被运行 Linux 内核的系统所掩盖。Android,拥有超过 30 亿台设备,是基于 Linux 构建的。它还为世界上大多数互联网服务器提供动力。- 没有一家公司能够想象到如今计算机使用的所有不同场景,而 Linux,凭借其适应性,每个人都可以通过微小的调整来使其适应自己的用例,现在已经覆盖了所有用例。- 但这一切,都依赖于一个关键的假设。代码是安全的。现在,有充分的理由这样认为。因为有这么多人查看代码,所以有一种想法是,无论是故意的还是无意的错误,都不会太深而无法发现。它被称为 Linus 定律。即有足够的眼睛,所有错误都会很浅。但这个假设有一个大问题。开源运动不是一个大项目。它是一个生态系统。你需要成千上万个小型工具和库,每个工具和库都执行不同的任务,如网络、安全或压缩。现在,许多这些项目之所以开始,是因为一个人想解决一个特定的问题,所以他们自己构建它。他们通常不拿报酬,在晚上和周末编码只是为了让工具正常工作。如果它有用,一个开源项目就会采用它,然后是另一个,突然之间,数百万台机器都依赖于一个人的热情项目。这就是整个生态系统如何最终悄无声息地依赖于一个由一名志愿者维护的项目。有一个著名的 XKCD 漫画完美地捕捉了这一点。但当那个块被破坏时会发生什么?在我们的故事中,我们的人不是来自内布拉斯加州。不,拉斯·科林来自芬兰,自 2005 年以来一直在开发一个名为 XZ 的小型数据压缩工具。XZ 在压缩方面非常出色,以至于它现在几乎被所有主要的 Linux 发行版使用。在过去的 20 年里,几乎所有让该工具与不断发展的硬件兼容的工作都落在了拉斯的身上。他从未因此获得报酬,但到目前为止,他对此还算满意。然而,最近,他承受的压力越来越大。“一个月过去了,合并的进展仍然没有。不足为奇。”“除非有新的维护者,否则不会有进展。提交补丁在这里这些天毫无意义。当前维护者失去了兴趣,或者不再关心维护。”拉斯回应说,“我并没有失去兴趣,但我关心能力一直受到相当大的限制,主要是由于长期的心理健康问题,但也由于其他一些事情。也要记住,这是一个无偿的爱好项目。”但这还不够。“我很抱歉你的心理健康问题,但重要的是要意识到自己的极限。社区想要更多。你忽略了邮件列表上大量正在腐烂的补丁。现在,你扼杀了你的仓库。”拉斯正在精疲力竭。但就在他认为自己无法再坚持下去的时候……“你们俩能把这个功能做到现在这个程度,真是太棒了。我只是在尽我作为助手精灵的本分。”署名,贾·谭。几个月来,贾一直在减轻拉斯的负担。他非常有帮助。现在他主动提出接任该项目的维护者。对拉斯来说,这听起来几乎好得令人难以置信。“正如我在之前的邮件中暗示过的,贾·谭将来可能在这个项目中扮演更重要的角色。”最后,拉斯可以退后一步,在 20 年的辛勤工作后喘口气。但贾并非他表面上看起来那样。他已经将拉斯·科林的 XZ 项目确定为 Linux 生态系统中的一个薄弱环节,一个可以让他访问互联网上几乎所有计算机的环节。(悬疑音乐)今天,我们认为安全的远程登录是理所当然的。我的意思是,它们已经可靠地工作了 30 多年。但这都始于 1995 年,当时赫尔辛基技术大学的一名黑客在一次嗅探攻击中捕获了数千个通过校园网络发送的用户名和密码。事后看来,问题很明显。这些登录请求完全以明文形式发送,因此任何拦截数据的人都可以阅读它。(悬疑音乐)当该大学的计算机研究员塔图·伊洛宁得知这次袭击时,他将确保这种情况不再发生作为自己的使命。- [塔图] 密码嗅探可能是当时互联网上最严重的と言う安全问题。- 为此,他的解决方案需要确保两件事。首先,机器必须建立安全连接。如果两台计算机都能就用于加密其数据的共享秘密代码达成一致,那么即使它们被窃听,任何没有该秘密代码的人只会得到乱码。现在,你可以提前亲自商定共享秘密。- 密码。- 但在互联网上,这很少实用。不,你必须在从未见过面的情况下就共享秘密达成一致,而且还要有某人在全程监听。这听起来非常棘手,但有一种方法可以做到,我可以用这个颜料罐向你展示。假设我正试图向格雷戈尔发送一条消息。第一步是商定一个共享的公共颜色。我们选这个红色。这没什么秘密,任何人都可以看到。现在我们各自选择自己的私人颜色。我选黄色,他可以选任何他想要的。所以我们取我们的私人颜色,然后我将它与公共颜色混合。现在值得一提的是,这些混合物被认为是无法混合的,所以即使你知道这种橙色,你也知道这种红色,你也无法确切地推断出我们用来创造它的黄色的确切色调,这对于稍后的实际计算机示例很重要。好的,所以我要把这个寄给格雷戈尔。- 所以,我混合了我的秘密颜色和公共颜色,我要把它交给亨利。- 所以,格雷戈尔给了我这个,看起来像一种深绿色。我们现在要做的是将它与我原来的私人颜色混合。- 好的,现在我有了亨利的秘密颜色和公共颜色混合在一起,我要加入我自己的。- 所以我们最终得到了这种独特的橄榄色。里面有我的黄色,我可以看到,还有格雷戈尔那边的任何东西。关键是,因为每套颜料都经历了相同的过程,它们最终都得到了相同的橄榄绿,尽管我们从未分享过我们的秘密颜色。所以我们最终得到了一个没有人能得到的共享秘密颜色,这意味着我们可以用它作为发送信息的秘密代码。现在,在实际的交换中,我们使用大的公共数字而不是颜色,但想法完全相同。每一方都使用一些数学运算来混合自己的私人数字,当你想反转它时,会导致离散对数问题,这使得它们几乎不可能混合。这样,我们就解决了第一个问题。但还有一个未被考虑到的威胁。假设像卡斯帕这样的黑客试图插在我们之间。现在我们可以建立合法的连接,所以我们最终会得到一个共享的秘密代码,而卡斯帕也可以和格雷戈尔做同样的事情。现在,每当我发送一条消息时,他都可以将其转发给格雷戈尔,他可以更改和修改它,然后发送他的回复。对我们每个人来说,连接看起来都是合法的,但卡斯帕一直在我们之间。他是个中间人。所以,我需要一种方法来验证格雷戈尔确实是他所说的那个人。现在,我们可以再次通过提前亲自商定密码来做到这一点,但我们需要一种在互联网上实用的方法。这是塔图必须解决的第二个问题。为了实现这一点,格雷戈尔可以取两个非常大的质数,他会保守秘密。然后他将它们相乘得到一个更大的数字,然后将其公开。现在,当我想给格雷戈尔发送消息时,我只需要取那个大的公共数字,然后将其加密,只有知道构成那个大的公共数字的两个质因数的格雷戈尔才能成功解密。对其他人来说,获得这两个质因数几乎是不可能的。所以,只要我知道那个大的公共数字确实属于格雷戈尔,我就知道任何用那个密钥加密的东西都只能由他读取。这被称为 RSA 加密,这意味着如果我知道证书有效,那么我就接受连接。通过验证格雷戈尔,它就挫败了我们的中间人卡斯帕·迪维厄斯。好了。塔图·伊洛宁将这两个步骤结合起来,即保护通道和验证用户,形成了一个机器之间的远程登录协议。它给了你人们习惯的相同的明文 shell,一个你可以输入命令的普通终端,但现在连接被加密了。他称之为安全外壳,或 SSH。它立即变得有用。许多 Linux 机器甚至没有键盘或显示器,尤其是服务器,所以你想能够远程登录并控制它们。因此,SSH 很快就被几乎所有运行 Linux 的机器采用。随着 Linux 的传播,SSH 也随之传播。今天,当你远程控制一台机器时,你很可能正在使用 SSH。- SSH 简直是整个互联网的维护骨干。- 而最广泛使用的开源 SSH 实现称为 OpenSSH。因为它非常受欢迎,所以它受到严密保护。- 我的意思是,OpenSSH 可能是最受仔细审查的项目之一,因为它对各地服务器的安全至关重要。拥有绕过安全外壳身份验证的方法就像拥有酒店的总钥匙。它让你进入每个房间。(悬疑音乐)- [亨利] 这就是为什么贾·谭想要进入 OpenSSH 的方法,但直接破解它几乎是不可能的。对贾来说幸运的是,开源模型不仅意味着操作系统是由许多程序拼接而成的,而且每个程序本身也是由其他程序拼接而成的。这些被称为依赖项。- OpenSSH 是最受审查的软件包之一,但这并不适用于它所有的依赖项。- 贾认为,如果他能破坏 OpenSSH 的一个依赖项,他就能将一个漏洞注入到主项目中。而拉斯·科林的压缩工具 XZ 恰好通过一系列这样的依赖项链接。 (悬疑音乐)现在,拉斯最初使用 XZ 的目标是找到一种在 Linux 上压缩数据的更好方法。这些数据可以是任何东西。代码、图像、文本。但对拉斯来说重要的是,一旦你压缩和解压缩它,它必须完全相同。方法必须是无损的。到瑞克·艾斯利的流行歌曲“Never Gonna Give You Up”,我们将尝试压缩它。现在,假设我们把它表示为一串字符,每个字符都有一个固定宽度的 8 位代码。现在,这可以工作,但效率不高。如果我们遍历这个流并计算每个符号出现的频率,你会注意到一个模式。有些出现的频率很高,比如 N 有 430 次使用,有些则很少,比如 J 只有一次使用。为了节省空间,为什么我们不给出现频率更高的符号更短的代码,而稀有的符号,嗯,它们可以承受更长的代码。但我们怎么做呢?所以,让我们先计算每个符号出现的频率,并从最高频率到最低频率排序。我们取两个频率最低的符号并将它们组合成一对。然后我们将这对视为一个新的组合符号,其频率是它所代表的两个符号频率的总和。然后我们可以将其重新插入列表中。然后我们再做一次。我们取两个频率最低的项目,将它们组合起来,然后将其重新插入列表中。我们一遍又一遍地这样做,直到我们得到这个庞大的结构,称为霍夫曼树。现在,要获得我们的代码,我们只需要遍历树。向右一步是 1,向左一步是 0。所以,例如,要获得 R,我们只需要向右、向左、向左、向右,所以代码是 1001。所以你会注意到,更常见的符号自然出现在树的顶部,所以它们得到更短的代码,而出现频率较低的符号则在树的底部。这个系统运行良好,但也有一个弱点。在我们的“Never Gonna Give You Up”示例中,它总是编码 N-E-V-E-R 空格。它没有意识到整个块会重复。那么,如果我们不看符号,而是看那些块呢?现在,它们不必是单词,它们可以是单词的一部分,甚至是更长的。它们只需要是重复的模式。所以,让我们扫描文本,但保留一个我们刚刚看到的滚动字典。然后,当我们向前移动时,我们可以检查下一个块是否已经出现。如果出现过,我们就没必要再次写入那个块。我们只需要写一个包含两个数字的代码:回溯多远,以及复制多少个字符。现在,当我们解压缩时,我们可以沿着读取,每当我们遇到一个这样的代码时,我们就回溯,复制匹配的块,然后粘贴到适当的位置。两位科学家 Lempel 和 Ziv 于 1977 年发表了该算法,因此它被称为 LZ77。但其中一些符号和指针比其他符号和指针出现得更频繁。它们实际上有自己的频率。所以我们可以将整个流输入另一个霍夫曼树,以获得第二层压缩。在我们的演示中,它实际上将文件缩小了 85%,比原始文件小。这可能看起来很新,但你几乎肯定自己用过它。它被称为 deflate,但它因其创建的文件而闻名,即 .zip。如果你以前点击过“关闭”,你肯定用过它。但霍夫曼只使用一个块重复的总体频率。真实数据不仅仅是随机块。在我们的例子中,“Never gonna”之后,你可能会得到“give you up”、“let you down”或“run around and desert you”。你可能会得到“make you cry”,你可能会得到“say goodbye”或“tell a lie and hurt you”。每一个都有自己的概率,你可以用一个叫做马尔可夫链的数学工具来表示这些概率。然后算法可以编码数据流,使得更可能出现的下一个块花费的比特数更少,而不太可能出现的块花费的比特数更多。如果你将其与一个更大的搜索窗口结合起来,这样它就可以回溯到更远的内存,那么你就得到了 Lempel Ziv 马尔可夫链算法,或 LZMA。LZMA 由 Igor Pavlov 于 1998 年左右开发,它通常比更熟悉的算法效果更好。在许多情况下,它可以将文件缩小到典型 .zip 文件大小的 70% 左右。拉斯将这个优雅的压缩算法应用到 Linux 上,并称之为 XZ,不是因为它代表什么,而是因为它听起来很酷。- 我使用 XZ 很多。我认为 XZ 是一个很棒的项目。有很多不同的压缩数据的方法。有些速度很快,但压缩效果不好,有些速度很慢,但压缩效果极佳。- 但在 Linux 中,项目不断地将相同的文件和更新发送到数百万台机器,所以 XZ 是完美的。你压缩一次,然后就可以永远下载更小的文件。拉斯于 2009 年发布了 XZ,在接下来的十多年半里,它从一个利基工具发展成为项目需要有效无损压缩时的首选。因此,XZ 悄无声息地传播到各处,最终成为 OpenSSH 的依赖项。(悬疑音乐)- 所以,大约在 2024 年 2 月,贾·谭给我发了邮件。他在 XZ 的新版本中加入了很多新功能。- [亨利] 他几乎立即赢得了 Rich 的信任。- 所以我每天都会和数百名贡献者交流,我能感觉到他们。我能感觉到,你知道,他们是好的编码员吗?这是我真正关心的。他们是认真的人吗?他们乐于助人吗?他们是否能快速响应错误报告?在所有方面,贾·谭都是一个非常好的贡献者,因为他显然是一个好的编码员。他反应迅速,他很热情,我喜欢这一切。- 所有迹象都表明贾是一个很好的贡献者,这让 Rich 放松了警惕。而这往往是互联网上问题的开始。你不可能永远保持警惕。但幸运的是,有了我们今天的赞助商 NordVPN,你就不用了。NordVPN 的 Threat Protection Pro 在危险网站加载之前就会阻止它们。它会阻止恶意下载,并自动删除跟踪器和侵入性广告。即使你没有连接到 VPN,它也能正常工作,所以很多攻击甚至没有机会开始。我在旅行或在公共 Wi-Fi 上工作时使用 NordVPN,因为它意味着我不用担心谁在运行网络。只需单击一下,它就非常快,以至于我经常忘记它在运行。不仅如此,如果某个节目在我所在的地区不再可用,或者某个体育队被禁赛,就像我经常观看国际足球比赛,而我将要去的地方没有它,那么在这种情况下,我只需单击一下即可切换我的服务器位置来解锁内容。据称,你还可以通过将你的 IP 地址更改为另一个国家来找到更便宜的机票。我还没有尝试过,但这听起来很吸引人。所以,如果你想尝试一下,你可以通过访问 nordvpn.com/veritasium 来获得最优惠的价格。当你使用那个链接或这个二维码时,你将获得巨大的折扣。另外,你还可以通过 Nord 获得 30 天的退款保证。这简直是明智之举。所以,再次强调,nordvpn.com/veritasium 或者你可以点击下面的描述中的链接。非常感谢 Nord,让我们回到贾和他正在瞄准的奖品。- 在这一点上,我们正在准备 RHEL 10。- [亨利] 看,Red Hat 发行两种主要的 Linux 版本。Fedora,它是免费且公开可用的,以及 Red Hat Enterprise Linux,或 RHEL,它是通过付费订阅提供的。这个版本必须稳定且安全,因为它被广泛用于最重要的机器上,比如政府和医院。贾希望他的代码进入 RHEL,但 RHEL 大约每三年才发布一次主要版本。- 所以,肯定有一个截止日期,那个截止日期大约在 2024 年 3 月或 4 月。- 贾必须迅速行动。他想要完全控制任何受损的机器。为了做到这一点,他有三个计划步骤。第一步,特洛伊木马。XZ 的代码保存在一个名为 GitHub 的网站上,该网站使用 Git 这个工具来跟踪 XZ 代码的所有编辑,Git 也是由 Linus Torvalds 开发的。所以,贾开始做一些小的改动。他将错误报告的主要联系人更改为他自己的电子邮件。他调整了一些小工具,这些工具以后会对他有帮助。但他不能通过这种方式偷偷植入有效载荷。我的意思是,这太明显了。所以他需要一种方法来偷偷植入它,而它永远不会出现在 GitHub 上的正常源代码中。- 所以,当你编写压缩软件时,你的软件经常包含这些二进制大文件,我们称之为二进制大文件,它们用于测试压缩或解压缩是否仍然正常工作。- 没有人会阅读这些测试大文件。它们被包含在内,而从不出现在人类可读的源代码中。它们被认为是垃圾数据。但对贾来说,这是隐藏他有效载荷的完美地方,隐藏在一个乍一看无害的东西里面。但实际上,它是一个特洛伊木马。但有了 XZ 内部的特洛伊木马,它仍然只是一个二进制大文件中的一堆数据。他必须解压它。所以,在构建项目的代码中,他悄悄地做了一个微小的、容易被忽略的改动。它隐藏在所有自动生成的代码中,并悄悄地解压他的有效载荷,将其插入 XZ 库。但现在它已经进入 XZ 了,它仍然必须选择正确的时机行动。第二步,金发姑娘。贾的最终目标是破坏 SSH 连接过程的一个非常特定的部分,即 RSA 身份验证步骤。他意识到,如果他能偷偷植入一个小的恶意组件,我们称之为有效载荷,那么每次 SSH 检查密钥时,他的代码都会先运行。它会悄悄地寻找一个只有他知道的特殊主密钥,如果它看到那个密钥,它就会让他直接进入。如果看不到,它就会调用真正的代码,没有人会知道。所以,他将拥有通往 OpenSSH 的后门入口。但他不能直接进去重写 RSA Decrypt,这个在登录时验证客户端身份的函数。没那么容易。你看,当你构建一个应用程序时,你可以从不同的库中获取所有你需要的代码,并将它们打包到你的应用程序中。但这种方法有一个很大的缺点。如果系统上有 10 个不同的应用程序都打包了同一个库,那么你的机器上就会有 10 个副本,所以这是冗余的。这就是为什么现代系统大多使用共享库。当应用程序启动时,链接器会填充一个地址表。这些地址指向它需要的函数和变量,这些函数和变量来自它链接的库。该表称为全局偏移表,或 GOT。现在,当它想使用共享库中的某个东西时,它只需检查 GOT 并跳转到内存中的正确位置。RSA Decrypt 完全不属于 OpenSSH。它来自一个共享的加密库。所以要劫持身份验证,贾可以覆盖告诉 SSH 它在哪里的 GOT 条目。为了做到这一点,他可以使用一个鲜为人知的工具,称为 IFUNC 解析器。- IFUNC 用于,比如说,你想优化你的代码,使其在 Intel 硬件和 AMD 硬件上运行。现在,你可以只为 Intel 编写软件,它在 Intel 上运行得非常快,而在 AMD 硬件上运行得可能非常糟糕。- [亨利] 相反,你保留同一函数的多个版本,IFUNC 解析器会选择适合你所处硬件的版本。乍一看,这似乎是贾欺骗系统认为它正在运行需要他自己的受损版本的 RSA Decrypt 的硬件的一种方式。但有一个问题。一个库只能为其自己的函数定义 IFUNC 解析器。由于 RSA Decrypt 不属于 XZ,它不能使用 IFUNC 解析器来覆盖它。但 IFUNC 仍然可以帮助他。- 所以它会在程序运行的非常非常早期进行这种硬件可用性的确定,而且至关重要的是,它允许你在库中运行自己的代码。- 现在,在这个早期阶段,从 IFUNC 解析器内部,贾可以尝试直接重写 RSA Decrypt 的 GOT 条目。但此时,系统仍在填充 GOT,所以即使贾更改了 RSA Decrypt 插槽,加载器稍后也会进来并写回真实的地址,擦除他的更改。另一边也有一个限制。为了使这种劫持更困难,一旦 GOT 上的所有条目都填满,系统就会将该表标记为只读。这意味着如果贾等太久,RSA Decrypt 条目就会被冻结。所以他必须在非常精确的时刻将其插入。在 RSA Decrypt 条目被合法填充之后,但在表被标记为只读之前。而那个微小的窗口就是金发姑娘区域。为了击中它,他需要另一个工具。所以,在 GOT 中链接共享库经常会导致错误,因此 Linux 有一个特殊的调试功能来跟踪系统正在做什么。它允许你在链接器将符号的地址写入 GOT 时运行代码。这被称为动态审计钩子,通常你会用它来分析性能。但对贾来说至关重要的是,没有真正的护栏。钩子可以运行他想要的任何代码。而这正是 IFUNC 最终发挥作用的地方。贾使用 IFUNC 解析器来提前设置审计钩子。然后,当链接器写入真实的 RSA Decrypt 地址时,钩子就会触发并替换为他的有效载荷。就在金发姑娘区域的中间。不过,最后还有一个复杂的问题。审计钩子通常由系统配置,而不是由 XZ 这样的库配置。所以当贾最初寻找他应该重写的审计钩子变量时,它实际上对他隐藏了,所以他必须先找到它。在 IFUNC 中,他扫描一小片二进制代码,寻找钩子的迹象。但它只是原始字节,所以他编写了一个微小的解码器将它们转换回他可以读取的指令。现在贾可以找到钩子在内存中的位置,并最终植入他的代码。然后,当合法调用 RSA Decrypt 时,它会触发有效载荷,他就进去了。但现在他进去了,他该做什么?他怎么能干净地离开那里?第三步,猫贼。有了贾的漏洞,SSH 不再只是检查合法登录。它还在监听一个隐藏的主密钥。贾很小心,他不想让其他人偶然发现后门,所以那个主密钥不仅仅是一个简单的密码。它实际上是一个迷你加密交换。首先,后门代码检查共享密钥,然后,第二,它验证用户。只有当两个检查都通过时,有效载荷才会运行。实际上,这就像后门在 SSH 内部运行一个微型版本的 SSH 加密。但在 SSH 中,它使用加密来阻止攻击者。在这种情况下,后门正在使用这种加密来确保只有攻击者才能进入。但他仍然很小心。防御者发现入侵的主要方式之一是 SSH 日志记录。所以,为了掩盖他的踪迹,他会擦除后门曾经触发过的证据。这还是他在此过程中插入的众多安全检查之外的,以确保系统支持后门并且不会崩溃引起注意。这就是贾陷阱的聪明之处。它谨慎而细致,旨在只在隐形运行的地方滑入。完成所有这三个步骤后,他就可以在不被发现的情况下控制机器了。他现在只需要将他更新的 XZ 实现到下一个版本中。但就在贾完成他的后门时,一位开源开发者请求删除将 XZ 连接到 OpenSSH 的依赖项。这对贾·谭来说将是灾难性的。他变得疯狂,越来越努力地将他受损的 XZ 植入主要的 Linux 发行版中。他将其植入 Debian 的早期实验性构建版本中。他提交了一个请求将其添加到 Ubuntu 中。他试图在任何人意识到发生了什么之前,将后门植入到他能到的所有地方。就在那时,Rich 收到了贾的第一条消息。在接下来的几周里,他变得越来越坚持,敦促 Rich 将更新的 XZ 添加到 Fedora 的下一个版本中。- 我总是很乐意与热情的上游贡献者交流,那些对他们软件中的新事物感到兴奋的贡献者,那些真正愿意帮助我们将东西引入 Fedora 的贡献者。所以,你知道,这很棒,我喜欢。这让我的日子变得美好,这是我的快乐之地。- 最终,贾得到了他想要的。Rich 将更新的 XZ 添加到了 Fedora 的一个预发布版本中。贾成功了。除了有一个 bug。在低级代码中,比如后门,你通常认为理所当然的事情,比如内存管理,不是自动完成的。如果一个函数获取了一块内存,它也必须在完成后将其归还。如果它不这样做,那么每次函数运行时,它都会获取越来越多的内存,然后永远不释放它。随着时间的推移,程序会不断增长。这叫做内存泄漏。为了捕捉这类问题,开发人员使用了一个叫做 Valgrind 的工具。它运行程序的速度较慢,但会监视每一次内存操作,查找任何可疑之处。Valgrind 在贾的代码上大肆破坏。- 我们将 XZ,这个版本,560,放入了 Fedora 40。我们最初收到一个错误报告。- 而 XZ 中的后门特别会产生无效写入错误。嗯,逻辑是手工编写的,绕过了编译器的安全检查,所以他们意外地写到了内存堆栈之外。现在,对贾来说幸运的是,这一切并不立即显现。Rich 还没有注意到发生了什么。- 新软件有 bug,对吧?这是软件的自然状态。软件总是充满了 bug。- [亨利] 现在,真正的问题在于测试文件中的恶意代码。但贾不能就这样去修复它,那会完全暴露后门。所以他发明了一个借口。他声称他用来生成原始测试文件的随机数据,嗯,它是不可复现的,所以他要替换它。在这个更新的代码中,他修复了内存错误。- 这是一个非常有说服力和合理的解释,为什么这个测试大文件需要更新。但当然,这不是真正的原因。- 好的,所以现在真正的修复已经完成,但如果 bug 只是神奇地消失了,那看起来会有点可疑。所以他必须找到一种方法来掩盖它。- 所以他接着做的是改变 IFUNC 代码,他添加了很多注释和周围代码的更改,这些更改实际上并没有改变代码,但看起来足够合理,就像他在改变 IFUNC 的工作方式来修复 Valgrind bug 一样。- 听起来确实如此,我听着,我心想,我知道这是邪恶的黑客贾·谭,但我心想,哦,这很聪明。你知道吗?- 是的,我的意思是,看,这家伙显然不是个白痴,对吧?但这一切都不可疑。这就是我们对压缩软件的期望。而且作为一个打包者,修复上游软件中的每一个 bug 并不是我的工作。一旦它达到一定的难度,我的想法是,嗯,贾·谭实际上一直在编写这个软件,对吧?所以他把它都记在脑子里了,他知道它是如何工作的。我把问题交给他更容易。我把 bug 发给他,大约一天后他就会把修复发回来。从我的角度来看,问题解决了。它奏效了,系统奏效了,对吧?我做出了正确的决定。我当时不知道,我当时看不到任何问题。- 所以我们下载了贾·谭的 XZ 版本,它在 Fedora 上公开可用,但我们做了一个小小的修改。我们没有使用贾的秘密代码,而是使用了我们自己的代码,这意味着我们可以利用贾的后门。在这种情况下,我们针对的是 veritasium.com 网站。一旦我们控制了它,我就有一个小把戏要给德里克。现在,为了确保我不会把真正的流量搞得太糟而丢掉工作,我们实际上克隆了 Veritasium 网站,并将其放在一个非常相似的 URL 上,但它的工作方式相同。当然,德里克不知道我已经做好了准备。- 哦不。伙计,当你们做这些事情时,我只是,我开始越来越害怕了。我希望它能为视频起作用,但我也希望它不起作用,因为我不想搞砸事情,所以。- 是的,我想这就是你冒的风险,允许我们横行霸道。- 这是一个担忧。- 我要执行一个脚本,它会打开。它会在 Veritasium 服务器上打开一个端口。然后我在这边执行一个小脚本。- 哎呀。(亨利笑)Henrytasium。这是谁啊?在主照片上,你花时间打扮得那么漂亮。- 当然。- 看起来很精神,先生。- 谢谢,谢谢。- [德里克] “德里克永远不会批准的视频。”哎呀。- 这个概念是,多年来我们一起工作,你拒绝了我的一些想法,我想现在我控制了网站,是时候让世界看到了。- “在水下生存 7 天。饱和潜水员如何在 -1000 英尺处生活?”我的意思是,你不会在外面,对吧?所以我不明白为什么你在这里需要护目镜和呼吸器,而你又不在水下。“为什么拍摄 4000 米几乎不可能。”这是一个狙击手视频。是的。“中央情报局撒谎:揭露中央情报局如何撒谎关于酷刑。”我觉得这仍然对我们来说是一个棘手的问题。“氙气如何取代氧气。我试图在氙气上攀登珠穆朗玛峰。”这听起来是个糟糕的主意。这个视频就是关于这个的,这个视频就是关于试图让我批准你的项目。你知道,如果人们喜欢这些视频创意,他们可以随时在评论中告诉我们,我们实际上可以制作它们。我将乐意批准得票最高的评论。- 来吧!- 这现在是实时公开的吗?- 是的,它是实时运行的,是的,它在服务器上是实时运行的,是的。- 如果现在有人在网站上,那对他们来说会很奇怪。听着,我并不满意,我希望你把它改回来。在 Linux 服务器上似乎不应该发生这种情况。所以最大的问题是,你是怎么做到的?- 地址是服务器,种子是我们的代码,然后命令是我们正在做的,基本上是打开,在这种情况下是 nc,就像在机器上打开一个端口,然后我们可以从第二个终端访问它。然后我们在这边运行一个脚本,连接到刚刚打开的端口,复制我们的文件,然后最后我们将获得服务器的 root 访问权限。这意味着它认为我们拥有它。- 这太疯狂了。这是一个非常可怕的黑客行为。我不喜欢它。- 另一件事是,这是演示这种攻击的一种非常明显的方式。就像我改变了网站上的一切,你立刻就知道我入侵了服务器。如果我们真的这样做,我们会做得更隐秘。- 我的意思是,正如你所说,对吧?要做的事情不是完全重做某人的网站,让所有人都注意到,而是微妙地改变它,这样就没有人注意到,这样你就可以窃取数据,或者,是的,比如获取信用卡详细信息或将付款转移到另一个地方,诸如此类的事情。- 所以你可以复制任何你想要的东西,你可以改变任何你想要的东西,你可以删除任何你想要的东西。所以,如果有任何有趣的文件或加密令牌,任何你感兴趣的文件,它们现在都是你的了。如果秘密通信正在跨越这些,让我们记住,我们所有的通信网络也是围绕 Linux 构建的,那些通信流现在都是你的了。如果你想加密某样东西并要求赎金,现在也是可能的。- [亨利] 可能性确实是无限的。经过两年半的辛勤工作,慢慢渗透 XZ 项目并编织了这个巧妙的后门,贾做到了。他现在可以自由地控制任何安装了新 Fedora 预发布版本的机器。他还可以获得对 Debian 测试版和 Ubuntu 预发布环境的相同访问权限。随着 RHEL 10 的推出,他的代码可能会感染世界上一些最重要的计算机。现在他应该可以放松了,等待发布,他已经有了他的后门钥匙。但就在他认为一切都进展顺利的时候……(悬疑音乐)安德烈斯·弗洛伊德是一位德国程序员。他不是安全研究员,也不是黑客。他只是微软的一名员工,正在从事一个名为 Postgres 的开源项目。2024 年 3 月的一天,他尝试了 Debian 的不稳定版本,以确保 Postgres 能够顺利运行。但在检查服务器连接时间时,他注意到了一些奇怪的地方。速度很慢。情况并不严重。最坏的情况下,只慢了半秒,但这足以让安德烈斯产生怀疑。我们自己测试了连接时间,在我们自己的 XZ 黑客版本上,我们发现了完全相同的情况。一致的减速,大约 400 到 500 毫秒。安德烈斯几周前已经看到了 XZ 和 Valgrind 的问题,这让他更加怀疑,所以他深入挖掘。他查看了 OpenSSH 的近期更新,并将延迟追溯到 XZ 的一次更新。他看到了二进制测试文件,但注意到它们从未在测试中使用过。这更奇怪了。安德烈斯试图回去工作,但他无法停止思考这件事。- [安德烈斯] 我记得参加了很多会议,而且实际上无法集中注意力,因为我觉得,我需要继续研究这件事。- 最终,安德烈斯看到了。这不是什么 bug,这是一个后门。而且这个后门非常细致。它会搜索内存以查找审计钩子,它会实现一个解码器来读取那些原始字节,然后将所有内容包装在自定义加密和安全检查中,以便它只在正确的连接类型上触发。我的意思是,它甚至会混淆自己的字符串,以免被发现。它极其谨慎。但这一切都需要时间,而最终,正是这一点引起了安德烈斯的注意。- 如果他们做得混淆性更少,
我可能根本不会注意到有什么不对劲。——[亨利] 现在,XZ 的安全联系人是贾谭,所以安德烈斯无法通过常规渠道报告。取而代之的是,他直接给 Debian 安全团队发邮件,并将一份详细的报告发布到一个公开的安全邮件列表中。然后,事情就变得一发不可收拾了。——我被叫去参加一个内部 Red Hat 会议,我想那是一个星期五的晚上,事实上,我确定那是一个星期五的晚上。这立刻就显而易见了,这不是一个普通的会议,因为我们的安全主管就在那里。我被告知,社区里有人发现 XZ 有一个后门,我立刻就想,什么鬼?这怎么发生的?——为了以防万一,Red Hat 迅速回滚了 Fedora,并告诉所有用户恢复,整个开源社区开始深入研究这个项目,以了解出了什么问题。但有一点是清楚的:安德烈斯是一位英雄。——现在,这个事情被发现在另一个测试中被发现,这真是幸运。但那些不是在寻找安全漏洞的人,花了几天时间调查这个的可能性有多大呢?所以,非常感谢这位研究员,是的,他让我们所有人免受了互联网上可能发生的末日。——我认为安德烈斯做得非常出色,因为他做了我实际上应该做的事情,那就是我应该看看那个错误,你知道的,我应该看看那个错误,当我看到它的时候,我应该去那里,你知道的,像一只疯狂的猎犬一样四处嗅探,试图找出发生了什么。——[亨利] 安德烈斯甚至得到了微软 CEO 的赞扬。但当这个故事曝光时,主流的反应却出奇地平淡。——事实上,我现在仍然很惊讶,主流新闻媒体并没有真正过多地报道这件事。嗯,我可以告诉你,有多少系统会被破坏,那将是数百万,——从间谍活动,到勒索,到摧毁整个国家,你都可以用这个后门做到。——[亨利] 我想最大的问题是,贾谭是谁?——这就是问题所在,不是吗?好吧,我的感觉是,贾谭,我与之交谈的人,我相信是一个人,但我也相信在他背后一定有一群人。而且他们工作了相当长的时间。我是说,据我们所知,他们已经为此努力了大约两年半了。——如果你回顾一下那些向拉斯施压的账户,它们有一些相似之处。它们使用免费的电子邮件地址,并且在 XZ 线程之外几乎没有留下任何痕迹。这些很可能是傀儡账户,身份是为了作为多阶段社会工程活动的一部分施加压力的制造出来的。——现在,谁会花一百万美元,花两年半的时间试图用一把万能钥匙闯入互联网上的每一个酒店房间?(悬疑音乐)我认为这不是一个犯罪组织,因为我不认为一个犯罪组织会有耐心花这么长时间而没有任何实际的回报。所以我认为这必须是一个国家行为者。——很多别名,比如贾谭,听起来像亚洲名字,而且发布的更改都以 UTC+8(北京时间)为时间戳。所以迹象都指向中国。而这正是为什么它可能不是中国。我是说,他们为什么要弄得如此明显?操作的其他部分一直都非常细致,非常谨慎。而且他们还在中国新年期间工作,但不在圣诞节。多年来,有九项更改的时间戳超出了北京时间,进入了 UTC+2,这是一个包括以色列和俄罗斯西部部分地区的时区。这就是为什么一些专家推测这可能是 APT29 的作品,一个俄罗斯国家支持的黑客组织,也被称为 Cozy Bear。——但同样,我们知道吗?不,我们当然不知道是谁,而且我们很可能永远不会知道。贾谭本人在这次漏洞被公开后就消失了,再也没有被听到过。——从某种意义上说,这是否是俄罗斯、中国或伊朗的并不重要。无论它们来自哪里,我们都需要防范这些类型的后门。——我把这看作是,你知道的,煤矿里的金丝雀,攻击者变得越来越复杂,他们犯的错误越来越少。你知道,在某种程度上,手套已经摘掉了。我不认为 Linux 社区已经完全,你知道的,已经为此做好了准备。——在 XZ 事件之后,开源社区仔细审查了无数类似的小型项目,寻找类似的活动,但他们几乎一无所获。——我担心我们没有发现其他后门。激励因素太明显了。有来自政府、军队甚至为国家工作的私人承包商的国家支持的部门,它们都在为下一次网络升级做准备,某种形式的战争,某种形式的地缘政治冲突,而那些后门都在哪里呢?有太多人有动力去放置后门,而我们实际发现的后门却很少。——现在,一些专家认为这暴露了开源模型的一个根本性缺陷,但并非所有人都同意。——闭源软件在这里也不会更好。事实上,谁能说那些在一些大公司里没有国家间谍作为付费软件工程师,植入像这样的后门呢?但那样就不会有社区成员通过免费测试偶然发现它了。这个后门,如果有什么的话,它强调了开源的精神。——我是说,想想看,在公开场合完成这件事需要什么。有一个多年的社会工程活动,有所有这些误导层,然后是旨在承受持续审查的代码。现在将其与闭源黑客攻击进行比较。有时,在那里安装后门只需要一个法院命令,或者你有一个上市公司可以轻易地掩盖一次违规行为。我实际上曾经在一家日本电信巨头 NTT 担任开源研究员,我的观点是,正是因为这是一个开源项目,它才被剖析、分析,并被转化为关于安全性的对话。一个关注根本性漏洞的对话。问题不在于代码,而在于人。以及系统如何没有给予他们足够的支持。——我同情拉斯,他给全世界带来了这份美丽的礼物,你知道的,我们,人类回报了他什么呢?我们毒害了他的礼物。然后我认为,虽然不是每个人都这么说,但我们却在含蓄地责怪他没有在那里永远免费维护这些东西。但当拉斯没有为此获得报酬时,我们为什么要要求他做任何事情呢?在我看来,这很不公平。在这个星期六的晚上,我们正在一起为他在 RHEL 9 中添加的 XZ 的一个 bug 寻找一个变通方法,他完全可以让我们滚开,但他没有。真是个聪明人。(电子哔哔声)(音乐渐弱)