关于electron
electron是chromium和nodejs的组合,主要使用了chromium的浏览器功能,并使用nodejs扩展了其文件系统访问、命令执行等功能。
由于使用的是chromium的content模块(渲染库),而不是完整的浏览器,所以同源策略需要electron自行控制;而且其扩展功能更需要仔细过滤及控制
安全性checklist
一、定时更新electron,包括chromium和nodejs模块
因为electron自身还在高速迭代中,会不断修复很多安全性bug
二、禁用nodeIntegration(重要)
启用nodeIntegration即开启nodejs扩展功能;electron APP界面一般是BrowserWindow和webview标签,都是用来加载html页面的。
若开启nodeIntegration,在html页面中可以执行命令<img/src=x οnerrοr="require('child_process').exec('gnome-calculator')">打开计算器
不建议加载远程不安全的html页面,因为即使禁用了node,默认也是可以访问file域,造成数据泄露
加载可信页面,要注意用户交互产生的XSS,因为结合node的强大功能,xss可以造成命令执行
三、使用https,并保证证书校验(重要)
排查allowRunningInsecureContent属性,排查是否忽略证书错误.on('certificate-error', 和.setCertificateVerifyProc(,及导入证书.importCertificate(
四、使用sandbox属性
虽然禁用了nodeIntegration,还有一些扩展API是暴露的,比如 window.open返回的BrowserWindowProxy。使用sandbox属性会禁止这些扩展API,但进程间通信受到了限制(具体见开发文档)
BrowserWindow支持sandbox属性,webview暂不支持
五、审查preload脚本,启用contextIsolation属性
preload脚本会无视nodeIntegration和sandbox,排查BrowserWindow的preload 的javascript脚本是否启用contextIsolation(类似chrome插件机制)
六、过滤命令行参数
比如设置代理功能和开启调试功能,排查appendArgument、appendSwitch、proxy-server、–debug
七、检测危险网站
监听跳转事件.webContents.on('will-navigate',,过滤危险网址。最好使用外部浏览器打开
八、监听权限请求事件
geolocation,打开弹窗等权限,必须实现.setPermissionRequestHandler(,否则外部网址可以恶意使用。若使用外部浏览器打开链接,则不需要关心
九、慎用insertCSS, executeJavaScript、eval、openExternal函数
十、禁止popups
webview的allowpopups可以打开新window,默认是禁止的
十一、检测自定协议
setAsDefaultProtocolClient
• registerStandardSchemes
• registerServiceWorkerSchemes
• registerFileProtocol
• registerHttpProtocol
• registerStringProtocol
• registerBufferProtocol
十二、启用CSP
同浏览器CSP,搜索webRequest.onHeadersReceived实现,或meta标签中
十三、下载并打开可执行文件(重要)
下载可执行文件,建议对其重命令,或只提供打开所在文件夹功能,避免打开文件之后执行命令
使用工具扫描
源码一般存在app.asar中,安装asar工具解包app.asar文件,然后使用electronegativity扫描源码
调试工具
https://github.com/bytedance/debugtron
抓包测试
如果APP使用net/http模块,不能使用fiddler等抓包,需使用wireshark;如果使用chromium的ajax等,则可以用fiddler抓包
参考