分類
Android 安心出行

「安心出行」能否安心使用?(四)

自十一月之後,「安心出行」App 已多次更新,這次先看看一些改變,有機會再談據報只用過一兩次的上傳機制。

使用 Hermes 虛擬機

第一部份提及、首次推出時對 Android 1.0.4 版本的分析方法,在半個月後更新的 1.0.5 版本已經失效。「安心出行」改為用 React Native 的 Hermes 虛擬機去執行以 JavaScript 編寫的程序,當中JavaScript源碼會先編繹為類似 bytecode 的二進位檔案才放到 APK 檔中。因此 APK 檔內再找不到 JavaScript 的編碼。

使用 Hermes 虛擬機的當然有其好處,如加快速度及減少內存消耗,不過同時增加了分析編碼的難度,在經 hbcdump 程式將 index.android.bundle 二進位檔反組繹後,得出類似的程式:

Function<_>7953(2 params, 18 registers, 0 symbols):
Offset in debug table: source 0x69f0e, lexical 0x0000
index.android.bundle[653:2481]
LoadConstUndefined r5
LoadConstUndefined r1
GetArgumentsLength r2, r1
LoadConstUInt8    r0, 1
JNotGreater       L1, r2, r0
GetArgumentsPropByVal r2, r0, r1
JStrictNotEqual   L2, r5, r2
L1:
index.android.bundle[653:2539]
GetEnvironment    r2, 0
LoadFromEnvironment r2, r2, 1
GetByIdShort      r2, r2, 1, "Constants"
GetById           r4, r2, 2, "N_KEY_LENGTH"
Jmp               L3
(r1 等為 register,L1 等是地址)

和 Java 或 smali bytecode 不同,由於 Hermes 仍是新技術,目前似乎未有公開的反編繹程式將之還原為較可讀的 JavaScript 格式,但多花時間熟習後還是可找到程式邏輯的。不過,在沒有工貝協助下,一些搜尋方式便變得困難,變相隱藏功能亦較容易,例如現時未能確保是否已找出「安心出行」與政府伺服器(「大台」?)間的所有API。

雖然使用 React Native 的 Hermes 技術(目前仍是 opt-in)絕對有合理理由,但時間上,卻恰在 JavaScript 碼被分析(包括加密虛招問題及 AES 加密 bit 數貨不對辦)後,而不是首次公開的 1.0.4 版前完成這些基本設定,難免令人對其動機是否純為改善效率產生聯想。

加強 AES 加密

在 12 月初的 1.1.0 版,「安心出行」加入了檢視到訪紀錄的功能,因此實際上,「資料加密儲存於手機」這種做法,已經毫無實質意義,因為「安心出行」App 檢視功能本身已自動解密,有關資料只受身機本身的保安機制保護。

奇怪的是,開發商竟還大費周章,將 AES 加密 bit 數由 128 增加到 256,這包括額外編碼,將用戶原有的資料用逐項以 128 bit 解密,再以 256 bit 加密,在資料庫增加欄位 isNew,分辨紀錄是否已進行升級等,而伺服器的 API 亦作出相應升級。

究竟是開發商未達(無謂的)加密要求,被發現後而補鑊,還是局長在立法會說 256 bit 加密時用了 Doraemon 的口講成真揚聲器,便不得而知了。

用之前門鎖的譬喻,就是當局或開發商一方面要把鎖匙長期插在門鎖方便開門,另一方面又花資源將門鎖加固。

當然,和「強烈建議」要打咭出入政府總部的公務員用「安心出行」一樣,一件沒有實質意義的事,不代表沒有其宣傳價值的。譬如張建宗司長最近(2月14日)在facebook的帖文,便繼續沿用資料「加密存放於用戶自己的手機」的舊口徑,來為「安心出行」宣傳。

「安心出行」API URL

[19/2 更新: 此段適用於 1.1.4或之前數個版本,1.1.6版已加回直接連結]

原本程式連接至「大台」的 API URL base,是 hard code 在程式內的,不過在新版中,該 URL 已不再直接寫在程式內,而是從 https://www.leavehomesafe.gov.hk/site.json 取得。該網址目前返回以下 JSON

{
    "api":"https://app.regqr.gov.hk/app",
    "json":"https://www.regqr.gov.hk/app"
}

(從 App 上傳資料用 api ,下載用 json)因此,如果用 Ad blocker (如 F-Droid 版的開源 Ad-blocker Blokada – 注意 Google Play 版因名顯原因,功能不全),在廣告阻加擋〉已封鎖主機中,加入 www.leavehomesafe.gov.hk 到阻擋名單,便會阻止「安心出行」取得 API 位置,繼而停止「安心出行」與「大台」溝通,因此亦可停止浪費數據的強制更新。如在網站如 apkpure 下載舊版的「安心出行」,若使用時沒有使用阻擋名單,程式會發出更新通知。若對安心出行有疑慮,這可能是其中一種利使用方法。

利申/宣傳:小鴨全力支持抗疫,特此呼籲,使用「安心出行」,若長時間阻擋,會錯過感染風險通知,若作出此設定,請在合法情況下安裝及使用如「出 duck 嚟行」的到訪紀錄程式,以便收到通知。「出 duck 嚟行」下一版將直接連接 API 網址,以下載資料並發出感染風險通知,單是阻擋 www.leavehomesafe.gov.hk 不影響運作,唯無法估計政府會否不斷更改 API 位置或以其他行動禁制使用。

能否安心?

回應主題,雖然前文在 1.0.4 版的 App 未見有可疑之處,(之後的版本因透明度降低未能評論),但據政府公布及其他跡象,政府會按部就班,加入更多涉及私隱的功能及要求更多權限。

自願實名登記

首先,根據傳媒報道流出的 1.0.0 版截圖[1],顯示安心出行原本是有紀錄「實名」的機制的。在設定版面,有「聯絡資料二維碼」一項,按入後再輸入姓名及資料,便會將資料生成二維碼,按截圖所載,應是供場地負責人掃描,而用戶須先同意場地負責人,將資料提供給政府,才會產生此二維碼。

截圖顯示的日子為10月27日,距離「安心出行」推出僅十多日。因此,推斷「安心出行」計劃可能已準備好另一套程式(「安心出行」場地負責人版),專供場地負責人掃描此收集「聯絡資料二維碼」,以作紀錄及上傳給政府。

但短短十多日後出街的 1.0.4 版,此功能離奇消失。報道中介紹上述功能的,是副政府資訊科技總監黃志光。可以推斷,有更高層的官員,以非技術原因,在最後關頭抽起此項功能。那麼究竟是什麼原因導致抽起此項功能呢,會否是為讓公眾起初較易接受程式?若程式多人接受,會否加回此功能,並強制不同場所執行呢?(尤其是政府有日「發現」,市民在食肆或其他場所留低的姓名及聯絡資料,含糊不清 …)恐怕政府有關官員以外,沒有人知道。

個案跟進及調查

在上文第三部,「安心出行」下載的組態檔中,有 enableCIenableFollowUp 的字眼,兩者皆設定為 False,即是尚未啟用。CI 有估計是 Case Investigation 的意思。問題是如果「安心出行」維持匿名及免登記,又不會上傳記錄,程式可以如何作跟進及個案調查呢?

可以想像,若要進行跟進及調查,程式日後可加入(或原本已存在,只是暫時抽起,日後補回)相關功能,例如政府以類似目前的強制性措施,令公眾「自願」實名登記及同意上載資料,日後若透過「安心出行」發現確診者的直接或間接接觸者,相關資料便可自動上載,以讓當局直接「跟進」接觸者有否受感染(例如強制檢測),甚至在不明源頭的情況,進一步將這些接觸者的到訪紀錄上傳(若多人使用「安心出行」,這些資料可以合併為接觸史的 social graph),一層一層的進行深入的「個案調查」,找出相關源頭。

上述當然只是憑兩個參數名稱天馬行空,但純以防疫角度,政府若掌握這些資料無疑是有幫助的,政府是否有類似類似後着,在「安心出行」使用普及時推出,希望公眾自願「為抗疫而而放下私隱考慮」(引局長的說法),目前仍是未知數。

藍芽定位

政府正與香港大學研究 beacon 藍芽定位,在小巴加設 beacon,讓「安心出行」自動用 BLE 即 Bluetooth Low Energy 記錄行蹤,而且已經進入試驗階段。

首先,這意味程式將加入令部份人更不安心的權限,包括藍芽相關權限,以及 Fine Location 權限(即和 GPS 相同的權限:使用 Bluetooth scan 自 Android 6 起要求 Coarse Location 權限,Android 10 起要求 Fine Location 權限,為在近年的機款運作,程式須要求後者)。

視乎程式若設計,若要求程式長駐背景作掃描,Android 10 以上還具要求 Background Location 權限,否則用戶須開 App 才可作掃描到結果。

獲得這些權限的程式,可以長期在背景收集用戶位置,包括 GPS, WiFi 及 流動電話網絡定位。

此外,即使用戶關上電話 GPS 及其他輔助定位功能、單純透過 BLE 定位,由於 BLE 在香港已有很全面的應用,亦能做到很準確的記錄用戶行蹤。

舉例說,所有港鐵月台已安裝 beacon,身在站內或車內作定位用途,即使是地底,已可做到以米計的精確度,亦即是說,你何時、坐哪班港鐵、哪個車卡、從什麼站到什麼站,已可以準確記錄。(順帶一提,安心出行與港鐵App是同一開發商,政府是港鐵大股東,移植相關功能及 beacon 數據,沒有難度。)

不搭港鐵嗎,BLE have you covered。九巴已在其數以千計的巴士站,安裝 beacon,用作車站定位及下車提示。大部份市區主要路段,已被覆蓋。同樣當局若向九巴取得 beacon 標識與巴士站的對應數據,已可追蹤使用者途經市區多個地點的紀錄(注意不一定要搭九巴的)。(順帶一提,新鴻基地產支持政府推出「安心出行」,旗下商場掃「安心出行」可獲贈積分換禮品。新地是載通國際大股東。)

當局選擇小巴作試驗,正是彌補了上述巴士及港鐵涵蓋不足之處,因為尤其是專線小巴,正正是行走一些較遠離市區核心,未有 beacon 的地方。

因此當局若解決了小巴以流動方式安裝 beacon 的判別問題,很容易便可將藍芽定位推廣至大部份公共交通工具。香港九龍新界地面地底無得避。

要公眾接受定位當然是有難度,因此先以看似較少影響的小巴,開始是以自願開啟定位的方式入手,到証實有成效時,才加入新措施全面推廣,是符合當局「按部就班」指導思想的做法。

感應大數據

此外,政府與浸會大學正研究以手機「感應位置變化速度」和大數據分析,來判斷用家是否已離開的士,以新增自動離開功能。在 Android 10 以上,這需要 Activity Recognition 權限。這涉及常見的感應器,包括 accelerometers, gravity sensors, gyroscopes, rotational vector sensors, orientation sensors 及 magnetometers,用途廣泛,可以透過監察手機的震動,方向,加速度等的詳鈿數據,用以識別用者的活動,如靜止,步行,乘車,升降機,以至更深入的步速,步行方向,上落樓梯等。此外,每人的步姿都有不同,透過步姿特徵辨識身份也是有可能的。隨着如 deep learning 技術普及和手機 neural network 運算效能提升,這些已不是天馬行空而是已成熟的技術,所以 Google 才為這些由來已久的感應裝置新加入 Activity Recognition 權限,提示用戶有關私隱影響。而 Google 在 Play Service 內亦提供 Activity Recognition API 供辨認基本的用戶活動 [2]。

與其他權限不同,感應器在 Android 10 以下是不能關閉的,在 Android 10 關閉選項(Sensors Off)亦藏在 Developer Options 內,一般用戶未必會找到。

總結

以上僅是客觀地列出了「安心出行」一些有跡可尋的發展可能性,以及其私隱影響,以供考慮及自行評估。如果大家相信政府的承諾,資料只會用於抗疫,上述可能性亦不足為懼。相反,對政府抱懷疑態度的公眾,是有相當數量。政府若真心抗疫,要達到全民參與,唯一可做的,就是和很多其他地方一樣,將程序開源讓公眾有效監察,並放上 F-Droid 等開源庫,由獨立可靠的第三方按源碼編繹,保證源碼及程式一致。用立法手段強制使用,將下載數字作為政績,而不同時提高透明度,只是自欺欺人的做法,令部份公眾用各種方式規避,對抗疫沒有好處。

[1] 資料來源:經濟日報

[2] 見 https://developers.google.com/android/reference/com/google/android/gms/location/ActivityRecognitionClient

在〈「安心出行」能否安心使用?(四)〉中有 4 則留言

「安心出行」API URL

[19/2 更新: 此段適用於 1.1.4或之前數個版本,1.1.6版已加回直接連結]
想問下:
“”原本程式連接至「大台」的 API URL base,是 hard code 在程式內的,不過在新版中,該 URL 已不再直接寫在程式內,而是從 https://www.leavehomesafe.gov.hk/site.json 取得。該網址目前返回以下 JSON”

即係用AD-block已經無用?

“薛永恒:港鐵應積極考慮使用安心出行”

用 BLE 意圖已經很明顯, 慢慢update再增加App使用權限, 用緊嘅用戶已經冇拒絕嘅可能

發表迴響

你的電子郵件位址並不會被公開。 必要欄位標記為 *