๐ ์ด ์ํฌํ๋ก๋ฅผ ์ฌ์ฉํ์ฌ JavaScript ํ๋ก์ ํธ๋ฅผ ๋ ์์ ํ๊ฒ ๋ง๋์ธ์
๋ณด์ ๋ฌธ์
JavaScript ํ๋ก์ ํธ์ ๋ณด์์ ๋ํด ์๊ฐํด ๋ณธ ์ ์ด ์์ต๋๊น? ์๋? ๋งค์ผ
npm
์ ๊ฒ์๋๋ ์์ฒ ๊ฐ์ ์๋ก์ด ํจํค์ง๋ก ์ธํด ์ทจ์ฝ์ ์ ์์ฒด ์ฝ๋๋ฟ๋ง ์๋๋ผ ์ง์ ์ข
์์ฑ(node_modules)์์๋ ๋ฐ์ํ ์ ์์ต๋๋ค.Few months ago, coa npm library was used to steal users' personal data by injecting malicious code.
As a reminder coa was:
- Downloaded approximately 9 million times per week
- Used by about 5 million GitHub projects
๊ทธ๋ฆฌ๊ณ ๊ทธ๊ฒ์ ๋ง์ ๋ค๋ฅธ ์ด์ผ๊ธฐ ์ค ํ๋์ผ ๋ฟ์ ๋๋ค...
npm
๋ฅผ ์ฌ์ฉํ์ฌ ์ข
์์ฑ์ ๋ค์ด๋ก๋ํ๋ ๊ฒฝ์ฐ ์ด๋ฏธ ๋ค์ ๋ฉ์์ง๊ฐ ํ์๋์์ ์ ์์ต๋๋ค.๊ฐ
npm install
, npm
ํ์ ์
๋ฐ์ดํธ๋ ์ข
์์ฑ์ ๋ํด ๊ฐ์ฌ ์ค์บ์ ์คํํฉ๋๋ค. ์ฌ๊ธฐ์๋ ํ๋ ์ด์์ ์ข
์์ฑ์์ ๋น๋กฏ๋ 79๊ฐ์ ์ทจ์ฝ์ ์ด ์์ต๋๋ค. ๊ฐ๊ฐ์ ์ ์ฌ์ ์ธ ์ํ์ ๋ํ๋ด๋ฏ๋ก ์์ ํด์ผ ํฉ๋๋ค.์ด๋ฌํ ์ทจ์ฝ์ ์ ์ด๋์์ ๋ฐ์ํฉ๋๊น? ๊ธฐ๋ณธ์ ์ผ๋ก
npm
๋ ๋งค์ผ ์
๋ฐ์ดํธ๋๋ ์ทจ์ฝ์ฑ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์ ์ง ๊ด๋ฆฌํฉ๋๋ค. ๋ค๋ฅธ ๋ง์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์กด์ฌํ๋ฉฐ ๋ค์์ JavaScript ์์ฝ์์คํ
์ ์ํ ๊ฐ์ฅ ์ธ๊ธฐ ์๋ ์คํ ์์ค ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํ ์ ์ฒด ๋ชฉ๋ก์
๋๋ค.์ด๋ฌํ ๋ฆฌ์์ค๋ ํ๋ฅญํ์ง๋ง ์ฐ๋ฆฌ๋ ์์ฐ์ฑ์ ์ง์คํ๋ ๊ฒ์ผ๋ฅธ ๊ฐ๋ฐ์์ด๋ฉฐ ์๋ํ๋ฅผ ์ํ๋ฏ๋ก ์๋ก์ด ๊ธฐ๋ฅ์ ์ฒ๋ฆฌํ๊ธฐ ์ ์ ๋งค์ผ ์ค์ 8์์ ๋ชจ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์๋์ผ๋ก ํ์ธํ ํ์๊ฐ ์์ต๋๋ค.
๋ณด์ ์๋ฃจ์
๋จผ์ ๋ณด์ ๋ฌธ์ ์ ๋ํ ๋ฌ์ฑ ์ด ์๋ค๋ ์ฌ์ค์ ๋ํด ๊ฒฝ๊ณ ํ๊ณ ์ถ์ต๋๋ค.
If security were all that mattered, computers would never be turned on, let alone hooked into a network with literally millions of potential intruders. Dan Farmer, pioneer in the development of vulnerability scanners for Unix operating systems and computer networks.
๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ํ๋ก์ ํธ์ ์ฝ๊ฒ ํตํฉํ ์ ์๋ ๋๊ตฌ๋ฅผ ์ฌ์ฉํ๋ฉด ์ทจ์ฝ์ฑ์ ์์ ํฌ๊ฒ ์ค์ผ ์ ์์ต๋๋ค.
๊ทธ๋ฌ๋ ๋๋ถ๋ถ์ ๊ฒฝ์ฐ ์ด๋ฌํ ๋๊ตฌ๋ ์คํ ์์ค๊ฐ ์๋๋ฏ๋ก ๋ฌด๋ฃ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค.
NodeSecure ์ง์์ ํตํฉ
NodeSecure is an open source organization that aims to create free JavaScript security tools. Our biggest area of expertise is in npm package and code analysis.
์์ธํ ๋ด์ฉ์ ๋ณด๋ ค๋ฉด GitHub ์กฐ์ง์ ์ค๋ฆฝ์์ธ Thomas @fraxken์ด ์์ฑํ ๋ค์์ ์ฝ์ด๋ณด์ญ์์ค.
@nodesecure/ci๊ฐ ๋ฌด์์ธ๊ฐ์?
@nodesecure/ci์ ์ข ์์ฑ ์ทจ์ฝ์ฑ์ ์๋ณํ๊ณ ์ ์ ์ฝ๋ ๋ถ์ ๋ฐ ์ทจ์ฝ์ฑ ๋ถ์์ ์ฌ์ฉํ์ฌ ๊ฐ์ฅ ์ผ๋ฐ์ ์ธ ์ ์ฑ ์ฝ๋ ๋ฐ ํจํด์ ์ถ์ ํ๋ ์ผ๋ จ์ ๋๊ตฌ๋ฅผ ์ ๊ณตํฉ๋๋ค.
ํ๋ก์ ํธ(์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ ์ฌ์ฉ ๊ฐ๋ฅ)๊ฐ ๋ชจ๋ ๋ณด์ ๊ฒ์ฌ๋ฅผ ํต๊ณผํ๋ฉด ์ค๋ฅ ์ฝ๋ ์์ด ํ๋ก์ธ์ค๊ฐ ์ข ๋ฃ๋๊ณ ๊ทธ๋ ์ง ์์ผ๋ฉด ์คํจํฉ๋๋ค.
๋ฏธ๋ฆฌ๋ณด๊ธฐ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
์ฌ์ฉํ๋ ๋ฐฉ๋ฒ
- GitHub ์์
GitHub Actions ์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ๊ณต์ NodeSecure ci-action ์์ ์ ์์ ํ๋ฆ์ ๋งค์ฐ ๊ฐ๋จํ๊ฒ ์ถ๊ฐํ ์ ์์ต๋๋ค.
์ํฌํ๋ก์ฐ.yaml
steps:
- uses: actions/checkout@v2
- uses: NodeSecure/ci-action@v1
์ด์ ์์ด๋ฌ๋ํ๊ฒ๋ ํ๋ก์ ํธ์ ์ ์ข ์์ฑ์ ์ถ๊ฐํ์ง ์๊ณ ๋ ์์ค ์ฝ๋์ ํด๋น ์ข ์์ฑ์ด ์๋์ผ๋ก ๋ถ์๋ฉ๋๋ค. ๋ํ ๊ธฐ์ ์ฑ ์์๊ฐ ์๋ก์ด ์ข ์์ฑ์ ์ถ๊ฐํ๋ ๊ฒ์ ์ํ์ง ์๋ ๊ฒฝ์ฐ(node_modules๋ ์ด๋ฏธ ์ฐ์ฃผ๋ณด๋ค ๋ฌด๊ฒ์ต๋๋ค)์ ์ ํฉํฉ๋๋ค.
- Node.js ์คํฌ๋ฆฝํธ
@nodesecure/ci ํจํค์ง๋ฅผ ์ค์นํ๊ณ ์์ ์คํฌ๋ฆฝํธ
node_modules/.bin/nsci
๋ฅผ ์ฌ์ฉํ์ฌ ์์ํฉ๋๋ค.GitHub Action๋ฟ๋ง ์๋๋ผ CLI ์ธ์๋ฅผ ํตํด ์ฌ์ฉ์ ์ง์ ๊ตฌ์ฑ์ ์ ๊ณตํ ์ ์์ต๋๋ค.
๋จผ์ package.json์์ ๋ฐ์ด๋๋ฆฌ ์คํฌ๋ฆฝํธ๋ฅผ ์ฐธ์กฐํ์ญ์์ค.
{
"scripts": {
"nsci": "nsci"
}
}
๊ทธ๋ฐ ๋ค์ ๋ค๋ฅธ ์ธ์๋ฅผ ์ ๊ณตํ์ฌ ์์ํฉ๋๋ค(๊ทธ๋ฐ๋ฐ ๋ชจ๋ ํ ๋ฒ์ ์ฌ์ฉํ ์ ์์).
$ npm run nsci -- --directory=/Users/user1/myproject
$ npm run nsci -- --strategy=npm
$ npm run nsci -- --vulnerability=all
$ npm run nsci -- --warnings=error
$ npm run nsci -- --reporters=console
- ๋ชจ๋ API
@nodesecure/ci๋ ํ์ดํ๋ผ์ธ ๋ฌ๋๋ฅผ API๋ก ๋ ธ์ถํ์ฌ ๋ค๋ฅธ ๊ฒฐํฉ๋ ์ํฌํ๋ก์์ ์ฌ์ฉํ ์ ์๋๋ก ํฉ๋๋ค.
import {ย runPipeline } from "@nodesecure/ci";
const optionsExample = {
directory: process.cwd(),
strategy: "node",
vulnerabilities: "all",
warnings: "error",
reporters: ["console"]
}
await runPipeline(optionsExample);
// => the process can either exit with error code (1)
// or no error code (0), depending on the pipeline status.
๊ทธ๊ฒ ๋ค์ผ, ์ด์ ๋ ์ด์ ์ฐ์ตํ์ง ์์ ๋ณ๋ช ์ ์ฌ์ง๊ฐ ์์ต๋๋ค DevSecOps =)
@nodesecure/ci์ ๋ํ ๋ชจ๋ ํผ๋๋ฐฑ์ ํ์ํฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ด์ ๋ง ์์๋์์ต๋๋ค.
์ธ์ ๋ ์ง GitHub @antoine-coulon์ผ๋ก ์ฐ๋ฝ์ฃผ์ธ์.
์ฝ์ด ์ฃผ์ ์ ๊ฐ์ฌํฉ๋๋ค.
Reference
์ด ๋ฌธ์ ์ ๊ดํ์ฌ(๐ ์ด ์ํฌํ๋ก๋ฅผ ์ฌ์ฉํ์ฌ JavaScript ํ๋ก์ ํธ๋ฅผ ๋ ์์ ํ๊ฒ ๋ง๋์ธ์), ์ฐ๋ฆฌ๋ ์ด๊ณณ์์ ๋ ๋ง์ ์๋ฃ๋ฅผ ๋ฐ๊ฒฌํ๊ณ ๋งํฌ๋ฅผ ํด๋ฆญํ์ฌ ๋ณด์๋ค https://dev.to/nodesecure/make-your-javascript-project-safer-by-using-this-workflow-403aํ ์คํธ๋ฅผ ์์ ๋กญ๊ฒ ๊ณต์ ํ๊ฑฐ๋ ๋ณต์ฌํ ์ ์์ต๋๋ค.ํ์ง๋ง ์ด ๋ฌธ์์ URL์ ์ฐธ์กฐ URL๋ก ๋จ๊ฒจ ๋์ญ์์ค.
์ฐ์ํ ๊ฐ๋ฐ์ ์ฝํ ์ธ ๋ฐ๊ฒฌ์ ์ ๋ (Collection and Share based on the CC Protocol.)
์ข์ ์นํ์ด์ง ์ฆ๊ฒจ์ฐพ๊ธฐ
๊ฐ๋ฐ์ ์ฐ์ ์ฌ์ดํธ ์์ง
๊ฐ๋ฐ์๊ฐ ์์์ผ ํ ํ์ ์ฌ์ดํธ 100์ ์ถ์ฒ ์ฐ๋ฆฌ๋ ๋น์ ์ ์ํด 100๊ฐ์ ์์ฃผ ์ฌ์ฉํ๋ ๊ฐ๋ฐ์ ํ์ต ์ฌ์ดํธ๋ฅผ ์ ๋ฆฌํ์ต๋๋ค