全文共1962字,预计学习时长7分钟
为了抗击疫情,很多国家都开始使用追踪人们移动路径和健康情况的应用程序。在印度,政府发布了一款名为Aarogya Setu的移动联系人追踪应用程序。PlayStore上可以下载这款应用程序,迄今已经有9000万印度人下载并安装了。
在诺伊达,如果人们的手机上没有安装这个应用程序,可能会被处以监禁6个月或罚款1000卢比。如果立即下载,即可离开。他们这样做是为了让人们认真对待这个命令。
一切似乎很合理,但问题却是这样发生的。
访问app内部文件
4月3日,也就是该app上线2天后,我决定去看看1.0.1版本。当时是晚上11点54分,我花了不到两个小时的时间来研究这个app。
凌晨1点27分,我发现一个名为WebViewActivity的activity有些异常。这是一个webview,理论上,它负责展示web页面,例如隐私策略。
Aarogya Setu v1.0.1中的AndroidManife
而问题是,WebViewActivity能做的不止这些:
Aarogya Setu v1.0.1中的WebViewActivi
我利用onPageStarted检查了str参数的值。如果str:
· is tel://[电话号码]:它会要求Android打开拨号器并预拨号码
· 不包含http或https的话,没有反应
· 否则它将打开一个具有指定URI的webview。
可以看到,根本没有主机验证。因此,我试图通过发送以下命令打开该app的一个名为fightcona_prefs.xml的内部文件。
为什么说这是个问题?因为攻击者只需单击一次,就可以打开该app任何内部文件,包括其使用的本地数据库fight-covid-db。
掌握印度各地病患信息
5月4日,我决定继续我的分析,于是便打开了该app的v1.1.1版本,即当前版本。
一开始我就注意到先前描述的问题已经被开发人员默默地修复了。事实上,WebViewActivity从外部是无法访问的,他们删除了AndroidManifest.xml中的意图过滤器。
Aarogya Setu v1.1.1中的AndroidManife
为了继续我的分析,我决定在一个有根设备上使用这个app。然后,我直接收到了下面这条消息。
我反编译了应用程序,找到了这个根检测的实现位置。为了绕过它,我在Frida脚本中编写了一个小函数。
接下来我需要绕过证书锁定,以便能够监视应用程序发出的网络请求。成功后,我发现了这个app的一个有趣的特性。
利用这个app,您可以知道有多少人在您所在的区域进行了自我评估。还可以选择这个区域的半径,500米、1公里、2公里、5公里或10公里都可以。当用户选择了其中一个距离后:
· 他的位置被发送出去了:查看header中的lat和lon参数
· 发送半径选择:查看url中的dist参数和header中的distance参数
我注意到的第一件事是,这个端点返回很多信息:
· 不适人数
· 感染人数
· 可使用蓝牙的人数
· 您周围已进行自我评测的人数
· 您周围使用该应用程序的人数
我做的第一件事就是修改位置,看看我是否能在印度的任何地方获得这些信息。然后我将半径修改为100公里,看看在选择了该app不支持的半径范围下,我还能否接受到信息。正如你所看到的在前面的截图,我把我的位置改为新德里,设置半径为100公里,竟然成功了!
但这个做法太傻了。由于这个端点,入侵这个app的人可以知道在他选择的区域谁在哪个地方被感染了。例如,我可以知道我的邻居是否生病。这个操作有点傻,听起来像是我自己的隐私问题…
所以我决定试一试,看看在半径为500米的范围内,某些特定地方有多少人被感染了:
· PMO办公室:{“感染人数”:0,“不适人数”:5,“开启蓝牙的人数”:4,“成功”:是,“自我检测人数”:215,“附近用户数”:1936}
· 国防部:{“感染人数”:0,“不适人数”:5,“开启蓝牙的人数”:11,“成功”:是,“自我检测人数”:123,“附近用户数”:1375}
· 印度议会:{“感染人数”:1,“不适人数”:2,“开启蓝牙的人数”:17,“成功”:是,“自我检测人数”:225,“附近用户数”:2338}
· 印度陆军总部:{“感染人数”:0,“不适人数”:2,“开启蓝牙的人数”:4,“成功”:是,“自我检测人数”:91,“附近用户数”:1302}
信息披露
在我的第一条推文发出49分钟后,NIC和印度认证中心联系了我。我给他们发了一份简短的技术报告。
几小时后,他们发布了一份官方声明。
意思就是“没什么问题,请继续使用。”
然而正如你在文章中看到的,完全有可能使用不同于5个硬编码值的半径,所以很明显,他们在这一点上撒谎了,他们清楚地知道这一漏洞。他们甚至承认现在的默认值是1km,所以他们在我的报告之后对此做了更改
有趣的是,他们也承认用户可以获取多个位置的数据。通过三角测量,攻击者可以精确地获得某人的健康状态。
图源:unsplash
他们的回应真的很快,这令人欣慰,并且他们还解决了一些问题。但更重要的是:请停止说谎,停止否认。公信力是很脆弱的东西,人们的信任往往只有一次。
我们一起分享AI学习与发展的干货
欢迎关注全平台AI垂类自媒体 “读芯术”
(添加小编微信:dxsxbb,加入读者圈,一起讨论最新鲜的人工智能科技哦~)