
Electronegativity es una herramienta para identificar configuraciones incorrectas y antipatrones de seguridad en aplicaciones Electron.
⚠️ Ya no mantenemos activamente este proyecto ⚠️
Electronegativity es una herramienta para identificar configuraciones incorrectas y anti-patrones de seguridad en aplicaciones basadas en Electron.
Aprovecha el análisis de AST y DOM para buscar configuraciones relevantes para la seguridad, como se describe en el documento técnico "Electron Security Checklist - A Guide for Developers and Auditors".
Los desarrolladores de software y auditores de seguridad pueden usar esta herramienta para detectar y mitigar posibles debilidades y errores de implementación al desarrollar aplicaciones con Electron. Aún se requiere un buen entendimiento de la (in)seguridad de Electron al usar Electronegativity, ya que algunos de los posibles problemas detectados por la herramienta requieren investigación manual.
Si estás interesado en la Seguridad de Electron, echa un vistazo a nuestra investigación de BlackHat 2017 Electronegativity - A Study of Electron Security y mantente al tanto del blog de Doyensec.

Si necesitas algo más potente o actualizado, una herramienta SAST mejorada basada en Electronegativity está disponible como resultado de muchos años de I+D aplicada de Doyensec. A finales de 2020, nos sentamos a crear una hoja de ruta del proyecto y formamos un equipo de desarrollo para trabajar en lo que ahora es ElectroNG. Puedes leer más sobre algunas de las principales mejoras respecto a la versión OSS en una entrada de blog reciente.
Las versiones principales se publican en NPM y se pueden instalar fácilmente usando:
$ npm install @doyensec/electronegativity -g
$ electronegativity -h
| Opción | Descripción |
|---|---|
| -V | muestra el número de versión |
| -i, --input | entrada (directorio, .js, .html, .asar) |
| -l, --checks | solo ejecuta las comprobaciones especificadas, pasadas en formato csv |
| -x, --exclude-checks | omite la lista de comprobaciones especificadas, pasadas en formato csv |
| -s, --severity | solo devuelve hallazgos con el nivel de severidad especificado o superior |
| -c, --confidence | solo devuelve hallazgos con el nivel de confianza especificado o superior |
| -o, --output <filename[.csv or .sarif]> | guarda los resultados en un archivo en formato csv o sarif |
| -r, --relative | muestra la ruta relativa para los archivos |
| -v, --verbose | muestra la descripción de los hallazgos, por defecto true |
| -u, --upgrade | ejecuta comprobaciones de actualización de Electron, ej. -u 7..8 para comprobar la actualización de Electron 7 a 8 |
| -e, --electron-version | asume la versión de Electron establecida, anulando la detectada, ej. -e 7.0.0 para tratar como si se usara Electron 7 |
| -p, --parser-plugins | especifica complementos de analizador adicionales separados por comas, ej. -p optionalChaining |
| -h, --help | muestra información de uso |
Usando electronegativity para buscar problemas en un directorio que contiene una aplicación Electron:
$ electronegativity -i /path/to/electron/app
Usando electronegativity para buscar problemas en un archivo asar y guardando los resultados en un archivo csv:
$ electronegativity -i /path/to/asar/archive -o result.csv
Usando electronegativity al actualizar de una versión de Electron a otra para encontrar cambios importantes:
$ electronegativity -i /path/to/electron/app -v -u 7..8
Nota: si te encuentras con el Error Grave "JavaScript heap out of memory", puedes ejecutar node usando node --max-old-space-size=4096 electronegativity -i /path/to/asar/archive -o result.csv
Electronegativity permite deshabilitar comprobaciones individuales usando comentarios eng-disable. Por ejemplo, si deseas que una comprobación específica ignore una línea de código, puedes deshabilitarla de la siguiente manera:
const res = eval(safeVariable); /* eng-disable DANGEROUS_FUNCTIONS_JS_CHECK */
<webview src="https://doyensec.com/" enableblinkfeatures="DangerousFeature"></webview> <!-- eng-disable BLINK_FEATURES_HTML_CHECK -->
Cualquier comentario en línea eng-disable (// eng-disable, /* eng-disable */, <!-- eng-disable -->) deshabilitará la comprobación especificada solo para esa línea. También es posible proporcionar múltiples nombres de comprobación usando tanto sus IDs en snake case (DANGEROUS_FUNCTIONS_JS_CHECK) como sus nombres de constructor (dangerousFunctionsJSCheck):
shell.openExternal(eval(safeVar)); /* eng-disable OPEN_EXTERNAL_JS_CHECK DANGEROUS_FUNCTIONS_JS_CHECK */
Si colocas una directiva eng-disable antes de cualquier código en la parte superior de un archivo .js o .html, esto deshabilitará las comprobaciones pasadas para el archivo completo.
eng-disableAntes de v1.9.0, las comprobaciones globales no se podían deshabilitar mediante anotaciones de código. Si todavía estás usando una versión antigua, usa el argumento de CLI -x para deshabilitar manualmente una lista de comprobaciones (ej. -x LimitNavigationJsCheck,PermissionRequestHandlerJsCheck,CSPGlobalCheck). Ten en cuenta que el uso de anotaciones puede no ser aplicable para algunas comprobaciones de nivel superior como CSP_GLOBAL_CHECK o AVAILABLE_SECURITY_FIXES_GLOBAL_CHECK. Para esos casos, es posible que quieras usar la bandera -x para excluir comprobaciones específicas de tu escaneo.
Electronegativity Action puede ejecutarse como parte de tu pipeline de CI/CD de GitHub para obtener "Alertas de escaneo de código":

También puedes usar electronegativity programáticamente, con opciones similares a las 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));
El resultado contiene el número de comprobaciones globales y atómicas, cualquier error encontrado durante el análisis y un array de los problemas encontrados, como esto:
{
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 estás pensando en contribuir a este proyecto, por favor echa un vistazo a nuestro CONTRIBUTING.md.
Electronegativity fue posible gracias al trabajo de muchos contribuidores.
Este proyecto ha sido patrocinado por Doyensec LLC.
¡Contrátenos para auditar su aplicación Electron.js!