Chrome 零日漏洞:“这个漏洞很猖獗”,所以现在检查你的版本

Chrome 零日漏洞:“这个漏洞很猖獗”,所以现在检查你的版本

源节点: 2704382

谷歌最新的 Chrome 更新已经发布,这次公司 直言不讳 关于它包括的两个安全补丁之一:

谷歌意识到利用 CVE-2023-3079 存在于野外。

没有像我们以前经常从谷歌看到的那样,用二度分离的措辞来表示该公司“知道”漏洞利用的报告。

这一次,它是“我们自己知道这一切”,更直截了当地翻译成“我们知道骗子在我们说话时滥用它”,因为错误报告直接来自谷歌自己的威胁研究小组。

与往常一样,这意味着谷歌正在调查一次主动攻击(是针对谷歌本身,还是针对某些外部组织,我们不知道),其中 Chrome 受到了一个以前未知的安全漏洞的攻击。

该错误被简单地描述为: V8 中的类型混淆。 (可以理解的是,谷歌在这个阶段并没有说更多。)

正如我们之前解释过的,一个 类型混乱 当你向程序提供一大块数据,它应该以一种方式解析、验证、处理和操作时,就会发生错误……

…但是您后来设法欺骗程序以不同的、未经授权的、未经验证的和潜在危险的方式解释数据。

解释类型混淆的危险

想象一下,您正在用 C 语言编写一个程序。(您是否了解 C 并不重要,您可以照着做。)

在 C 语言中,您通常单独声明变量,这样不仅可以在可以存储变量的地方保留内存,还可以向程序发出应该如何使用这些变量的信号。

例如:

 long long int JulianDayNumber; 签名的字符 * 客户名称;

第一个变量声明保留 64 位用于存储表示天文日数的普通旧整数值。 (如果您想知道,今天下午是 JDN 23157 – 儒略日从中午开始,而不是午夜,因为天文学家经常在晚上工作,而午夜是他们工作日的中间时间。)

第二个保留 64 位用于存储可以找到客户姓名文本字符串的内存地址。

可以想象,您最好不要混淆这两个值,因为一个合理且安全的数字用作日期数字(例如 23157)几乎肯定用作内存地址是不安全的。

从正在运行的 Windows 程序的内存转储中可以看出,分配使用的最低内存地址从 0x00370000,十进制为 3,604,480,比任何合理的天数都大。

Windows 使用的实际内存地址随时间随机变化,使您的内存布局更难被骗子猜测,因此如果您运行相同的程序,您将获得值,但它们仍然是相似的:

以及(虽然它在上图的底部)当这个程序运行时运行时用户数据部分的内存地址 0x011300000x01134FFF,代表不太可能的日期范围 22 月 44631 日 16 到 44687 月 XNUMX 日 XNUMX。

实际上,如果您试图将这两个变量混在一起,编译器应该尝试警告您,例如:

 JulianDayNumber = CustomerName; CustomerName = JulianDayNumber; 警告:赋值从指针生成整数而不进行强制转换 警告:赋值从整数生成指针而不进行强制转换

现在,如果您曾经用 C 编程过,就会知道为了方便起见,您可以使用 union 关键字,像这样:

 union { long long int JulianDayNumer; 签名的字符 * 客户名称; } 数据;

您现在可以通过两种不同的方式引用内存中完全相同的变量。

如果你写 data.JulianDayNumber,你神奇地将存储的数据解释为一个整数,但是写 data.CustomerName 告诉编译器您正在引用内存地址,即使您正在访问相同的存储数据。

你所做的,或多或少,是向编译器承认你有时会将你获得的数据视为日期,而在其他时候则视为内存地址,并且 您有责任记住在什么时候适用哪种解释 在代码中。

您可能决定使用第二个变量,称为 tag (通常是一个整数)与你一起去 union 跟踪您现在正在处理的数据类型,例如:

 结构 { int 标签; union { long long int JulianDayNumer; 签名的字符 * 客户名称; } 数据; } 价值;

你可能会决定什么时候 value.tag 被设置为 0,数据尚未初始化使用, 1 意味着你正在存储一个日期, 2 表示它是内存地址,其他任何内容都表示错误。

好吧,你最好不要让任何人惹恼它 value.tag 设置,否则您的程序可能最终会出现严重的异常行为。

一个更令人担忧的例子可能是这样的:

 结构 { int 标签; // 1 = hash, 2 = function pointers union { unsigned char hash[16]; // 要么存储一个随机哈希结构 { void* openfunc; // 或两个经过仔细验证的 void* closefunc; // 稍后执行的代码指针 } validate; } } 价值;

现在,我们正在重载同一个内存块,这样我们有时可以用它来存储一个 16 字节的散列,有时可以存储两个 8 字节的指针,指向我们的程序稍后将调用的函数。

显然,当 value.tag == 1,我们很乐意让我们的软件将任何 16 字节的字符串存储到为联合分配的内存中,因为哈希是伪随机的,所以任何字节集合都是同样可能的。

但当 value.tag == 2,我们的代码需要格外小心,不要让用户提供未经验证、不受信任、未知的函数地址以便稍后执行。

现在想象一下,当标记设置为 1 时,您可以向此代码提交一个值,因此它没有得到检查和验证……

…但是后来,就在程序实际使用存储值之前,您可以诱使代码将标签切换为 2。

然后,代码会将您未经验证的函数地址视为“已知且已验证安全”(即使它们不是),并且会信任地将程序执行分派到您事先偷偷选择的​​内存中的恶意位置。

这就是类型混淆错误中发生的情况,尽管使用了人为和简化的示例,

如果以一种方式处理,则可以安全使用的内存被恶意地传递给程序以另一种不安全的方式进行处理。

怎么办呢?

确保您拥有最新版本的 Chrome 或 Chromium。

你想要 Chrome 114.0.5735.106 或更高版本的 Mac 和 Linux,以及 114.0.5735.110 或更高版本的 Windows。

基于 Chromium 的 Microsoft Edge 也受到此错误的影响。

微软到目前为止 [2023-06-06T16:25:00Z] 指出,

Microsoft 了解最近在野外存在的漏洞。 我们正在积极致力于发布安全补丁。

Edge 目前的版本是 114.0.1823.37,所以任何编号 晚于那个 应该包括 Microsoft 的 CVE-2023-3079 补丁。

要检查您的版本并强制更新您尚未收到的版本:

  • Google Chrome。 三点菜单 (⋮) > 政策和帮助 > 关于铬。
  • Microsoft Edge。 设置等 (…) > 帮助和反馈 > 关于 Microsoft Edge。

别客气。


时间戳记:

更多来自 裸体安全