2018年11月22日 星期四

分析台版FGO電話權限要求

最近發生更新台版 FGO 到 v1.20.1 後
會跳出「要允許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


看來官方放棄,還是要給予電話權限了

因此這邊要探究幾個問題:
  1. 到底 FGO 本身要了什麼權限?
  2. 為什麼 Android 出現訊息「要允許FATE/GO撥打電話和管理通話嗎?」,有 API 文件提到這件事嗎?
  3. 實際上 FGO 傳了那些資訊給 Server?
  4. 猜測 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營運方為什麼需要這些資訊

  1. 收集玩家硬體資訊:了解玩家的硬體規格,針對最大眾的硬體做優化
  2. 收集 Crash 報告:Debug用,如果發生大規模閃退時,可以有足夠的資訊定位問題
  3. 協助警方抓竊取他人帳號的嫌犯:聽說 IMEI 碼可以定位手機位置,以及取得手機購買人資訊,或許警方可以透過這條線索抓人
  4. IMEI 碼另一個用途猜測:單純用來當作唯一識別 ID

結語

雖然收集的資料之中,大概就 IMEI 最敏感了吧,但是不曉得這個資訊外漏會有什麼影響。
希望官方要提早說明收集那些資料,以及目的,最好可以讓玩家選擇是否提供資料





1 則留言: