
Electronegativity는 Electron 애플리케이션에서 잘못된 설정과 보안 안티패턴을 식별하는 도구입니다.
⚠️ 이 프로젝트는 더 이상 적극적으로 유지 관리되지 않습니다 ⚠️
일렉트로네거티비티는 Electron 기반 애플리케이션에서 잘못된 설정과 보안 안티패턴을 식별하는 도구입니다.
이 도구는 "Electron Security Checklist - A Guide for Developers and Auditors" 백서에 설명된 대로 AST 및 DOM 파싱을 활용하여 보안 관련 구성을 찾아냅니다.
소프트웨어 개발자와 보안 감사자는 이 도구를 사용하여 Electron을 사용하는 애플리케이션을 개발할 때 잠재적인 약점과 구현 버그를 탐지하고 완화할 수 있습니다. 일렉트로네거티비티를 사용할 때는 Electron (비)보안에 대한 충분한 이해가 여전히 필요하며, 도구가 탐지하는 일부 잠재적 문제는 수동 조사가 필요합니다.
Electron 보안에 관심이 있다면, BlackHat 2017 연구 자료인 Electronegativity - A Study of Electron Security를 확인하고 Doyensec의 블로그를 주시하세요.

더 강력하거나 업데이트된 기능이 필요하다면, Doyensec의 수년간의 응용 연구개발 결과로 일렉트로네거티비티를 기반으로 한 개선된 SAST 도구가 제공됩니다. 2020년 말, 우리는 프로젝트 로드맵을 만들고 현재 ElectroNG가 된 제품을 개발할 팀을 구성했습니다. 최근 블로그 게시글에서 OSS 버전에 비해 주요 개선 사항을 더 자세히 읽을 수 있습니다.
주요 릴리스는 NPM에 푸시되며 다음과 같이 간단히 설치할 수 있습니다.
$ npm install @doyensec/electronegativity -g
$ electronegativity -h
Electron 앱이 포함된 디렉토리에서 문제를 찾기 위해 일렉트로네거티비티 사용:
$ electronegativity -i /path/to/electron/app
asar 아카이브에서 문제를 찾고 결과를 csv 파일로 저장:
$ electronegativity -i /path/to/asar/archive -o result.csv
Electron 버전 간 업그레이드 시 호환성 문제를 찾기 위해 일렉트로네거티비티 사용:
$ electronegativity -i /path/to/electron/app -v -u 7..8
참고: "JavaScript heap out of memory" 오류가 발생하면, node --max-old-space-size=4096 electronegativity -i /path/to/asar/archive -o result.csv를 사용하여 node를 실행할 수 있습니다.
일렉트로네거티비티는 eng-disable 주석을 사용하여 개별 검사를 비활성화할 수 있습니다. 예를 들어, 특정 검사가 코드 라인을 무시하도록 하려면 다음과 같이 비활성화할 수 있습니다.
const res = eval(safeVariable); /* eng-disable DANGEROUS_FUNCTIONS_JS_CHECK */
<webview src="https://doyensec.com/" enableblinkfeatures="DangerousFeature"></webview> <!-- eng-disable BLINK_FEATURES_HTML_CHECK -->
eng-disable 인라인 주석 (// eng-disable, /* eng-disable */, <!-- eng-disable -->)은 해당 라인에 대해 지정된 검사를 비활성화합니다. 스네이크 케이스 ID (DANGEROUS_FUNCTIONS_JS_CHECK) 또는 생성자 이름 (dangerousFunctionsJSCheck)을 사용하여 여러 검사 이름을 제공할 수도 있습니다.
shell.openExternal(eval(safeVar)); /* eng-disable OPEN_EXTERNAL_JS_CHECK DANGEROUS_FUNCTIONS_JS_CHECK */
.js 또는 .html 파일 상단에 코드 앞에 eng-disable 지시문을 넣으면 파일 전체에 대해 전달된 검사가 비활성화됩니다.
eng-disable 주석에 대한 참고 사항v1.9.0 이전에는 코드 주석을 사용하여 글로벌 검사를 비활성화할 수 없었습니다. 여전히 이전 버전을 사용 중이라면 -x CLI 인수를 사용하여 검사 목록을 수동으로 비활성화하세요 (예: -x LimitNavigationJsCheck,PermissionRequestHandlerJsCheck,CSPGlobalCheck).
CSP_GLOBAL_CHECK 또는 AVAILABLE_SECURITY_FIXES_GLOBAL_CHECK와 같은 상위 수준 검사의 경우 주석 사용이 적용되지 않을 수 있습니다. 이러한 경우 -x 플래그를 사용하여 스캔에서 특정 검사를 제외할 수 있습니다.
일렉트로네거티비티 액션은 GitHub CI/CD 파이프라인의 일부로 실행되어 "코드 스캐닝 알림"을 제공할 수 있습니다.

CLI와 유사한 옵션을 사용하여 일렉트로네거티비티를 프로그래밍 방식으로 사용할 수도 있습니다.
const run = require('@doyensec/electronegativity')
// 또는: import run from '@doyensec/electronegativity';
run({
// 입력 (디렉토리, .js, .html, .asar)
input: '/path/to/electron/app',
// 결과를 csv 또는 sarif 형식의 파일로 저장 (선택 사항)
output: '/path/for/output/file',
// 출력을 sarif로 저장하려면 true, csv로 저장하려면 false (선택 사항)
isSarif: false,
// 지정된 검사만 실행 (선택 사항)
customScan: ['dangerousfunctionsjscheck', 'remotemodulejscheck'],
// 지정된 심각도 수준 이상의 결과만 반환 (선택 사항)
severitySet: 'high',
// 지정된 신뢰도 수준 이상의 결과만 반환 (선택 사항)
confidenceSet: 'certain',
// 파일의 상대 경로 표시 (선택 사항)
isRelative: false,
// Electron 업그레이드 검사 실행, 예: -u 7..8 (Electron 7에서 8로 업그레이드 확인) (선택 사항)
electronUpgrade: '7..8',
// 감지된 버전을 재정의하여 설정된 Electron 버전 가정
electronVersion: '5.0.0',
// 추가 파서 플러그인 사용
parserPlugins: ['optionalChaining']
})
.then(result => console.log(result))
.catch(err => console.error(err));
결과에는 글로벌 검사와 원자 검사의 개수, 파싱 중 발생한 오류, 발견된 문제의 배열이 포함됩니다. 예시:
{
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: '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: 'contextIsolation 옵션 사용 검토',
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'
}
]
}
이 프로젝트에 기여할 생각이라면 CONTRIBUTING.md를 확인해 주세요.
일렉트로네거티비티는 많은 기여자의 작업 덕분에 가능했습니다.
이 프로젝트는 Doyensec LLC의 후원을 받았습니다.
귀하의 Electron.js 애플리케이션을 테스트해 드립니다!
| 옵션 | 설명 |
|---|
| -V | 버전 번호 출력 |
| -i, --input | 입력 (디렉토리, .js, .html, .asar) |
| -l, --checks | 지정된 검사만 실행, csv 형식으로 전달 |
| -x, --exclude-checks <제외할검사이름> | 지정된 검사 목록 건너뛰기, csv 형식으로 전달 |
| -s, --severity | 지정된 심각도 수준 이상의 결과만 반환 |
| -c, --confidence | 지정된 신뢰도 수준 이상의 결과만 반환 |
| -o, --output <파일이름[.csv 또는 .sarif]> | 결과를 csv 또는 sarif 형식의 파일로 저장 |
| -r, --relative | 파일의 상대 경로 표시 |
| -v, --verbose | 각 발견 항목에 대한 설명 표시, 기본값 true |
| -u, --upgrade <현재 버전..대상 버전> | Electron 업그레이드 검사 실행, 예: -u 7..8 (Electron 7에서 8로 업그레이드 확인) |
| -e, --electron-version <버전> | 감지된 버전을 재정의하여 설정된 Electron 버전 가정, 예: -e 7.0.0 (Electron 7 사용으로 처리) |
| -p, --parser-plugins <플러그인> | 추가 파서 플러그인 지정, 쉼표로 구분, 예: -p optionalChaining |
| -h, --help | 사용 정보 출력 |