安全摄像头登录页面泄露GitHub管理员令牌
最近我又开始琢磨安全摄像头了,因为AXIS 正大力推动旗下所有摄像头都能轻松运行 Linux 应用程序。在企业的环境中,它们是更重要的安全目标,需要像对待其他系统一样管理其漏洞和凭证等。有人向我提到一家我没听说过的公司——韩华(Vision)。我查看了他们的网站,发现每个型号的摄像头都有可下载的固件文件,这总是让人开心的事。
探索
我把固件镜像扔给 binwalk,期望它只是个 rootfs 之类的,但里面却有一个单独的 tarball 文件,包含一些 AI 相关的东西,还有一个 fwimage.tgz,binwalk 标记为加密。
我在网上搜了一下,发现 Matt Brown 有一篇关于这些摄像头的文章,帮我解决了问题。基本上密码就是 HTW 加上型号,比如 HTWXNP-9300RW 就能用。
看来他们现在做了更多处理,因为那个 tarball 里面还有另一个 fwimage.tgz,也是加密的,但方案不同,所以不能直接套用 Matt Brown 的方法。我本来以为只能放弃了,觉得韩华用了更高级的方法,比如把密钥烧录到硬件里(显然这也不是万无一失,但至少需要拥有摄像头才能开始)。不过,外层的 tarball 里有一个 fwupgrader 二进制文件,我就把它丢进 Ghidra 开始研究。
这要是 2023 年,我可能会手动研究一番,但现在我把任务交给 Claude Code,然后去做了顿美餐,陪了陪另一半,回来后就有了详细的分析结果和一个好用的 rootfs。
韩华在 fwupgrader 中加入了混淆,以隐藏解密实际 rootfs 的方式。AES 密钥与二进制文件中的一个小型静态密钥表进行 XOR 运算,并在运行时重新组装(IV 是明文的)。fwupgrader 只是调用 openssl 命令行,甚至命令片段也以同样的方式进行了 XOR 混淆。
重构后的命令如下:
openssl enc -md sha256 -aes-256-cbc -d \
-K <KEY> -iv <IV> -in <INPUT> -out <OUTPUT>
由于密钥和 IV 都是硬编码的(同一型号系列通用),我在此公布它们:
KEY = dfa049bb922e63e2decc764af5628068e5b7a2662e479a615b14643e567579b0
IV = 53f926801b81454a4f889c9a390db6e6
有了这些,我们就能得到一个完整的根文件系统,可以正常分析了。
truffles
既然终于可以直接查看内容,我立刻运行了 trufflehog,看看有没有明显的问题。结果发现一个 GitHub 令牌在大约 30 个文件中重复出现……我检查了该令牌能访问哪些仓库,发现它对 GitHub 组织中的数百个仓库拥有管理员权限。
这并非我第一次遇到有组织在固件中打包 GitHub 令牌的情况……不过那是另一篇博客的内容了。那么为什么这个组织要把令牌放在 30 个文件中呢?看起来他们用 Vite 构建这些摄像头的 UI,其中一个变量在构建时被设置为整个 process.env,这意味着 CI 作业的整个环境都被写入了这些文件。
var W = {
DATAPORT: "9090",
GIT_LFS_SKIP_SMUDGE: "1",
npm_command: "run-script",
KUBERNETES_SERVICE_PORT_HTTPS: "443",
GITHUB_NPM_TOKEN: "<snip>:ghp_…REDACTED…",
npm_config_userconfig: "/home/docker/.npmrc",
// etc
我没有这些摄像头可以测试,但我认为这意味着任何访问这些摄像头管理界面的人,都可能通过网络收到这个 GitHub 令牌,并且(希望)没有恶意的人注意到它。不过,也许它并没有实际被发送,只是留在了磁盘上。
不过环境中还有一些其他……有趣的数据:有一些环境变量包含 IP 地址,但这些 IP 地址属于美国国防部:
- SWARM_MASTER_NFS_ADDRESS: 55.101.212.23
- OTEL_ELASTIC_URL: http://55.101.212.21:5601/<snip>
- CIMIP: 55.101.211.213
嗯……这仅仅是巧合,是那种人们明知永远不会与这些 IP 交互却仍将其用于内部服务的奇怪案例(顺便说一句,这种做法很疯狂),还是说韩华与美国国防部有更直接的联系?
我们来看看维基百科上关于 Hanwha Vision 的页面:
Hanwha Vision(韩语:한화비전),前身为 Samsung Techwin,是一家视频监控公司,是 Hanwha Group 的子公司。
曾生产过的产品
K9 Thunder 自行火炮、K10 弹药补给车、K2 Black Panther 的子系统、哨戒机枪机器人 SGR-A1。
哦……好吧……我还记得高中时读过 SGR-A1 的报道,但从未想过自己会在后来的职业生涯中偶然捡到制造商的关键凭证……这人生有时候还真是奇妙……
以下内容纯属推测
不过,这些设备并非美国制造,也不是什么美国产品。为什么 Hanwha Vision 需要任何与国防部(DoD)沾边的东西?有没有可能,它们的 CI 系统是由母公司 Hanwha 的某个集中团队提供的,而同属姐妹公司的 Hanwha Aerospace 的需求,导致共享平台上出现了这些 CI 环境变量?或者,是因为另一家姐妹公司——生产其他大型恐怖钢铁机器的 Hanwha Defense USA?
再深挖一点
我想确认这不是偶然,他们的固件里也不至于有成百上千个不同的 GitHub 令牌。于是我爬取了韩华网站,下载了所有能找到的摄像头固件,最终大概有 500 个(摄像头型号约有 600 多种,但并非都有固件列表)。用同样的方法,我成功解压了其中 62% 的固件,只有三个包含 GitHub 令牌,而且都是同一个。
不太确定其他固件为什么不行,但对我来说已经足够满意了。
披露
我写了一封很短的邮件,提供了足够的信息来定位令牌的位置,然后发给了韩华。他们有一个公开的邮箱用于报告安全问题,12 小时内就回复了我,通知令牌已被撤销。当然,他们本就不该把 GitHub 令牌放在那里,但我从未遇到过如此迅速的回应和解决。
我们真的必须停止这么频繁地犯这些错误了,不然我还怎么睡觉呢?
谢谢电脑,下次见。