关于Electron框架应用的安全测试
Electron框架应用的安全测试
0.Electron相关简介
electron.js是一个运行时框架,它在设计之初就结合了当今最好的Web技术,核心是使用HTML、CSS、JavaScript构建跨平台的桌面应用。
作为一个跨平台的“集成框架”,它能轻松和多平台兼容。而所谓的“集成框架”也就是它将“Chromium”和“Node.js”很好的集成,并明确分工。
Electron负责硬件部分,“Chromium”和“Node.js”负责界面与逻辑,共同构成了成本低廉却高效的解决方案。
比如流行的VS Code,WhatsApp,WordPress等应用都是使用了electron框架来构建跨平台开发
特点如下:
1.摆脱了不同浏览器之间的差异和版本的限制
2.基于Node.js,有活跃的贡献者社区管理和第三方丰富的包支持
3.可以开发跨平台的桌面应用。只需要写一份代码,可以构建出三个平台的应用程序
a.优势
1.摆脱浏览器的沙盒机制,可以访问操作系统层面的东西。
2.跨平台,前端人员能在不学习其他语言的情况下,快速构建跨平台,带来统一的用户体验
b.劣势
1.打包的APP太大,简单的应用多大几十兆
2.引入Node.js的API具备接触系统底层的能力,控制不当易引发安全风险,直接从对浏览器的影响提升为对系统的影响。
1.与传统Web开发的区别与联系
回顾以前的web开发,无论是HTML、CSS还是Java,都是运行在浏览器沙盒中的,无法越过浏览器的权限访问系统本身的资源,代码的能力被限制在了浏览器中。浏览器之所以这么做,为了安全的考虑。设想一下,使用浏览器的时候,会打开各样不同的网站,如果代码有能力访问并操作本地操作系统的资源,那将是可怕的事情。
但开发桌面应用程序,如果无法访问到本地的资源肯定是不行的。
而使用Electron架构的应用程序分成三个基础模块:主进程、渲染进程、进程间通信;
Electron将nodejs引入并作为主进程,可以访问和操作本地资源,使用原本在浏览器中不提供的高级API。同时主进程负责管理整个应用程序的生命周期以及所有渲染进程的创建和销毁。 在主进程中运行的脚本通过创建web页面来展示用户界面。它内置了完整的Node.js API,主要用于打开对话框以及创建渲染进程。此外,主进程还负责处理与其他操作系统交互、启动和退出应用程序。
渲染进程是应用程序中的浏览器窗口。与主进程不同,Electron可以有许多渲染进程,且每个进程都是独立的。由于 Electron 使用了 Chromium 来展示 web 页面,所以 Chromium 的多进程架构也被使用到。 每个Electron 中的 web 页面运行在它自己的渲染进程中。正是因为每个渲染进程都是独立的,因此一个崩溃不会影响另外一个,这些要归功于Chromium的多进程架构。
2.对electron解包的一般思路
在Electron项目开发中,resource\目录下的代码文件默认是明文可见的,如果没有对项目封装打包,就可以进行白盒审计,发现更多的问题,而如果只是使用npm执行asar对app.asar文件(resources目录里)合并归档,则会很容易被解包。而对Electron源码保护方案讨论由来已久。官方并没有打算提供解决方案。作者们认为,无论用什么形式去加密打包文件,密钥总归是需要放在包里。
因为asar只是对源码的合并归档,并不提供加密之类的操作。 通过asar e的命令,可以很简单地进行解压和得到源码。
//1.安装npm
//2.全局安装 asar
npm install asar -g
//3.解包
用asar命令解包:asar e app.asar app
3.DOM-Based XSS--->RCE
由于electron框架开发出的应用,不只是一个浏览器。在Web浏览器中,基于安全策略考虑,web页面通常是在一个沙盒环境中运行的,不被允许去接触原生的资源。
然而在Electron中,允许页面(渲染进程)调用Node.js的API,原生具备操控系统底层的能力,所以页面可以与操作系统底层进行交互,如执行系统命令,那么DOM Based-XSS在electron就会提升为RCE,直接从对浏览器的影响提升为对系统的影响。
Electron是基于Chromium的内容模块实现的,但是从本质上来说它就不是一个浏览器。它可以给开发人员提供非常强大的功能,而且Electron的灵活性也可以有助于构建复杂的桌面应用程序。
所以,实际上Electron整合了Node.js,所以JavaScript可以直接访问操作系统并完全利用原生的桌面机制。
如:假设在使用electron开发的应用中发现某处DOM based XSS,那么直接就可以提升为RCE,如下
//要利用electron的xss,只需要引入nodejs自带的命令执行模块child_process即可
//Electron框架,Dom XSS->RCE,比如弹计算器
<img src="" onerror="require('child_process').exec('calc.exe')">
<img src=1 onerror=require('child_process').exec('calc.exe')>
<img/src="1"/onerror=eval(`require("child_process").exec("calc.exe");`);>
<img src=# onerror="require('child_process').exec('calc.exe',null);">
<img src=# onerror="require('electron').shell.openExternal('file:C:/Windows/System32/calc.exe')">
5.漏洞原理
应用开发使用了Electron框架,且nodeIntegration默认值为True,说明开启了Node.js扩展,那就能够调用node.js模块从XSS到RCE, 只要不进行严格的过滤,就会造成rce
<img src=1 onerror="require('child_process').exec('calc.exe')">
注意:
Electron中使用了一个标记nodeIntegration用来控制页面对node的API的访问,只有nodeIntegration为true的时候,才可以使用如require,process这样的node API去访问系统底层资源。
5.修复方案
1. 使用 DOMPurify 过滤 XSS Payload,或者 React JSX;
2. 谨慎开启nodeIntegration参数,如果开启一定要对用户可控输入点做好充分的过滤,如特殊字符实体编码。
可参考:https://www.electronjs.org/docs/latest/tutorial/security#2-do-not-enable-nodejs-integration-for-remote-content
3.可使用webpack类似的前端构建工具,对项目代码进行加密混淆
为了安全性,官方将 electron@v12.0.0 的 contextIsolation 的默认值改了。所以今后要在渲染进程里调用 require 的话,还需要加上 contextIsolation: false 。
6.总结
防御Electron开发程序的逆向,从目前看方案比较有限,混淆后效果也不佳,和传统的二进制逆向相比,逆向难度不会太大。所以,electron比较适合拥抱开源生态的开发者,不适合个人及企业对保护源代码,保护自身的专利技术及知识产权的应用开发。
关于Electron框架应用的安全测试的更多相关文章
- 从零开始编写自己的C#框架(24)——测试
导航 1.前言 2.不堪回首的开发往事 3.测试推动开发的成长——将Bug消灭在自测中 4.关于软件测试 5.制定测试计划 6.编写测试用例 7.执行测试用例 8.发现并提交Bug 9.开发人员修复B ...
- 【Electron】Electron开发入门(八):自定义electron框架外壳(shell)的菜单(Menu)
1.自定义electron框架外壳(shell)的菜单(Menu) electron的main.js里代码: const Menu = require('electron').Menu; var te ...
- Java自动化测试框架-10 - TestNG之测试结果篇
1.-测试结果 1.1-成功,失败和断言 测试被认为是成功的,如果它不引发任何异常完成,还是它扔的预期异常(请参阅文档expectedExceptions属性上找到的@Test注释). 您的测试方法通 ...
- 『德不孤』Pytest框架 — 1、Pytest测试框架介绍
目录 1.什么是单元测试框架 2.单元测试框架主要做什么 3.单元测试框架和自动化测试框架有什么关系 4.Pytest测试框架说明 5.Pytest框架和Unittest框架区别 (1)Unittes ...
- 《手把手教你》系列基础篇(七十七)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 上篇(详解教程)
1.简介 今天主要是讲解和分享:TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用dependsOnMethods,testNG会自动根据@Test方法名称 ...
- 《手把手教你》系列基础篇(七十八)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试- 中篇(详解教程)
1.简介 上一篇讲解了依赖测试的各种方法,今天继续讲解依赖测试的方法,这一篇主要是讲解和分享通过xml文件配置组名依赖方法( 主要是测试组的用法).废话不说,直接上干货. 2.实例 测试组:一个组可包 ...
- 《手把手教你》系列基础篇(八十)-java+ selenium自动化测试-框架设计基础-TestNG依赖测试-番外篇(详解教程)
1.简介 经过前边几篇知识点的介绍,今天宏哥就在实际测试中应用一下前边所学的依赖测试.这一篇主要介绍在TestNG中一个类中有多个测试方法的时候,多个测试方法的执行顺序或者依赖关系的问题.如果不用de ...
- RPC框架性能基本比较测试
RPC框架:gRPC.Thrift.Wildfly.Dubbo 原文链接:http://www.open-open.com/lib/view/open1426302068107.html gRPC是G ...
- ORM框架示例及查询测试,上首页修改版(11种框架)
继上次ORM之殇,我们需要什么样的ORM框架? 整理了11个ORM框架测试示例,通过示例代码和结果,能很容易了解各种框架的特性,优缺点,排名不分先后 EF PDF XCODE CRL NHiberna ...
随机推荐
- 面向对象编程(C++篇4)——RAII
目录 1. 概述 2. 详论 2.1. 堆.栈.静态区 2.2. 手动管理资源的弊端 2.3. 间接使用 2.4. 自下而上的抽象 3. 总结 4. 参考 1. 概述 在前面两篇文章<面向对象编 ...
- 面试问题之操作系统:linux线程API
https://blog.csdn.net/youwotianya/article/details/80933449
- 数组有没有length()方法?String有没有length()方法?
数组没有length()方法,有length 的属性.String 有length()方法.JavaScript中,获得字符串的长度是通过length属性得到的,这一点容易和Java混淆.
- Mosquitto安装和使用
Mosquitto是一个实现了MQTT3.1协议的代理服务器,由MQTT协议创始人之一的Andy Stanford-Clark开发,它为我们提供了非常棒的轻量级数据交换的解决方案. 下载地址是: ht ...
- Spring Data Jpa使用QueryDsl接口出现的一些问题
1.QuerydslPredicateExecutor当实现此接口时,如果出现什么什么类没有找到的时候,请确认相关的querydsl依赖是否已经添加到maven依赖中 <dependency&g ...
- Redis++:Redis做分布式锁真的靠谱吗
Redis做分布式锁真的靠谱吗 Redis的分布式锁可以通过Lua进行实现,通过setnx和expire命令连用的方式 || 也可以使用高版本的方法同时设置失效时间,但是假如在以下情况下,就会造成无锁 ...
- ACM - 动态规划 - UVA323 Jury Compromise
UVA323 Jury Compromise 题解 考虑用动态规划.该问题要求解的最终状态为,选出的 \(m\) 个人,使得辩方总分与控方总分差的绝对值最小,总分之和最大.即 \(\left| D(\ ...
- 一道关于压缩包的ctf题目(包括暴力破解,明文攻击,伪加密)
关于题目附件 链接:https://pan.baidu.com/s/1PRshlizSndkgxkslnqJrHA 提取码:p76e zip三连击 下载附件得到题目 手机号码一般是11位,那么我们设置 ...
- scanf()函数的原理
最近使用scanf发现了自己对scanf函数还是不太了解,主要出现在无意中出现的一个错误: scanf正确的写法是,scanf中以什么格式输入变量,则变量的类型就应该是什么格式,如下面scanf输入到 ...
- 判断1~n有多少个1
判断1~n有多少个1 例如:1~12中 1 2 3 4 5 6 7 8 9 10 11 12 有1,10,11,12中含有1,则共有5个1: 算法如下: #include<stdio.h> ...