导语:这车不是被撬开的。攻击者连车都没碰过——他攻的是车企的登录后台,改掉车主的邮箱和密码,走完正常登录流程拿到应用令牌,然后像车主 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
本文为原创报道,素材来自上述公开研究。所有测试均由研究者在获得授权的车辆上进行。














暂无评论内容