大家好,又见面了,我是你们的朋友全栈君。
1、前言
周围总是有些同学QQ被盗号,攻击者盗取账号后会继续去欺骗列表里的好友,形成链式反应。危害比较大。
腾讯QQ安全中心提供了登录保护机制,如图:
但是,有位同学在开启QQ登录保护的情况下依然被盗号者登录成功了。
当我们开启了“登录保护”,盗号者登录QQ输入正确的密码,即使更换IP骗过了安全检测系统,会发现仍然需要验证密保手机短信里的数字验证码才能真正登录成功,由于手机随时带在我们的身边,盗号者无法偷走手机拿到短信,也就无法继续作恶了。
其原理就是,登录时,QQ会检测是否在新设备登录或者在异地登录,一旦发现在新设备(未知设备,可疑设备)或者异地登录,都会向绑定的手机发送验证码,从而阻止盗号者登录QQ。
2、绕过安全检测
被盗号的同学表示并未收到短信验证码,当时我就在想:难道攻击者找到某种途径绕过了腾讯的安全检测?
首先,绕过异地登录检测可以通过修改IP地址来实现。上一期:传送门。我们讲到,定位的3种方法,那是针对手机的,针对电脑的还有一种就是IP定位,这个只能确定大致范围,很不准确。所以盲猜也能想到是利用IP定位,这样只需要修改IP地址就可以轻松绕过。
那么接下来只需要绕过新设备的检测就可以了,那么QQ是如何判断是否是新设备呢。
3、Android判断设备唯一性
我们要判断是不是新设备,只需要给每个设备一个唯一的ID,当设备ID和数据库存储的常用ID不同时,就认定为新设备。
IMEI:IMEI可以说是比较理想的设备ID,具备唯一性,恢复出厂设置不会变化(真正的设备相关),可通过手机拨号:*#06# 查询手机的IMEI码。如图:
值得一提的是,获取IMEI需要申请”READ_PHONE_STATE” 权限,做过Android开发的想必应该知道这个权限有多麻烦了。Android 6.0以后, 这类权限要动态申请,很多用户可能会选择拒绝授权。有的APP不授权这个权限就无法使用, 这会大大降低用户对APP的好感度。
Android 10.0以后彻底禁止第三方应用获取设备的IMEI(即使申请了 READ_PHONE_STATE 权限)。这使得用IMEI作为设备ID有些困难。
设备序列号:在Android 7.1或更早系统(SDK<=25),可通过android.os.Build.SERIAL获得,由厂商提供。如果厂商比较规范的话,设备序列号+Build.MANUFACTURER应该能唯一标识设备。但现实是并非所有厂商都按规范来,尤其是早期的设备。
最重要的一点是,Android 8.0及以上(SDK>=26),android.os.Build.SERIAL 总返回 “unknown”;若要获取序列号,可调用Build.getSerial() ,但是需要申请”READ_PHONE_STATE”权限。到了Android 10.0(SDK>=29)以上,则和IMEI一样,也被禁止获取了。
MAC地址:大多Android设备都有Wi-Fi模块,因此,Wi-Fi模块的MAC地址就可以作为设备标识。基于隐私考虑,官方不建议获取MAC地址。因此,获取MAC地址也是越来越困难了,Android 6.0以后通过WifiManager()获取到的MAC地址是固定的。7.0之后读取 /sys/class/net/wlan0/address 也获取不到了。
另外,Android 9.0及以上版本默认使用了“随机MAC地址”。
ANDROID_ID:Android ID是获取门槛最低的,不需要任何权限,64bit的取值范围,唯一性算是很好的了。但是一些举措会改变这个值,如:刷机、root、恢复出厂设置等会使得 Android ID 改变。
在Android 8.0以后,ANDROID_ID根据应用签名和用户的不同而不同。ANDROID_ID的唯一决定于应用签名、用户和设备三者的组合。这意味着如果用户安装APP设备是8.0以下,后来卸载了,升级到8.0之后又重装了应用,Android ID会改变。
但是QQ判断新设备的依据,可不是简单的以上几种。因为你会发现不论伪造哪一种ID(或者全部伪造),登录QQ时依然提示在未知设备登录需要验证。
由于我们不可能知道QQ的源代码,所以具体它是依据什么进行判断的我们无从得知。但是大致推测,QQ应该是采用多元记录进行拼凑设备ID。如下是某部手机的一些硬件信息:
BOARD: umi
BRAND: Xiaomi
DEVICE: umi
DISPLAY: QKQ1.191117.002 test-keys
HOST: c5-miui-ota-bd074.bj
ID: QKQ1.191117.002
MANUFACTURER: Xiaomi
MODEL: Mi 10
PRODUCT: umi
TAGS: release-keys
TYPE: user
USER: builder
我们假设QQ是通过以上信息来计算设备ID,可以肯定的是根据所搜集的信息可以确保唯一性,同时会经过某种算法进行加固,例如hash算法的盐值(salt)。这样就算我们历尽千辛万苦知道了拼凑ID的全部信息,但是由于不知道算法结构和无法逆推盐值,依然无法伪造成原设备。
一句话概括就是:QQ会收集很多硬件信息,然后通过某种算法,生成唯一设备ID。由于盗号者不知道QQ是依据哪些信息来生成ID的,也不知道生成ID的算法是怎样计算的,所以无法伪造成原设备ID。
总结
那么为什么那些被盗QQ的同学没有收到短信验证呢?要知道,当盗号者获取你的账号密码后,不一定就要登录QQ,还可以登录QQ邮箱、QQ空间、腾讯旗下的游戏等。这些应用往往没有像QQ那么强的安全保护,所以往往可以登录成功。通过查看异常登录信息,也验证了我的猜想:
要知道,QQ是不允许多设备登录的,例如当有另一台手机登录时,我们手上的手机QQ就会被挤下线。不过可以在不同的客户端登录,例如可以同时电脑QQ和手机QQ在线。但在不登录QQ的情况下,比如上图的登录QQ邮箱,手机端是不会被挤下线,也不会提示电脑登录。 如下图:
可以看到,盗号者并不会直接登录QQ(主要是他也登不了,上文已经分析了),而是登录一些与QQ相关的业务。
不过还是有办法的,邮箱登录保护也开启,开启后,仅能使用电脑网页和手机客户端登录邮箱,其他方式将无法使用。邮箱二级密码依然保持有效,设置了邮箱二级密码的用户登录邮箱依然需要输入二级密码。QQ邮箱网页版需用QQ安全中心扫描二维码登录:
当盗号者尝试登录QQ邮箱时,会出现以下信息:
当我们把所有的登录保护全部开启后,就算密码不小心泄露了也不用担心。盗号者登录时需要短信验证码,这样就不怕被盗号了。当然如果盗号者不但获取了你的账号密码,还把你的手机也偷了,那就真的无能为力了。
关注
极客随想,获取更多干货!
发布者:全栈程序员-用户IM,转载请注明出处:https://javaforall.cn/150655.html原文链接:https://javaforall.cn
【正版授权,激活自己账号】: Jetbrains全家桶Ide使用,1年售后保障,每天仅需1毛
【官方授权 正版激活】: 官方授权 正版激活 支持Jetbrains家族下所有IDE 使用个人JB账号...