
Electronegativity est un outil pour identifier les mauvaises configurations et les anti-modèles de sécurité dans les applications Electron.
⚠️ Nous ne maintenons plus activement ce projet ⚠️
Electronegativity est un outil pour identifier les mauvaises configurations et les anti-patrons de sécurité dans les applications basées sur Electron.
Il utilise l'analyse AST et DOM pour rechercher des configurations pertinentes pour la sécurité, comme décrit dans le livre blanc "Electron Security Checklist - A Guide for Developers and Auditors".
Les développeurs de logiciels et les auditeurs de sécurité peuvent utiliser cet outil pour détecter et atténuer les faiblesses potentielles et les bugs d'implémentation lors du développement d'applications utilisant Electron. Une bonne compréhension de la (in)sécurité d'Electron est encore nécessaire lors de l'utilisation d'Electronegativity, car certains des problèmes potentiels détectés par l'outil nécessitent une investigation manuelle.
Si vous êtes intéressé par la sécurité d'Electron, jetez un œil à notre recherche BlackHat 2017 Electronegativity - A Study of Electron Security et gardez un œil sur le blog de Doyensec.

Si vous avez besoin de quelque chose de plus puissant ou mis à jour, un outil SAST amélioré basé sur Electronegativity est disponible grâce à des années de R&D appliquée de Doyensec. Fin 2020, nous nous sommes assis pour créer une feuille de route du projet et avons créé une équipe de développement pour travailler sur ce qui est maintenant ElectroNG. Vous pouvez en savoir plus sur les principales améliorations par rapport à la version OSS dans un article de blog récent.
Les versions majeures sont publiées sur NPM et peuvent être simplement installées en utilisant :
$ npm install @doyensec/electronegativity -g
$ electronegativity -h
| Option | Description |
|---|---|
| -V | affiche le numéro de version |
| -i, --input | entrée (répertoire, .js, .html, .asar) |
| -l, --checks | exécute uniquement les vérifications spécifiées, passées au format csv |
| -x, --exclude-checks | ignore la liste de vérifications spécifiée, passée au format csv |
| -s, --severity | ne retourne que les résultats avec le niveau de sévérité spécifié ou supérieur |
| -c, --confidence | ne retourne que les résultats avec le niveau de confiance spécifié ou supérieur |
| -o, --output <filename[.csv or .sarif]> | enregistre les résultats dans un fichier au format csv ou sarif |
| -r, --relative | affiche le chemin relatif des fichiers |
| -v, --verbose | affiche la description des résultats, par défaut true |
| -u, --upgrade | exécute les vérifications de mise à niveau d'Electron, ex: -u 7..8 pour vérifier la mise à niveau d'Electron 7 vers 8 |
| -e, --electron-version | suppose la version d'Electron définie, en remplacement de celle détectée, ex: -e 7.0.0 pour considérer l'utilisation d'Electron 7 |
| -p, --parser-plugins | spécifie des plugins d'analyse supplémentaires à utiliser séparés par des virgules, ex: -p optionalChaining |
| -h, --help | affiche les informations d'utilisation |
Utilisation d'electronegativity pour rechercher des problèmes dans un répertoire contenant une application Electron :
$ electronegativity -i /path/to/electron/app
Utilisation d'electronegativity pour rechercher des problèmes dans une archive asar et enregistrer les résultats dans un fichier csv :
$ electronegativity -i /path/to/asar/archive -o result.csv
Utilisation d'electronegativity lors de la mise à niveau d'une version d'Electron à une autre pour trouver les changements cassants :
$ electronegativity -i /path/to/electron/app -v -u 7..8
Note : si vous rencontrez l'erreur fatale « JavaScript heap out of memory », vous pouvez exécuter node en utilisant node --max-old-space-size=4096 electronegativity -i /path/to/asar/archive -o result.csv
Electronegativity vous permet de désactiver des vérifications individuelles en utilisant des commentaires eng-disable. Par exemple, si vous voulez qu'une vérification spécifique ignore une ligne de code, vous pouvez la désactiver comme suit :
const res = eval(safeVariable); /* eng-disable DANGEROUS_FUNCTIONS_JS_CHECK */
<webview src="https://doyensec.com/" enableblinkfeatures="DangerousFeature"></webview> <!-- eng-disable BLINK_FEATURES_HTML_CHECK -->
Tout commentaire en ligne eng-disable (// eng-disable, /* eng-disable */, <!-- eng-disable -->) désactivera la vérification spécifiée uniquement pour cette ligne. Il est également possible de fournir plusieurs noms de vérifications en utilisant à la fois leurs ID en snake case (DANGEROUS_FUNCTIONS_JS_CHECK) ou leurs noms de constructeur (dangerousFunctionsJSCheck) :
shell.openExternal(eval(safeVar)); /* eng-disable OPEN_EXTERNAL_JS_CHECK DANGEROUS_FUNCTIONS_JS_CHECK */
Si vous placez une directive eng-disable avant tout code en haut d'un fichier .js ou .html, cela désactivera les vérifications passées pour le fichier entier.
eng-disableAvant la v1.9.0, les vérifications globales ne pouvaient pas être désactivées à l'aide d'annotations de code. Si vous utilisez encore une ancienne version, utilisez l'argument CLI -x pour désactiver manuellement une liste de vérifications (ex: -x LimitNavigationJsCheck,PermissionRequestHandlerJsCheck,CSPGlobalCheck). Notez que l'utilisation d'annotations peut ne pas être applicable pour certaines vérifications de plus haut niveau telles que CSP_GLOBAL_CHECK ou AVAILABLE_SECURITY_FIXES_GLOBAL_CHECK. Dans ces cas, vous pouvez utiliser le drapeau -x pour exclure des vérifications spécifiques de votre analyse.
Electronegativity Action peut être exécutée dans le cadre de votre pipeline CI/CD GitHub pour obtenir des « alertes d'analyse de code » :

Vous pouvez également utiliser electronegativity par programmation, en utilisant des options similaires à celles de la 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));
Le résultat contient le nombre de vérifications globales et atomiques, les erreurs rencontrées lors de l'analyse et un tableau des problèmes trouvés, comme ceci :
{
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'
}
]
}
Si vous envisagez de contribuer à ce projet, veuillez consulter notre CONTRIBUTING.md.
Electronegativity a été rendu possible grâce au travail de nombreux contributeurs.
Ce projet a été sponsorisé par Doyensec LLC.
Engagez-nous pour casser votre application Electron.js !