车联网安全进阶之Trick——Android车机运行Python

车机 ECUTermux
2023-11-17 21:14
111263

在整车环境下,网络隔离划分出了多个网络。多数的 ECU(注,本文中的 ECU 特指支持 TCP/IP 协议栈的 ECU) 不能够与测试机直连,虽然通过内网穿透技术可以实现访问这些隔离的 ECU。在内网穿透环境下测试由于转发问题会出现异常连接的情况。例如,使用 Python 的 Scapy 模块编写 SOMEIP 脚本时无法建立连接。

Python 脚本比较灵活,支持的模块也比较多,但 Python 上车确实是个问题。智驾上往往原生支持Python,但通常作为测试入口的车机,Python 却不支持的。最近在漏洞挖掘中,在车机上对 Python 有迫切的需求,于是就又双叒叕去搜索了一下 Android 上运行Python的方法,所有的方案指向—— Python IDE APP。那就得安装一个 APP,但当下新出的车机有的加了系统签名验证导致第三方应用无法安装。那先试试安装APP这个方案。

一共尝试了5种方案,最终选择了方案④,使用独立的Python虚拟环境。

image.png

方案①:安装 Python IDE APP

Qpython、Pydroid 是Android上用的比较多的编辑器/IDE。在能够安装第三方APP的车机上,使用 adb 安装上应用。然后使用就比较尴尬了,图形化界面在测试中是个弊端,把车机屏幕当成显示屏,外接键盘来测试?有的车机也不是识别键盘呀!

突然想起我手机上的 Termux 也是可以安装 Python。但是 Termux 也是图形的,也不是图形化——主界面是命令行。怎么通过ADB 使用纯命令行的 Termux 呢,尝试第二种方案——ADB中使用Termux。

Termux是一款基于Android系统的终端模拟器应用程序,可以在Android设备上运行命令行界面和Linux软件包。它提供了一个完整的Linux环境,包括常用的命令行工具、编程语言和软件包管理器等。

image.png

方案②:ADB中使用Termux

首先看看 Termux 用的 SHELL 是哪个,直接查看环境,SHELL 的路径是 /data/data/com.termux/files/usr/bin/bash

~ $ echo $SHELL
/data/data/com.termux/files/usr/bin/bash
先拿手机试试,进入ADB SHELL 切换到 Termux 的SHELL。好消息,命令行的Termux进去了;坏消息,Python运行不了。

image.png

其实,已经装了 Python,运行不了的原因是缺少环境变量。缺啥补啥,这就去加个环境变量。添加环境变量 PATH 就能直接使用 python等命令了,指定依赖库的位置 LD_LIBRARY_PATH 也不可或缺。

export LD_LIBRARY_PATH=/data/data/com.termux/files/usr/lib/
export PATH=$PATH:/data/data/com.termux/files/usr/bin
环境变量设置好了,果然进来了。

image.png

那么问题来了,虽然能用Python,但这辆车上不能安装第三方应用。那摆在眼前的是怎么在不安装 APK 的情况下使用Termux。都到这里了,证明ADB运行Python是可行的,那么继续下一步——迁移Termux。

方案③:迁移Termux

查看 Termux 安装后的文件结构发现,/data/data/com.termux/files/usr/ 下不就是 POSIX 的文件系统结构么。

.../data/com.termux $ tree -L 3
├── cache
│ └── apt
│ ├── archives
│ ├── pkgcache.bin
│ └── srcpkgcache.bin
├── files
│ ├── home
│ │ └── test
│ └── usr
│ ├── bin
│ ├── code
│ ├── etc
│ ├── include
│ ├── lib
│ ├── libexec
│ ├── share
│ ├── tmp
│ └── var
└── shared_prefs
└── com.termux_preferences.xml
车机的架构和手机架构一样,直接打包复制到车机上。

image.png

说干就干,复制到 /data/local/tmp/ 下,设置好环境变量。

export LD_LIBRARY_PATH=/data/local/tmp/data/data/com.termux/files/usr/lib
export PATH=$PATH:/data/local/tmp/data/data/com.termux/files/usr/bin
Python 启动!

image.png

能用就是包有点大 700M,想想感觉可以精简。

方案④:独立的 Python

手机是AARCH64,车机也是AARCH64, 那么 Termux 的Python软件包是不是能直接使用。 直接去 Termux 的包管理网站下载 python_3.11.6-1_aarch64.deb。

deb 中有三个文件,其中 data.tar.gz 是主要的程序文件。

image.png

data.tar.gz 放到车机里面却发现报错,缺少依赖环境。

image.png

缺啥补啥,从Termux lib 中抠出来,有点未免太费劲了。都到这里了,还是尝试添加一下依赖吧。把 libandroid-support.so 上传到 /data/local/tmp/data/data/com.termux/files/usr/lib 竟然成了,不是连环的缺少依赖。

image.png

又试了试 pip,包里面没有 pip。

image.png

补充了 pip,也能安装模块,但是不能使用,因为配置的 lib 路径的文件,必须和 termux 的文件结构一致才行。但独立出来,路径是固然要改的。于是想到修改pip下载模块的默认存储路径。配置需要写入配置文件到根目录,然而大部分车机的根目录是不可写的。

image.png

继续修复Bug,那还不如直接用方案三中的直接复制过来Termux环境。老老实实用Termux的环境,占用的磁盘空间大就大点吧!

image.png

对了,还有一种方案就是使用虚拟环境 venv,直接使用 python -m venv venv 不出意料也报错,修复报错后,就大功告成了。打包好放在 https://github.com/delikely/Automotive-Security-Toolkit/tree/main/pydroid ,各位看官自取。

image.png

方案⑤:静态编译Python

话又说回来,不同的车机可能缺少的依赖不同,那存不存在静态编译的Python呢?这可能是最佳的方案,静态编译的 Python 和 pip,就像静态编译的 busybox 一样,没有依赖问题直接用。但是找了一圈又一圈,现成的压根没有,有没有愿意尝试静态编译 Python 的勇士呢?

参与评论

0 / 200

全部评论 0

暂无人评论
投稿
签到
联系我们
关于我们