
Electronegativity ist ein Tool zur Identifizierung von Fehlkonfigurationen und Sicherheits-Anti-Patterns in Electron-Anwendungen.
⚠️ Wir pflegen dieses Projekt nicht mehr aktiv ⚠️
Electronegativity ist ein Werkzeug, um Fehlkonfigurationen und Sicherheits-Anti-Patterns in Electron-basierten Anwendungen zu identifizieren.
Es nutzt AST- und DOM-Parsing, um sicherheitsrelevante Konfigurationen zu finden, wie im Whitepaper "Electron Security Checklist - A Guide for Developers and Auditors" beschrieben.
Softwareentwickler und Sicherheitsauditoren können dieses Werkzeug nutzen, um potenzielle Schwachstellen und Implementierungsfehler bei der Entwicklung von Electron-Anwendungen zu erkennen und zu beheben. Ein gutes Verständnis von Electron-(Un-)Sicherheit ist dennoch erforderlich, da einige der vom Tool erkannten potenziellen Probleme manuell untersucht werden müssen.
Wenn Sie sich für Electron-Sicherheit interessieren, werfen Sie einen Blick auf unsere BlackHat 2017-Forschung Electronegativity - A Study of Electron Security und behalten Sie den Doyensec-Blog im Auge.

Wenn Sie etwas Leistungsfähigeres oder Aktuelleres benötigen, ist ein verbessertes SAST-Tool basierend auf Electronegativity als Ergebnis langjähriger angewandter Forschung und Entwicklung von Doyensec verfügbar. Ende 2020 setzten wir uns zusammen, um eine Projekt-Roadmap zu erstellen, und gründeten ein Entwicklungsteam, um an dem zu arbeiten, was heute ElectroNG ist. Sie können mehr über einige der wichtigsten Verbesserungen gegenüber der OSS-Version in einem aktuellen Blogbeitrag lesen.
Hauptversionen werden auf NPM veröffentlicht und können einfach mit folgendem Befehl installiert werden:
$ npm install @doyensec/electronegativity -g
$ electronegativity -h
Verwendung von electronegativity, um Probleme in einem Verzeichnis mit einer Electron-App zu suchen:
$ electronegativity -i /path/to/electron/app
Verwendung von electronegativity, um Probleme in einem asar-Archiv zu suchen und die Ergebnisse in einer CSV-Datei zu speichern:
$ electronegativity -i /path/to/asar/archive -o result.csv
Verwendung von electronegativity beim Upgrade von einer Electron-Version auf eine andere, um Breaking Changes zu finden:
$ electronegativity -i /path/to/electron/app -v -u 7..8
Hinweis: Wenn Sie auf den fatalen Fehler "JavaScript heap out of memory" stoßen, können Sie node mit node --max-old-space-size=4096 electronegativity -i /path/to/asar/archive -o result.csv ausführen.
Electronegativity ermöglicht es, einzelne Prüfungen mit eng-disable-Kommentaren zu deaktivieren. Wenn Sie beispielsweise möchten, dass eine bestimmte Prüfung eine Codezeile ignoriert, können Sie sie wie folgt deaktivieren:
const res = eval(safeVariable); /* eng-disable DANGEROUS_FUNCTIONS_JS_CHECK */
<webview src="https://doyensec.com/" enableblinkfeatures="DangerousFeature"></webview> <!-- eng-disable BLINK_FEATURES_HTML_CHECK -->
Jeder eng-disable-Inline-Kommentar (// eng-disable, /* eng-disable */, <!-- eng-disable -->) deaktiviert die angegebene Prüfung nur für diese Zeile. Es ist auch möglich, mehrere Prüfungsnamen sowohl mit ihren Snake-Case-IDs (DANGEROUS_FUNCTIONS_JS_CHECK) als auch mit ihren Konstruktnamen (dangerousFunctionsJSCheck) anzugeben:
shell.openExternal(eval(safeVar)); /* eng-disable OPEN_EXTERNAL_JS_CHECK DANGEROUS_FUNCTIONS_JS_CHECK */
Wenn Sie eine eng-disable-Direktive vor jeglichem Code am Anfang einer .js- oder .html-Datei platzieren, werden die übergebenen Prüfungen für die gesamte Datei deaktiviert.
eng-disable-AnnotationenVor Version 1.9.0 konnten Global Checks nicht mit Code-Annotationen deaktiviert werden. Wenn Sie noch eine alte Version verwenden, nutzen Sie stattdessen das -x CLI-Argument, um manuell eine Liste von Prüfungen zu deaktivieren (z.B. -x LimitNavigationJsCheck,PermissionRequestHandlerJsCheck,CSPGlobalCheck).
Beachten Sie, dass die Verwendung von Annotationen für einige übergeordnete Prüfungen wie CSP_GLOBAL_CHECK oder AVAILABLE_SECURITY_FIXES_GLOBAL_CHECK möglicherweise nicht anwendbar ist. In diesen Fällen sollten Sie das -x-Flag verwenden, um bestimmte Prüfungen von Ihrem Scan auszuschließen.
Electronegativity Action kann als Teil Ihrer GitHub CI/CD-Pipeline ausgeführt werden, um "Code scanning alerts" zu erhalten:

Sie können electronegativity auch programmatisch verwenden, mit ähnlichen Optionen wie für das 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));
Das Ergebnis enthält die Anzahl der globalen und atomaren Prüfungen, etwaige Fehler beim Parsen und ein Array der gefundenen Probleme, wie folgt:
{
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'
}
]
}
Wenn Sie darüber nachdenken, zu diesem Projekt beizutragen, werfen Sie bitte einen Blick auf unsere CONTRIBUTING.md.
Electronegativity wurde durch die Arbeit vieler Mitwirkender ermöglicht.
Dieses Projekt wurde von Doyensec LLC gesponsert.
| Option | Beschreibung |
|---|
| -V | gibt die Versionsnummer aus |
| -i, --input | Eingabe (Verzeichnis, .js, .html, .asar) |
| -l, --checks | führt nur die angegebenen Prüfungen aus, als CSV-Format übergeben |
| -x, --exclude-checks | überspringt die angegebene Liste von Prüfungen, als CSV-Format übergeben |
| -s, --severity | gibt nur Ergebnisse mit dem angegebenen Schweregrad oder höher zurück |
| -c, --confidence | gibt nur Ergebnisse mit dem angegebenen Konfidenzniveau oder höher zurück |
| -o, --output <filename[.csv or .sarif]> | speichert die Ergebnisse in einer Datei im CSV- oder SARIF-Format |
| -r, --relative | zeigt relativen Pfad für Dateien an |
| -v, --verbose | zeigt die Beschreibung der Ergebnisse an, standardmäßig true |
| -u, --upgrade | führt Upgrade-Prüfungen für Electron durch, z.B. -u 7..8 für Upgrade von Electron 7 auf 8 |
| -e, --electron-version | legt die Electron-Version fest und überschreibt die erkannte Version, z.B. -e 7.0.0 für Electron 7 |
| -p, --parser-plugins | gibt zusätzliche Parser-Plugins an, getrennt durch Kommas, z.B. -p optionalChaining |
| -h, --help | zeigt Nutzungsinformationen an |