车门不是被撬开的,是被登录远程开的

导语:这车不是被撬开的。攻击者连车都没碰过——他攻的是车企的登录后台,改掉车主的邮箱和密码,走完正常登录流程拿到应用令牌,然后像车主 App 那样发出开门指令。车主手机上的 App 还登录着,告警却被引到了别人那边。


一、入口是两个车联网 App

这轮研究不是从车里硬件下手,是从两个手机 App 开始。

Assetnote 联合创始人 Shubham Shah 和独立研究员 Sam Curry 把两家车企的 Android 应用反编译,追踪认证请求。两家用的是同一套身份平台——ForgeRock(身份与访问管理厂商):登录先打到 Access Management(访问管理模块)跑认证旅程,客户档案由 OpenIDM(身份管理组件)存放。两家域名不同,骨架却一样,这个平台撑起了两家车企多个区域的消费者身份。

厂商要求不点名,理由是”安全圈太忙,别让他们分心”。网友从演示视频里那半张模糊车脸猜是丰田和雷克萨斯。

二、一条路径骗过 WAF,一个默认密码打开控制台

管理路径 /openidm/managed/user、/system/console 直接访问会被 WAF(Web 应用防火墙)挡,反复尝试还封 IP,普通登录接口却一直通。

Shah 试遍编码方式和路径分隔符,发现边缘设备在 Java 解析之前就先匹配危险路径,而静态资源前缀 /static 下的请求能直接打到后端。

于是他把穿越段和分号参数拼在一起:/static%2f..;/system%2fconsole;/bundles/.json。边缘设备看到静态文件请求,Jetty(Servlet 容器)解码斜杠、剥掉分号参数、解析掉 /static/..,规范路径成了 /system/console/bundles/.json,正好落到 Apache Felix(OSGi 运行时的 Web 控制台)的 bundles 插件上。

攻击链示意图:边缘过滤、后端解析、身份服务器与车钥匙

控制台是藏起来了,认证可没藏。不带 Authorization 头访问返回 401,带错密码一样是 401。Shah 试了文档默认值:admin / admin。

YWRtaW46YWRtaW4= 解开就是 admin:admin。响应吐出 361 个 bundle 的清单,Felix 版本 7.0.1。ForgeRock 的加固指南早就写明:这个控制台要么删掉,要么上线前改密码。没删,也没改。

三、把 Groovy 排进任务队列,拿到身份服务器上的 shell

控制台的 ConfigMgr(配置管理器)里有个 org.forgerock.openidm.schedule 工厂,配一条任务就能让 OpenIDM 脚本服务用 Groovy(脚本引擎)跑内联代码。

他们没拿这个一次性任务当命令通道——传命令、取回显太别扭。改成让脚本解码内嵌的 OSGi 包,校验 SHA-256,调 Felix 的 ShellService 装进运行时并启动,包里注册一个 HTTP servlet 当命令端点。

中间踩了个坑:OpenIDM 主机名是负载均衡的,他们靠 INGRESSCOOKIE 做会话亲和,让任务和命令落在同一节点。

cmd=ls 返回了 OpenIDM 的安装目录:conf、script、connectors、audit、secrets、db 全在眼前。

研究者的演示:车门被远程打开

图源:The Hacker News

四、WAF 还在挡,就绕到 localhost 改数据

进程环境变量里的 idm.username 和 idm.password 正好凑成一对本地管理员凭据。可 WAF 依然挡着客户目录的读写。

绕法是从服务器内部直接调自己。细节很讲究——curl 命令里故意不写 http:// 协议头:写了,外层 WAF 会在请求到达 servlet 前就拦下,省略后连接走回环接口,WAF 根本看不见。

拿到记录就是改写:PATCH 掉 /mail,再 PATCH 掉 /password,顺带把两个强制改密标志置为 false,改写要带上当前 _rev。改完之后,登录后台认为他就是车主本人。

五、走一遍正常登录流程,把 App 的令牌拿回来

用新邮箱和新密码跑 App 那条认证旅程。到了邮箱验证码这步,他们自己搭了个收信服务收六位码。

接下来是 App 那套 OAuth 换令牌流程:先拿会话换授权码,再用它换出 access、refresh 和 ID 三个令牌。更值钱的发现是,PKCE(授权码保护)的挑战值和校验值都写成了 plain,等于没做。

换到令牌后,他们把自己的推送 token 注册进去,把告警引到自己手机。车主的 App 还在线着,只是收不到提醒。邮箱测试后改回原样。

六、远程开门、远程启动:和车主 App 一模一样的指令

拿 ID 令牌里的客户 GUID 确认账户,再拉车库:VIN、订阅状态、支持的指令都能看。

登录界面:车主的账号被完整接管

图源:The Hacker News

最后一步是远程开门。第一家走全局 REST 通道,{"command": "doors-unlock"} 就把门打开,远程启动只改命令名。第二家分 REST 和 GraphQL 两套,按世代走不同路由。

车主就站在车旁边。研究者远程解锁、远程启动,然后熄火、重新锁上,每条指令都刷新车辆状态,结果当面确认。

没有 CVE。这不是产品漏洞,是部署问题:控制台没删、默认密码没改、WAF 挡错了层。厂商 2026 年初收到报告后约两小时修复。

七、另一条链,和该查的东西

澳洲那条链路子完全不同——车牌查 VIN,VIN 换订户 GUID,GUID 换车主邮箱,管理员凭据写死在第三方 JS 包里。完整过程 11 月 8 日发过。

两条链合起来,覆盖澳大利亚、美国和加拿大的车辆控制权。不管在不在车企,这张自查清单都该走一遍:

  • 上生产前删掉 /system/console,或改掉默认密码
  • 别指望 WAF 路径规则挡得住管理页——边缘和后端读 URL 的方式可能不同
  • 扫一遍前端 JS 包和反编译后的 App,查硬编码的管理员凭据、API key
  • 审计谁能改身份平台的用户档案,尤其是邮箱和密码字段
  • 车主侧:App 长期在线却收不到告警、密码被改过、登录设备陌生,都是失陷信号

条条大路通车门。 这次通的是登录后台。

相关链接

  • The Hacker News:https://thehackernews.com/2026/11/default-adminadmin-server-password.html
  • Sam Curry 技术分析:https://samcurry.net/forgerock

本文为原创报道,素材来自上述公开研究。所有测试均由研究者在获得授权的车辆上进行。

© 版权声明
THE END
喜欢就支持一下吧
点赞10 分享
评论 抢沙发

请登录后发表评论

    暂无评论内容