μ€νμμ€ μ·¨μ½μ λΆμ μ€ν¬ - Open Source Vulnerability Scanner
CVE Scannerλ μ€νμμ€ μννΈμ¨μ΄μ 보μ μ·¨μ½μ μ λΆμνκ³ λ¦¬ν¬νΈλ₯Ό μμ±νλ κ°λ ₯ν λꡬμ λλ€. NVD(NIST), OSV.dev(Google), GitHub Advisory 3κ° λ°μ΄ν° μμ€μμ CVE μ·¨μ½μ μ μ‘°ννμ¬ μ΅μ λ²μ μ 보μ ν¨κ» 보μ 리ν¬νΈλ₯Ό μ 곡ν©λλ€.
- NVD (NIST) - λ―Έκ΅ κ΅κ° μ·¨μ½μ λ°μ΄ν°λ² μ΄μ€
- OSV.dev (Google) - μ€νμμ€ μ μ© μ·¨μ½μ DB
- GitHub Advisory - GitHub 보μ κΆκ³
- npm (Node.js)
- PyPI (Python)
- Maven (Java)
- Go (Golang)
- crates.io (Rust)
- RubyGems (Ruby)
- Packagist (PHP)
- NuGet (.NET)
package.json/package-lock.jsonrequirements.txt/Pipfile.lockpom.xml/build.gradlego.mod/go.sumCargo.lockcomposer.lockGemfile.lock
- Markdown - κ°λ μ± μ’μ λ¬Έμ νμ
- Excel - μ€νλ λμνΈ λΆμμ©
- CSV - λ°μ΄ν° μ²λ¦¬μ©
- JSON - νλ‘κ·Έλλ° μ°λμ©
# μ μ₯μ ν΄λ‘ λλ μ€ν¬ λλ ν λ¦¬λ‘ μ΄λ
cd ~/.openclaw/workspace/skills/cve-scanner
# μμ‘΄μ± μ€μΉ
pip install -r requirements.txt# κΈ°λ³Έ μ€μΊ
./cve-scanner "log4j-core" "2.14.0"
# μ¬κ°λ νν°λ§
./cve-scanner "openssl" "1.1.1k" --severity HIGH,CRITICAL
# JSON μΆλ ₯
./cve-scanner "spring-framework" "5.3.18" --output json# package.json μ€μΊ
./cve-scanner --file package.json
# requirements.txt μ€μΊ (μμ
μΆλ ₯)
./cve-scanner --file requirements.txt --output excel
# pom.xml μ€μΊ (CRITICALλ§)
./cve-scanner --file pom.xml --severity CRITICAL$ ./cve-scanner "log4j-core" "2.14.0"
# CVE Scanner μ·¨μ½μ λΆμ 리ν¬νΈ
## π¦ log4j-core
| νλͺ© | λ΄μ© |
|------|------|
| νμ¬ λ²μ | 2.14.0 |
| μ΅μ λ²μ | 2.23.1 |
| λ°κ²¬ CVE μ | 3건 |
### μ·¨μ½μ λͺ©λ‘
| CVE ID | μ¬κ°λ | CVSS | μ€λͺ
|
|--------|--------|------|------|
| CVE-2021-44228 | π΄ CRITICAL | 10.0 | Log4Shell - JNDI κΈ°λ₯ μ격 μ½λ μ€ν μ·¨μ½μ |
| CVE-2021-45046 | π΄ CRITICAL | 9.0 | DoS μ·¨μ½μ |
| CVE-2021-45105 | π HIGH | 7.5 | μ€ν μΆμ μ 보 λμΆ |
### π μ
κ·Έλ μ΄λ κΆκ³
- **κΈ΄κΈλ**: π΄ CRITICAL - μ¦μ μ
κ·Έλ μ΄λ κΆμ₯
- **μ΅μ κΆμ₯ λ²μ **: `2.17.1`
- **μ΅μ λ²μ **: `2.23.1`$ ./cve-scanner --file package.json --output excel
ν¨ν€μ§ λΆμ μ€... (150κ° ν¨ν€μ§)
CVE μ‘°ν μ€... (NVD, OSV, GitHub Advisory)
Report saved to: cve-scanner-report-20260309-170500.xlsx| μ΅μ | μ€λͺ | κΈ°λ³Έκ° |
|---|---|---|
package |
ν¨ν€μ§ μ΄λ¦ | - |
version |
νμ¬ λ²μ | - |
--file, -f |
μμ‘΄μ± νμΌ κ²½λ‘ | - |
--ecosystem, -e |
μνκ³ μ§μ (npm, PyPI, Maven λ±) | μλ κ°μ§ |
--severity, -s |
μ¬κ°λ νν° (CRITICAL,HIGH,MEDIUM,LOW) | μ 체 |
--output, -o |
μΆλ ₯ νμ (markdown, excel, json, csv) | markdown |
--no-cache |
μΊμ μ¬μ© μ ν¨ | μΊμ μ¬μ© |
--nvd-key |
NVD API ν€ | - |
--github-token |
GitHub ν ν° | - |
NVD API ν€λ₯Ό μ¬μ©νλ©΄ Rate Limitμ΄ 30μ΄λΉ 5건μμ 50건μΌλ‘ μ¦κ°ν©λλ€.
# νκ²½ λ³μ μ€μ
export NVD_API_KEY="your-nvd-api-key"
# λλ λͺ
λ Ήμ€μμ μ§μ
./cve-scanner "package" "version" --nvd-key "your-key"NVD API ν€ μ μ²: https://nvd.nist.gov/developers/request-an-api-key
GitHub ν ν°μ μ¬μ©νλ©΄ Advisory API Rate Limitμ΄ 60건/μκ°μμ 5,000건/μκ°μΌλ‘ μ¦κ°ν©λλ€.
# νκ²½ λ³μ μ€μ
export GITHUB_TOKEN="your-github-token"
# λλ λͺ
λ Ήμ€μμ μ§μ
./cve-scanner "package" "version" --github-token "your-token"GitHub ν ν° μμ±: https://github.com/settings/tokens
cve-scanner/
βββ SKILL.md # μ€ν¬ λ©νλ°μ΄ν°
βββ README.md # μ΄ νμΌ
βββ requirements.txt # Python μμ‘΄μ±
βββ cve-scanner # CLI λνΌ μ€ν¬λ¦½νΈ
βββ scripts/
βββ cve-scanner.py # λ©μΈ μ§μ
μ
βββ cve_sources/ # CVE λ°μ΄ν° μμ€
β βββ __init__.py
β βββ nvd_api.py # NVD API ν΄λΌμ΄μΈνΈ
β βββ osv_api.py # OSV.dev API ν΄λΌμ΄μΈνΈ
β βββ github_advisory.py # GitHub Advisory API ν΄λΌμ΄μΈνΈ
βββ parsers/ # μμ‘΄μ± νμΌ νμ
β βββ __init__.py # λͺ¨λ νμ ꡬν
β βββ ...
βββ utils/ # μ νΈλ¦¬ν°
βββ __init__.py
βββ version_compare.py # λ²μ λΉκ΅ λ‘μ§
βββ report_generator.py # 리ν¬νΈ μμ±κΈ°
# λ¨μΌ ν¨ν€μ§ ν
μ€νΈ
python3 scripts/cve-scanner.py "lodash" "4.17.15"
# νμΌ νμ± ν
μ€νΈ
python3 scripts/cve-scanner.py --file test_package.jsonscripts/parsers/__init__.pyμ μ νμ ν΄λμ€λ₯Ό μΆκ°νμΈμ:
class MyParser(BaseParser):
def parse(self, file_path: str) -> List[Dict]:
# νμ± λ‘μ§ κ΅¬ν
return dependencies
# PARSERS λμ
λ리μ λ±λ‘
PARSERS['my-file.lock'] = MyParser- λ¨μΌ ν¨ν€μ§: 10μ΄ μ΄λ΄ μλ£ λͺ©ν
- λλ μ€μΊ (100κ°+): λ°°μΉ μ²λ¦¬ + μ§νλ₯ νμ
- API Rate Limit: μμ² κ° μ μ ν λλ μ΄ μλ μ½μ
- μΊμ±: λμΌ μΈμ λ΄ μ‘°νν ν¨ν€μ§ μ¬μ‘°ν λ°©μ§
- API Rate Limit: NVD, GitHub APIλ Rate Limitμ΄ μμ΅λλ€. λλ μ€μΊ μ API ν€ μ¬μ©μ κΆμ₯ν©λλ€.
- λ²μ νμ: SemVerλ₯Ό λ°λ₯΄λ λ²μ νμμ κΆμ₯ν©λλ€. μΌλΆ νλ‘μ νΈλ 컀μ€ν λ²μ νμμ μ¬μ©ν μ μμ΅λλ€.
- μνκ³ κ°μ§: μλ κ°μ§κ° μ€ν¨ν μ μμ΅λλ€. μ΄ κ²½μ°
--ecosystemμ΅μ μ μ¬μ©νμΈμ. - λ€νΈμν¬: μΈν°λ· μ°κ²°μ΄ νμν©λλ€.
λ²κ·Έ 리ν¬νΈ, κΈ°λ₯ μ μ, ν 리νμ€νΈλ₯Ό νμν©λλ€!
MIT License