香港电脑保安事故协调中心 (HKCERT) 在官方网页内发表 “香港地区 Google Play 商店应用程式保安风险报告 (2019年4月)” [1],内里提到检测中发现 4款应用程式为高风险,包括;苹果动新闻, 三国杀繁体版,但细阅报告分析后发现错漏百出,而且内容不尽不实。
HKCERT 联同国家互联网应急中心 (CNCERT) 合作,从 Play Store 下载的应用程式进行恶意及可疑行为检测。报告检测了 200 款 App,发现其中 4 款为高风险应用程式,并指根据程式行为的安全威胁,列出的应用程式可被定义为高风险应用程式。
细看 “深度分析” 附件
这份报告内有一个 “高风险应用程式深度分析” 附件 [2],详列了上述四个 App 内的所谓可疑高危之处例如:读取手机号码, 通过连线访问网络 等,我们就抽取一些来研究一下。
读取手机号码
报告提到 “苹果动新闻” 读取手机号码,并附了下面一段程式码,报告更 Highlight 了 getLineNumber() 这一行。
getLineNumber 就是读取手机号码?? 看看 getLineNumber() 是从 variable arg7 进行的,而 arg7 本身是一个 StackTraceElement 的 Variable。
StackTraceElement [3] 在 Android Java Program 内是用于追查程式码执行时遇到的错误,而 getLineNumber() 就可找到对应程式码行数,让开发人员方便 Debug。
public int getLineNumber ()
Returns the line number of the source line containing the execution point represented by this stack trace element. Generally, this is derived from the LineNumberTable attribute of the relevant class file
getLineNumber() 跟电话号码完全没有关系的,到底要怎样才可会将 StackTraceElement getLineNumber() 当成电话号码呢?
通过连线访问网络
报告指连线访问网络是可疑之处,但 “苹果动新闻” 这个 App 又怎可能不连线上网呢。再看看报告内贴出 “连线访问网络” 所谓可疑程式码。
这段程式码是执行 http connection getResponseCode(),跟着再比较是否细过 200 或大过 300,到底是什么意思呢?大家上网偶然都会遇 404 Not Found 的网页,404 就是网站传回的 Response Code。当浏览网页时,网站会传回 Response Code 标示成功或错误,而 200 就是 OK, Success的意思,其他数值例如 301, 400, 404, 500 就用于代表不同的错误如网页搬迁, 找不到, 服务器错误 [4]。这段程式码纯粹判别是否有错误,根本就是零风险。
传送手机资料
报告又指 App 会传送手机资料。
看看报告内贴出的程式码,会看到是一个 shareToMessenger 的 function,内里就是呼唤 Android 系统内的 Intent [5] 功能进行 SEND 动作传送至 com.facebook.orca,而 external_uri 应该就是网址。其实这段程式码就是一般 App 内的分享功能,App A 透过 Android Intent 将资料传递至App B,例如在App内将文章分享至 Facebook, 分享至 Whatsapp 都会使用到 Android Intent 进行。整段程式码都是使用十分标准的 Android 功能,而对应的也是 Facebook Messenger package 名称,就是将网址分享至 Facebook Messenger。分享至 Facebook Messenger 完全跟传送手机资料无关系呢。
Soul Knight App 读取手机号码
报告内提到另一只 Soul Knight App 有 “读取手机号码”,指这是高风险行为,我们可以看看报告内贴出的程式码。
同样地标记着 v3 variable 的 getLineNumber() 这个 Function,大家可以看看程式码内 v3 其他 functions,包括有 getClassName(), getMethodName(),这些都应该是关乎程式码的功能,并不是跟电话号码相关呢。再看看紧接几行的 y.a, y.b function 内容,有 timestamp, message, sourceFile, lineNumber, methodName, stackTrace 这些几可肯定是用作 log 记录程式码内的错误问题呢,什么 source 档案, 第几行, 那一个 method 还有 stacktrace,怎可能跟电话号码相关呢。
又是跟上面一样,不知所谓地将 getLineNumber() 当成读取电话号码。
没有分析的报告
细看这份所谓的深度分析,每一个所谓可疑之处都只是单纯 call function,没有交代程式码 call function 后获得资料的用途。一个 App 读取一项资料并不代表它有可疑,读取了的资料之后如何应用,取用一个权限是否合理才是重点。”苹果动新闻” 连线访问网络有什么可疑呢?若果单纯 “连线访问网络” 就是可疑,那么天文台天气 App 又或交通 App 都会有可疑。
整份报告完全没有进行分析,只是单纯看到程式码有 call function 就判断为危险,而且内容更是错漏百出,将 StackTraceElement 的操作当成读取电话号码。这份报告真是连学生做的 Project 也不如,HKCERT 枉为一个 IT 专业呢。
References:
[1] 香港地区 Google Play 商店应用程式保安风险报告 (2019年4月)
[2] 香港地区 Google Play 商店应用程式保安风险报告 (2019年4月) 附件二
[3] Android Developer Documentation Reference – StackTraceElement
[4] HTTP/1.1: Status Code Definitions
[5] Android Developer Documentation Reference – Intent
你都系见有苹果动新闻先帮佢发声吧,如果没这app系名单里 肯定冇人帮其他app发声