⚠️ 我们已不再积极维护此项目 ⚠️
Electronegativity 是一个用于识别基于 Electron 的应用中的配置错误和安全反模式的工具。
它利用 AST 和 DOM 解析来查找与安全相关的配置,如白皮书《Electron 安全清单——开发者和审计者指南》中所述。
软件开发者和安全审计员可使用此工具来检测和减轻使用 Electron 开发应用时潜在的弱点及实现漏洞。使用 Electronegativity 仍需对 Electron(不)安全性有良好理解,因为该工具检测到的某些潜在问题需要手动调查。
如果你对 Electron 安全感兴趣,请查阅我们的 BlackHat 2017 研究报告《Electronegativity —— Electron 安全研究》,并关注 Doyensec 的博客。

如果你需要更强大或更新的工具,基于 Electronegativity 的改进版 SAST 工具已作为 Doyensec 多年应用研发的成果推出。2020 年底,我们制定了项目路线图,并组建了开发团队,致力于打造现在的 ElectroNG。你可以通过最近的 博客文章 了解更多相对于开源版本的主要改进。
主要版本已发布到 NPM,可以直接安装:
$ npm install @doyensec/electronegativity -g
$ electronegativity -h
对包含 Electron 应用的目录使用 electronegativity 查找问题:
$ electronegativity -i /path/to/electron/app
对 asar 归档文件使用 electronegativity 并将结果保存为 CSV 文件:
$ electronegativity -i /path/to/asar/archive -o result.csv
在从某个 Electron 版本升级到另一个版本时使用 electronegativity 查找破坏性变更:
$ electronegativity -i /path/to/electron/app -v -u 7..8
注意:如果遇到致命错误 "JavaScript heap out of memory",可以使用 node --max-old-space-size=4096 electronegativity -i /path/to/asar/archive -o result.csv 运行。
Electronegativity 允许通过 eng-disable 注释禁用个别检查项。例如,若要使特定检查项忽略某一行代码,可以这样禁用:
const res = eval(safeVariable); /* eng-disable DANGEROUS_FUNCTIONS_JS_CHECK */
<webview src="https://doyensec.com/" enableblinkfeatures="DangerousFeature"></webview> <!-- eng-disable BLINK_FEATURES_HTML_CHECK -->
任何 eng-disable 行内注释(// eng-disable、/* eng-disable */、<!-- eng-disable -->)都会针对该行禁用指定的检查项。也可以同时提供多个检查项名称,使用蛇形命名 ID(如 DANGEROUS_FUNCTIONS_JS_CHECK)或构造名称(如 dangerousFunctionsJSCheck):
shell.openExternal(eval(safeVar)); /* eng-disable OPEN_EXTERNAL_JS_CHECK DANGEROUS_FUNCTIONS_JS_CHECK */
如果在 .js 或 .html 文件顶部、任何代码之前放置 eng-disable 指令,则会针对整个文件禁用传递的检查项。
eng-disable 注释的说明在 v1.9.0 之前,无法通过代码注释禁用全局检查项。如果你仍在使用旧版本,请改用 -x CLI 参数手动禁用检查项列表(例如 -x LimitNavigationJsCheck,PermissionRequestHandlerJsCheck,CSPGlobalCheck)。
注意:对于某些更高级别的检查项(如 CSP_GLOBAL_CHECK、AVAILABLE_SECURITY_FIXES_GLOBAL_CHECK),使用注释可能不适用。对于这些情况,你可能需要使用 -x 标志从扫描中排除特定的检查项。
Electronegativity Action 可以作为 GitHub CI/CD 流水线的一部分运行,以获得“代码扫描警报”:

你也可以以编程方式使用 electronegativity,选项与 CLI 类似:
const run = require('@doyensec/electronegativity')
// 或:import run from '@doyensec/electronegativity';
run({
// 输入(目录、.js、.html、.asar)
input: '/path/to/electron/app',
// 将结果保存为 CSV 或 SARIF 格式的文件(可选)
output: '/path/for/output/file',
// true 保存为 SARIF,false 保存为 CSV(可选)
isSarif: false,
// 仅运行指定的检查项(可选)
customScan: ['dangerousfunctionsjscheck', 'remotemodulejscheck'],
// 仅返回达到或超过指定严重级别的发现(可选)
severitySet: 'high',
// 仅返回达到或超过指定置信级别的发现(可选)
confidenceSet: 'certain',
// 显示文件的相对路径(可选)
isRelative: false,
// 运行 Electron 升级检查,例如 -u 7..8 检查从 Electron 7 升级到 8(可选)
electronUpgrade: '7..8',
// 假设使用设定的 Electron 版本,覆盖检测到的版本
electronVersion: '5.0.0',
// 使用额外的解析器插件
parserPlugins: ['optionalChaining']
})
.then(result => console.log(result))
.catch(err => console.error(err));
结果包含全局和原子检查项的数量、解析过程中遇到的错误以及一个发现问题的数组,如下所示:
{
globalChecks: 6,
atomicChecks: 36,
errors: [
{
file: 'ts/main/main.ts',
sample: 'shell.openExternal(url);',
location: { line: 328, column: 4 },
id: 'OPEN_EXTERNAL_JS_CHECK',
description: '审查 openExternal 的使用',
properties: undefined,
severity: { value: 2, name: 'MEDIUM', format: [Function: format] },
confidence: { value: 0, name: 'TENTATIVE', format: [Function: format] },
manualReview: true,
shortenedURL: 'https://git.io/JeuMC'
},
{
file: 'ts/main/main.ts',
sample: 'const popup = new BrowserWindow(options);',
location: { line: 340, column: 18 },
id: 'CONTEXT_ISOLATION_JS_CHECK',
description: '审查 contextIsolation 选项的使用',
properties: undefined,
severity: { value: 3, name: 'HIGH', format: [Function: format] },
confidence: { value: 1, name: 'FIRM', format: [Function: format] },
manualReview: false,
shortenedURL: 'https://git.io/Jeu1p'
}
]
}
如果你考虑为此项目做贡献,请查看我们的 CONTRIBUTING.md。
Electronegativity 的诞生离不开众多贡献者的工作。
本项目由 Doyensec LLC 赞助。
请我们攻破你的 Electron.js 应用程序吧!
| 选项 | 描述 |
|---|
| -V | 输出版本号 |
| -i, --input | 输入(目录、.js、.html、.asar 文件) |
| -l, --checks | 仅运行指定的检查项,以 CSV 格式传入 |
| -x, --exclude-checks | 跳过指定的检查项列表,以 CSV 格式传入 |
| -s, --severity | 仅返回达到或超过指定严重级别的发现 |
| -c, --confidence | 仅返回达到或超过指定置信级别的发现 |
| -o, --output <filename[.csv or .sarif]> | 将结果保存为 CSV 或 SARIF 格式的文件 |
| -r, --relative | 显示文件的相对路径 |
| -v, --verbose | 显示发现的描述信息,默认为 true |
| -u, --upgrade <当前版本..目标版本> | 运行 Electron 升级检查,例如 -u 7..8 检查从 Electron 7 升级到 8 |
| -e, --electron-version <版本> | 假设使用设定的 Electron 版本,覆盖检测到的版本,例如 -e 7.0.0 视为使用 Electron 7 |
| -p, --parser-plugins <插件> | 指定额外的解析器插件,以逗号分隔,例如 -p optionalChaining |
| -h, --help | 输出帮助信息 |