![智能汽车网络安全权威指南(下册)](https://wfqqreader-1252317822.image.myqcloud.com/cover/812/48593812/b_48593812.jpg)
11.5 汽车功能应用视角下的攻击手法
在前面的内容中,我们提到了从两个维度来看待汽车网络安全攻击,即架构和功能。我们已经从汽车网络安全架构的角度介绍了远程攻击、中程攻击和近程攻击。接下来,我们将从核心功能应用的角度来介绍攻击,帮助读者更好地理解汽车网络安全攻击。
11.5.1 OTA攻击
OTA在车联网行业,可以说是一个网红名词了。智能汽车最大的特色之一就是可以进行OTA,即通过无线的方式对整车的软件进行升级。只要汽车的硬件支持,车辆功能就可以通过软件升级不断提升、优化,让用户不断获得新体验,而不像传统汽车一经交付即固定了最终形态。本节知识点如图11-113所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/151_02.jpg?sign=1739279271-GuVkqabFIo5BPPuuqL2QAihIZkqnkOBd-0-ab45e3620da369b886573621e596667c)
图11-113 OTA攻击知识点
1.OTA原理
OTA为汽车带来了便捷,同时也会引入新的攻击面。我们可以简单地思考一下:OTA是可以让整车软件升级的功能,如果攻击者可以介入该流程,将自己的恶意代码植入升级包中,那么后果不堪设想。
OTA的功能实现对于每家厂商都不一样,但是大致步骤如图11-114所示。
1)云端生成升级包:该过程基本上是在OEM后端完成的。当软件开发完成后,对最新的版本进行打包、签名、加密等操作。此时,在车辆上就能看到有更新版本可以升级。
2)升级包传输:在用户同意升级后,车端会从云端下载升级包。
3)车端升级包派发执行:当升级包下载完成后,车端会对升级包进行安全校验,接着开始升级。由于车端不止一个控制器,因此该过程还涉及升级包的分发,以及触发各个控制器进行升级等操作。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/152_01.jpg?sign=1739279271-ZKCVn31C17GPJcPnR9EXrBRsFAmpDHTO-0-1b32a8ce2452bb0e292e46242e66acdb)
图11-114 车端OTA流程
2.OTA安全风险
从上述步骤可以看出,在第一步云端生产升级包的过程中,攻击者通常无法介入,除非从供应链植入恶意程序,或从OEM其他系统渗透到OEM内部进行植入。
第二步非常关键,通常OTA升级包都是通过公网进行传输的,因此攻击者具有劫持的机会。一旦劫持成功,如果升级包未加密,则攻击者可以轻松获取车辆固件,无须提取固件。此外,如果升级包未进行签名校验,攻击者还可以修改升级包,将自己的恶意代码注入其中。
第三步主要在车内完成。与第二步原理类似,车内也存在各种通信网络,攻击者同样可以在车内网络上进行劫持和篡改,成功后就可以将自己的恶意代码注入其中。
3.OTA生产阶段攻击
如上所述,OTA升级包在生产阶段主要是在OEM厂商内部系统中完成的,攻击者通常是无法介入的。但是对APT组织来说,则并非无孔可入。这涉及传统的企业安全攻防和渗透。攻击者会通过钓鱼、公网Web漏洞、网络设备漏洞等各种方式攻入企业内网,从而破坏OTA生产阶段的系统。
此外,还有一条攻击线路,即通过Tier1厂商。由于ECU是这些厂商开发的,升级包自然也是这些厂商生成好传给OEM的。所以可以攻击供应链,从源头上直接拿下Tier1厂商,并污染升级包,也可以达到攻击OTA的效果。
4.OTA下载阶段攻击
当车辆和OTA服务端相互都准备好升级后,就开始下载OTA升级包了。这通常是通过无线蜂窝或Wi-Fi网络完成的此时OTA下载服务器很有可能就暴露在公网环境中。当攻击者获取下载地址后,可以直接访问OTA下载服务器进行下载。如图11-115所示,我们在固件中看到了下载地址,直接用浏览器就可以访问,没有鉴权。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/153_01.jpg?sign=1739279271-WNe2l99HUzTxkF2bbXd4FGaRFghitcZh-0-64d5ca7bfb513a650d957d675c8dcdc7)
图11-115 硬编码OTA升级包地址
当下载了固件后,攻击者可以对固件进行篡改,然后利用OTA刷写回去,比如利用DNS劫持等方法。
5.OTA分发阶段攻击
在分发阶段时,OTA也存在重重风险。由于OTA分发是在车内进行的,而开发者往往并不关心安全性,所以OTA Master在对升级包校验后,可能会直接将升级包明文发送给其他ECU进行升级。这个过程如果被攻击者拦截并篡改,同样会对ECU造成很严重的威胁。例如,我们采用车载以太网嗅探工具抓取OTA Master上的以太网流量,可以发现它明文传输了固件包,从而可以获取升级固件,如图11-116所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/153_02.jpg?sign=1739279271-zOOOrdGsvD2rK82wxEePZqPVlnWlEku0-0-546e506f5049f16ac27df62776fb012c)
图11-116 OTA分发流量包含未加密固件
11.5.2 车载Android应用攻击
车载Android应用与手机Android应用大同小异,本节我们将介绍针对这类应用的攻击方法,分为静态方法和动态方法。本节知识点如图11-117所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/154_01.jpg?sign=1739279271-EJOhDoXI485Wd3VHvBhWJewRzNo3SNZd-0-8ae4cdcc285c9178b73ba3ae0eec32cd)
图11-117 车载Android应用攻击知识点
1.静态分析攻击
(1)逆向工具
如图11-118所示,jadx是一个很好用的开源跨平台反编译GUI工具,非常推荐,它的下载地址为https://github.com/skylot/jadx。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/154_02.jpg?sign=1739279271-k0BKj89spFXHKBMFko35IPwFHEp3If56-0-ce345a7d191030cbade63f2ab13cec1d)
图11-118 jadx逆向工具
如图11-119所示,GDA也是一个强大的逆向分析工具。它不仅支持基本的反编译操作,还支持恶意行为检测、隐私泄露检测、漏洞检测、路径求解、打包者识别、变量跟踪分析、解混、Python和Java脚本编写、设备内存提取、数据解密和加密等众多功能。另外,它只支持Windows。GDA下载地址为https://github.com/charles2gan/GDA-android-reversing-Tool。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/155_01.jpg?sign=1739279271-QKrWZn9rHqaKyTpgceVntIUgeOEKzKLi-0-be2511bf53177d930f7f45d02de3ccd4)
图11-119 GDA逆向工具
(2)是否存在敏感字符串
检查APK中是否存在一些敏感的明文字符串,比如Passwords、URL、API、Encryption、Backdoors、Tokens、Bluetooth UUID。该过程可以使用反编译工具手动搜索,也可以使用以下自动化工具。
❑apkurlgrep,地址为https://github.com/ndelphit/apkurlgrep,可以帮助扫描出APK中使用的URL,使用如下。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/155_02.jpg?sign=1739279271-NSHuNNvppUOxi1xAODS3N04iDMCMC9BH-0-5a36ab3c3464599c7715153ac6eaa4fc)
❑apkleaks,地址为https://github.com/dwisiswant0/apkleaks,可以帮助扫描APK中的密钥、URI,可以建立自己的规则文件,使用如下。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/155_03.jpg?sign=1739279271-uaWemfhfWrZSjBARFwGhap84fcAdWd1W-0-16f03c48a76ef316f6068e8fcaa77f52)
❑StaCoAn,地址为https://github.com/vincentcox/StaCoAn,可以帮忙扫描硬编码密钥、apikey、密码等信息,如图11-120所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/156_01.jpg?sign=1739279271-qdK2hnyNVfLhghSw15cTxSx8uHjNLk5Z-0-09f5bbd07493735f824281e59da9e4df)
图11-120 StaCoAn扫描工具
(3)检查Manifest.xml
在APK中有一个清单文件,即Manifest.xml。它是这个APK的配置文件,包含很多内容。漏洞往往就出现在该文件中。接下来我们看看该文件有哪些需要注意的点。
1)检查应用程序是否可调试。检查清单文件里是否有debugable="true",这样的程序可以用jdb调试。
2)检查APK是否允许备份。检查清单文件里是否有android:allowBackup="true",这样的程序可以通过ADB备份应用,从而有可能泄露隐私数据。
3)检查是否有导出的Activity。检查清单文件里是否有<activity android:name=".TestActivity"android:exported="true"/>,这样的Acitivity组件可以被其他应用调用。
4)检查是否有导出的Content Provider。检查清单文件里是否有<provider android:name=".DBContentProvider"android:exported="true">,这样的Provider可以被其他应用调用。
5)检查是否有导出的Service。检查清单文件里是否存在<service android:name=".ExampleExportedService"android:exported="true"/>,这样的Service可以被其他应用调用。
6)检查是否有广播接收器。检查清单文件里是否存在<receiver android:name=".MyBroadcastReceiver"android:exported="true">,这样其他的应用可以发送广播给该程序。
7)检查是否有URL Scheme。检查清单是否存在Activity中具有URL Scheme:<data android:scheme="app"android:host="open.my.app"/>。这样的Activity可以被其他应用通过URL打开,包括浏览器。
8)检查Activity模式是否为singleTask。具有singleTask模式的Activity具有被劫持的风险,检查命令如下。此类漏洞的详情可以参考https://blog.takemyhand.xyz/2021/02/android-task-hijacking-with.html。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/157_01.jpg?sign=1739279271-FFxIIadYnerQWxq4wm9wKxlmaryhBo0x-0-9fca1f2af5da738eb38d0638814e914e)
(4)程序数据保存的位置是否安全
首先,默认情况下,对于在内部存储中创建的文件,只有应用程序自己才能访问。但有些程序使用MODE_WORLD_READBALE和MODE_WORLD_WRITABLE可以将这些文件公开出来。
在Android设备的/data/data/中会有每个应用程序的文件夹,在里面都有一个Shared_Prefs和databases文件夹以及由应用程序所创建的其他文件夹。这些文件夹里的文件都属于内部存储,如果程序使用了MODE_WORLD_READBALE,命令如下,则任意程序都能访问该文件。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/157_02.jpg?sign=1739279271-taoU1Mf2SKNEw2v7NZNpAtVHv03NEonJ-0-b47e8c56e6e8d9615743775ad9411250)
如下所示,该文件中存在密码等敏感信息。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/157_03.jpg?sign=1739279271-1anaU1Re9ETHY5EMgowfa3yhrSAfEamh-0-d3be2611eca61418c949bbcb280c891a)
其次,在外部存储上创建的文件是全局可读和可写的,因此是不安全的。外部存储的路径通常是/store/emated/0、/sdCard、/mnt/sdCard。如果程序将可执行的文件放在该目录下,则要检查一下它是否会校验签名等完整性信息。
(5)是否有硬编码密钥
有些程序将敏感数据存储在本地,并使用代码中硬编码密钥对其进行加密。这样可以通过逆向的方式获取密钥,从而解密敏感数据,如图11-121所示,存在硬编码私钥。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/157_04.jpg?sign=1739279271-boYjWLQQPng5Ek1qsVMN2rFYkqzs5kRJ-0-15cab673922ebc36b91be8b692c2b425)
图11-121 硬编码私钥
(6)应用使用的加密算法是否安全
程序不应该使用过时的加密算法,比如RC4、MD4、MD5、SHA1等,可以参考以下链接:https://www.ibm.com/docs/en/ibm-mq/8.0?topic=cipherspecs-deprecated。
(7)自动化静态分析工具
如图11-122所示,MobSF是一个很强大的开源分析工具,既可以静态分析也可以动态分析。它的下载地址为https://github.com/MobSF/Mobile-Security-Framework-MobSF,也支持直接在https://mobsf.live/上进行在线试用。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/158_01.jpg?sign=1739279271-XJxXOMlcVJGop2xvPlEpVER26FNF1wqw-0-af1880652e91da439a1233a3a62e3fa8)
图11-122 MobSF分析工具
如图11-123所示,Yaazhini Android也是一个免费易用的静态扫描工具,下载地址为https://www.vegabird.com/yaazhini/。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/158_02.jpg?sign=1739279271-eyM2UY4rBibpgEQhhBV4dkq2rRtzNiK8-0-7a9914260128246a1302d6b4aecd34d9)
图11-123 Yaazhini静态分析工具
如图11-124所示,Mariana-trench这个工具能静态扫描程序发现漏洞。它使用的是污点追踪的方式,包含一系列Source(污点数据的来源)和Sink(具有危险的函数目标),能通过扫描发现是否存在Source到Sink的路径,并据此判断漏洞。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/159_01.jpg?sign=1739279271-PcMDY9rzH0Mmjj67WmAYiHvGUeJzvdhQ-0-284672dd855de4eeddba473bba86224e)
图11-124 Mariana-trench静态分析工具
(8)需要重点关注的函数
重点需要关注的函数有两类。一类是可以从外部获取数据的函数,比如getOutputStream、getParcelable等。另一类是具有风险行为的函数,比如exec、sendBroadcast等。对此,大家可以参考开源静态分析工具中的Source、Sink配置,比如flowdroid:https://github.com/secure-software-engineering/FlowDroid/blob/fc5c2c72ea451f6fa54675cf4a44ca4170fc9989/soot-infoflow-android/SourcesAndSinks.txt。
2.动态分析攻击
(1)搭建动态分析环境
针对模拟器,Android有很多模拟器可选。这里推荐一款性能和兼容性不错的模拟器——Genymotion。我们可以通过https://www.genymotion.com/下载它。同时,最好有一台root物理机并开启开发者模式。
(2)利用MobSF做初始分析
MobSF可以帮助我们发现应用中一些有趣的点。它是全自动的,因此我们可以先让它运行起来,然后去做其他的事情。关于使用方法,请参考官方文档:https://mobsf.github.io/docs/#/zh-cn/。
(3)检查日志中是否存在敏感数据
应用程序在运行过程中会输出各种日志,查看这些日志可以帮助我们了解应用程序的功能,并找到一些敏感信息。推荐使用Pidcat来查看应用程序的日志,如图11-125所示。相比于Logcat,Pidcat更容易阅读。我们可以在https://github.com/JakeWharton/pidcat下载Pidcat。
(4)检查SQLite数据库中是否存在机密信息
许多应用程序会使用SQLite数据库。我们可以浏览数据库,查看其中是否存在敏感信息。数据库通常位于/data/data/the.package.name/databases目录下。如果数据库中的数据是加密的,我们可以尝试在APK中找到密钥,以便访问并浏览数据库。常用的浏览SQLite数据库的工具包括SQLite 3、Android Studio和Stetho等。由于工具众多,本节不再一一介绍。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/160_01.jpg?sign=1739279271-KRcpyzcO0r7cGCj0jsyyl5E1TA9wOKvz-0-bb0487a3b0728b12883e99ee4c640fcd)
图11-125 Pidcat日志查看工具
(5)检查是否存在可利用的导出Activity
如果我们发现应用程序存在导出的Activity,就需要考虑它是否可利用。通常,我们需要尝试启动该Activity,查看是否有敏感信息。假设包名为com.example.demo,Activity名称为com.example.test.MainActivity,则可以使用以下命令进行启动。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/160_02.jpg?sign=1739279271-Sk4haQQTlDDvejqStZqNf5XZ52VRwCeZ-0-c65965b1b3d456ce237a7c710c6c3fb4)
(6)是否有可利用的Content Provider
Content Provider就是应用程序用来给其他应用提供数据的。如果它的权限限制不严格,就可能从中获取敏感数据。此外还可以尝试SQL注入或路径穿越的攻击方式。如下所示是一个Content Provider的定义。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/160_03.jpg?sign=1739279271-oIhdsZglCqi0u1ANhoaNeA280oaJfEZ9-0-f5b41c3b54fb7ce25dc1f7b7ee1b2629)
Content Provider所提供的数据可以存储在数据库、文件,甚至网络上。接下来我们将介绍几种利用方法。此处我们使用一个可以模拟应用程序的工具Drozer,它可以用命令行的方式模拟应用程序调用四大组件,节省我们写代码的时间。
当Content Provider为数据库存储时,容易出现SQL注入的问题。对此,我们可以进行如下尝试。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/161_01.jpg?sign=1739279271-BEwBBm3gs1rQPLP2YmG9IgQLMWH9DnuL-0-d95d347b3f976bfbfdecf1a159bb04da)
当Conent Provider为文件存储时,也许存在目录穿越问题。对此,我们可以进行以下尝试。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/161_02.jpg?sign=1739279271-wmzBKydogVvGCAMnsQ0bxhIAcbRGfGQa-0-ef2af3a910baece84aa731948e9edec4)
(7)是否有可利用的服务
服务基本上都可以接收数据、处理数据。如果应用程序导出了服务,则需要仔细进行逆向分析,看看该服务到底实现了什么功能、有没有身份校验等。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/161_03.jpg?sign=1739279271-M7stsxYjqw54CRZl5seeyGiDjUXD1dps-0-c4dac21255f7834e0321f79a5d7899e0)
服务的处理代码从handleMessage(Message msg)函数开始,因此我们逆向的时候可以快速定位到关键函数,如下所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/161_04.jpg?sign=1739279271-uVjSwsNy6UewT7nOWJ1U8QNGdYtiiGPt-0-bfce680d67caaf22fc44e098d665159a)
使用Drozer来调用服务,如下所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/161_05.jpg?sign=1739279271-K3smUgfZvSuI8lM1kdpdMMhB0HZO045B-0-7befb0230c5f24b729d61ba18371708c)
(8)是否有可利用的Broadcast Receiver
Broadcast Receiver是一种处理广播消息的组件,主要用于查看普通应用是否具有发送该广播的权限,而接收器是否有危险操作。通常接收器会使用onReceive函数,可以重点关注该函数的实现。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/162_01.jpg?sign=1739279271-hX73YYK1TkrfBFDBfK6rUKGvM8KSf0Zf-0-2ce9475a78936101b670d840a01fdbc0)
使用Drozer发送广播的操作如下。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/162_02.jpg?sign=1739279271-7QHBIUDuWmu3HGkmQc3gN1yS1DcUKXdv-0-ecc951e8f50821e5c6890f94b694f919)
(9)检查Deep Link
Deep Link允许通过URL来触发Intent。应用程序会在Activity中声明Deep Link。这样就可以通过URL来启动该Activity。代码如下,存在Deep Link:app://open.my.app。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/162_03.jpg?sign=1739279271-KoY40RIbLyDFILZFcwKm1DQ9wexclKLn-0-c149580995fdedc20fc51b8f3499ac65)
测试Deep Link,可以使用如下代码。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/162_04.jpg?sign=1739279271-zWFwbf0hja0sEtaV4mMz0HMVnVeSYjb4-0-7df22c1901d7626709d371a9d20a6e72)
在检查Deep Link时,需要注意是否存在敏感参数,例如密码等。如果存在,攻击者可以模拟这样的Deep Link,以窃取敏感信息。此外,还应检查Deep Link中是否存在参数以及这些参数的作用,是否可以通过控制参数来执行危险操作。
在检查应用程序的网络通信时,需要注意以下几点。
❑明文传输:某些Android应用程序直接使用HTTP进行通信,在这种情况下,攻击者可以直接劫持流量,获取敏感信息。
❑缺少证书检查:许多应用程序尽管使用HTTPS进行通信,但并不验证服务器证书,会接受任何自签名证书。攻击者可以利用这种情况进行中间人攻击,窃取敏感信息。
❑弱密码套件:应用程序和服务器进行TLS握手时,可能选择不安全的密码套件。攻击者可以利用这种情况破解整个通信加密过程。常见的弱密码列表可以参考https://www.ibm.com/docs/en/ibm-mq/8.0?topic=cipherspecs-deprecated。
❑后凭证泄露:有些应用程序只在登录时进行身份验证并采用强安全传输,即保护第一个凭证(如密码),但在后续操作中就放松了警惕,不进行传输保护。这会导致后续凭证(如Cookie、token等)泄露。攻击者可以使用这些凭证完成敏感操作。
(10)代理组件攻击
该漏洞有点像SSRF,即Intent对象本身也可以作为参数在四大组件中传递。有些应用利用此特征开发出了代理组件,它将传进来的Intent对象再次传递给了startActivity、sendBroadcast等函数,如下所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/163_01.jpg?sign=1739279271-NBE9PVswz2LVMHWXjxncPB7FSMniOw47-0-6b00a63ec88029f4fd55a37504055c90)
这是很危险的,因为攻击者可以利用这种操作启动非导出的组件,如下所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/163_02.jpg?sign=1739279271-Mgb1c0ilhSBi2m1m3yyrk5lqfGpGfmyK-0-8834cf129719da6b4e27ad80e9f65a31)
(11)是否存在Android客户端注入
对于SQL注入,主要看是否存在与数据库相关的操作,以及有没有将SQL查询进行参数化,如下所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/163_03.jpg?sign=1739279271-JWUXaEnBiDevltPjm7GhQ3L2rNiq0kVQ-0-10dc51fa721a97853b815587abe8fee3)
对于JavaScript注入(XSS),主要看WebView中是否禁用了JavaScript。该设置默认是关闭的,如果代码中调用了setJavaScriptEnabled函数则可能开启了。
对于本地文件包含的情况,主要看WebView中是否禁用了文件访问。该设置默认是开启的,如果代码中调用了setAllowFileAccess(false)则表示关闭了。当不存在跨域问题时,攻击者通过以下代码可以访问本地文件。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/163_04.jpg?sign=1739279271-5s7ABFo7PkiOfGXXxZ1470FCsCZ07bRM-0-9428b2c2a2074df83f8bbc67f8239db4)
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/164_01.jpg?sign=1739279271-Nh09XBTooeYROR5IzbAy3gZL1Tyu1jCY-0-c184e21ee7033a807df52cb770f08119)
(12)借助Frida获取感兴趣的信息
Frida是在对Android应用进行分析时非常有用的动态Hook工具。在进行Android Java层代码逆向分析时,我们通常并不会使用调试的方式。因为Java层的代码有各种回调,调试起来问题很多,加上Java自身的反编译程度已经非常高,我们只需利用静态逆向分析配合动态Hook打印信息,就可以完成逆向工作了。
本节就带大家快速入门Frida的使用方法。掌握之后再配合反编译工具,对大多数Android Java层的应用都可以进行逆向分析了。
首先,在PC上安装Frida Client端,如下所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/164_02.jpg?sign=1739279271-He9jl5iRMPD2Lza6WDMDQP2fbF6Kl6D1-0-3f146c3ad4411378880730e9509b4377)
然后,在Android里安装Frida Server端,下载地址为https://github.com/frida/frida/releases。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/164_03.jpg?sign=1739279271-MVfd8fCGoS8FQJGWl0rDaN7UGrFfwXj9-0-d3414720b519635780a5d87f5c59b3b1)
编写Frida Hook脚本,挂钩一个函数,获取它的参数和返回值。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/164_04.jpg?sign=1739279271-Ev4KGVmnKrXqdIdGgJ5hHVMzUuPJgWUP-0-f96411f5c99aa7359dbd256ed34d8078)
以上介绍了车载Android应用程序常见的攻击思路和方法,由于Android的安全研究相对成熟而且是开源的,大家可以在网络上深入学习更多的知识。
11.5.3 车载Linux应用攻击
本节所讲的车载Linux通常是嵌入式的。它不会像桌面版Linux(Ubuntu之类)那么复杂,是没有UI界面的。但是车载Linux上常见的Service,包括启动方式(Init、Systemd)等还是与桌面版相似的,因此基本上针对桌面版上的攻击方式都可以应用于车载Linux。此外,与桌面版Linux不同的是车载Linux通常都是ARM架构的,因此在利用内存漏洞时会和桌面版有所不同。
操作系统的提权通常是指DAC(自主访问控制)提权与MAC(强制访问控制)提权。无论DAC还是MAC,都是为了限制用户态的代码,明确可以做什么以及不可以做什么。而提权就是在一个受限的代码上下文中执行超过自身权限的行为。本节将介绍一些针对车载Linux系统常见的本地提权攻击方法。本节知识点如图11-126所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/165_01.jpg?sign=1739279271-4m6nq4BGswo84PcD8iOcZ1SnySzDjppx-0-cdcb952e40260f1c211daa6bf6136add)
图11-126 Linux应用攻击知识点
其中,在用户态中寻找DAC提权漏洞的方法是本节的重点内容。
1.Linux系统信息收集
先收集系统上的一些信息用于提权攻击面分析。下面列举了这些信息的获取方式。
1)查看进程信息,查看进程都有哪些权限,关注root权限的进程。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/165_02.jpg?sign=1739279271-WwOloFgtFz7WlZ5tLdbtpzKyFKcRMvxH-0-062ebb8d1a3347cb5e032480c7243ab2)
2)查看网络信息,检查有哪些端口开放,还有哪些UNIX socket。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/165_03.jpg?sign=1739279271-jWlsQfWMjxJglr4jVmNkWQBqvT0ND9s7-0-ebe9cf0393f43a43b0a53f2ea910dba4)
3)检查SUID程序是否具有提权的机会。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/165_04.jpg?sign=1739279271-9E3rNUE8F6rOlM3aj34P3fTkulFMWapF-0-37065d0a9688306844b6ca36c3e8aa9f)
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/166_01.jpg?sign=1739279271-NsgYNieEYYJxPhdVBWzb2ViB7bx7HKDX-0-08e76f19adcb9e847f2b0466a75f0002)
4)检查任意用户可写的文件,是否可以修改文件来提权。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/166_02.jpg?sign=1739279271-E1wHnecCJ9GobU8hgjcX4rMNj3hb1NtD-0-f10dc6b3669d2bd178603c1add486da4)
5)检查任意用户可写的目录,是否可以创建符号链接来提权。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/166_03.jpg?sign=1739279271-b6Yk1J6pHkZdvPBcSYaFmIFrC9FNOKw1-0-84904652643f37c3ef45ef0b64b5e671)
6)查看设备,寻找可以访问的设备。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/166_04.jpg?sign=1739279271-80ydtik8gqvEYNaMqYCVJjUwWZbWslZk-0-04bf39c52ee1a0bdbf4e6f36f7b5fd40)
7)查看文件系统,查看哪些目录是可写的。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/166_05.jpg?sign=1739279271-EZubUhItoP3Mnn6I1M8hasQvADeYCAP8-0-57a109febf1c796d4c18b25e144c155d)
8)查看内核模块,是否存在自定义的内核模块。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/166_06.jpg?sign=1739279271-6lJlCph0IntXOkPXspSbWke3LPlSmeiM-0-37281abc6b9b5b0478e26015aa902bc2)
9)查看防火墙,是否对高危端口做了隔离。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/166_07.jpg?sign=1739279271-4IlgKxz7QcPoE7qmA0WMQcnEvDZLRHwl-0-e82d573b3ab90ebc38e5a019aa39c4e8)
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/167_01.jpg?sign=1739279271-0s6Wm4IX2UUgkesqx3wbfvgJBQiA4Dnk-0-9a57f642c76f874e128ecca3bc75458e)
10)查看网卡配置,检查其IP、MAC等信息。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/167_02.jpg?sign=1739279271-p6tftZlyhg0jHemOrIF85oWV3Vcql9IP-0-2533e762d958f8bba92da81b03766e44)
11)查看路由,检查它的网络通信方式。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/167_03.jpg?sign=1739279271-6HUyGPdd74vgSLiNyOLZKCsSLNYdtQxi-0-bc0b9f400e8445c41cc9880cc7d0ddca)
12)查看内核版本,是否有历史漏洞。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/167_04.jpg?sign=1739279271-9AqbvXOgaazAfZU842KG7no0sGOAI7nc-0-458e915db8d2dbc460eebb4a1cb1c671)
13)检查环境变量,是否存在可写的文件或目录。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/167_05.jpg?sign=1739279271-GyjVLxvu9tR3v29NLXMMBu4FafBVqATz-0-3847e8199a7c6fb204872545e84a74c1)
14)检查crontab,是否存在可写的文件和目录。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/167_06.jpg?sign=1739279271-pV5x1YeMQb6MUNQkuILxWGzT88GgQmcD-0-2aac65b942515aec7c1018d08e1df879)
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/168_01.jpg?sign=1739279271-zbb1Rc8hjDugqF3OkEgKK10yn9Rmy0nR-0-451ad2506f88364fcba8f2e424c153e1)
15)检查crontab的定时执行文件以及里面执行的内容,是否具有可写权限。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/168_02.jpg?sign=1739279271-X4zh8cqhnG9Ev0vAFCLyGv4RXTCqZd2X-0-3778c14aa78e064fc27332d271d5d432)
2.用户态提权攻击
用户态攻击指的是在不使用内核漏洞的情况下进行提权,通常攻击的目标是用户态的高权限进程。常见的用户态提权攻击方法如下所示。
(1)文件修改
在收集到系统信息后,可以获得许多可修改的文件,进而发现其中的提权漏洞。以下是通过修改文件进行提权的几种方法。
❑可执行文件(包括shell脚本、so库、EXE文件):这些文件本身包含可执行的代码,如果执行该文件的是root用户,那么我们可以直接修改此文件,在其中加入自己的代码,然后等待重启或某些特定操作触发代码执行即可。
❑配置文件(包括系统配置文件、服务配置文件):这些文件不包含代码,但是是系统或程序运行需要读取的文件。例如,/etc/passwd、/etc/ld.so.conf、/etc/httpd.conf等配置文件中可能存在一些敏感字段,比如在ld.so.conf文件中可以添加导入so库的目录,在passwd文件中可以修改用户登录时执行的命令,在httpd.conf文件中可以添加自定义插件。
❑数据库文件(包括SQLite、XML等):这些文件不直接包含代码,而用来存放程序中使用的数据。例如,如果sqlite能修改数据库文件,就能控制程序所使用的数据。此时需要分析逆向该程序,看它是否存在利用数据进行一些敏感操作的机会,比如将数据代入system命令执行中,或者将数据当作URL访问之类。
❑Service文件:在使用systemd的系统中会存在.service文件,如果可以修改它,就可以在启动或停止该服务的时候加入自己的代码。例如,修改.service文件中的相应内容为”ExecStart=/tmp/myscript.sh”,就可以执行自己的myscript.sh脚本。对于systemd的其他文件(比如.timer和.socket文件),也可以通过同样的方式来利用。
(2)文件夹可写
除了修改文件之外,如果对文件夹具有可写权限,同样可以用来提权。在Linux中,拥有可写权限即代表可以在目录中删除和创建文件。因此,攻击者可以删除目录中不可修改的文件,再创建一个自己的文件,从而达到修改目标文件的目的。此外,还可以将创建的文件改为符号链接,并将其链接到一个普通用户无法访问的文件上。此时,如果有使用该符号链接的操作,则会间接控制该文件。
举个例子,/var/log/testlog/目录具有777权限。test软件在运行时会向/var/log/testlog/test.log文件中写日志,日志中的内容有一部分是用户可控的。攻击者可以在/var/log/目录下创建一个名为test.log的符号链接,并将其链接到crontab文件上。利用crontab对文件格式的弱敏感性,攻击者可以执行自己的任意命令。
(3)Capability滥用
Linux Capability为进程提供了有限的root功能,这就导致它即使不是root进程,也具有一些高级权限。我们可以利用这样的进程进行提权。
首先我们查找具有Capability的进程,使用如下所示的命令。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/169_01.jpg?sign=1739279271-wLZia6ROchMLIhPPxemztDzLryk58uNI-0-4244359227b0bff43e47fb88fef94fbb)
如上所述,该程序如果具有cap_dac_override,则可以写任意文件。接下来,如果可以控制写的目标文件和目标内容,我们就能达到提权的目的了。
另外,还有很多高危的Capability,比如CAP_SYS_ADMIN、CAP_SYS_PTRACE、CAP_SYS_CHOWN等,都是可以具有提权风险的。
(4)SUID
具有SUID的程序会始终以该程序文件的拥有者的用户身份执行,若普通用户启动具有SUID的root程序,则其权限最终会变为root权限。最常见的此类程序包括sudo、su等。因此,如果存在具有SUID权限的程序,攻击者需要格外关注,很可能可以利用这个漏洞来提升权限。
(5)socket
这里提到的用于提权的socket通常指UNIX socket,用于进程间通信。当然,也可以使用TCP/UDP的socket进行通信,因为有些进程使用这种socket进行通信。
无论哪种socket,它们的攻击方式都是类似的。首先,服务器端是一个root进程。然后,普通用户需要能够与该服务器进行socket通信,从而通过服务器端的漏洞实现提权的目的。有时,服务器端只是充当中介角色,真正完成通信业务的是其他进程,比如DBus、MQTT、ZMQ之类的协议。因此,攻击面就会扩大到多个进程中。
这种提权取决于服务器代码是否存在漏洞,因此在这里我们只介绍如何使用UNIX socket。与TCP相比,UNIX socket的使用方式类似,只是将IP地址和端口号替换为文件路径,代码如下。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/169_02.jpg?sign=1739279271-VorhzlhJdR40nlm634REdYeWWHLIIB2K-0-d5f9e1bf4af244400b43c769fa47950c)
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/170_01.jpg?sign=1739279271-XZmpr2TI5FlJHWgwUv0pc2zt7QsqiWnA-0-61aa16cf3d52b76222dddd6ec539570f)
(6)其他Linux IPC
Linux的IPC(Linux Inter Process Communication)有多种,上面提到的socket是常用的一种,其他还有MemoryMap、MessageQueue、NamedPipe、SharedMemory等。这里任何一种都可以作为提权的攻击面使用,其原理和socket是一样的。攻击者作为普通用户通过这些IPC与具有root权限的进程通信,如果该root进程在此通信中存在漏洞可被利用,则会造成提权。
接下来列举一下如何利用这些IPC与root进程通信。
❑MemoryMap
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/170_02.jpg?sign=1739279271-tZzid4mcsjYS4G7adAWoHeTqajhVjaTa-0-da8142a2127b94c85d6ed1f0f95dc18e)
❑消息队列(SystemV)
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/170_03.jpg?sign=1739279271-9iNprrZK7Guui3ELiPrxgjQ6f67q3n4d-0-7364d96f65867075c5a031bc785ce1af)
❑消息队列(Posix)
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/170_04.jpg?sign=1739279271-omHhUqMIip7ZDsDIptWorqxdNjOnasl1-0-73ccbdfac779bb9494086bade455698d)
❑NamedPipe
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/170_05.jpg?sign=1739279271-gV8enC9iixwhvgG4EMxJpYEZJRVICHCn-0-66f5a4922424d45b1970853afee2862a)
❑SharedMemory
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/170_06.jpg?sign=1739279271-UV13Ni9Bf04CQMfGE3Fnwf0Flbzm73Bq-0-3639c0ef14a70a0c022a3e36695523f7)
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/171_01.jpg?sign=1739279271-jEqV6gyXtZkDWRZwLKd8KjILpIZGu4Go-0-562259fe81f77a0af8737942d4761bf4)
(7)总线协议
在操作系统中,有一些协议被称为总线协议。它们类似于中介,负责分发消息给不同的进程。在Linux中,常见的总线协议包括DBus和MQTT协议。本节将介绍DBus协议的攻击方法。
DBus协议的中介是dbus-daemon。各个服务端会首先将自己注册到中介那里,然后中介负责接受客户端的请求并将其分发给不同的服务端。它既支持UNIX socket也支持TCP socket,一般在进程间通信时会使用UNIX socket。下面介绍如何利用DBus进行攻击。
首先需要查找系统中注册了哪些服务,可以使用busctl list命令获取。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/171_02.jpg?sign=1739279271-9dyVJl2gWhWrI5VvzGZjDqTlbf7m6Q1m-0-b8ed82bf1a02576eb35986ebe9fd0f5b)
接着,看这些服务有哪些接口。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/171_03.jpg?sign=1739279271-Rqe4Kb0gw8f97SI7VBGJAHYxL2hBt4Bn-0-715e02c09cc3cbdbc942d2375ae180f2)
再看这些接口具有哪些方法。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/171_04.jpg?sign=1739279271-gns7oWp7ZDUmZ0kMXmq7hpUcK7SxWHDK-0-528cc85577f9e617054e8e8e1ee6aec2)
有了以上这些信息,就可以调用服务了,如下所示。
![](https://epubservercos.yuewen.com/2593A2/28235010504763506/epubprivate/OEBPS/Images/171_05.jpg?sign=1739279271-68i844nNI6hjH4aPZQ0MfKTfZYl5A6Dv-0-1821419f5af8e7ecbd3eadf6e59f6935)
3.内核态提权攻击
内核态攻击一直是操作系统的一个热门话题。由于内核具有系统非常高的权限,攻击者往往需要在获取系统普通应用程序权限后攻击内核以获取更高的权限,尤其是在用户态提权不易操作的情况下。因为Linux有许多分支版本和模块更新非常频繁,所以Linux内核的漏洞不断涌现。而且,Linux漏洞补丁的修复也比较复杂,很多分支版本并没有跟主线同步更新。因此,新的漏洞补丁需要再次人工合并。此时,如果该补丁在主线上没有明确标识为漏洞补丁,则可能会在分支上被忽略。
本节将简要介绍常见的Linux内核态攻击方法,并介绍如何触发内核代码路径。
(1)来自用户态程序的输入
1)syscall系统调用:这是用户态程序与内核交互的主要方式,Linux内核包含400多个系统调用。
2)文件操作:这实际上也是一组系统调用(open、read、write、ioctl),但是它会根据打开的不同文件使用不同的功能。
3)socket操作:这也是一组系统调用(socket、bind、listen等),与文件操作类似,它根据打开的不同socket类型具有不同的功能。
4)异常中断:当软件产生错误时,系统会跳转到内核的中断处理函数。这也是一个攻击面,比如常见的coredump提权就是从此路径来攻击的。
(2)来自底层设备、硬件等的输入
1)网络设备:这主要是指与外部通信的设备有流量输入,比如以太网、串口、CAN总线等通信设备。当有流量进入时,内核中对应的设备驱动会进行解析。
2)存储设备:这主要是指一些可插拔的存储设备,比如USB、SD卡等。当这些设备插入后,内核会有响应的驱动来执行。
3)其他输入设备:这主要是指各个特定用途的设备,比如键盘、鼠标、摄像头等。它们与上述设备也是类似的,有响应的驱动来处理它们输入的数据,通常也是利用标准的接口协议,比如USB、以太网等。
关于Linux的攻击路径就是上面所介绍的,至于具体的漏洞挖掘和利用,则需要我们深入了解内核的实现原理,包括各个子系统以及驱动的实现。通常采用人工审计和Fuzz的方式。此外,内核也像用户态一样存在各种内存漏洞利用缓解措施,比如KASLR(地址随机化)、StackProtect(栈保护)等,因此还需要掌握绕过这些缓解措施的利用手段。
更多关于内核态攻击的内容,大家可以在网上自行学习,比如https://github.com/xairy/linux-kernel-exploitation就提供了对内核的各种利用方法。
总结一下,本章根据笔者和业内专家的渗透测试经验总结提炼出了许多实战技巧思路,对不同的攻击面进行了详细介绍。本章涵盖了硬件安全和软件安全两方面的内容,从固件提权到逆向工程,再到协议实战,通过多个方面的内容带领读者进入了一个真实的车联网攻击的世界。
渗透测试是最能够体现汽车安全性的手段之一。我们此次以攻击者的视角,对汽车的各个攻击面进行攻击测试,最终将漏洞作为结果呈现出来。因此,从正向设计、开发、防御的角度来看,熟悉渗透测试就了解了攻击者的思路,知己知彼,以攻促防,才能做到百战百胜。