承上文,「小鴨幹線」與「有害」App 特徵相近,每次更新都可能再次觸發誤報。在 Google Play Protect 目前沒有預警,在判為「有害」App 後即時通知用戶刪 App 的新做法下,「小鴨幹線」只能無奈地繼續刪除 Google Play 版功能,並在大幅更新核心攔截程序前,採取消極方法,停止更新。
實例證明,機器學習仍難以準確辨識有害 App
Google 是靠機器學習去辨識有害 App,若機器學習僅為輔助性質,最終由人手覆核有害程式碼,或先與開發者溝通,本身並無問題。但「小鴨幹線」的經驗,再次確定 Google 的做法,由辨識至下架,吊銷開發者戶口,以至(剛更新的政策) Google Play Protect 即時向所有用戶發通知建議/強行刪 App,全不經人手[1]。
以「小鴨幹線」這次被視為收費欺詐的例子,WAP 或收費欺詐,一般所需要的權限及行為,包括
- SMS 權限,以取得確認碼及
- 偷偷地撥號或誤導用戶撥號,以訂閱收費服務或
- 背後用 webview 上網執行 script 等以訂閱收費服務
上述都是「小鴨幹線」沒有的行為。此外,小鴨絕大部份用戶為香港用戶,進行此類欺詐亦要本地電訊商有類此收費模式,並在本地設有相關收費服務,方可成立。但事實上此類模式的收費服務在本地似乎已絕跡多年。
由此可見,Google Play Protect 的機器辨識,不但未能學習到一些現實世界的常識(例如在 App 的目標地區,此類收費模式欺詐已行不通);亦未能從程式的動態分析(若有的話)中判斷「小鴨幹線」的撥號行為是否誤導,及根本沒有 webview 上網執行 script 的行為,與此類欺詐有根本不同之處;甚至連最簡單的靜態的權限分析,即此類欺詐要應用「小鴨幹線」沒有的 SMS 權限,亦未能學習得到。
事實上,如前文所述,一直對 Anti-virus 軟件進行的測試的結果指出,Google Play Protect 的辨識表現(相較其他靠傳統由人手辨認 malware 的軟件)是最差的。
為什麼辨識有害 App 未能全自動化
為什麼機器學習可以打嬴圍棋世界冠軍,GPT-3 作文難分真假,但辨識 malware 還是不濟?最大原因應是,機器學習要靠大量資料,棋類規則固定,勝負清楚,不須規則以外的常識,靠機器不斷對打,已能產生大量資料學習。而語言模型,有大量文字資料供學習,但 malware 樣本的數量相對極為有限,亦不能隨便自動產生。
另一方面,程序組合的變化性或不下於棋局或語言。而即使最新的語言模型,未必真正理解文章內容,(據指 GPT-3 作稍長的文章,會看出破綻,因為背後想法並不連貫),因此要從極有限的樣本,訓練出可以從已編繹程式碼,看出程式是否有欺詐意圖,以至歸納出對行騙手法相關的常識 (例如電訊商是否有某種服務,可透過撥號加上攔截 SMS 確認短訊,是以瞞騙用戶以騙財),基本上並不可行。
所以,根據 Google 在 Security Blog 所述 [2],目前 Google 的機器學習,很可能只使用了大量不相關及較簡單表面的特徵,如 App 的大概的權限分布(即將大量權限透過自動學習併合為小數量的特徵,以避免在樣本少的情況下過度學習),所使用程序介面 (API)的大約分布,以及其他與是否「有害」不具直接因果關係,但有統計上的相關性的因素 (舉例說,如有害程式在 Google Play 收費比率較其他程式低,一隻不收費的 App 便會被視為有較大機會是有害,但兩者沒有因果關係),來決定一隻 App 是否與「有害」程式的樣本相似,只要特徵相似程度夠高,便當作有害,當中不含對程序作為的真正邏輯分析,亦未有一般的常識支持。
更甚者,Google 的機器學習似乎連 WAP 欺詐必須 SMS 權限這種靜態特質亦未能歸納出來,這有可能是 WAP 欺詐樣本太少[3],加上樣本分類有錯誤,或 SMS 權限特徵因整體上與其他權限相關而被併合(如與「小鴨幹線」所持的電話權限),以致誤中副車。
預期 Google 只會變本加厲
除非 Google 大幅改善其辨識率(特別是減少假陽性的機率),或改變一貫方法,以人手覆核或事先與開發者聯絡,否則,即使這次「小鴨幹線」「幸運」上訴成功,但因事件已顯示「小鴨幹線」的特徵與「有害」 App 相似,事故仍極有機會重演。
不過,按上述推測,除非機器學習的方式大幅改變,以目前的方式,似乎有很大的先天限制,以致未能提升準確度。
而 Google 的非人性化下架處理,問題已為開發者詬病多年,改善機會亦極微。相反,Google 近期刪去 90日上訴失敗後才向用戶發通知的政策,而小鴨上架多年一直相安無事,近日卻劃為「有害」,可見情況或會因 Google 為加強偵測「有害」程式,在機器學習未有突破的情況下,向寧枉毋縱方向調整,令更多無辜程式下架。反正對Google 來說,再多千百宗「小鴨幹線」一樣的遭遇,半點損失也沒有,但一單半單「有害」程式在 Google Play 上架,已足以讓 Google Play 再「見報」。
高危因素的推斷
作者在下架後曾估計相關的因素,其後再參考了更多此次被錯誤指控的「有害」程式類別的資料,如 Google 所指的常用的手法(見[4]),以下為高危因素的(最新)推斷。
- 電話權限(讀取電話資料,撥出電話等),尤其是,保留有電話權限的正當程式,亦因 Google 2019 年收緊此類權限的 App 在 Google Play 上架政策,而大幅減少。若在 Google Play 以外的某類有害程式,很多具有電話權限,便會令有電話權限的程式,更容易被視為近似「有害」的程式。
- 使用 Java 的 reflection 使用系統界面,傳統 Android 的電話攔截,由於沒有正式的掛線介面,以 reflection 取得隱藏掛線介面必要的。但同時 reflection 亦可視為避開偵測或繞過限制的方法 ,為「有害」程式所常用(即使 App 權限不是在 client API 層面執行,不能用此方式繞過)。
- 「在其他程式上繪製」權限,小鴨用來做彈出通知,以讓用戶在使用其他程式或來電顯示為全屏時可以見到小鴨的提示。但亦為「有害」程式所用,以假冒其他程式的用戶介面,誤導用戶。
- 常駐的背景服務。如電話權限的情況相似,在 Google 對背景的限制不斷增強的情況,可能令背景服務成為更近似有害程式的特徵,視為在背景偷偷運作。
- 通知存取權,小鴨用以(1)來電時更改通知模式以靜音(Android 5 以上開始,因為原本靜音方式無效),(2)模擬藍芽接聽掛線,在部份手機這是非預設撥號 App 唯一可行的掛線方式。但也可用以隠藏其他程式的通知,暪騙用戶。
- 偵測及使用 root 權限,雖然未必和這次下架相關,但 Google 為 root 度身訂造了一類「有害」程式類別。當然,對「有害」程式,root 的功效不用多說。
無奈的決擇,繼續刪除功能
由於預期 Google 只會繼續加強「有害」軟件偵測率,有殺錯無放過,作為沒有為 Google 帶來收入,亦不可能向 Google 就錯誤要求補救的小開發者,可以做的,就只有斬腳趾避沙蟲
- 在「小鴨幹線」 Google Play 版本,去除上述高危因素,以及刪除所有相關功能,
- Google Play Protect 運作並不透明,但有可能的情況是,目前版本在上訴後去除「有害」屬性,只是經人手就此版本加上標簽,特別免除被誤判,但若小鴨更新,可能清除了防護標簽,再觸發問題。因此,在上述功能去除前,凍結 Google Play「小鴨幹線」版本,或許暫時較為安全。
已知目前版本在部份 Android 10 上未能掛線,只能靜音,由於 Google Play「小鴨幹線」版本凍結,若發生此問題可改用完整版。
對 Google Play 版功能的影響
要去除上述高危因素,便要將攔截部份,以近期 Android 的新方式重寫,即 CallScreeningService
的方式 (見此文所述),對 Google Play 版本,相關影響如下
- 在 Android 10 之前,除非加入撥號功能及預設為撥號程式,否則必須使用目前的方式攔截,而電話權限及 reflection 等,是目前攔截方式必須的。小鴨無意強制用戶預設為撥號程式,因此,日後更新將只支援 Android 10 及之後的 Android 版本。(對 Android 9 或之前手機來說,「小鴨幹線」將停留在現版本,直至一兩年後不符 Google Play 最低 API 要求而下架,已安裝的不受影響,除非日後再當成有害被 Google 自動刪 App)。
- 去除「其他程式上繪製權限」,即不會再彈出小鴨來電視窗的通知。由於使用
CallScreeningService
,小鴨提供的來電者資料會改為在正式的電話通知中顯示,因此若非以掛線方式攔截,仍會見到部份來電訊息,但就沒有目前警告顏色,分類圖標,來電次數等的圖示。 CallScreeningService
不須常駐背景服務,只在來電時觸發,但由於所有程式及資料在來電時才載入,或會加長啟動時間 (不過對新機種來說也許不是重要因素)。- 用戶要指定「小鴨幹線」為來電過濾預設 App,由於每部手機只限一隻預設 App,因此不可與其他要相同要求的 App 共用。
- 沒有通知存取權,接聽的 API 亦在 Android 10 劃為過時,因此不會再提供接聽再掛線功能。
- 不會再提供 root 功能 (新機或已沒有此需要)。
- 不再常駐監聽電話狀態,因此或須刪除通話後提示回報功能(預設電話 App 有此功能,但當然是回報到 Google 或相應廠商而非 HKJunkCall,因此將來有賴用戶自發回報到HKJunkCall)。
- 同上,不再提供撥出防護功能。
- 回撥已攔截電話,只會跳到撥號程式介面,再由用戶按鍵撥出,不會直接撥出。
另一方面,採用 CallScreeningService
亦可能有正面影響
- 應較不受殺背景程序的影響。在一些機種可能增加成功機會。
- 可以回復刪除系統來電紀錄功能。來電資料亦可寫入系統來電紀錄。
- 由於系統在來電時會先叫
CallScreeningService
,攔截必定早於響鈴或震動,不會有響一下的情況。
完整版因 Google Play 無處不在,也許不能倖免
完整版會先保留原有功能,但事實上,只要有用戶使用 Google Play Protect ,自動上載 Google Play 外下載的程式給 Google 掃瞄,Google 仍很大程度對 Google Play 外的 App 操生殺權,若 Google Play 認為有害,完整版的用戶,只要使用 Google Play,都可能會收到同樣的有害警告,甚至被自動刪 App。若出現此情況,亦可能「攬炒」同一 package 名的 Google Play 版本。到時或可能要視乎情況,完整版都要刪除部份功能。
順帶一提,這情況顯示,即使 Google 聲稱日後會讓 Google Play 以外的 App Store 更易使用,亦只可視為應付壟斷調查的虛招,Google 一直在加強開發者對非開源的 Google Play Services 依賴,再靠 Google Play Services 綑綁 Google Play Protect,並加強 Google Play Protect 對 App 生殺權(不論來源)的操控,同時亦不用對決定作解釋或負責,Android 只會愈來愈接近另一陣營的 walled garden。不同的是,對家(在收了年費後)是有真人與開發者就 App 問題溝通的。
[1] Google 的思維可參考自稱曾於 Google 工作的 Reddit 用戶 capilot 在 Reddit 的說法,重點是,對於如小鴨作者般的小開發者,非迫不得已是不會用作人對人處理,因為用真人回覆你一次,所花資源已超過從你身上獲利的總和。
[2] 這篇是 Google 本身公開說明 Google Play Protect 如何學習分辨「有害」程式的文章。當中指見用數以百計的特徵以及匿名資料(可能包括舉報?),以作辨識。例如與其他程式互動,取得私隱資料,繞過系統限制等。
[3] 細心看註 [2] 文中那幅 Animated GIF (應是訓練或測試數據中,不同種類的「有害」程式數量的分布,數百特徵壓縮到二維),Toll Fraud / WAP Fraud (除 WAP Fraud 有 2 個集中群組)都是分布廣但數量相對少(特別是Toll Fraud)。因此在學習抽取/壓縮特徵或辨識時,可能會忽略了對此等分類較關鍵的特徵(因為對整體分辨成績作用較少)。
[4] 另一篇 Google Security Blog 文章,講述 Billing Fraud 手法。
在〈「小鴨幹線」2020年10月再於 Google Play 上架 (二)斬腳趾避沙蟲〉中有 2 則留言
無論是下架事件或三星firmware事件,都見到小鴨的讀解和努力不懈。作為多年鴨粉,很感動。無論Google Play或完整版,必繼續支持小鴨。(不轉iPhone其中一個原因就係有小鴨)
感謝作者與 Google 交手後撰寫文章作紀錄,讓大家知道 Google 如何作惡。