首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計綜合問答

QQ 消息特定字符串導致 Android 卡死的原理分析

     編輯:程式設計綜合問答

用戶發現發送特定長字符串(大量 oo0.oo.OOO00... 重複模式)至 QQ Android 版會導致界面凍結、ANR,而 iOS 版正常。這屬於典型的 遠程拒絕服務(DoS)漏洞,由客戶端渲染/解析邏輯缺陷引發。

觸發條件

  • 消息包含極長、高重複、特定字符模式的文本。
  • 接收端為 Android 版 QQ(特定版本區間)。
  • 消息進入會話列表或聊天窗口時觸發渲染/解析流程。

技術原理分析

  1. 文本渲染複雜度過高:Android TextView / Spannable 處理超長文本、大量 Span(如表情符號解析、URL 高亮、@提及)時,佈局計算時間呈指數級增長,阻塞主線程。
  2. 正則表達式回溯災難:若採用複雜正則(如 (oo0\.oo\.OOO00\.)+)匹配高亮,輸入特定模式會導致災難性回溯,CPU 飆升。
  3. 內存分配洪峰:解析生成大量臨時對象(SpannableString、Layout),觸發頻繁 GC,加劇卡頓。

為何 iOS 不受影響

  • iOS UITextView / NSAttributedString 實現機制不同,對長文本佈局有更優化的分頁/異步渲染策略。
  • 騰訊對兩平台客戶端代碼庫分離維護,Android 版存在該缺陷的解析邏輯,iOS 版可能已修復或未引入該邏輯。

修復時間線

此類漏洞屬安全級 Bug,騰訊通常會在發現後通過熱修復(動態下發正則/解析配置)或版本更新修復。用戶遇到只需更新 QQ 至最新版即可解決。

開發者避坑指南

  • 限制文本長度:前端截斷、後端校驗,單條消息不超 5000 字符。
  • 異步解析:將 Span 解析、表情替換移至子線程(HandlerThread/RxJava),結果回主線程設定。
  • 正則優化:避免嵌套量詞、使用具體字符類代替點號、設置匹配超時(Pattern.compile(regex, Pattern.DOTALL) 無原生超時,需自行實現)。
  • 異常捕獲:解析入口包裝 try-catch,失敗時降級顯示純文本。

此案例再次提醒:客戶端渲染邏輯必須假設輸入惡意,做好長度限制、異步處理、異常隔離,防止單條消息癱瘓整個應用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved