23๊ฐ ๋ค์ธต ๋ฐฉ์ด ์ฒด๊ณ ๊ธฐ๋ฐ npm ๊ณต๊ธ๋ง ๋ณด์ ์ํ ์ค์๊ฐ ํ์ง ์์ง
๐ก๏ธ NPM Safety Guard โ All 23 Security Layers Explained
AI ์์ฝ
Context
๋จ์ผ CVE ์ค์บ ์ค์ฌ์ ๊ธฐ์กด npm audit ๋ฐฉ์์ ๋ฐํ์ ํ์ด๋ก๋๋ ์ ๊ตํ ์ฌํ๊ณตํ์ ๊ณต๊ฒฉ ํ์ง์ ํ๊ณ ๋ ธ์ถ. ํนํ transitive dependency์ ๊น์ ๋จ๊ณ์์ ๋ฐ์ํ๋ ์ ์ฑ ์ฝ๋ ์ฝ์ ๋ฐ Dependency Confusion ๊ณต๊ฒฉ์ ์ทจ์ฝํ ๊ตฌ์กฐ์ ๊ฒฐํจ ์กด์ฌ.
Technical Solution
- Damerau-Levenshtein ๊ฑฐ๋ฆฌ ์๊ณ ๋ฆฌ์ฆ ๊ธฐ๋ฐ์ Typosquatting ๋ฐ Homoglyph ๊ณต๊ฒฉ ์คํ๋ผ์ธ ํ์ง ๋ก์ง ๊ตฌํ
- AST(Abstract Syntax Tree) ์ ์ ๋ถ์์ ํตํ eval(), child_process ๋ฑ 14๊ฐ์ง ์ ์ฑ ํจํด์ ํ๋ฅด๋ณผ(Tarball) ๋ด๋ถ ์ ๋ฐ ์ค์บ
- Semver ์ฐ์ ์์๋ฅผ ์ ์ฉํ Public Registry์ ๊ฐ์ง ํจํค์ง ์ฃผ์ ์ ๋ง๊ธฐ ์ํ Dependency Confusion ํ์ง ๋ฉ์ปค๋์ฆ ์ ์ฉ
- ํจํค์ง ์ฐ๋ น, ๋ฉ์ธํ ์ด๋ ์, ๋ค์ด๋ก๋ ์๋ ๋ฑ ํ๋ ์งํ ๊ธฐ๋ฐ์ Registry Risk Heuristics ์ค์ฝ์ด๋ง ์์คํ ๊ตฌ์ถ
- Lockfile Full-Tree ๋ถ์์ ํตํด ์ ์ด ์์กด์ฑ ๋ด์ ๋ชจ๋ URL ๊ฒ์ฆ ๋ฐ ํ์ค ๋ ์ง์คํธ๋ฆฌ ์ผ์น ์ฌ๋ถ ํ์ธ
- Native Node.js Addons(.node)์ ๋ถํฌ๋ช ์ฑ์ ๊ณ ๋ คํ ๋ณ๋์ ๋ฐ์ด๋๋ฆฌ ์ํ๋ ๋ถ๋ฅ ๋ฐ ๊ฐ์ฌ ๊ฐ์ด๋ ์ ๊ณต
์ค์ฒ ํฌ์ธํธ
- package.json์ overrides/resolutions ํ๋ ๋ด ํ ๊ณ ์ ๋ ๋ฒ์ ์ CVE ์ต์ ์ํ ๊ฒํ - preinstall, postinstall ๋ฑ install script hook์ ์ฌ์ฉํ๋ ํจํค์ง์ ํ์ดํธ๋ฆฌ์คํธ ๊ด๋ฆฌ ๋ฐ ์คํ ๊ถํ ์ ์ด - ๋ด๋ถ ์ ์ฉ ํจํค์ง ๋ช ์นญ์ด public npm registry์ ๋ฑ๋ก๋์ด ์๋์ง ์ฃผ๊ธฐ์ ๋ชจ๋ํฐ๋ง - ๋ฐํ์์ ๋์ require() ๋๋ Base64 ๋์ฝ๋ฉ ํ์ด๋ก๋๋ฅผ ์ฌ์ฉํ๋ ์์กด์ฑ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ AST ๋ถ์ ์ํ