會跳出「要允許FATE/GO撥打電話和管理通話嗎?」
如果不同意的話便無法繼續遊戲
站在使用者的立場,當然是希望能收集越少資料越好
或是至少要說明清楚收集的目的
以及給予玩家選擇的權利
(像是早期的 Windows 錯誤報告)
所以這篇文章會探究 FGO 使用那些權限
以及收集那些資料
本身只有在學校學過 Android ,而且很久沒碰了
如果有講錯的地方,歡迎在底下指正
背景
2018/11/13
最早是在這篇 「[問題] 有人台版更新後也開不了遊戲嗎」https://www.ptt.cc/bbs/FATE_GO/M.1542104034.A.FC7.html
有人發現升級到 v1.20.1 後,會無法開啟遊戲,畫面會一片黑
但是接著有人發現給予電話權限後,就可以正常進入遊戲
2018/11/15
後來官方發布訊息https://www.facebook.com/FateGO.TW/posts/727941087575860
2018/11/21
過了好幾天後,官方回應後續https://www.facebook.com/FateGO.TW/posts/731173643919271
看來官方放棄,還是要給予電話權限了
因此這邊要探究幾個問題:
- 到底 FGO 本身要了什麼權限?
- 為什麼 Android 出現訊息「要允許FATE/GO撥打電話和管理通話嗎?」,有 API 文件提到這件事嗎?
- 實際上 FGO 傳了那些資訊給 Server?
- 猜測 FGO 需要這些資訊的用途?
權限測試
首先先重現不給予電話權限的狀況測試設備:
手機:Sony XZ F8332
作業系統:Android 8.0.0
首先將自己的手機的 FGO 升級到 v1.20.2
先測試不給手機權限
出現要求手機權限視窗,先按拒絕
結果就是一片黑,放幾分鐘還是沒反應
到底 FGO 本身要了什麼權限?
要回答這個問題,就要拆 APK 來看看 AndroidManifest.xml
那首先要取得 APK 檔參考這篇 stackoverflow 答案,使用 adb 取出手機的 apk
接著使用 apktool 拆開 APK 檔,並開啟 AndroidManifest.xml
所有權限只有這個跟電話有關
<uses-permission android:name="android.permission.READ_PHONE_STATE"/>
到 Android 官方文件查查 READ_PHONE_STATE 可以做什麼
https://developer.android.com/reference/android/Manifest.permission#READ_PHONE_STATE
看起來能讀取手機號碼、基地台網路資訊、打出去電話的狀態(?)跟註冊在手機的電話帳號(?),最後兩個不是很清楚用途
話說電話還有那些權限?讓我們查查
https://developer.android.com/guide/topics/permissions/overview
看來還有其他權限可以使用,像是:
PHONE:
CALL_PHONE:撥打電話
ANSWER_PHONE_CALLS:接電話(?)
看看其他類別:
CONTACTS(聯絡人):
READ_CONTACTS:讀取聯絡人
WRITE_CONTACTS:寫聯絡人
所以看起來只使用 READ_PHONE_STATE 的話,只能讀取一些跟手機有關的資訊,撥打電話或是讀取聯絡人都是辦不到的。
另外,印象中 IEMI 碼也需要這個權限才能讀取。
為什麼 Android 出現訊息「要允許FATE/GO撥打電話和管理通話嗎?」,有 API 文件提到這件事嗎?
回到剛剛 Android API 文件,在 Permission groups 有提到:https://developer.android.com/guide/topics/permissions/overview#perm-groups藍色框框是指:當 APP 要求其中一個權限時,給使用者看的說明是權限所屬的Group說明,例如:要求 READ_CONTACTS 權限,會顯示「此 APP 要求存取你的聯絡人」,當使用者同意後,也只會給予 READ_CONTACTS 權限。
紅色框框是指:如果 Group 裡的權限有被授權,那下次 APP 要求同 Group 其他的權限時,會自動同意,不需要使用者操作,例如:當 READ_CONTACTS 權限已經被授權,那下次 APP 要求 WRITE_CONTACTS 時,會自動同意。
所以同理可證,當 FGO 要求 READ_PHONE_STATE 時,就會顯示「要允許FATE/GO撥打電話和管理通話嗎?」,即使 FGO 只要求 READ_PHONE_STATE 。
實際上 FGO 傳了那些資訊給 Server?
要解答這個問題,最直覺的方法是側錄手機封包,不過由於現在 Android 安全政策的關係,要側錄加密封包越來越困難,但是還有辦法解決就是。
接下來使用 mitmproxy 這個程式擷取封包,並看看內容。
首先架好環境後,開啟 FGO 登入,並觀察封包
其中發現一條傳到 appsflyer.com 的 request,裡面有 IMEI 的資訊,看起來還有電信業者的名稱(因為我用模擬器,所以名稱很奇怪)
Google 看看 appsflyer.com 是什麼,看起來收集使用者手機資訊的公司,幫助開發者了解哪些人有使用他們APP
話說去翻 API doc
https://support.appsflyer.com/hc/en-us/articles/207032126-AppsFlyer-SDK-Integration-Android#24-setting-the-required-permissions
READ_PHONE_STATE 竟然不是必須的選項...
接下來看到另一個 request,是傳到 android.bugly.qq.com
資料看起來有編碼或加密,所以不確定裡面有什麼資料
Google 看看是什麼服務,根據網頁的介紹,似乎是可以收集 APP Crash 後的資訊,方便開發者偵測與處理
猜測 FGO 需要這些資訊的用途
準確一點來說,應該是猜測台版FGO營運方為什麼需要這些資訊- 收集玩家硬體資訊:了解玩家的硬體規格,針對最大眾的硬體做優化
- 收集 Crash 報告:Debug用,如果發生大規模閃退時,可以有足夠的資訊定位問題
- 協助警方抓竊取他人帳號的嫌犯:聽說 IMEI 碼可以定位手機位置,以及取得手機購買人資訊,或許警方可以透過這條線索抓人
- IMEI 碼另一個用途猜測:單純用來當作唯一識別 ID
結語
雖然收集的資料之中,大概就 IMEI 最敏感了吧,但是不曉得這個資訊外漏會有什麼影響。
希望官方要提早說明收集那些資料,以及目的,最好可以讓玩家選擇是否提供資料
非常棒的分享
回覆刪除