为了对抗Covid19,印度政府发布了一款名为Aarogya Setu的移动联系人追踪应用程序。这个应用程序在Playstore上可以买到,已经有9000万印度人安装了它。
这个应用程序目前在印度获得了很大的关注。在诺伊达,如果人们没有在手机上安装应用程序,一个人可能会被判处最高6个月的监禁或最高1000卢比的罚款。
4月3日,也就是这款应用上线2天后,我决定看看这款应用的1.0.1版本。那是晚上11点54分,我看了不到2个小时。
凌晨1点27分,我发现一个名为WebViewActivity的活动行为异常。这个活动是一个网页浏览,理论上负责显示网页,例如隐私政策。
问题是WebViewActivity能够做的比这多一点。
如您所见,onPageStarted方法检查了str参数的值。如果str:-是tel://[电话号码]:它将要求Android打开拨号器并预拨号码-不包含http或https,它什么也不做-否则它将打开具有指定URI的网页视图。
如您所见,根本没有主机验证。因此,我尝试通过发送以下命令打开名为FightCorona_prefs.xml的应用程序的内部文件。
为什么这是个问题?攻击者只需单击一次即可打开任何应用程序内部文件,包括名为Fight-covid-db的应用程序使用的本地数据库
5月4日,我决定进一步分析,我分析了这款应用的v1.1.1版本,也就是目前的版本。
我注意到的第一件事是前面描述的问题已经被开发人员悄悄地修复了。实际上,WebViewActivity不能再从外部访问,他们删除了AndroidManifest.xml中的意图过滤器。
为了继续我的分析,我决定在一台有根基的设备上使用这款应用程序。当我尝试的时候,我直接收到了这条消息。
我反编译了这个应用程序,并找到了这个根检测的实现位置。为了绕过它,我在Frida脚本中编写了一个小函数。
下一个挑战是能够绕过实现的证书锁定,以便能够监控应用程序发出的网络请求。一旦我这样做了,我使用了这款应用程序,发现了一个有趣的功能。
在这款应用中,你可以知道在你所在的地区有多少人做了自我评估。您可以选择该区域的半径。它可以是500米、1公里、2公里、5公里或10公里。
当用户单击以下距离之一时:-发送他的位置:查看标题中的经度和经度参数-发送半径选择:查看url中的dist参数和标题中的距离参数。
我注意到的第一件事是,这个端点返回了很多信息:-感染人数-不适人数-声明为蓝牙阳性的人数-在您周围进行的自我评估的人数-在您周围使用该应用程序的人数
因为我很笨,我尝试的第一件事就是修改位置,看看我是否能在印度的任何地方获得信息。第二件事是将半径修改为100公里,看看我是否能够获得应用程序中没有的半径信息。正如你在前面的截图中看到的,我将我的位置设为新德里,并将半径设置为100公里,它起作用了!
后果是什么?多亏了这个端点,攻击者可以知道谁在印度的任何地方,在他选择的地区被感染。例如,我可以知道我的邻居是否生病了。听起来像是我的隐私问题,…。
所以我决定稍微玩一下,看看在半径500米的一些特定地方谁感染了病毒:-PMO办公室:{“感染”:0,“不适”:5,“蓝光阳性”:4,“成功”:TRUE,“Self Asses”:215,“usersNearBy”:1936}-国防部:{“感染”:0,“不适”:5,“蓝光阳性”:11,“Success”:TRUE,“(自述):215,”usersNearBy“:1936}-国防部:{”感染“:0,”不适“:5,”BluetothPositive“:11,”成功“:TRUE,”“usersNearBy”:1375}-印度议会:{“感染”:1,“身体不适”:2,“BluToothPositive”:17,“Success”:true,“selfAsses”:225,“usersNearBy”:2338}--印度陆军司令部:{“感染”:0,“身体不适”:2,“BluetothPositive”:4,“Success”:TRUE,“selfAsses”:91,“usersNearBy”:1302}。
在我最初发推文49分钟后,NIC和印第安人证书联系了我。我给他们寄了一份小小的技术报告。
我对他们的回答是:-正如你在文章中看到的,完全可以使用与5个硬编码值不同的半径,所以很明显他们在这一点上撒谎,他们知道这一点。他们甚至承认现在的默认值是1公里,所以在我的报告之后,他们对生产进行了更改-有趣的是,他们还承认用户可以获得多个位置的数据。多亏了三角测量,攻击者可以用一米的精度获得某人的健康状况。-批量通话是可能的,我的朋友.。我花了一天时间给这个端点打电话,你也知道。
我很高兴他们很快回复了我的报告,并解决了一些问题,但我是认真的:停止撒谎,停止否认。