安全资讯

一张图片使得 Android 手机变砖

zeronohacker · 6月4日 · 2020年 515次已读

本文翻译自:https://www.androidauthority.com/android-wallpaper-crash-1124577/

原文作者:Bogdan Petrovan | @bogdan247

1 演示视频

一个简单的图片是如何使得 Android 手机无法使用而崩溃?随着“被诅咒的壁纸”的消息在网络上传播,这个问题在过去的 24 小时内经常出现。

2 壁纸导致崩溃

有几种解决方案,具体取决于手机受到的损坏程度。 一些用户能够在两次崩溃之间的短暂间隔内更改壁纸。 其他人则使用恢复工具 TWRP 成功删除了壁纸。 但是在大多数情况下,唯一的解决方案是将手机重置为出厂设置,但是会丢失所有未备份的数据。

Ice Universe 揭露了这个问题,中国的 Twitter 用户同样也遇到此问题。 根据用户报告,三星和 Google 的许多型号手机都受到了影响,而且我们还看到了 OnePlus,诺基亚和小米设备的用户的一些报告(尚不清楚这些设备是否运行了库存软件或自定义 ROM)。 但从我们自己的测试和查看的用户报告来看,华为设备似乎较少遭受壁纸崩溃的问题。

注意:不要将这张图片设置为壁纸,特别是三星手机用户,它将会导致你的手机崩溃,请别去尝试。如果别人向你发送了此图片,请忽略它

该问题会影响运行 Android 10 的最新手机,但事实证明,这并不是真正的新问题。 几年来,用户一直在报告类似的问题,而就在上个月,Android Police 报道了一个似乎与之密切相关的问题,具体影响了运行 Google Wallpapers 应用的 Pixel 手机。

3 我们向开发者询问此问题

这是一个很奇怪的问题,有可能成为更广泛的问题,尤其是在巨魔介入的情况下。 可以很容易地预想那些不受欢迎的角色会被壁纸诱捕,然后将它们作为“恶作剧”发送给毫无戒心的用户。发生什么了?我们已经对此问题进行了一些解释,其中大多数涉及图像的色彩空间,这超出了 Android 的 SystemUI 可以处理的范围,最终导致崩溃。

为了更好地了解 Android 壁纸崩溃的原因,我们联系了 POSP 定制 ROM 项目的首席开发人员之一 Davide Bianco,他为 AOSP 错误跟踪器提交了此问题的初始补丁。

Davide 为 Android Authority 读者亲切地解释了图片如何引起此类问题,并警告说这只是他的“个人观点”。 以下是他的简短说明:

此处的主要问题是 SystemUI 仅处理壁纸的 sRGB 图像,而没有针对非 sRGB 壁纸的任何检查。这可能会导致 ImageProcessHelper 类中的特定崩溃,因为用于访问数组的变量会超出数组范围。

下面是方法定义,供参考:

private int[] getHistogram(Bitmap grayscale) {
    int width = grayscale.getWidth();
    int height = grayscale.getHeight();
    // TODO: Fine tune the performance here, tracking on b/123615079.
    int[] histogram = new int[256];
    for (int row = 0; row < height; row++) {
        for (int col = 0; col < width; col++) {
            int pixel = grayscale.getPixel(col, row);
            int y = Color.red(pixel) + Color.green(pixel) + Color.blue(pixel);
            histogram[y]++;
        }
    }
    return histogram;
}

此变量称为 y,它是当前扫描像素 rgb 值的总和。该像素是通过扫描灰度图片表面的每一行和每一列获得的。每次获得像素时,我们将其 rgb 值的总和(通常最大为 255)分配给 y,并使用所述变量访问直方图数组的元素(其大小最大为 256)并对该元素进行处理。

现在,对于正常的灰度图像,rgb 值的总和始终为 255,但这不是正常的图像。变量 y 超过255,并生成一个超出范围的异常(SysUI 中的任何异常都被视为致命异常,因为每次 SysUI 启动都会处理图像,因此导致死机的无限循环)。现在,一种解决方案可能是在为 y 赋值之后添加检查,如果该值超过最大范围,则该值基本上将 y 设置为 255。这确实有效,但是由于某种原因,我们的质量会变差。

LineageOS 的人员能够发现由于舍入不佳而导致发生此特定问题,主要是因为 rgb 值始终舍入为 ceil 而不是正常舍入。他们能够通过手动舍入值来修复它,显然这种方法还保留了质量,但是我真的不知道如何做到这一点,主要是因为 SysUI 似乎总是将图像转换为 sRGB,从而在色空间为更大。

9to5Google 开发人员还发现该问题在 Android 11 上也不会发生,因为图片在以任何方式处理之前始终会转换为 sRGB。

我还尝试使用 photoshop 或 gimp 制作自己破碎的图像,但是 SysUI 始终将图像转换为安全的色彩空间,不会导致崩溃(但会丢失 ofc 色)。我尝试提取破损的图像颜色配置文件并在新图像中使用它,但仍然无法使 SysUI 崩溃。

4 这是一个好消息,同时也是一个坏消息

坏消息是这个问题现在已经公开了,您可以打赌有些人会用它来作恶。 更令人担忧的是,此 BUG(或一个非常类似的 BUG)似乎已经存在了至少两年之久,Google 并没有采取任何行动。

另一个坏消息是:如果您成为恶作剧的受害者(或由于您自己的好奇心,把这张图片设置为了壁纸),没有简单、轻松的方法来消除它。 至少恢复出厂设置是万不得已的方法,但是我们仍然不建议您在自己的设备上尝试恢复出厂设置。

好消息是,这似乎是一个简单的 BUG,而不是恶意软件或其他更邪恶的东西。 我们之所以说“似乎”,是因为我们没有收到 Google 的回复以进行确认。 另一个好消息是一旦 Android 11 于今年晚些时候登陆,此 BUG 就不会成为问题。

原壁纸(无压缩)下载:

提取码:

此区域内容需评论后才可见

(本文完)

2 条回应

必须 注册 为本站用户, 登录 后才可以发表评论!

  1. nkul未知2020-6-9 · 14:13

    演示视频,没有加载出来,而且这个收藏是给予浏览器的,请了缓存就没了

    • zeronohacker天津2020-6-9 · 14:16

      演示视频是 YouTube,免注册登录用户收藏文章清了缓存是会没!