0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

Google在一个函数中放入2万个变量引发Firefox大崩溃

OSC开源社区 来源:OSC开源社区 2023-06-26 16:58 次阅读

近日,Mozilla 检测到 Firefox 出现了大量崩溃事件,这个问题主要发生在使用 Linux 系统的用户身上,尤其是使用基于旧版本 Debian 的 Linux 系统上。

经过调查,Mozilla 最后发现这个问题并非由 Firefox 本身引起,而是涉及到 Linux 内核和 Google 的 JavaScript 代码。

这些崩溃事件发生的十分突然,一开始 Mozilla 检测到数以千计使用一个名为 Huayra 的 Debian 发行版的用户受到影响,特别是 Huayra 5(基于 Debian 10)。

后续的持续检测发现,这个问题影响了几乎所有基于旧版本 Debian 的发行版。

崩溃事件也并不是随机发生,而是能够 100% 复现。用户只要在 Google 上搜索图片 Firefox 就会出现崩溃,这个问题影响了所有版本的 Firefox 浏览器 —— 无论是最新版本还是非常老的版本,都会崩溃。

结合上面两个条件,Mozilla 的研究人员认定这个问题不是由 Firefox 这边引发的,问题应该是出在 Google 和旧版 Linux 那边,并开始分析这个问题发生的原因。

40b175c4-1349-11ee-962d-dac502259ad0.png

Mozilla 随后开始分析 Firefox 在崩溃时的行为,发现崩溃发生在堆栈探测期间。

JIT 触及了为下一个 JavaScript 调用保存变量的区域,并不知为何导致了溢出。

第一个奇怪的地方在于,Mozilla 发现 Google 最近对其图像搜索页面进行了更改,该页面现在有一个 JS 函数,Google 在这个单独的函数中分配了 20000 个变量。

进一步分析发现,这个函数可能是由 AI 生成的代码。

虽然发现了有这样的问题,不过理论上 Firefox 应该依然不会出现崩溃才对,因为 Linux 会自动扩展堆栈,Mozilla 团队也已经预留了足够的空间,随后他们通过查看受影响进程的内存确认了这一点。

在执行此操作之前,我们进行了堆栈检查并验证了我们分配的额外堆栈内存量不会溢出我们为自己设置的本机堆栈限制。

因此,似乎存在我们自我施加的限制与操作系统限制之间的分歧。

这在某种程度上取决于发行版,但很混乱:例如,它影响 Debian 10 但不影响 Debian 11。

随后 Mozilla 团队将检查重点放在了 Linux 内核上,结果发现 Linux 内核曾经有一个检查,可以防止对堆栈的访问离堆栈指针太远。

特别是在 64KiB+256 字节以外的访问会产生崩溃,而不是扩展堆栈。

这个问题在 Linux 4.20 中被修复了,所以使用较新的发行版的用户不受影响。

根据测试,Google 似乎已经在图片搜索中修复了这个问题,不过 Mozilla 仍然在着手研究解决方案,看看是否能为还在使用老系统的用户一劳永逸解决这个问题,以免未来发生同样的情况。






审核编辑:刘清

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • Linux系统
    +关注

    关注

    4

    文章

    567

    浏览量

    26914
  • LINUX内核
    +关注

    关注

    1

    文章

    311

    浏览量

    21389
  • Debian
    +关注

    关注

    0

    文章

    71

    浏览量

    1003

原文标题:Google在一个函数中放入2万个变量,引发Firefox大崩溃

文章出处:【微信号:OSC开源社区,微信公众号:OSC开源社区】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    IAR仿真时崩溃了怎么解决?

    发现IAR有BUG,程序中定义unsigned char型的变量,如果在代码中给变量赋某些值(比如0xEC,0xE0),
    发表于 04-22 07:57

    如何处理STM32的HAL库函数返回异常问题?

    (1)官方提供的例程里面,例如返回的结果不是 HAL_OK 的结果,般直接跳转到 错误处理的函数里面了。这样写的目的是给开发者根据实际情况自己写异常处理代码。 (2)比较现实是,
    发表于 04-17 06:39

    C语言中的三种形式变量

    局部变量是在一个函数、代码块内部声明的变量,只能被该函数或者代码块内部应用。局部变量函数之外不
    发表于 03-11 17:34 154次阅读
    C语言中的三种形式<b class='flag-5'>变量</b>

    TC2XX现在看的擦除函数都是扇区扇区擦除的,如何实现按页擦除?

    TC2XX现在看的擦除函数都是扇区扇区擦除的,如何实现按页擦除?
    发表于 02-18 07:51

    softune如何把变量定义指定RAM地址?

    你好,请问如何把变量定义指定RAM地址? 例如把 i 变量定义 RAM地址 0x0200
    发表于 01-18 10:48

    LabVIEW调用image.cpp或drawmgr.cpp因为DAbort而崩溃

    需要时加载选板以尝试减轻崩溃\user.lib目录中删除不必要的库。LabVIEW会为每个选板图像使用 GDI 对象,因此具有
    发表于 12-01 18:57

    函数返回的类型是枚举,能不能将此状态赋值给char呢?

    函数返回的类型是枚举类型,现在我另外的子程序中调用了这个
    发表于 11-10 06:11

    stc51单片机程序存储区不够用,可否程序存储区写bootloader,用户程序放入自身的EEPROM?

    stc51单片机程序存储区不够用,可否程序存储区写bootloader,用户程序放入自身的EEPROM?如何实现?
    发表于 11-09 07:09

    求助,关于const char *p参数的函数和中断赋值的问题

    假设带有 const char *p参数的函数 在此函数中 p指向全局
    发表于 11-09 06:05

    keil5 debug的时候,如何查看具体的变量

    keil5 debug的时候,如何查看具体的变量,而且让这个变量能实时更新
    发表于 11-01 06:24

    昉·星光 2(VisionFive 2)Debian 202308最新镜像发布!

    显示无法恢复; 解码器的DMA缓冲区泄漏; Omx无法进程中打开多个解码器实例; VLC: EGL /wayland调整窗口大小问题 VLC:窗口调整宽度/高度,具有空值
    发表于 09-08 14:44

    怎么快速进行变量函数的命名?

    enum(枚举)类型,前缀使用“e”+枚举变量名,其成员前缀为枚举变量或者其缩写;struct(结构体)类型,前缀使用“s”+结构体变量名,其成员和变量定义规则相同;union(联合)
    发表于 08-18 10:30 233次阅读

    Mozilla检测到Firefox出现了大量崩溃事件

    这些崩溃事件发生的十分突然,一开始 Mozilla 检测到数以千计使用一个名为 Huayra 的 Debian 发行版的用户受到影响,特别是 Huayra 5(基于 Debian 10)。后续的持续检测发现,这个问题影响了几乎所有基于旧版本 Debian 的发行版。
    的头像 发表于 08-07 16:33 615次阅读
    Mozilla检测到<b class='flag-5'>Firefox</b>出现了大量<b class='flag-5'>崩溃</b>事件

    static的全局变量与局部变量的使用,看完你就懂了

    时,编译器为它在栈上分配空间,函数栈上分配的空间在此函数执行结束时会释放掉,这样就产生了问题: 如果想将
    发表于 06-27 08:54

    使用yocto构建Firefox Web浏览器报错怎么处理?

    \' 但是,虽然 bitbake firefox do_compile 中遇到以下错误。 ERROR: firefox-68.9.0esr-r0 do_compile: Execution
    发表于 06-02 08:42