⚠️ このプロジェクトはもはや積極的にメンテナンスされていません ⚠️
Electronegativityは、Electronベースのアプリケーションにおける設定ミスやセキュリティアンチパターンを特定するためのツールです。
このツールは、ASTおよびDOM解析を活用してセキュリティ関連の設定をチェックします。これは、ホワイトペーパー「Electron Security Checklist - A Guide for Developers and Auditors」で説明されています。
ソフトウェア開発者やセキュリティ監査者は、このツールを使用して、Electronを使ったアプリケーション開発における潜在的な脆弱性や実装バグを検出し、軽減することができます。Electronegativityを使用する際には、Electronのセキュリティ(および非セキュリティ)に関する十分な理解が依然として必要です。このツールが検出する潜在的な問題の一部は手動による調査が必要だからです。
Electronのセキュリティに興味がある場合は、BlackHat 2017の研究「Electronegativity - A Study of Electron Security」をご覧いただき、Doyensecのブログにもご注目ください。

より強力または最新のものが必要な場合は、Doyensec による長年の応用研究開発の成果として、Electronegativityをベースに改良されたSASTツールが利用可能です。2020年末に、私たちはプロジェクトのロードマップを作成し、現在 ElectroNG として知られるものに取り組む開発チームを立ち上げました。OSSバージョンからの主な改善点の一部については、最近のブログ記事で読むことができます。
メジャーリリースはNPMにプッシュされており、以下のように簡単にインストールできます。
$ npm install @doyensec/electronegativity -g
$ electronegativity -h
Electronegativityを使用してElectronアプリを含むディレクトリの問題を検索する:
$ electronegativity -i /path/to/electron/app
Electronegativityを使用してasarアーカイブの問題を検索し、結果をcsvファイルに保存する:
$ electronegativity -i /path/to/asar/archive -o result.csv
Electronegativityを使用して、Electronのバージョンアップグレード時の破壊的変更を見つける:
$ electronegativity -i /path/to/electron/app -v -u 7..8
注: 「JavaScript heap out of memory」という致命的なエラーが発生した場合は、次のようにnodeを実行してください:
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')
// 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'
}
]
}
このプロジェクトに貢献したいと考えている場合は、CONTRIBUTING.mdをご覧ください。
Electronegativityは、多くのコントリビューターの作業のおかげで実現しました。
このプロジェクトはDoyensec LLCによってスポンサーされています。
| Option | Description |
|---|
| -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 | 使用法情報を出力 |