from:https://unicorn.360.com/blog/2018/04/18/GoodBye_5G_IMSI-Catcher/

0x00 IMSI & IMSI-Catcher

我们以前担心的手机泄漏个人位置隐私的问题,也就是在2G/3G/4G一直存在的IMSI Catcher问题,终于有望在5G标准里得到彻底解决啦! 这个问题在每次制定新一代网络标准的时候,都要争论一回。这是网络功能性、成本与安全性之间的斗争。在5G的第一版标准,Release15,关于安全的标准[1]中,IMSI加密是最大的亮点。

在2/3/4G网络中,攻击者能通过十分廉价的设备获取你的位置。这是由于手机每次需要联网的时候都要大声喊着,“我是谁谁谁”,攻击者就可以通过手机报告的信息确定手机的大概位置了。专业一点的说,手机所广播的那条“我是谁谁谁”就是手机的IMSI码,全球唯一,就如同你的身份证号。设想,如果满大街都在喊着每个人的身份证号,那么追踪某一个人就变得容易了。

当然实际上,IMSI这么关键的信息不会在你发送的每条信息中都带着。手机还会有一个临时身份证(GUTI/TMSI),平时传递数据都是使用这个临时身份证,手机只有在特殊的场景下会发送自己的IMSI。手机会在哪些场合会发送自己的IMSI呢?

0x01 什么情况下手机会发送IMSI?

情景一:手机接入正常的网络时
手机开机后,先从USIM中读取之前运营商分配的临时身份信息GUTI/TMSI,发送携带该身份信息的信令给基站,请求接入运营商网络。基站收到该消息后便转发给核心网的MME,若MME中可以查询到对应的GUTI/TMSI对应的真实身份,则允许手机接入。若MME查询不到,则需要重新对手机发起真实身份核验的请求“Identity Request”,即要求手机提供真实身份IMSI。
通常触发手机真实身份验证的合理情况有:手机首次入网或手机移动到其它MME覆盖范围后,MME中无法从网络中查询到手机的GUTI/TMSI,故而需要手机上报自己的真实身份。
在这种情景下,攻击者只需采取被动监听就可以捕捉到手机的IMSI。

情景二:手机接入到伪基站网络时
伪基站通过高信号强度压制真实基站把手机吸进来(手机会自动选择信号强度最强的基站),之后强行给连接过来的手机发送身份验证请求消息——“Identity Request”,手机就会乖乖的把自己真实身份报上来。
在该情境下,攻击者采取的是主动攻击,需要打开伪基站,不停的发送“Identity Request”就可以获取周围手机的真实身份。
这种获取IMSI的工具,就称为IMSI Catcher,其中比较出名的一款工具叫Stingray(黄貂鱼),目前被一些执法部门使用。Stingray是一款同时具有被动监听(监听+数据分析)和主动攻击(伪造基站)的IMSI Catcher。通过获取IMSI,TMSI,IMEI可以更好地获取移动终端的数据信息。并且设备非常便携,可以装在飞机、汽车、无人机等交通工具适用以上两种情景,并且该设备还可以测绘基站的分布情况,自行进行数据分析,追踪目标手机位置,监听通信内容,进行DDoS攻击等。


图:Stingray(图片来自网络)

讲到这,大家一定有疑问,这么重要的身份信息为何不能加密传输呢?因为在建立安全连接的过程中,一开始网络不知道手机是谁,要先知道它是谁,才开始交换密钥,换句话说,核心网在加密信息前要确定对方是自己人。

0x02 5G是如何解决IMSI-Catcher问题的呢?

5G决定引入公钥私钥的机制,公钥用来公开并加密,私钥用来保留并解密。将公钥存放在手机端,私钥存放在运营商手里,如此一来,只有运营商可以解密手机的真正的身份信息,攻击者只能拿到加密后的信息,没有私钥而无法解出IMSI。

此时,整个手机的鉴权流程是什么样的呢?
手机的真实身份在5G里称为SUPI(SUbscription Permanent Identifier)(类似IMSI),通过公钥加密后的密文称为SUCI(SUbscription Concealed Identifier),SUCI传送给基站后,基站直接上传至核心网[1]。
大概的流程如下图所示:

    1. 手机向基站gNB发起接入网络的请求,发送SUCI(即加密的SUPI)或是GUTI;(注:在4G和5G共存的时代,将存在两种无线接入与核心网,这里我们单讨论5G里通过NR-gNB作为接入核心网NGCN(NextGen Core)的方式)
    2. 基站gNB收到信息后,转发至核心网的SEAF(SEcurity Anchor Function);
    3. SEAF收到信令后解析后看是GUTI还是SUCI,若是GUTI就匹配到对应的SUPI,若为SUCI则不解密,继续向AUSF(Authentication Server Function)发起鉴权申请Nausf_UEAuthentication_Authenticate Request,并携带对应的网络服务信息SN-Name,方便AUSF调用对应鉴权算法AV(Authentication Vector,包含RAND, AUTN, HXRES*和 K_seaf);
    4. AUSF通过分析SEAF携带的网络信息SN-Name,确定手机是否在网络服务范围内,并保存手机需要的网络服务信息,接下来继续将SUCI或SUPI和服务网络信息SN-Name转发给UDM(Unified Data Management);
    5. 在UDM中调用SIDF(Subscription identifier de-concealing function)将SUCI解密得到SUPI,然后通过SUPI来配置手机对应所需的鉴权算法。
    6. 接下来便会根据手机的鉴权方式一步步提取对应的鉴权秘钥与鉴权结果,直至最后将结果反馈给手机,手机端USIM会校验网络侧所发送鉴权结果的真伪。

5G信令(就是用户身份信息)——手机开机后,先从USIM中读取之前运营商分配的临时身份信息GUTI/TMSI,发送携带该身份信息的信令给基站,请求接入运营商网络。的更多相关文章

  1. postman(十二):发送携带md5签名、随机数等参数的请求

    想起来之前在借助百度翻译接口做翻译小工具的时候,需要把参数进行md5加密后再传输. 而在平时的接口测试工作中难免会遇到类似这种请求参数,比如md5加密.时间戳.随机数等等.固然可以先计算出准确的参数, ...

  2. C#关于数据库中存储的用户权限类似 "普通员工,管理员" 如何在代码中读取分析权限

    之前在看某些数据库的用户权限的表时,发现字段是这样类似这样存储的"  普通员工,管理员 ",当时觉得他们是通过分割字符串来分析权限的.后来读到 Liam Wang  的 https ...

  3. Android之——监听手机开机事件

    转载请注明出处:http://blog.csdn.net/l1028386804/article/details/47028535 本文中,主要通过监听开机广播来达到监听手机开机状态的操作.在Andr ...

  4. 让一个Activity在开机后自动显示

    Activity本身不会在手机开机后自动运行的.但想让手机开机后就立刻做一些动作,需要使用广播接收器拦截手机开启广播,并在onReceive方法中完成相应的动作,如打开一个Activity. 广播接收 ...

  5. Winform调用QQ发信息并且开机启动 (开源)

    前言 公司CS系统需要加入启动qq从winform调用qq聊天窗口的功能,前提是需要将聊天者的QQ号码作为参数传递到函数中,一直没有搞过,正好很感兴趣,就折腾,Winform调用qq,我想肯定是需要一 ...

  6. 反向代理:是指以代理server来接收Internet上的请求,然后将请求转发到内部网络的server上,并将结果返回给Internet上连接的client,此时的代理server对外就表现为反向代理server。

       Nginx安装好之后.開始使用它来简单实现反向代理与负载均衡的功能.在这之前.首先得脑补一下什么是反向代理和负载均衡.   反向代理:是指以代理server来接收Internet上的请求,然后将 ...

  7. charles重发网络请求&模拟慢速网络&过滤网络请求

    重发网络请求&模拟慢速网络&过滤网络请求 重发网络请求:后端调试的过程中,一直在客户端进行点点点比较麻烦,此时直接发送请求比较方便查看调试后的结果 模拟慢速网络:用户的网络不能一直是快 ...

  8. 创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息。

    创建一个欢迎 cookie 利用用户在提示框中输入的数据创建一个 JavaScript Cookie,当该用户再次访问该页面时,根据 cookie 中的信息发出欢迎信息. <html> & ...

  9. .NET跨平台之旅:ASP.NET Core从传统ASP.NET的Cookie中读取用户登录信息

    在解决了asp.net core中访问memcached缓存的问题后,我们开始大踏步地向.net core进军——将更多站点向asp.net core迁移,在迁移涉及获取用户登录信息的站点时,我们遇到 ...

随机推荐

  1. Linux系统——rpm命令

    (1)查看操作系统名字.版本cat /etc/redhat-release 查看系统内核kernel的版本号uname -r查看操作系统位数uname -m (2)rpm命令rpm 参数 软件名-q ...

  2. __new__方法以及TypeError: object() takes no parameters的处理

    一些python书或博客将类中的__init__方法称为构造函数,而实际上这种说法是不严格的,因为创建实例的方法是__new__,实例初始化的方法是__init__.__new__方法会返回一个实例, ...

  3. 京东AI平台 春招实习生面试--NLP(offer)

    给offer了 开心.春招第一个offer!!! 2018.4.11 update 1面: 只有1面, 面试官还是个老乡.. 1.自我介绍 如何学的AI相关的知识? 2.介绍百度的实习 3.拿到一个问 ...

  4. JVM调优总结(转)

    本文转自:http://my.oschina.net/xishuixixia/blog/132395 常用的调优参数. 1.堆大小 -Xms和-Xmx用于指定堆大小,我们需要将他们俩设置为一样的值,以 ...

  5. java获取时间戳

    package com.ycy.test; import java.text.SimpleDateFormat; import java.util.Date; public class ItemsCo ...

  6. logstash运输器以及kibana的更多操作

    为了达到不会因为ELK中的某一项组件因为故障而导致整个ELK工作出问题,于是 将logstash收集到的数据存入到消息队列中如redis,rabbitMQ,activeMQ或者kafka,这里以red ...

  7. ubuntu下 gedit中文乱码

    Gedit 3.x 版本设置 (适用于Ubuntu 11.10及以后) 命令方式 gsettings set org.gnome.gedit.preferences.encodings auto-de ...

  8. this 的理解

    function foo(num){ console.log("foo:",+num); this.count++}foo.count =0for (var i=0; i<1 ...

  9. JAVA基础补漏--SET

    HashSet: 1.无序集合. 2.底层是一个哈希表结构,查询速速很快. 哈希表==数据 + 链表/红黑树 特点:查询速度快. 存储数据到SET中: 1.计算数据的HASH值. 2.查看有没有相同H ...

  10. KindEditor ctrl+v添加图片功能

    原理: 监听粘贴事件(paste) 获取粘贴版数据,读取到图片数据流进行加载base64 传到后台服务端直接输出为图片文件保存后返回图片读取路径插入编辑器中 /** * 获取编辑器对象 */ wind ...