[Open Source] NVDยทOSVยทGitHub Advisory ํ†ตํ•ฉ ์˜คํ”ˆ์†Œ์Šค ์ทจ์•ฝ์  ์Šค์บ๋„ˆ (open-cve-scanner)

ยท

๐Ÿ“‹ ๊ฐœ์š”

์˜์กด์„ฑ์— ์ˆจ์€ ์•Œ๋ ค์ง„ ์ทจ์•ฝ์ (CVE)์„ ๋น ๋ฅด๊ฒŒ ์ฐพ์•„๋‚ด๊ธฐ ์œ„ํ•ด ๋งŒ๋“  ์˜คํ”ˆ์†Œ์Šค ๋„๊ตฌ open-cve-scanner๋ฅผ ์†Œ๊ฐœํ•ฉ๋‹ˆ๋‹ค. ๋‹จ์ผ ํŒจํ‚ค์ง€๋ถ€ํ„ฐ ํ”„๋กœ์ ํŠธ ์ „์ฒด ์˜์กด์„ฑ ํŒŒ์ผ๊นŒ์ง€, NVD(NIST)ยทOSV.dev(Google)ยทGitHub Advisory ์„ธ ๊ณณ์˜ ์ทจ์•ฝ์  ๋ฐ์ดํ„ฐ๋ฅผ ํ•œ ๋ฒˆ์— ์กฐํšŒํ•ด ๋ณด์•ˆ ๋ฆฌํฌํŠธ๋ฅผ ์ƒ์„ฑํ•˜๋Š” Python CLI์ž…๋‹ˆ๋‹ค.

GitHub ์ €์žฅ์†Œ: https://github.com/rebugui/open-cve-scanner

๐ŸŽฏ ์ œ์ž‘ ๋ฐฐ๊ฒฝ

์ทจ์•ฝ์  ์ ๊ฒ€์„ ํ•  ๋•Œ๋งˆ๋‹ค NVD, OSV, GitHub Advisory๋ฅผ ๋”ฐ๋กœ ๊ฒ€์ƒ‰ํ•˜๊ณ  ๋ฒ„์ „์„ ๋น„๊ตํ•˜๋Š” ์ผ์€ ๋ฒˆ๊ฑฐ๋กญ๊ณ  ๋ˆ„๋ฝ์ด ์ƒ๊ธฐ๊ธฐ ์‰ฝ์Šต๋‹ˆ๋‹ค. ์„ธ ์†Œ์Šค๋ฅผ ํ†ตํ•ฉ ์กฐํšŒํ•˜๊ณ , ์˜์กด์„ฑ ํŒŒ์ผ์„ ํŒŒ์‹ฑํ•ด ํ•œ ๋ฒˆ์— ๊ฐ์‚ฌํ•˜๋ฉฐ, ๊ฒฐ๊ณผ๋ฅผ ๋‹ค์–‘ํ•œ ํ˜•์‹์œผ๋กœ ๋–จ์–ด๋œจ๋ ค CI/CD ํŒŒ์ดํ”„๋ผ์ธ์— ๊ทธ๋Œ€๋กœ ๋ฌผ๋ฆด ์ˆ˜ ์žˆ๋Š” ๋„๊ตฌ๊ฐ€ ํ•„์š”ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ—๏ธ ํ•ต์‹ฌ ๊ธฐ๋Šฅ

3๊ฐœ CVE ๋ฐ์ดํ„ฐ ์†Œ์Šค ํ†ตํ•ฉ โ€” NVD(๋ฏธ๊ตญ ๊ตญ๊ฐ€ ์ทจ์•ฝ์  DB), OSV.dev(์˜คํ”ˆ์†Œ์Šค ์ „์šฉ), GitHub Advisory

8๊ฐœ ํŒจํ‚ค์ง€ ์ƒํƒœ๊ณ„ ์ง€์›

์ƒํƒœ๊ณ„์˜์กด์„ฑ ํŒŒ์ผ
npm (Node.js)package.json / package-lock.json
PyPI (Python)requirements.txt / Pipfile.lock
Maven (Java)pom.xml / build.gradle
Gogo.mod / go.sum
crates.io (Rust)Cargo.lock
Packagist (PHP)composer.lock
RubyGems (Ruby)Gemfile.lock
NuGet (.NET)(ํŒจํ‚ค์ง€๋ช…ยท๋ฒ„์ „ ์ง์ ‘ ์ง€์ •)

๋‹ค์–‘ํ•œ ์ถœ๋ ฅ ํ˜•์‹: Markdown ยท Excel ยท CSV ยท JSON ยท SARIF ์‹ฌ๊ฐ๋„ ํ•„ํ„ฐยท์บ์‹ฑยทRate Limit ๋Œ€์‘: --severity๋กœ CRITICAL/HIGH๋งŒ ์ถ”๋ฆฌ๊ณ , ๋™์ผ ์„ธ์…˜ ์บ์‹ฑ๊ณผ API ํ‚ค(NVDยทGitHub)๋กœ ์กฐํšŒ ์ œํ•œ์„ ์™„ํ™”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿšฆ CI/CD ์ •์ฑ… ๋ชจ๋“œ

๋นŒ๋“œ ๊ฒŒ์ดํŠธ๋กœ ์“ฐ๋„๋ก ์„ค๊ณ„ํ–ˆ์Šต๋‹ˆ๋‹ค.

  • --output sarif : GitHub code scanning ๋“ฑ SARIF ์†Œ๋น„ ๋„๊ตฌ ์—ฐ๋™
  • --fail-on HIGH : HIGH ์ด์ƒ ์ทจ์•ฝ์ ์ด ๋‚จ์œผ๋ฉด ์ข…๋ฃŒ ์ฝ”๋“œ 2๋กœ ๋นŒ๋“œ ์‹คํŒจ
  • --ignore-file .cveignore : ์˜คํƒ/์˜ˆ์™ธ ํ•ญ๋ชฉ ์–ต์ œ (package:ID ํ˜•์‹ ์ง€์›)

โš–๏ธ ๋ผ์ด์„ ์Šค

MIT License โ€” ์ž์œ ๋กญ๊ฒŒ ์‚ฌ์šฉยท์ˆ˜์ •ยท๋ฐฐํฌํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

โš ๏ธ ์ฃผ์˜์‚ฌํ•ญ

  • NVDยทGitHub API๋Š” Rate Limit์ด ์žˆ์–ด ๋Œ€๋Ÿ‰ ์Šค์บ” ์‹œ API ํ‚ค ์‚ฌ์šฉ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ƒํƒœ๊ณ„ ์ž๋™ ๊ฐ์ง€๊ฐ€ ์‹คํŒจํ•˜๋ฉด --ecosystem ์˜ต์…˜์œผ๋กœ ์ง์ ‘ ์ง€์ •ํ•˜์„ธ์š”.
  • ๋ฒ„์ „ ๋น„๊ต๋Š” SemVer ๊ธฐ์ค€์ด๋ฉฐ, ์ปค์Šคํ…€ ๋ฒ„์ „ ์ฒด๊ณ„๋Š” ๊ฒฐ๊ณผ๊ฐ€ ๋ถ€์ •ํ™•ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ธํ„ฐ๋„ท ์—ฐ๊ฒฐ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค.

๐Ÿš€ ์‹คํ–‰ ๋ฐฉ๋ฒ•

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# ์„ค์น˜
pip install -r requirements.txt

# ๋‹จ์ผ ํŒจํ‚ค์ง€ ์Šค์บ”
./cve-scanner "log4j-core" "2.14.0"

# ์˜์กด์„ฑ ํŒŒ์ผ ์Šค์บ” (์—‘์…€ ์ถœ๋ ฅ)
./cve-scanner --file requirements.txt --output excel

# CI: HIGH ์ด์ƒ์ด๋ฉด ๋นŒ๋“œ ์‹คํŒจ
./cve-scanner --file package.json --fail-on HIGH

๐Ÿ’ฌ ํ”ผ๋“œ๋ฐฑ

๋ฒ„๊ทธ ๋ฆฌํฌํŠธยท๊ธฐ๋Šฅ ์ œ์•ˆยทํ’€ ๋ฆฌํ€˜์ŠคํŠธ๋ฅผ ํ™˜์˜ํ•ฉ๋‹ˆ๋‹ค. GitHub Issues ๋กœ ๋‚จ๊ฒจ ์ฃผ์„ธ์š”.