计算机设备地理位置定位攻防原理调研
郝伟 2021/01/09
接入设备A连接网络后,攻击方B希望获得A的地理坐标信息(所在的经纬度或城市区域信息),A为了保护自己,希望能够实现以下两个层面的目标:
为了实现此目标,我们首先需要了解一下设备定位技术的基本原理。
一般而言,可上网设备如果可以定位,都是通过硬件来实现,然后系统负责管理,软件层面负责调用,在调用的时候通常需要向系统申请一定的权限。在地理信息的获得,主要有以下四种方式,就此问题分别进行分析。
GPS是英文Global Positioning System(全球定位系统)的简称。基本原理是与24颗近地轨道的GPS卫星中的至少3颗进行通信,利用通信时差计算所在位置。GPS卫星有两种专用的频率用于载波信号,即频率为1575.42MHz的L1载波和频率为1227.60MHz的L2载波。在L1和L2上又分别调制着多种信号,这些信号主要有:C/A码、P码和Y码。GPS定位功能现在已经被封装成芯片,即GPS定位芯片来完成。这些芯片的功能就是能够实现定位过程,通过API接口返回当前位置信息。
硬件支持:GPS定位芯片或硬件模块。
定位精度:1-100米,由模块性能决定。
攻击方通过GPS获得接入设置的地理信息,只需获得用户的地址位置的访问权限即可获得,然后将设备的地理信息传回。
使用4G/5G上网的基本原理是通过与附近的基站的数据传输,从而获得到附近基站的特征信息。由于基站几乎是不会变化的,所以只要获得了基站的特征信息,那么基本上接入方就在附近10公里内。
硬件支持:4G/5G芯片或硬件模块
定位精度:500m - 10km,取决于基站的强度,通常4G比5G的覆盖范围要大些。
攻击方在获得相应权限后,即可通用使用通过GPS获得接入设置的地理信息,只需获得用户的地址位置的访问权限即可获得,然后将设备的地理信息传回。
举例来说,通过安装软件 TelephonyManager 获取基站信息,其格式lac:mcc:mnc:cell-id(基站信息)。通过附录1所示Android商代码,即可获得相关信息。代码运行后,即可得到以下基站的信息。
注意:代码运行需要 android.permission.ACCESS_COARSE_LOCATION 权限。
中国联通基站信息

中国移动基站信息

android.permission.ACCESS_COARSE_LOCATION。IP地址实际上只是一个32位的二进制数,其本身并不能具备地理位置定位功能。但是由于公网的IP地址通常是比较固定的,很少发生变化,所以通过人工的方式建立字典,即可根据IP地址基本确定大概的位置。
硬件支持:以太网网卡
定位精度:建筑级,不过由于字典更新问题,可能失败或产生明显偏差。
只需获得本机IP即可。通常是通过本机发另一台机器发一个消息包即可,只是一般接入设备都在内网,所以返回的IP地址通常为一个区域的出口IP。
F项目直接即可防御,因为返回的是攻击节点的IP地址。
WIFI定位的原理与IP地址类似,区别是Wifi定位使用的是无线AP的Mac地址:
硬件支持:无线网卡
定位精度:10-100米,视周边Wifi源数量和质量而定
与4G/5G接入原理类似,通过获得网络接入权限,扫描周边Wifi的Mac并向攻击方返回,然后攻击方根据这些Mac地址,查询Mac地理信息字节,即可获得接入设备的大概地址位置。再次强调,在读取周边的无线AP时,是不需要任何认证的,所以能够非常轻易地获得周边无线AP的MAC信息。
无论是使用GPS、4G/5G、还是使用Wifi都有较高的曝露风险。所以,推荐使用相对安全的方式是使用F项目的网络,以IP的方式来访问互联网。
如果一定要使用前三种方式,建议针对不同的系统进行相应的安全加固,具体加固的内涵有两点:
另外还要一点:即使黑客程序取得了数据需要返回,如果这些程序没有相应的数据发送权限,同时也能够保证接入设置的地理位置的安全。
package com.easipass.test; import java.util.List; import android.app.Activity; import android.content.Context; import android.os.Bundle; import android.telephony.NeighboringCellInfo; import android.telephony.TelephonyManager; import android.telephony.cdma.CdmaCellLocation; import android.telephony.gsm.GsmCellLocation; import android.util.Log; import android.view.View; /** * 功能描述:通过手机信号获取基站信息 * # 通过TelephonyManager 获取lac:mcc:mnc:cell-id * # MCC,Mobile Country Code,移动国家代码(中国的为460); * # MNC,Mobile Network Code,移动网络号码(中国移动为0,中国联通为1,中国电信为2); * # LAC,Location Area Code,位置区域码; * # CID,Cell Identity,基站编号; * # BSSS,Base station signal strength,基站信号强度。 * @author android_ls * 参考:https://blog.csdn.net/android_ls/article/details/8672442 */ public class GSMCellLocationActivity extends Activity { private static final String TAG = "GSMCellLocationActivity"; @Override public void onCreate(Bundle savedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main); // 获取基站信息 findViewById(R.id.button1).setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { TelephonyManager mTelephonyManager = (TelephonyManager) getSystemService(Context.TELEPHONY_SERVICE); // 返回值MCC + MNC String operator = mTelephonyManager.getNetworkOperator(); int mcc = Integer.parseInt(operator.substring(0, 3)); int mnc = Integer.parseInt(operator.substring(3)); // 中国移动和中国联通获取LAC、CID的方式 GsmCellLocation location = (GsmCellLocation) mTelephonyManager.getCellLocation(); int lac = location.getLac(); int cellId = location.getCid(); Log.i(TAG, " MCC = " + mcc + "\t MNC = " + mnc + "\t LAC = " + lac + "\t CID = " + cellId); // 中国电信获取LAC、CID的方式 /*CdmaCellLocation location1 = (CdmaCellLocation) mTelephonyManager.getCellLocation(); lac = location1.getNetworkId(); cellId = location1.getBaseStationId(); cellId /= 16;*/ // 获取邻区基站信息 List<NeighboringCellInfo> infos = mTelephonyManager.getNeighboringCellInfo(); StringBuffer sb = new StringBuffer("总数 : " + infos.size() + "\n"); for (NeighboringCellInfo info1 : infos) { // 根据邻区总数进行循环 sb.append(" LAC : " + info1.getLac()); // 取出当前邻区的LAC sb.append(" CID : " + info1.getCid()); // 取出当前邻区的CID sb.append(" BSSS : " + (-113 + 2 * info1.getRssi()) + "\n"); // 获取邻区基站信号强度 } Log.i(TAG, " 获取邻区基站信息:" + sb.toString()); } }); } }