
Elettronegatività è uno strumento per identificare configurazioni errate e anti-pattern di sicurezza nelle applicazioni Electron.
⚠️ Non manteniamo più attivamente questo progetto ⚠️
Electronegativity è uno strumento per identificare configurazioni errate e anti-pattern di sicurezza nelle applicazioni basate su Electron.
Sfrutta il parsing AST e DOM per cercare configurazioni rilevanti per la sicurezza, come descritto nel whitepaper "Electron Security Checklist - A Guide for Developers and Auditors".
Sviluppatori di software e auditor di sicurezza possono utilizzare questo strumento per rilevare e mitigare potenziali debolezze e bug di implementazione nello sviluppo di applicazioni Electron. È comunque richiesta una buona comprensione della (in)sicurezza di Electron quando si utilizza Electronegativity, poiché alcuni dei potenziali problemi rilevati dallo strumento richiedono un'indagine manuale.
Se sei interessato alla sicurezza di Electron, dai un'occhiata alla nostra ricerca BlackHat 2017 Electronegativity - A Study of Electron Security e tieni d'occhio il blog di Doyensec.

Se hai bisogno di qualcosa di più potente o aggiornato, uno strumento SAST migliorato basato su Electronegativity è disponibile come risultato di molti anni di R&S applicata da Doyensec. Alla fine del 2020, ci siamo seduti per creare una roadmap di progetto e abbiamo creato un team di sviluppo per lavorare su quello che oggi è ElectroNG. Puoi leggere alcuni dei principali miglioramenti rispetto alla versione OSS in un recente articolo del blog.
Le versioni principali vengono pubblicate su NPM e possono essere semplicemente installate usando:
$ npm install @doyensec/electronegativity -g
$ electronegativity -h
Utilizzo di electronegativity per cercare problemi in una directory contenente un'app Electron:
$ electronegativity -i /path/to/electron/app
Utilizzo di electronegativity per cercare problemi in un archivio asar e salvare i risultati in un file csv:
$ electronegativity -i /path/to/asar/archive -o result.csv
Utilizzo di electronegativity durante l'aggiornamento da una versione di Electron a un'altra per trovare modifiche che interrompono la compatibilità:
$ electronegativity -i /path/to/electron/app -v -u 7..8
Nota: se si verifica l'errore fatale "JavaScript heap out of memory", puoi eseguire node usando node --max-old-space-size=4096 electronegativity -i /path/to/asar/archive -o result.csv
Electronegativity consente di disabilitare singoli controlli utilizzando commenti eng-disable. Ad esempio, se desideri che un controllo specifico ignori una riga di codice, puoi disabilitarlo come segue:
const res = eval(safeVariable); /* eng-disable DANGEROUS_FUNCTIONS_JS_CHECK */
<webview src="https://doyensec.com/" enableblinkfeatures="DangerousFeature"></webview> <!-- eng-disable BLINK_FEATURES_HTML_CHECK -->
Qualsiasi commento inline eng-disable (// eng-disable, /* eng-disable */, <!-- eng-disable -->) disabiliterà il controllo specificato solo per quella riga. È anche possibile fornire più nomi di controllo usando sia i loro ID snake case (DANGEROUS_FUNCTIONS_JS_CHECK) che i loro nomi costruttore (dangerousFunctionsJSCheck):
shell.openExternal(eval(safeVar)); /* eng-disable OPEN_EXTERNAL_JS_CHECK DANGEROUS_FUNCTIONS_JS_CHECK */
Se inserisci una direttiva eng-disable prima di qualsiasi codice all'inizio di un file .js o .html, disabiliterà i controlli passati per l'intero file.
eng-disablePrima della v1.9.0, i controlli globali non potevano essere disabilitati usando annotazioni nel codice. Se stai ancora utilizzando una versione vecchia, usa l'argomento CLI -x per disabilitare manualmente una lista di controlli (ad es. -x LimitNavigationJsCheck,PermissionRequestHandlerJsCheck,CSPGlobalCheck).
Nota che l'uso di annotazioni potrebbe non essere applicabile per alcuni controlli di alto livello come CSP_GLOBAL_CHECK o AVAILABLE_SECURITY_FIXES_GLOBAL_CHECK. In quei casi, potresti voler usare il flag -x per escludere controlli specifici dalla scansione.
Electronegativity Action può essere eseguito come parte della tua pipeline CI/CD di GitHub per ottenere "Avvisi di scansione del codice":

Puoi anche utilizzare electronegativity a livello di programmazione, usando opzioni simili a quelle della 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));
Il risultato contiene il numero di controlli globali e atomici, eventuali errori incontrati durante il parsing e un array dei problemi trovati, come questo:
{
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 stai pensando di contribuire a questo progetto, dai un'occhiata al nostro CONTRIBUTING.md.
Electronegativity è stato reso possibile grazie al lavoro di molti contributori.
Questo progetto è stato sponsorizzato da Doyensec LLC.
Affidati a noi per testare la sicurezza della tua applicazione Electron.js!
| Opzione | Descrizione |
|---|
| -V | mostra il numero di versione |
| -i, --input | input (directory, .js, .html, .asar) |
| -l, --checks | esegue solo i controlli specificati, passati in formato csv |
| -x, --exclude-checks | salta la lista di controlli specificata, passata in formato csv |
| -s, --severity | restituisce solo i risultati con il livello di gravità specificato o superiore |
| -c, --confidence | restituisce solo i risultati con il livello di confidenza specificato o superiore |
| -o, --output <filename[.csv or .sarif]> | salva i risultati in un file in formato csv o sarif |
| -r, --relative | mostra il percorso relativo per i file |
| -v, --verbose | mostra la descrizione dei risultati, il valore predefinito è true |
| -u, --upgrade | esegue controlli di aggiornamento di Electron, ad es. -u 7..8 per verificare l'aggiornamento da Electron 7 a 8 |
| -e, --electron-version | imposta la versione di Electron, sovrascrivendo quella rilevata, ad es. -e 7.0.0 per trattare come Electron 7 |
| -p, --parser-plugins | specifica plugin parser aggiuntivi da usare separati da virgole, ad es. -p optionalChaining |
| -h, --help | mostra le informazioni sull'uso |