一个手机热点泄露你所有的账户信息?

在移动互联网生活中,用手机建立热点共享网络是一个很常见的场景,无论是Android还是iOS系统,简单的几步操作就可以迅速的建立热点,将你的4G网络分享给他人使用。

由于连接热点的热备和宿主之间网络互通,操作系统做了很多隔离和保护措施,以保障热点的安全使用,通过热点的机制去攻击宿主操作系统是一件很困难的事情。尽管如此,随着一些新兴业务的开展,通过热点窃取你所有账户也成为了可能……

手机热点背后到底泄露了什么东西?这要从“手机号码一键登录”开始说起。

0x0 什么是“手机号码一键登录”

移动互联网时代,手机里APP的数量越来越多,而初次使用APP通常采用“手机号+验证码”的方式进行注册,填写验证码是一个非常麻烦的事情,早期的APP直接获取短信权限,从短信中提取出验证码帮用户填好,但随着用户隐私意识的加强通常不会赋给APP读取短信的权限,于是就只能手动去短信中找出验证码,多次点击跳转复制粘贴的操作使注册流程变动非常繁琐。

为了解决这个用户痛点,运营商推出了“手机号码一键登录”这个技术(也叫“本机号码一键登录”、“手机号免密登录”等),彻底告别了验证码。

例如手机上打开”货拉拉“,APP会自动获取你手机号,点击”本机号码一键登录“后这个按钮后,APP会直接使用你的手机号进行注册登录,整个过程中不需要任何验证码,做到了真正的一键登录。

upload successful

如此简单的交互彻底解决了APP在注册和登录时的痛点,告别了烦人的短信验证码,为互联网应用提供全新的用户账号认证一站式解决方案。

然而,作为一名安全研究人员,看到自己的手机号在没有任何权限提示的情况下直接被显示了出来,自然而然的产生了警觉。为了探索这种技术的安全性,我对其背后的原理进行了分析。

0x1 一键登录的原理

我们带着几个疑问去解释一键登录的原理。

1.手机号能被APP获取吗?

正常情况下,APP是无法读取手机号的,即使给了APP所有的权限,它也读取不了。但Android确实提供了一个读取手机号的API —getLine1Number,使用这个API读取手机号的前提是手机号已经明文硬写在了SIM卡中,然而很多SIM卡是没有硬写入手机号码的,因此APP是读不到手机号的,那么通过“本机号码一键登录”的方法是如何拿到手机号的呢?想来想去,也只有和运营商合作了。

事实上,在使用“一键登录“时,必须要打开手机的数据流量,只开启wifi的情况下无法使用这种技术,这样进一步印证了该技术和运营商有关。

2.运营商为什么能拿到手机号?

这就有点废话了,SIM卡本来就是运营商核发的,当然知道哪个卡对应哪个手机号。这里可能是APP搜集了imsi、iccid等SIM卡上的信息,用这些信息去运营商查询手机号码,也可能是运营商直接从网关处获取手机号返回给APP端,具体细节后文再详细分析。

所以我们猜测一键登录的原理大概是: APP使用数据流量发送一个数据包,运营商根据这个数据包就可以查出是哪个sim卡发出的,进而也就知道了发送方的手机号码,把这个手机号返回给APP就可以了。

然而市场上纷乱的APP是不可能直接从运营商那边直接获取用户手机号码的,那么他们是如何合作的呢?

3.APP如何和运营商合作?

我们对”手机号一键登录“进行了逆向分析,发现其工作流程如下:

upload successful

其中:

  1. APP利用数据流量向运营商服务器发起请求
  2. 运营商返回带掩码的手机号(例如176_**_1234)和以及一个accessCode
  3. APP携带accessCode向APP服务端发起请求获取明文手机号
  4. APP的服务端带着accessCode访问运营商服务端
  5. 运营商将手机号密文和公钥返回给APP服务端
  6. APP服务端解密后完成注册和登录逻辑

(因各个运营商的实现机制不同,上述流程可能存在细节性的差异,但核心原理基本相同)

上述流程和一个第三方的OAuth机制非常相似,也许不同运营商在实现上存在一些和常见OAuth漏洞那样相似的安全问题,例如Access Token复用、越权等,但这里我们抛开这些实现上的问题,分析一种更严重的安全隐患。

上文中我们提到APP端可能上传了imsi、iccid等SIM卡的信息去置换获取了手机号码,我们通过hook技术,把和SIM卡相关的信息全部置空,发现一键登录依然可以正常使用。此外,这种方式在正常的wifi连接下也能实现,APP也没有必要强制用户打开数据流量使用。因此,运营商大概率直接从网关处获取手机号码的,“一键登录”技术使用的核心就是4G网络。

传统的使用手机验证码登录的方式,本质上是借助“用户的手”,实现了对手机号和SIM卡一致性的验证。新兴的“一键登录”的技术,本质上是利用运营商的移动网络,完成了对手机号和SIM卡一致性的验证。前者借助了人,但会令人感到繁琐。后者借助了网络,似乎更加简单和完美。但缺少了人这一层“验证”,安全却大打折扣了。

0x2 一键登录的安全风险

“一键登录”的本质是借用了运营商的移动网络,如果攻击者也可以使用受害者的4G网络,就意味着可以使用“一键登录”窃取受害者账号了。

简单的想,攻击者可以偷取受害者的SIM卡去使用“一键登录”,但事实上,如果有SIM卡的话,攻击者完全可以用验证码的方式登录了,而没必要“一键登录”,这属于典型的物理接触攻击。也许你想过用“补卡攻击”、“SIM卡克隆”等各种花式攻击手段,但严格来说这不能算是严重安全问题。

那么如何在不接触SIM卡的前提下去使用他人的4G网络呢?这就回到了本文的标题 —— 手机热点。

1.利用手机热点窃取账号

手机热点是最简单的共享4G网络的方式,我们成功实现了一套攻击流程。

我们用A手机的数据流量建立热点,使用无SIM卡的B手机通过热点进行连接,并强行进入一键登录页面,最终显示获取的手机号是A,且成功登录上了A的账户。

(当然,具体的实现细节远不止这么简单,你需要做到“让B手机上的APP认为它正在使用4G网络,但实际上它却是连着wifi热点”,此外,各大运营商均有不同复杂安全策略需要绕过,所以具体的攻击代码在这里就不分享了)

除了一键登录外,我们还可以一键注册,即使受害者从未使用自己的手机号注册过某APP,攻击者可以提前用他的手机号进行“抢注”。

整个登录或者注册过程,受害者仅仅是共享了一个热点,却丝毫未察觉他手机上各种APP的账号已经被攻击者登录了,甚至是他未注册的APP也被提前注册了,仔细想想是一件多么可怕的事情。

2.在受害者手机上安装恶意APP

通过热点的方式进行攻击是基于双方在一定的信任前提下的,如果说这种方式比较low的话,我们介绍另一种更low的方式 —— 在受害者手机上安装恶意APP。

原理不用细说,恶意APP无非就是为了把受害者手机上的网络共享出去,通过建立一个网络代理,将远端攻击者“一键登录”的流量通过受害者的4G网络发出去,再把运营商返回的数据转给远端攻击者。

既然APP都装到受害者手机上了,本身就可以使用4G网络了,干嘛还要搞个代理那么麻烦,直接逆向各大APP的协议,模拟各个APP进行“一键登录”就好了。

在各个品牌手机严控安装来源的策略上,安装恶意APP固然是很low的,但和手机热点攻击的方式相比,攻击距离可以不受限制。

3.利用浏览器漏洞建立网络代理

如果说安装恶意APP很low的话,这个时候就需要祭出浏览器漏洞了,浏览器漏洞可以实现点一个链接就可以RCE的效果,RCE下建立一个网络代理自然也不是问题了。

但我都可以手机上RCE了,拿到所有APP的token进行登录也不是什么问题了,“一键登录”唯一可利用的地方也就是用手机号抢注一些APP了。

需要注意的是,这里的RCE必须是APP进程下的RCE或者突破沙箱下的浏览器的RCE,毕竟浏览器的Render下的RCE连Socket都建不了,更不用提建立网络代理了。

当然,到这一步我们没有再实现了。

0x4 影响分析

“手机号一键登录”这个漏洞原理看似简单,但其影响范围是非常大的,其主要表现在:

  • 与系统无关,Android和iOS设备都可以建热点
  • 漏洞场景简单,受害者账号被登录后几乎无察觉
  • 攻击者可以提前于受害者“抢注”账户
  • 使用手机号一键登录的APP较多

这些受影响的APP大都是集成了“本机号码一键登录”的SDK,通过扫描后发现,Top 100 APP中有23款应用存在问题,其中不乏如京东、抖音、今日头条、百度等大厂软件,具体的列表考虑到其他因素就不贴了。所以毫不夸张的讲,分享一个热点,你手机上的“半壁江山”可能都被别人盗取了。

其中,提供“手机号一键登录”的运营商:

这些官方的SDK支持的运营商也各有差异,其中电信的SDK支持三大运营商手机号码,移动的SDK也支持联通号码,联通的SDK仅支持自己。也正是由于这些官方SDK的支持不一,出现了各种同时支持三大运营商的第三方SDK,比较典型的有:

这些SDK完成一次登录的费用远低于短信验证码的费用,这也是“手机号一键登录”技术除了便捷外,能够很快普及,被各大厂APP使用的另一个原因。

此外,除了国内的运营商使用了“手机号一键登录”技术,也有国外的运营商使用同样技术。例如,美国四大电信商AT&T、Sprint、T-Mobile和Verizon结盟,联手提出了验证计划Mobile Authentication Taskforce,限于SIM卡资源问题,我们没有对其进行研究。

0x5 后记

这个漏洞在GeekPwn 2019上已经被选手演示了,参考我只是开了一个手机热点,为什么我的账号都被盗了。截止在本文发布之时,多数之前存在漏洞的APP已经作了修复。我在19年7月份发现的这个漏洞,后因其他事情没有继续研究下去,本文对之前的研究进行了整理。

参考资料:

  1. APP本机号码一键登录如何实现? https://www.zhihu.com/question/316829163
  2. 惊!!!网站居然可以不经授权获取用户手机号码 https://www.v2ex.com/t/497976
  3. 移动验证:本机校验和一键登录 https://blog.csdn.net/peng_up/article/details/84024991
  4. 极光大数据:移动认证再进化,一键登录或成大势所趋 http://biz.ifeng.com/a/20190306/45334883_0.shtml
  5. 本机号码一键登录 https://mp.weixin.qq.com/s/CLhBn5pmOVA1TYbRYCqTtg
  6. 好奇一键登录是怎么实现的吗?进来了解一下 https://mp.weixin.qq.com/s/91gvgalgwag44gdluPIvLg