報料 image
調查報道

「安心出行」內置人臉識別功能 資科辦承認 稱從未使用 正研究刪除

傳真社拆解Android版本的安心出行手機應用程式,發現程式內置人臉識別模組,具有包括識別臉部五官特徵和位置的功能。由於政府拒絕公開安心出行的源代碼,無法確定程式在運作時有否進行人臉識別。政府資訊科技總監辦公室回覆傳真社查詢時承認,承辦商在開發程式時使用了包含人臉識別功能的現成模組,但強調安心出行沒有亦毋須採用相關功能,已要求承辦商研究「在不影響程式正常運作的前提下」從程式中刪除有關模組的可行性。

安心出行手機應用程式於上月18日更新至3.2.0版本,傳真社早前從政府安心出行網站下載3.2.0、以及之前6個不同時期版本的Android程式安裝檔(又稱apk檔)進行拆解,提取裡面的執行檔(classes.dex)並轉換為人類可讀(human readable)格式java源代碼檔(java source file),以取得應用程式的源代碼。

將安心出行應用程式的classes.dex檔轉換成java後,可以讀取包含20多個檔案夾的源代碼庫。其中在「org」的檔案夾中,有一個名為「reactnative」的檔案夾,裡面載有3個分別名為「facedetector」、「camera」及「maskedview」的檔案夾。React Native是「安心出行」採用的一個開源應用程式框架(framework),其模組可以為程式提供不同功能,而從上述的「camera」檔案夾可見,安心出行使用了用作啟動電話相機鏡頭的react-native-camera代碼庫。

LeaveHomeSafe

不過,安心出行使用了為保護版權及防止程式被破解的代碼混淆處理(code obfuscation)技術,用英文字母或「f2」、「i6」等代號取代了源代碼中大部份模組(module)、函數(function)和類(class)的名稱。

LeaveHomeSafe's code obfuscation

在facedetector檔案夾內的4個java檔,就有3個的名字均被置換成代號,傳真社將其代碼內容與公開的react-native-camera-master主代碼庫比對後,發現兩者結構吻合,顯示當中的人臉識別模組有被導入到安心出行應用程式內。打開對應安心出行中代號「a.java」的「FaceDetectorUtils.java」檔案,可見裡面寫有偵測人臉特徵的代碼,偵測包括嘴、左右臉頰、左右眼、左右耳、鼻尖、左右耳珠等特徵的位置,並可將位置轉化為數據。代碼又可以偵測目標頭部傾側的角度,計算目標雙眼打開以及正在笑的機率。

除3.2.0版本外,傳真社對其他版本1.0.4、1.0.5、2.1.4、2.1.5、3.0.2和3.1.0的安心出行進行相同的拆解,結果發現全部均載有人臉識別模組,顯示該模組在2020年安心出行推出早期已存在,但安心出行網站和手機應用程式商店的介紹均沒有提及程式有相關功能。

安心出行應用程式由政府委託創奇思有限公司(Cherrypicks Limited)開發,根據安心出行網站公開的技術文件,承辦商使用的應用程式框架React Native可同時編寫iOS、Android系統的應用程式,兩者使用相同的代碼庫(codebase),故iOS、Android版本的安心出行程式源代碼大致相同。傳真社未有測試iOS版的安心出行程式。iOS版於上周六(30日)更新至3.2.1版本,Android則仍更新至3.2.0版本。

傳真社聯絡負責維護react-native-camera代碼庫、專門編寫React Native核心的維也納軟件公司Margelo創辦人Marc Rousavy,並將已拆解的安心出行檔案交予他閱覽。Rousavy指出,安心出行程式中有人臉識別模組,是因為程式使用react-native-camera代碼庫作為鏡頭控制組,當中包括該人臉識別模組。他表示現階段很難判斷安心出行有沒有使用人臉識別功能,因為安心出行程式打包檔使用了React Native Hermes機器編譯成非人類可讀的二進制代碼(bytecode),要再反編譯回可讀的Javascript非常困難。

不過Rousavy發現,在3.1.0版本安心出行的程式打包檔(index.android.bundle)內,人臉識別功能(onFaceDetected)被編配一個編號,此編號並被傳遞至另一個函數(function),雖然不清楚該函數的實際作用,以及未能確認人臉識別功能有沒有啟用,但Rousavy指出這顯示安心出行在偵測到人臉的同時,有可能會向硬碟寫入資料。

翻查3.2.0版本的程式打包檔,onFaceDetected無論傳遞至另一個函數或自身作為函數,均出現有可能讀取資料的行為。

曾承接政府合約的軟件工程師Leo To同樣表示,相信安心出行要使用的是react-native-camera中讀取二維碼的功能,但於開發程式時一併導入該代碼庫裡的人臉識別模組。他解釋,react-native 代碼庫是用作控制手機鏡頭,可以取得鏡頭的實時影像,以現時導入到程式的代碼來說,可以辨認到barcode或者QR code,亦可以識認到人臉。

不過Leo To強調,毋須使用的模組應該刪除,「這件事(程式保留人臉識別模組)在執行上是一定有問題的,我不會預期在這裡看到一個人臉識別模組。而我是否可以導入整個代碼庫,再刪除人臉識別功能呢?是絕對可以。」

軟件工程師Leo To亦指出,根據過往經驗,承接政府的應用程式合約,一定要向政府交出源代碼(source code),「但交上去他們資科辦是不會看的,他們只會告訴你,總之現時我遇到這個問題,你快點給我處理好。」他表示,「技術上Cherrypicks的開發人員是否無法刪除人臉識別功能?當然可以刪除,只在於他們會不會這樣做,以及OGCIO(資科辦)是否知情,可能OGCIO都不知道。」

一旦安心出行將來啟用人臉識別功能,Leo To認為未必需要索取額外的權限,「人臉識別只需要鏡頭權限。因為鏡頭影像就等同一條影片串流,影片串流在後台如何處理,跟權限已沒關係。」

傳真社另外使用Android Studio和實體電話進入除錯模式(debug mode)測試安心出行,發現程式僅使用了「camera ID 0」的硬件,即手機後背的主鏡頭,並未使用前鏡頭。假如市民使用安心出行時臉向手機畫面,以手機後鏡頭掃瞄二維碼,在程式未有使用前鏡頭的情況下,能夠對使用者進行人臉識別的機會相當小。

傳真社向政府資訊科技總監辦公室查詢有關情況,政府回覆指,根據資科辦與承辦商Cherrypicks了解,承辦商在開發「安心出行」時使用了市場上現成的「react-native-camera」模組,操作手機鏡頭以掃描場所二維碼、電子針卡二維碼和的士車牌號碼。政府指該模組具有多項功能,包括人臉識別功能,不過Cherrypicks從沒有在「安心出行」程式使用模組中的人臉識別功能,而且「安心出行」的運作沒有亦毋須採用相關功能。政府表示,在本社查詢之前,並不知悉安心出行程式裡有face detector模組,已即時要求Cherrypicks「研究在不影響程式正常運作的前提下,從程式中刪除face detector模組的可行性,免除公眾不必要的疑慮。」

資科辦又指根據政府與開發及運維承辦商(Cherrypicks Limited)的合約安排,「(政府)擁有「安心出行」程式及其原始碼(source code)的知識產權,但這並不包括由承辦商在開發時所提供的軟件的原始碼(例如Cherrypicks所擁有的軟件產品或市場上現成的商業(commercial)/開源(open source)軟件產品及程序庫/模組等)。」

資科辦在回覆中亦指出,程式有必要讀取手機資料,包括在儲存或讀取電子針卡功能時檢查手機有否啟動密碼或生物驗證、檢查「安心出行」版本、手機的系統版本、手機型號、以及Android系統中的API level。

回覆指,「我們一直重視公眾對私隱的關注,每次在『安心出行」』程式加入新功能時均會徵詢個人私隱專員公署的意見,確保符合《個人資料(私隱)條例》的規定。『安心出行』亦已通過由獨立第三方進行的私隱影響評估和資訊保安風險評估及審計,以確保安全可靠。」

不過翻查安心出行官網上公開的安全風險評估報告及私隱影響評估報告,安全風險評估報告中未有提及會審核多餘的模組。私隱影響評估報告的評估範圍及目標(Assessment Scope and Objectives)提到,承辦商有責任識別私隱風險及系統問題、以及識別系統對個人資料的潛在影響等,但亦未有提及審核源代碼中多餘的模組。

傳真社向安心出行程式承辦商創奇思查詢相關事宜,對方未有回應問題,僅回覆著記者向資科辦查詢。

安心出行於2020年11月16日推出供市民下載,用作進入指定場所時掃瞄二維碼,記錄進入及離開的時間和地點,以協助政府追蹤新冠肺炎傳播鏈。應用程式支援iOS、Android及華為系統。開發商Cherrypicks 創奇思有限公司母公司為中資網絡遊戲商網龍網絡控股有限公司(聯交所代號:777)。政府資訊科技總監辦公室4月13日書面回覆立法會,指於2022-23財政年度,政府資訊科技總監辦公室就營運及提升「安心出行」流動應用程式以支持政府最新防疫抗疫措施的開支預算約為860萬元,當中包括約360萬元為流動應用程式及後台系統的升級及維護支出,以及500萬元為支援及營運支出(包括相關的員工開支)。

創科局局長薛永恒本月13日在立法會財委會上表示,期望於5月初會更新安心出行版本,提供確診康復者紀錄等新功能,新版本3.2.0最終在僅5日後、即4月18就已推出。