Electronegativity 是一种工具,用于识别基于 Electron 的应用程序中的错误配置和安全反模式。它利用 AST 和 DOM 解析来查找与安全相关的配置,如“Electron 安全检查表 - 开发人员和审计员指南”白皮书中所述。软件开发人员和安全审计员可以在使用 Electron 开发应用程序时使用此工具来检测和缓解潜在的弱点和实现错误。使用电负性时,仍然需要对 Electron (in) security 有很好的了解,因为该工具检测到的一些潜在问题需要手动调查。如果您对 Electron Security 感兴趣,请查看我们的 BlackHat 2017 研究 Electronegativity - A Study of Electron Security,并关注 Doyensec 的博客。
如果你需要更强大或更新的东西,基于Electronegativity的改进型SAST工具是Doyensec多年应用研发的结果。2020 年底,我们坐下来制定了项目路线图,并成立了一个开发团队来开发现在的 ElectroNG。您可以在最近的博客文章中阅读更多对 OSS 版本的一些主要改进。
安装
安装直接用npm即可
$ npm install @doyensec/electronegativity -g
-h即可查看该命令的一些常规参数
$ electronegativity -h
选择 | 描述 |
---|---|
-V |
输出版本号 |
-i, --输入 |
input (目录、.js、.html、.asar) |
-l, --检查 | 仅运行以 CSV 格式传递的指定检查 |
-x, --exclude-检查 | 跳过以 CSV 格式传递的指定检查列表 |
-s, --严重性 | 仅返回具有指定严重性级别或更高级别的调查结果 |
-c, --置信度 | 仅返回具有指定置信度或更高置信度的调查结果 |
-o, --output <filename[.csv 或 .sarif]> | 将结果保存到 CSV 或 SARIF 格式的文件中 |
-r, --relative | 显示文件的相对路径 |
-v, --verbose | 显示调查结果的描述,默认为 true |
-u, --upgrade | 运行 Electron 升级检查,例如 -u 7..8 来检查从 Electron 7 到 8 的升级 |
-e, --electron-版本 | 假设设置的 Electron 版本,覆盖检测到的版本,例如 -e 7.0.0 视为使用 Electron 7 |
-p, --parser-plugins | 指定要使用的其他解析器插件,以逗号分隔,例如 -p optionalChaining |
-h, --help | 输出使用信息 |
使用电负性在包含 Electron 应用程序的目录中查找问题:
$ electronegativity -i /path/to/electron/app
使用电负性在存档中查找问题并将结果保存在 csv 文件中:asar
$ electronegativity -i /path/to/asar/archive -o result.csv
从 Electron 的一个版本升级到另一个版本时使用电负性来查找重大变化:
$ 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 -->
任何内联注释 (, , ) 都将禁用对该行的指定检查。也可以使用蛇形大小写 ID () 或构造名称 () 提供多个检查名称:eng-disable// eng-disable/* eng-disable */DANGEROUS_FUNCTIONS_JS_CHECKdangerousFunctionsJSCheck
shell.openExternal(eval(safeVar)); /* eng-disable OPEN_EXTERNAL_JS_CHECK DANGEROUS_FUNCTIONS_JS_CHECK */
如果你在 or 文件顶部的任何代码之前放置一个指令,这将禁用整个文件的通过检查。eng-disable.js.html
关于全局检查和注释的注释eng-disable
在 v1.9.0 之前,无法使用代码注释禁用全局检查。如果您仍在使用旧版本,请使用 CLI 参数手动禁用检查列表(例如 )。请注意,使用注释可能不适用于某些更高级别的检查,例如 或 。对于这些情况,您可能希望使用标志从扫描中排除特定检查。-x-x LimitNavigationJsCheck,PermissionRequestHandlerJsCheck,CSPGlobalCheckCSP_GLOBAL_CHECKAVAILABLE_SECURITY_FIXES_GLOBAL_CHECK-x
CI/CD
Electronegativity Action 可以作为 GitHub CI/CD 管道的一部分运行,以获取“代码扫描警报”:
编程
您还可以使用与 CLI 类似的选项,以编程方式使用电负性electronegativity:
const run = require('@doyensec/electronegativity')
// or: import run from '@doyensec/electronegativity';
run({
// input (directory, .js, .html, .asar)
input: '/path/to/electron/app',
// save the results to a file in csv or sarif format (optional)
output: '/path/for/output/file',
// true to save output as sarif, false to save as csv (optional)
isSarif: false,
// only run the specified checks (optional)
customScan: ['dangerousfunctionsjscheck', 'remotemodulejscheck'],
// only return findings with the specified level of severity or above (optional)
severitySet: 'high',
// only return findings with the specified level of confidence or above (optional)
confidenceSet: 'certain',
// show relative path for files (optional)
isRelative: false,
// run Electron upgrade checks, eg -u 7..8 to check upgrade from Electron 7 to 8 (optional)
electronUpgrade: '7..8',
// assume the set Electron version, overriding the detected one
electronVersion: '5.0.0',
// use additional parser plugins
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: 'Review the use of 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: 'Review the use of the contextIsolation option',
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'
}
]
}
原文始发于微信公众号(Urkc安全):Electron 应用安全
- 左青龙
- 微信扫一扫
-
- 右白虎
- 微信扫一扫
-
评论