呂凱崴kaiweilu.tw

APKSec Pro 實證:400 支上架 App 的檢測與負責任揭露

以最嚴格的送測分級 L3 統一檢測 400 支上架 App,整理各條文的不通過分布;再把反編譯確認的 584 筆 App 自有漏洞依攻擊者所需的前置條件分級,挑出可直接通報的問題,依負責任揭露原則處理。確認過程只做辨識與定位,不以任何取得的金鑰或憑證連線。

期間
2026-09(400 支統一檢測於 9 月 16 日完成;可回報分級於 9 月 21 日完成)
角色
獨立完成:語料取得、統一檢測與結果分析、確認方法、可回報分級與揭露規劃(通報對象與時程由指導教授與本人共同決定)
技術
Android 模擬器、adb、APKSec Pro、jadx、密碼學函式庫(離線解析)
規模
400 支上架 App;1,574 條不通過旗標;584 筆確認漏洞分四級;列入通報規劃 62 支、68 筆

書審對應:附件 A-3;系統與判定方法見 A-1,比對基準見 A-2

各檢測項的不通過支數(400 支,送測分級 L3,2026 年 9 月 16 日統一檢測)
各檢測項的不通過支數(400 支,送測分級 L3,2026 年 9 月 16 日統一檢測)
本頁目錄
  1. 研究問題與設計
  2. 語料與檢測設定
  3. 整體結果
  4. 可回報分級
  5. 在不觸法的前提下確認漏洞為真
  6. 遮蔽與保密
  7. 負責任揭露流程
  8. 研究倫理

研究問題與設計

本頁回答第三個研究問題:系統能否在真實世界找到可辯護、值得通報的高危漏洞?找到之後,研究者如何在不觸法、不越界的前提下確認漏洞為真?設計分兩部分:

  1. 統一檢測:以同一版本、同一分級檢測 400 支上架 App,描述不通過旗標在各 App 與各條文上的分布。
  2. 可回報分級:以 A-2 反編譯逐支確認的 584 筆 App 自有漏洞為母體,依攻擊者需要的前置條件分級,挑出可以直接通報廠商的問題。

兩部分共用同一條倫理界線:金鑰與權杖只辨識、定位、遮蔽記錄,不測試有效性、不用來連線。

語料與檢測設定

  • 取得:原始清單 408 支,排除 8 支 Google 與系統元件後為 400 支第三方 App;安裝檔多數是在 Android 模擬器上經 Google Play 安裝後,以 adb 取出。
  • 類別:銀行、券商、保險、政府、醫院、交通與生活類。
  • 設定:全數以送測分級 L3(最嚴格的範圍,39 項)純靜態檢測,2026 年 9 月 16 日以 v2.2.0 統一重掃,不區分取得先後。
  • 計數口徑:只計 L3 範圍內的 39 項;F 類加測項不在送測範圍,不計入。
  • 這 400 支也全數在 546 支比對基準之內,其後各版判定碼的重掃與比對見 A-2。

整體結果

400 支中,368 支至少有一項不通過、32 支零不通過,合計 1,574 條不通過旗標,平均每支 3.9 條。每支的不通過項數介於 0 至 11,最常見的是 4 項(82 支),8 項以上者 20 支。

400 支 App 的不通過項數分布(送測分級 L3)
400 支 App 的不通過項數分布(送測分級 L3)

各條文的不通過支數如下,14 個條文合計 1,574 條:

條文內容不通過支數
4.1.2.3.12IPC:匯出元件沒有足夠權限保護255
4.1.2.5.3分享時未限定 App(與上條同一組證據)255
4.1.2.4.1允許明文傳輸或設定弱 TLS 版本230
4.1.2.3.6儲存加密使用弱演算法177
4.1.5.4.2SQL 字串拼接135
4.2.2.1.2WebView 不安全設定113
4.1.4.2.3主機名稱驗證放寬92
4.1.4.2.2伺服器憑證驗證停用80
4.1.2.3.14允許系統備份且無排除規則73
4.1.2.3.16以日誌輸出敏感欄位46
4.1.5.1.2函式庫含 CVSS 7 以上的已知漏洞44
4.1.5.3.1同上,同一組 CVE 證據對應本條44
4.1.2.3.7以全域可讀寫模式開檔22
4.1.2.3.8內嵌結構自證的私鑰或權杖8

怎麼讀這些數字

一條不通過是一個「待人工複核的旗標」,不等於一個可被入侵的洞。旗標多有兩個原因。第一,系統採召回優先(定義見 A-1):命中第三方函式庫仍輸出不通過,只是在證據上標注套件歸屬,留給人工快速撤銷,而不是隱藏成通過。第二,部分條文的門檻本來就低:允許備份的預設值、自訂 action 的匯出、任一明文設定,成熟 App 幾乎都會中。零不通過代表在 L3 範圍內工具沒有找到可定位的違反證據,需人工的檢測項仍要由檢測員完成。

工具的價值因此不是「零人工」,而是把人工從「盲目逆向整支 App」降為「複核一份已定位、已分類、已標歸屬的清單」:證據直接指到類別、檔案與條文;結構自證的機密、可偵錯、允許備份、自訂 action 匯出等可由工具終判;標為第三方的命中可以很快撤銷,真正需要判斷的是少數 App 自有的可疑項。

可回報分級

584 筆「確認的漏洞」不等於 584 件「該通報的事」。分級的依據是攻擊者需要什麼前置條件;它是對外揭露的優先序,不是 V4.0 條文判定,也不影響系統的判定結果。

等級判準筆數App 數
A 可直接通報機密可直接從安裝檔取出(A1),或 App 自有的主要連線停用 TLS 驗證(A2)7064
A? 通報前補一步確認型態已確認,但還須確認受影響的是什麼資料11693
B 需要前置條件需要誘導使用者或其他前置條件才碰得到敏感功能271178
C 不通報沒有敏感資料經過、實為公開識別碼,或為教學用的靶機 App12797

四級筆數合計 584;同一支 App 可以同時出現在多個等級。A 級 70 筆中,A1 有 30 筆、A2 有 40 筆;A 級含 2 支公開的教學靶機(刻意寫壞的教材,沒有揭露對象),扣除後列入通報規劃的是 62 支、68 筆。

分級流程由本人設計:多個 AI agent 依完整的反編譯證據文字分批初判,本人逐批驗收並裁決爭議。專題前期逐支確認的 9 支機密外洩,全數落在 A1 之內。

系統對 A 級的判定也驗證了合約的設計:A1 的 30 筆中,結構自證的機密由系統自動判不通過(11 筆),沒有固定格式的機密(例如寫死的帳密)附線索交人工確認(19 筆);A2 的 40 筆中 39 筆自動判不通過、1 筆交人工;兩類都沒有任何一筆被判為通過。

在不觸法的前提下確認漏洞為真

以取得的金鑰登入、連線或解密屬於未經授權的存取,觸法且違反研究倫理。本專題的確認只做辨識與定位,全部在本機離線進行:

  1. 結構自證:只有結構本身就能證明是私密憑證的物件,才視為機密外洩;只有標頭的函式庫模板、公開的測試金鑰與示範金鑰都依型態排除。
  2. 一致性驗證:伺服器私鑰與同一安裝檔內的憑證,以數學關係確認互相對應,再解碼憑證確認其用途;排除測試用的配對。
  3. 反編譯定位:以 jadx 追到使用位置,確認是 App 自有的程式碼,以及問題所在的連線或功能是否為主要功能。
  4. 逐筆覆核:每一筆高危候選都逐筆反組譯覆核,覆核中發現的誤判型態寫回系統規則。

沒有做的事同樣明確:不登入、不連線、不解密任何流量、不測試金鑰的有效期與權限範圍;這些留給廠商查證,是負責任揭露的標準分工。

遮蔽與保密

  • 報告:系統報告中的私鑰本體一律不輸出,權杖只保留前綴。
  • 比對基準鏡像:入版本控制的是遮罩後的鏡像,憑證字串只保留足以回到安裝檔定位、不足以使用的片段,並在重建後以偵測器掃描確認沒有殘留的憑證本體。未遮罩的原件只留在本機。
  • 版本控制:倉庫維持私有;真實 App 語料、未遮罩的證據、具名的可回報分級報告與真實測試帳號皆不入庫。
  • 對外資料:本站與技術摘要只寫方法與整體統計,不寫 App 名稱、套件名、主機名或雲端專案識別;含受測 App 識別資訊的完整成果報告(31 頁)依負責任揭露原則,於通報完成前不對外提供。

負責任揭露流程

依 ISO/IEC 29147 的原則:研究者只辨識與定位、不實際利用;私下通報廠商,由廠商驗證並修補後才公開。本專題的規劃:

  1. 優先序:可直接取出的機密最優先,循 TWCERT/CC 或各廠商的資安聯絡管道通報,由廠商撤銷並更換;TLS 驗證停用屬 App 端修補。
  2. 通報前逐案再確認:分析結果綁定特定版本的安裝檔(以 SHA-256 記錄),廠商可能已在新版修正;通報前逐案確認現況。A? 級在補完確認之前不通報。
  3. 材料:依實際危害排序整理,分具名版(供通報)與代稱版(供對外說明),兩者皆不含機密字面。
  4. 決定權:通報對象與時程由指導教授與本人依上述原則共同決定。

研究倫理

  • 語料只取自公開上架的安裝檔,分析在本機進行。
  • 發現的機密不用於任何連線或存取,不嘗試驗證其權限,也不以任何方式利用漏洞。
  • 對外只呈現方法與整體統計,不使用能把範圍縮到少數機構的描述。
  • 研究結果只供教學與負責任揭露使用。