Hi!请登陆

WebP开源库漏洞影响严重! 测试显示微信/钉钉/QQ等多款软件都面临风险

2023-9-25 126 9/25

此前苹果发布安全公告修复 CVE-2023-41064 和 CVE-2023-4863 漏洞,攻击者利用该漏洞可以向 iPhone 和 iPad 发送特制信息,受害者手机或平板只要收到这条信息就会触发漏洞,无需用户进行任何交互,危害程度极高。

根据调查该漏洞被商业间谍软件公司用来开发间谍软件,专门针对一些高价值的特定用户发起攻击,背后的目的自然不是为了钱。

事实证明这个漏洞并不只是威胁 iPhone 和 iPad,因为漏洞是 WebP 图像开源库 libwebp 中的,理论上只要软件调用了这个开源库那么都受影响。

所以目前 Google Chrome、Mozilla Firefox、Microsoft Edge 等浏览器均已发布更新修复这个漏洞,然而还有很多软件并未修复。

WebP开源库漏洞影响严重! 测试显示微信/钉钉/QQ等多款软件都面临风险

PoC 概念验证已经被公布:

更糟糕的是目前网上已经出现了该漏洞的 PoC,实际上有一些能力的黑客很容易找出漏洞的利用方法,因此只需要制作特定图片进行投递即可,尽管不一定可以实现无感攻击,但想要成功发起攻击并不难。

仍然还有不少软件未更新:

网络安全公司 DarkNavy (深蓝) 日前发布了一篇分析报告,根据深蓝的测试,国内也有很多软件受该漏洞影响,因为它们也需要调用 libwebp 开源库来加载 WebP 图像。

受影响的包括但不限于微信、钉钉、QQ 等国民级即时通讯 / 协作类软件,目前这些软件都还没有发布更新进行修复。

至于其他用户量稍微比微信、钉钉、QQ 低一些的类似软件自然也受该漏洞影响,当然除了即时通讯、协作类软件,其他能够发送和展示图片的软件多半也会受这个漏洞影响,只要这些软件支持 WebP 图像,那么大概率都是调用 libwebp 开源库的。

所以在这里蓝点网也提醒各位近期碰到一些软件弹出的升级提示一定要及时升级,因为这很有可能就是用来修复该漏洞的。

尤其是在 PoC 已经被公布的情况下,这下会有很多黑客参与进来,到时候就不是针对高价值客户了,可能普通用户也会被攻击。

深蓝表示:

在本案例中,漏洞发生在一个常用基础库中,实际受影响的软件产品数量超乎想象,但能及时修复漏洞的厂商微乎其微。

管中窥豹,与 Chrome、Firefox 等团队相比,国内软件开发商在漏洞信息获取、漏洞研判、漏洞修复、应急响应等诸多环节存在明显不足。

只有安全应急从被动走向主动,才能让“安全”更真实。

下面是深蓝关于该漏洞的技术分析细节:

本次漏洞根源,位于 webp 图片的处理代码逻辑中。当解析一个无损格式的webp图片时,解码器采用了范式霍夫曼编码 (Canonical Huffman Code) 算法,首先从图片流中读取前缀编码的数据,基于此数据构建一个完整的霍夫曼编码表,随后依照这个编码表对图片流中的压缩数据进行解码,得到原始的图像。

霍夫曼编码(Huffman Coding),是一种用于无损数据压缩的熵编码(权编码)算法。

在计算机资料处理中,霍夫曼编码使用变长编码表对源符号(如文件中的一个字母)进行编码。

变长编码表通过一种评估来源符号出现概率的方法得到,出现概率高的字母使用较短的编码,反之出现概率低的则使用较长的编码。

这可以使编码后的字符串平均长度、期望值降低,从而达到无损压缩数据的目的。

根据范式霍夫曼算法,在构建一个霍夫曼表时,首先会使用一级表,用于查询长度小于 N bit (N 默认为 8) 的霍夫曼编码;随后,若出现了长度超过 N bit 的编码,解码器会为其分配二级表,用于查询超过 N bit 的编码部分。在分配霍夫曼编码表的内存空间时,解码器提前会将所有一级表和二级表的空间一并分配出来,其内存大小是固定的:

  1. #define FIXED_TABLE_SIZE (630 * 3 + 410)
  2. static const uint16_t kTableSize[12] = {
  3. FIXED_TABLE_SIZE + 654,
  4. FIXED_TABLE_SIZE + 656,
  5. FIXED_TABLE_SIZE + 658,
  6. FIXED_TABLE_SIZE + 662,
  7. FIXED_TABLE_SIZE + 670,
  8. FIXED_TABLE_SIZE + 686,
  9. FIXED_TABLE_SIZE + 718,
  10. FIXED_TABLE_SIZE + 782,
  11. FIXED_TABLE_SIZE + 912,
  12. FIXED_TABLE_SIZE + 1168,
  13. FIXED_TABLE_SIZE + 1680,
  14. FIXED_TABLE_SIZE + 2704
  15. };
  16. const int table_size = kTableSize[color_cache_bits];
  17. huffman_tables = (HuffmanCode*)WebPSafeMalloc(num_htree_groups * table_size,
  18. sizeof(*huffman_tables));

问题在于,解码器默认图片中保存的霍夫曼编码表数据是合理的,因此提前计算了这一情况下能够容纳的最大内存长度。而霍夫曼编码表数据是来自不受信任源的,是可以由攻击者任意构造的,且编码器不会对这些数据进行有效性检查。

  1. // Fill in 2nd level tables and add pointers to root table.
  2. for (len = root_bits + 1, step = 2; len <= MAX_ALLOWED_CODE_LENGTH;
  3. ++len, step <<= 1) {
  4. num_open <<= 1;
  5. num_nodes += num_open;
  6. num_open -= count[len];
  7. if (num_open < 0) {
  8. return 0;
  9. }
  10. if (root_table == NULL) continue;
  11. for (; count[len] > 0; --count[len]) {
  12. HuffmanCode code;
  13. if ((key & mask) != low) {
  14. table += table_size;
  15. table_bits = NextTableBitSize(count, len, root_bits);
  16. table_size = 1 << table_bits;
  17. total_size += table_size;
  18. low = key & mask;
  19. root_table[low].bits = (uint8_t)(table_bits + root_bits);
  20. root_table[low].value = (uint16_t)((table - root_table) - low);
  21. }
  22. code.bits = (uint8_t)(len - root_bits);
  23. code.value = (uint16_t)sorted[symbol++];
  24. ReplicateValue(&table[key >> root_bits], step, table_size, code); // overflow here
  25. key = GetNextKey(key, len);
  26. }
  27. }

因此,如果攻击者能够构造出一个非法的霍夫曼表,包含了大量的长编码,这将导致解码器将分配过多的二级表,使得霍夫曼表的总内存大小超过分配大小,发生堆缓冲区溢出。

相关推荐