Meltdown 的工作原理

2025-05-27

Meltdown 的工作原理

Meltdown 和 Spectre 是最近两起让科技界措手不及的漏洞。它们有很多共同点:都依赖于计算机处理器的内置功能。

读了一些资料后,我想我对 Meltdown 漏洞有了足够的了解,可以用通俗易懂的语言来解释它。如果文中有任何错误,请在下方评论并指正。

众所周知,CPU(或处理器)是计算机的大脑。它能快速执行许多简单的指令,例如将数字相加以及读取内存。

假设你的CPU是快餐柜台的一名员工。人们在柜台前排队,点菜单上的菜品,然后用信用卡付款,然后去取餐处取餐。这个过程非常简单。如果他们不付款,就拿不到食物。

(类似地,CPU 接受来自进程的指令,确保该进程具有执行这些指令所需的权限,然后执行这些指令并将结果返回给进程。)

快餐店以快捷服务为荣。事实上,如果其他餐厅比它更快,它就会失去很多顾客。所以它开始走捷径。比如,你告诉收银员你想吃什么菜,他们就会把你的订单送到后台,厨师甚至在你刷信用卡之前就开始制作。他们会把菜做好,放在后台的托盘上,等你到取餐队伍时再送到你面前。这大大加快了速度。当然,如果你无法付款,他们就不得不取消订单并扔掉食物,这很浪费。但大多数人都会立即付款,所以这不是什么大问题,而且更早开始的效率绝对可以弥补这一点。

(您的 CPU 会执行此操作。它在检查进程的权限执行某些指令,并行执行这些指令(称为“推测执行”)可以节省一些时间。如果它没有正确的权限,它会取消指令并转储结果。)

这时,餐厅灵机一动:如果你不付钱,他们不会把食物扔掉,而是把食物放在后面的托盘上,最多5分钟。如果5分钟内有人下了同样的订单,他们就会把你取消的订单里的食物还给他们。减少食物浪费,加快服务速度。双赢。

(您的 CPU 也会这样做。它有自己的缓存,它将执行指令的结果放在其中,甚至在它知道进程是否具有正确的权限之前。)

有一天,餐厅突发奇想:可以数字化复制食物。食物制作完成后,可以一次性提供给多位顾客,无需重新制作:只需复制到每位顾客的餐盘即可。研发部门还没想出如何让食物保持热度和新鲜度超过5分钟,但如果一位顾客点了6号套餐,那么接下来5分钟内其他点6号套餐的人都会得到一份同样的餐点,而且由于无需重新制作,所以速度非常快。这非常高效。利润也随之飙升。

(我知道这个比喻现在变得不够形象,但数据就是这样工作的。一旦 CPU 在缓存中有了某些内容,它就可以根据需要将其分发给尽可能多的进程,直到缓存的该部分被覆盖或转储。)

这家餐厅的最后一个创新点在于私密性。你有没有觉得不好意思点三份大份薯条,全都给自己吃?不用再担心了:得益于一套极具创意的白噪音机器、厚窗帘和低语系统,现在你可以点餐、用餐,而不会让其他顾客知道你点了什么。

(进程和 CPU 之间的私人通信非常重要。它可以防止程序相互监视。您不希望您的纸牌游戏读取您的 Outlook 密码,对吧?)

你是一名快餐黑客,想要弄清楚如何操控餐厅,从而查明其他人点了什么。你为此投入了大量的时间和精力。

首先,你会发现,如果你点的是最近5分钟内做好的菜,你拿到菜的速度会比他们为你新鲜制作的菜要快得多。所以,用秒表就能判断这道菜最近是否有人点过。事实上,如果你经常留意柜台,即使你的信用卡被拒,你也能判断你的订单是新鲜制作的还是只是电子版的。

(CPU 缓存的目的是为了加快速度。如果多次需要指令结果,那么从缓存中获取它们比重复执行相同的操作要快得多。即使某个进程没有正确的权限,它也可以向 CPU 请求一些数据,计算交互时间,并确定这些数据是否在 CPU 缓存中。)

由此你制定了计划。你去餐厅,选了一个目标:另一位正在用餐的顾客,你想弄清楚他们点了什么。你走到收银员面前,假装自己就是那位顾客,询问是否可以修改订单。你说你不小心点了菜单上你想要的菜品之前的那个;能不能请他们帮你改成下一个菜品?出于礼貌,收银员同意了,并将订单发送到厨房,但要求查看你的信用卡以验证你的身份。当收银员发现你谎称自己是另一位顾客时,他取消了订单——但菜品已经做好了,放在后面的托盘上。这时,你只需要拿着秒表,一个接一个地点菜单上的菜品,直到其中一道菜品显示出来足够快,表明它已经做好了。然后你就知道:另一位顾客点的是那道菜品之前的那个。例如,如果6号菜品显示得非常快,你就知道另一位顾客点的是5号菜品。

(可以指示 CPU 根据其他数据查找数据(例如,“查找内存地址 0xFFF;它包含另一个内存地址;返回存储在该内存地址的数据”)。这是难题的最后一部分。Meltdown 要求 CPU 根据其无权访问的其他数据查找一段数据。CPU会拒绝该请求,但它仍会进行计算并将第二段数据放入其缓存中。然后 Meltdown 只需要请求一堆内存地址,而无论哪个地址返回得非常快,都是等式的另一部分(在我们的示例中,它是存储在原始的、被禁止的内存地址中的内存地址。)这使得 Meltdown 可以读取内存中的任何内容。这非常糟糕。)

这就是 Meltdown 漏洞。您已经受到影响。您应该立即更新您的浏览器和操作系统以获取补丁。

回想起来,如果没有快餐的比喻,也许这会更容易解释......但是嘿,我玩得很开心。

如果您对此没有理解,或者您有任何补充,请告诉我。

文章来源:https://dev.to/isaacdlyman/how-meltdown-works-28j2
PREV
所以你被困住了
NEXT
我是如何获得谷歌实习机会的——面试流程及技巧和资源