关于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 ...
随机推荐
- spring——通过xml文件配置IOC容器
创建相关的类(这里是直接在之前类的基础上进行修改) package com.guan.dao; public interface Fruit { String getFruit(); } packag ...
- weblogic重要漏洞记录
(PS:之前在freebuf发过,这里直接复制过来的,所以有些图片会有水印) 前言 T3协议存在多个反序列化漏洞CVE-2015-4852/CVE-2016-0638/CVE-2016-3510/CV ...
- 有关电控制图软件EPLAN的安装,下面有破解版本2.7
前段时间刚刚接触这一块,就安装个软件老是出问题,所以我通过自己的努力学会啦,来给正要学习EPLAN的同学发福利啦 15:07:48 安装包发放在百度网盘来自取呀 建议安装我勾选的这个哦 链接:htt ...
- Rabbitmq安装与部署
一:安装依赖软件Erlang 安装包otp_src_22.3.tar.gz,下载到部署服务器tar -zxvf解压 mv otp_src_22.3 ./erlang变更文件夹名字 可能需要安装的依赖包 ...
- Python使用pip安装No matching distribution found for PyYaml==5.3.1
ERROR: Command errored out with exit status 1: command: /usr/local/dmahz/p_book_data/bin/python3.9 - ...
- prometheus-存储
采集到的样本以时间序列的方式保存在内存(TSDB 时序数据库)中,并定时保存到硬盘中 prometheus一般会保留15天 prometheus按照block块的方式来存储数据,每2小时为一个时间单位 ...
- 学习ansible(一)
1.介绍 1 ansible基于Python开发的自动化运维工具 2 ansible基于ssh协议实现远程管理的工具,没有客户端 3 ansible软件可以实现多种批量管理操作 2.环境 主机 IP ...
- vue 3d轮播组件 vue-carousel-3d
开发可视化项目时,需要3d轮播图,找来找去发现这个组件,引用简单,最后实现效果还不错.发现关于这个组件,能搜到的教程不多,就分享一下我的经验. 插件github地址:https://wlada.git ...
- jdk_8接口的内部内容
目标: 如何创建已定义好的接口类型的对象呢? 步骤: 实现的概述 抽象方法的使用 默认方法的使用 静态方法的使用 接口的常量使用 讲解: 实现的概述 类与接口的关系为实现关系,即类实现接口,该类可以称 ...
- Tomcat警告之“资源添加到Web应用程序[]的缓存中,因为在清除过期缓存条目后可用空间仍不足 - 请考虑增加缓存的最大空间”
原因 缓存不够,可以将其缓存调大 解决办法: 在 /conf/context.xml 的 前添加以下内容: <Resources cachingAllowed="true" ...