
Electronegativity é uma ferramenta para identificar configurações incorretas e anti-padrões de segurança em aplicações Electron.
⚠️ Não estamos mais mantendo ativamente este projeto ⚠️
Electronegativity é uma ferramenta para identificar configurações incorretas e anti-padrões de segurança em aplicações baseadas em Electron.
Ela utiliza análise de AST e DOM para buscar configurações relevantes para segurança, conforme descrito no whitepaper "Electron Security Checklist - A Guide for Developers and Auditors".
Desenvolvedores de software e auditores de segurança podem usar esta ferramenta para detectar e mitigar potenciais fraquezas e bugs de implementação ao desenvolver aplicações usando Electron. Um bom entendimento da (in)segurança do Electron ainda é necessário ao usar Electronegativity, pois alguns dos possíveis problemas detectados pela ferramenta exigem investigação manual.
Se você tem interesse em Segurança do Electron, dê uma olhada em nossa pesquisa BlackHat 2017 Electronegativity - A Study of Electron Security e fique de olho no blog do Doyensec.

Se você precisa de algo mais poderoso ou atualizado, uma ferramenta SAST melhorada baseada no Electronegativity está disponível como resultado de muitos anos de P&D aplicada da Doyensec. No final de 2020, nos sentamos para criar um roteiro do projeto e montamos uma equipe de desenvolvimento para trabalhar no que hoje é o ElectroNG. Você pode ler mais sobre algumas das principais melhorias em relação à versão OSS em uma postagem recente no blog.
As versões principais são publicadas no NPM e podem ser simplesmente instaladas usando:
$ npm install @doyensec/electronegativity -g
$ electronegativity -h
Usando electronegativity para procurar problemas em um diretório contendo um aplicativo Electron:
$ electronegativity -i /path/to/electron/app
Usando electronegativity para procurar problemas em um arquivo asar e salvando os resultados em um arquivo csv:
$ electronegativity -i /path/to/asar/archive -o result.csv
Usando electronegativity ao atualizar de uma versão do Electron para outra para encontrar mudanças que quebram:
$ electronegativity -i /path/to/electron/app -v -u 7..8
Nota: se você estiver enfrentando o Erro Fatal "JavaScript heap out of memory", você pode executar o node usando node --max-old-space-size=4096 electronegativity -i /path/to/asar/archive -o result.csv
Electronegativity permite desabilitar verificações individuais usando comentários eng-disable. Por exemplo, se você quiser que uma verificação específica ignore uma linha de código, você pode desabilitá-la da seguinte forma:
const res = eval(safeVariable); /* eng-disable DANGEROUS_FUNCTIONS_JS_CHECK */
<webview src="https://doyensec.com/" enableblinkfeatures="DangerousFeature"></webview> <!-- eng-disable BLINK_FEATURES_HTML_CHECK -->
Qualquer comentário inline eng-disable (// eng-disable, /* eng-disable */, <!-- eng-disable -->) desabilitará a verificação especificada apenas para aquela linha. Também é possível fornecer vários nomes de verificação usando tanto seus IDs em snake case (DANGEROUS_FUNCTIONS_JS_CHECK) quanto seus nomes de construtor (dangerousFunctionsJSCheck):
shell.openExternal(eval(safeVar)); /* eng-disable OPEN_EXTERNAL_JS_CHECK DANGEROUS_FUNCTIONS_JS_CHECK */
Se você colocar uma diretiva eng-disable antes de qualquer código no topo de um arquivo .js ou .html, isso desabilitará as verificações passadas para o arquivo inteiro.
eng-disableAntes da v1.9.0, as Verificações Globais não podiam ser desabilitadas usando anotações de código. Se você ainda está usando uma versão antiga, use o argumento de CLI -x para desabilitar manualmente uma lista de verificações (ex: -x LimitNavigationJsCheck,PermissionRequestHandlerJsCheck,CSPGlobalCheck).
Note que usar anotações pode não ser aplicável para algumas verificações de nível mais alto, como CSP_GLOBAL_CHECK ou AVAILABLE_SECURITY_FIXES_GLOBAL_CHECK. Para esses casos, você pode querer usar a flag -x para excluir verificações específicas da sua varredura.
A Electronegativity Action pode ser executada como parte do seu pipeline CI/CD do GitHub para obter "Code scanning alerts":

Você também pode usar electronegativity programaticamente, usando opções semelhantes às da 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));
O resultado contém o número de verificações globais e atômicas, quaisquer erros encontrados durante a análise e um array dos problemas encontrados, como este:
{
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'
}
]
}
Se você está pensando em contribuir com este projeto, por favor dê uma olhada em nosso CONTRIBUTING.md.
Electronegativity foi possível graças ao trabalho de muitos contribuidores.
Este projeto foi patrocinado pela Doyensec LLC.
Contrate-nos para quebrar sua aplicação Electron.js!
| Opção | Descrição |
|---|
| -V | exibe o número da versão |
| -i, --input | entrada (diretório, .js, .html, .asar) |
| -l, --checks | executa apenas as verificações especificadas, passadas em formato csv |
| -x, --exclude-checks | pula a lista de verificações especificada, passada em formato csv |
| -s, --severity | retorna apenas achados com o nível de severidade especificado ou superior |
| -c, --confidence | retorna apenas achados com o nível de confiança especificado ou superior |
| -o, --output <filename[.csv or .sarif]> | salva os resultados em um arquivo no formato csv ou sarif |
| -r, --relative | exibe caminho relativo para arquivos |
| -v, --verbose | exibe a descrição dos achados, padrão é verdadeiro |
| -u, --upgrade | executa verificações de atualização do Electron, ex: -u 7..8 para verificar atualização do Electron 7 para 8 |
| -e, --electron-version | assume a versão definida do Electron, substituindo a detectada, ex: -e 7.0.0 para tratar como usando Electron 7 |
| -p, --parser-plugins | especifica plugins de parser adicionais a serem usados separados por vírgulas, ex: -p optionalChaining |
| -h, --help | exibe informações de uso |