返回资讯中心
外部精选
软件工程
#开发者实时流

研究者逆向Meta Ray-Ban智能眼镜固件并获取shell访问权限

来源标题:Hacking the meta ray-ban smartglasses

一名研究者通过反编译Meta AI应用,篡改GraphQL请求中的device_firmware_full_update_only字段,成功下载并解包了Ray-Ban智能眼镜的完整Android固件。固件126及之前版本未验证DAT APK的Meta签名,理论上可向眼镜安装任意应用,从而获得shell访问。

Hacker News 最新moooooky2026/11/7 · 今天10 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

继续反编译代码后,我发现了一个名为 device_firmware_full_update_only 的 GraphQL 输入字段。应用通常将其值填充为 false,因此我 hook 了负责添加 GraphQL 字段的通用方法,仅当字段名完全匹配时,才将值替换为 true。这样我就能够获取完整的固件更新 URL。

随后我从 CDN 下载了 zip 包。解压后发现这是一个 Android 更新包,其中包含 payload.bin。

使用 payload-dumper 处理 payload.bin,我得以导出镜像并将其挂载到文件系统中。

固件已经拿到了,但怎么才能在眼镜上获得一个 shell 呢?

Meta AI 应用中有一个开发者模式,允许开发者编写能够与眼镜交互的应用。它叫做 DAT SDK(Device Access Toolkit)。

要使用它,你需要在眼镜上安装 DAT APK。MetaAI 应用基本上是实时下载它,并获取 DAT 应用以安装到设备上。你明白我的意思了吧?

直到固件 126(含)为止,固件都没有验证 DAT APK 是否由 Meta 签名。因此理论上可以在眼镜上安装任意应用,因为没有任何验证来确认它是否是合法应用。

一个看似简单实则不简单的替换是可行的。我可以使用 frida,将合法的 DAT 应用替换为我自己签名的应用。这意味着我可以在眼镜上运行任意应用。

// hook DAT Installer field(this, "$localFile") .set(this, replacement); field(this, "$appName") .set(this, "DAT Probe"); packageField.set(this, cachedPackage); // Meta AI sends my apk return invokeSuspend.call(this, result);

现在我的自签名 DAT apk 就在眼镜上运行了!太棒了!!😎

DAT apk 只有在开发者应用请求 DAT 会话以与眼镜交互时才会运行。

因此,为了运行伪造的 DAT apk,我安装了 Meta 的一个示例应用 Camera Access,它会与眼镜上的应用创建一个 DAT 会话。

然而,我无法真正检查它是否正常运行。调试很困难。

这副太阳镜没有屏幕。没有控制台,没有日志,没有“嘿你的代码在运行”。那我怎么才能确认我的代码确实在执行呢?答案是通过听声音。

我在 DAT APK 中使用了 android.media.ToneGenerator 来发出信号,指示代码执行到了哪一部分:

通过这个序列,我成功调试了一个我之前没有考虑到的大问题:Camera Access 应用失败是因为它期望眼镜上运行的是真正的 DAT apk。当它无法启动 DWA 时,startDwaReadinessProbe() 会报告 START_ERROR_DWA_UNAVAILABLE。

而且每次失败时,它都会关闭我的连接。

修复方法

我使用 frida hook 了 startDwaReadinessProbe(),以禁用 DWA 超时并保持连接存活。

startDwaReadinessProbe.implementation = function () { // No operation };

绑定 shell

当 Meta AI 应用想要从眼镜同步照片和视频时,它会在 192.168.49.x 子网上创建一个 WiFi Direct 组。眼镜会连接到该组并获得一个 IP 地址。

为了让眼镜连接到 WiFi Direct 组,我使用 Frida hook 了 CameraAccess 应用,向 Meta AI 应用请求“high link lease”。

sub = device.createLinkLease(2, 1, cb); highLeaseSubscriptions.push(sub);

我植入的应用在该地址上绑定了 TCP 31337 的监听器,从而将我带入一个交互式 shell。

因此,从手机上我只需 nc 连接进去并发送命令,比如 id,就能在应用上下文中获得 shell 级别的执行权限。

ServerSocket listener = new ServerSocket(31337, 4, address)) nc <glasses-ip> 31337

id

uid=10097(u0_a97) gid=10097(u0_a97) groups=3003(inet)

能力越大,责任越大

我拥有这种不受控的能力大约 5 天,而就在我寻找眼镜上的提权方法时,我的 shell 访问权限消失了。

不幸的是,要么是我当时的 opsec 太差(有可能),要么是他们碰巧调查了此事并修补了漏洞。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →