
js-x-ray @nodesecure/[email protected]
JavaScript ๋ฐ Node.js ์คํ์์ค SAST ์ค์บ๋. ๊ฐ์ฅ ํํ ์ ์ฑ ํจํด์ ํ์งํ๋ ์ ์ ๋ถ์๊ธฐ ๐ฌ.
JS-X-Ray๋ ์ ์ฑ ํจํด, ๋ณด์ ์ทจ์ฝ์ , ์ฝ๋ ์ด์ ์งํ๋ฅผ ์๋ณํ๊ธฐ ์ํ JavaScript ๋ฐ TypeScript SAST์ ๋๋ค. ESLint์ ๋น์ทํ์ง๋ง ๋ณด์ ๋ถ์์ ํนํ๋์ด ์๋ค๊ณ ์๊ฐํ๋ฉด ๋ฉ๋๋ค. ์๋ NodeSecure CLI๋ฅผ ์ํด ๋ง๋ค์ด์ก์ง๋ง, JS-X-Ray๋ ์ด์ ๊ณต๊ธ๋ง ๋ณดํธ๋ฅผ ์ํ ๋ ๋ฆฝ์ ์ด๊ณ ์ง์งํ ์ ํ์ง๊ฐ ๋์์ต๋๋ค.
๐ ์๋ ๋ฐฉ์
JS-X-Ray๋ JS ๋๋ TS ์ฝ๋๋ฅผ Abstract Syntax Tree (AST) ๋ก ํ์ฑํ๋ฉฐ, RegEx๋ Semgrep ๊ท์น์ ๊ด๋ฒ์ํ๊ฒ ์ฌ์ฉํ์ง ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ณ์ ์ถ์ , ๋์ import ํด์, ๊ทธ๋ฆฌ๊ณ ํจํด ๋งค์นญ ๋๊ตฌ๊ฐ ๋์น๋ ์ ๊ตํ ๋๋ ํ ํ์ง๊ฐ ๊ฐ๋ฅํฉ๋๋ค. ๋์ JS-X-Ray๋ JavaScript/TypeScript ์ํ๊ณ์๋ง ์ ์ ์ผ๋ก ํนํ๋์ด ์๋ค๋ ํธ๋ ์ด๋์คํ๊ฐ ์์ต๋๋ค.
๐ก ๊ธฐ๋ฅ
- ์์ ํ ๋ณ์ ์ถ์ ์ ํตํด
require(),import, ๋์ import ์ถ์ - ๋๋ ํ๋ ์ฝ๋๋ฅผ ํ์งํ๊ณ ์ฌ์ฉ๋ ๋๊ตฌ ์๋ณ (jsfuck, jjencode, obfuscator.io ๋ฑ)
- ์
์ฑ ํจํด ํ์: ๋ฐ์ดํฐ ์ ์ถ,
process.env์ง๋ ฌํ, ์์ ํ์ง ์์ ์ ธ ๋ช ๋ น - ์ทจ์ฝํ ์ฝ๋ ํ์ง:
eval(),Function()์์ฑ์, ReDoS์ ์ทจ์ฝํ ์ ๊ท์, SQL ์ธ์ ์ - ์ทจ์ฝํ ์ํธํ ์๊ณ ๋ฆฌ์ฆ ํ์ (MD5, SHA1 ๋ฑ)
- ์ธํ๋ผ ์งํ ์ถ์ถ: URL, IP, ํธ์คํธ ์ด๋ฆ, ์ด๋ฉ์ผ
- ๊ตฌ์ฑ ๊ฐ๋ฅํ ๋ฏผ๊ฐ๋ ๋ชจ๋ (conservative/aggressive) ๋ฐ ํ์ฅ ๊ฐ๋ฅํ probe ์์คํ
- JavaScript์ TypeScript ๋ชจ๋ ์ง์
๐ ์์ํ๊ธฐ
์ด ํจํค์ง๋ค์ Node ํจํค์ง ์ ์ฅ์์์ ์ฌ์ฉํ ์ ์์ผ๋ฉฐ npm ๋๋ yarn์ผ๋ก ์ฝ๊ฒ ์ค์นํ ์ ์์ต๋๋ค.
$ npm i @nodesecure/js-x-ray
# or
$ yarn add @nodesecure/js-x-ray
๐ ์ฌ์ฉ๋ฒ
import { AstAnalyser } from "@nodesecure/js-x-ray";
const scanner = new AstAnalyser();
const { warnings, dependencies } = await scanner.analyseFile("./file.js");
console.log(dependencies);
console.dir(warnings, { depth: null });
์ ์ฒด API ๋ฌธ์, ๊ฒฝ๊ณ ์นดํ๋ก๊ทธ, ๊ณ ๊ธ ์ฌ์ฉ๋ฒ์ @nodesecure/js-x-ray ํจํค์ง README๋ฅผ ์ฐธ์กฐํ์ธ์.
Workspaces
๐ฅ ๊ธฐ์ฌ์ ๊ฐ์ด๋
ํ๋ก์ ํธ์ ๊ธฐ์ฌํ๊ณ ์ ํ๋ ๊ฐ๋ฐ์๋ผ๋ฉด ๋จผ์ CONTRIBUTING ๊ฐ์ด๋๋ฅผ ์ฝ์ด์ผ ํฉ๋๋ค.
๊ฐ๋ฐ์ ๋ง์น ํ์๋ ๋ค์ ์คํฌ๋ฆฝํธ๋ฅผ ์คํํ์ฌ ํ ์คํธ(๋ฐ ๋ฆฐํฐ)๊ฐ ์ฌ์ ํ ์ ์์ธ์ง ํ์ธํ์ธ์:
$ npm run check
[!CAUTION] ์๋ก์ด ๊ธฐ๋ฅ์ ์ถ๊ฐํ๊ฑฐ๋ ๋ฒ๊ทธ๋ฅผ ์์ ํ๋ ๊ฒฝ์ฐ, ๋ฐ๋์ ์ด์ ๋ํ ํ ์คํธ๋ ํฌํจํ์ธ์.
๋ด๋ถ API
JS-X-Ray ๋ด๋ถ ๊ตฌ์กฐ๋ฅผ ๋ค๋ฃจ๋ ๊ธฐ์ฌ์๋ฅผ ์ํด, ๋ค์ ๋ฆฌ์์ค๋ ์ ์์ค ์ ํธ๋ฆฌํฐ์ AST ์กฐ์ ํจํด์ ๋ฌธ์ํํฉ๋๋ค:
- ESTree ์ ํธ๋ฆฌํฐ - ESTree AST ๋ ธ๋๋ฅผ ์กฐ์ํ๊ธฐ ์ํ ์ ์์ค ํฌํผ
- ESTree ํ ๋น ๋ฐ ์ ์ธ ํจํด (ํ๋์ค์ด) - AST ํํ์ JavaScript ํ ๋น ๋ฐ ์ ์ธ ํจํด ์ฐธ์กฐ ๊ฐ์ด๋
๋ฒค์น๋งํฌ
js-x-ray์ ์ฑ๋ฅ์ mitata๋ฅผ ์ฌ์ฉํ์ฌ ์ธก์ ๋๊ณ ์ถ์ ๋ฉ๋๋ค.
๋ฒค์น๋งํฌ๋ฅผ ์คํํ๋ ค๋ฉด:
workspaces/js-x-ray๋ก ์ด๋ํฉ๋๋ค.npm run bench๋ฅผ ์คํํฉ๋๋ค.
๋ฒค์น๋งํฌ ๊ฒฐ๊ณผ๋ workspaces/js-x-ray/benchmark/report.json์ ์ ์ฅ๋ฉ๋๋ค. ์ด ํ์ผ์ ์๋์ผ๋ก ํธ์งํ์ง ๋ง์ธ์. ๋ชจ๋ pull request์์ ์๋์ผ๋ก ์ ๋ฐ์ดํธ๋ฉ๋๋ค.
๊ธฐ์ฌ์ โจ
์ด ๋ฉ์ง ๋ถ๋ค๊ป ๊ฐ์ฌ๋๋ฆฝ๋๋ค (emoji key):
License
MIT

























