车联网安全进阶之跨境传输检测

车联网安全进阶之跨境传输检测

车联网安全基础知识系列外,新开了一个系列 车联网安全进阶,主要分享一些车联网安全的进阶的知识,包括但不限于检测脚本编写,其他的等想好了再说🙈。

5月5日发布的《汽车整车信息安全技术要求》(征求意见稿) 在10节 车辆数据代码安全要求 中对数据跨境传输提出了要求——车辆不得直接向境外传输数据。

10.7 车辆不得直接向境外传输数据。

注: 用户使用浏览器访问境外网站、使用通信软件向境外传递消息、自主安装可能导致数据出境的第三方应用等不受本条款限制。

并在A.7.7 防数据直接出境测试方法给出了测试方法,使用抓包工具开始抓包,然后模拟测试车辆各项预装的数据传输功能,最后分析数据包中是否包含境外IP地址。

测试人员应按照如下测试方法,检验测试车辆是否满足正文10.7的要求:

a) 开启车辆全部移动蜂窝通信网络、WLAN通信网络,依次模拟测试车辆各项预装的数据传输功能

b) 使用网络数据抓包工具进行不少于3600秒的数据抓包,解析通信报文数据,分析目的IP地址中是否包含境外IP地址,并记录测试结果,应不包含境外IP地址。

标准中只说了应不包含境外IP地址,没有给出数据包的分析方法,今天和大家分享一下我采用的检测方法和脚本。

数据包抓取

不同场景下使用适合的抓包工具,如使用 tcpdump 在TBOX中抓取移动蜂窝通信网络通信数据。

1
tcpdump -i any -w tbox.pcap

跨境检测脚本编写

使用 Python 脚本提取出数据包中的 IP,从中过滤出公网IP,然后使用公开的接口查询 IP 地址的所在地,提取出境外的IP。

  1. 使用 scapy 提取出数据包中的公网 IP

    1
    2
    3
    4
    5
    packets = rdpcap(pcap)
    ip_list = []
    for pkt in packets:
    if IP in pkt:
    src_ip = pkt[IP].src
  2. 使用 ipaddress 过滤检测是否是公网IP地址

    判断IP是否为公网IP地址,过滤掉内网地址、本地换回地址、广播地址、保留地址。

    1
    2
    3
    4
    5
    6
    7
    # 检查是否公网IP,是则返回真
    def is_public_ip(ip):
    ip = ipaddress.ip_address(ip)
    if ip.is_private or ip.is_loopback or ip.is_multicast or ip.is_reserved:
    return False
    else:
    return True
  3. 公开的接口查询 IP 地址的所在地

    有很多公开的IP地址接口可以使用,这里我采用 百度数据开放平台提供的 API 查询 IP 的所在地。百度数据开放平台查询国内IP返回地址以省名/直辖市开头,国外的IP只显示国家。

    image-20230513214955112

    根据返回地址特性,筛选出不是以省名/直辖市打头的地址,过滤出境外IP。

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    # 检查IP,如果是境外IP则返回所在地址
    def cross_border_addr(ip):
    # 百度IP信息查询API
    query_api = "https://opendata.baidu.com/api.php?co=&resource_id=6006&oe=utf8&query="
    homeland = ["中国","北京","天津","河北","山西","内蒙古","辽宁","吉林","黑龙江","上海","江苏","浙江","安徽","福建","江西","山东","河南","湖北","湖南","广东","广西","海南","重庆","四川","贵州","云南","西藏","陕西","甘肃","青海","宁夏","新疆"]
    response = requests.get(query_api+ip)
    location = json.loads(response.content.decode())["data"][0]["location"]
    if location[0:2] not in homeland:
    return location
    else:
    return False
  4. 将前面的代码组合起来,就是一个跨境检测的脚本

    完整脚本见 https://github.com/delikely/Automotive-Security-Toolkit

检测脚本使用

1
2
3
4
5
6
7
8
E:\Code\Automotive> python 'cross-border checker.py' -h
usage: PROG [options]

流量包跨境传输检查

optional arguments:
-h, --help show this help message and exit
-f FILE, --file FILE pcap file

使用 -f 选项指定需要分析的流量包。使用实例如下图,在tbox.pcap 中检测出了 4 个跨境的 IP地址。

image-20230513204937877

注意事项

  • 测试机接入到车辆网络中,对外通信通过TBOX传输,测试机的流量可能会污染抓取的流量,影响检测的准确性。

  • 在查询 IP 地址的所在地中,如对数据较为敏感,则可采用私有化部署(如 rapiddns 私有化部署)的数据进行查询。

参考

系列文章

  1. 车联网安全基础知识之汽车模块化平台
  2. 车联网安全基础知识之大众集团汽车电子电气架构
  3. 车联网安全基础知识之TBOX主要功能
  4. 车联网安全基础知识之大众J949(OCU/T-BOX)
  5. 车联网安全基础知识之充电基础设施
  6. 车联网安全基础知识之从插线端子分析车内通信网络结构
  7. 车联网安全基础知识之QNX命令
  8. 车联网安全基础知识之测试台架购买
  9. 车联网安全基础知识之USB SPH2.0线束制作
  10. 车联网安全基础知识之UDS刷写前置基础知识
  11. 车联网安全基础知识之 UDS 刷写安全