CodeQL CLI๋ก ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถ์ ์ ๋ณด
์ฝ๋๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ๊ธฐ ์ํด, ์ฝ๋์์ ์ถ์ถ๋ CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์ต๋๋ค. CodeQL ๋ถ์์ GitHub์ ์ ๋ก๋ํ์ฌ ์ฝ๋ ๊ฒ์ ๊ฒฝ๊ณ ๋ฅผ ์์ฑํ ์ ์๋ ๊ฒฐ๊ณผ๋ฅผ ์์ฑํฉ๋๋ค.
ํ์ ์กฐ๊ฑด
๋ถ์์ ์์ํ๊ธฐ ์ ์ ๋ค์์ ์ํํด์ผ ํฉ๋๋ค.
- CodeQL CLI์(๋ฅผ) ์ค์ ํ์ฌ ๋ช ๋ น์ ๋ก์ปฌ๋ก ์คํํฉ๋๋ค.
- ๋ถ์ํ๋ ค๋ ์์ค ์ฝ๋์ ๋ํ CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ง๋ญ๋๋ค.
๊ฐ์ฅ ๊ฐ๋จํ codeql database analyze
์คํ ๋ฐฉ๋ฒ์ CodeQL CLI ๋ฒ๋ค์ ํฌํจ๋ ํ์ค ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ๋ ๊ฒ์
๋๋ค.
codeql database analyze
์คํ
database analyze
(์)๋ฅผ ์คํํ๋ฉด:
- ํ์์ ๋ฐ๋ผ ๋ก์ปฌ์์ ์ฌ์ฉํ ์ ์๋ ์ฐธ์กฐ๋ CodeQL ํจํค์ง๋ฅผ ๋ค์ด๋ก๋ํฉ๋๋ค.
- CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ํตํด ์คํํ์ฌ ํ๋ ์ด์์ ์ฟผ๋ฆฌ ํ์ผ์ ์คํํฉ๋๋ค.
- ํน์ ์ฟผ๋ฆฌ ๋ฉํ๋ฐ์ดํฐ๋ฅผ ๊ธฐ๋ฐ์ผ๋ก ๊ฒฐ๊ณผ๋ฅผ ํด์ํ์ฌ ์์ค ์ฝ๋์ ์ฌ๋ฐ๋ฅธ ์์น์ ๊ฒฝ๊ณ ๋ฅผ ํ์ํ ์ ์์ต๋๋ค.
- ์ง๋จ ๋ฐ ์์ฝ ์ฟผ๋ฆฌ์ ๊ฒฐ๊ณผ๋ฅผ ํ์ค ์ถ๋ ฅ์ ๋ณด๊ณ ํฉ๋๋ค.
๋ค์ ๋ช ๋ น์ ์คํํ์ฌ ๋ฐ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ ์ ์์ต๋๋ค.
codeql database analyze <database> --format=<format> --output=<output> <query-specifiers>...
์ฐธ๊ณ ํญ๋ชฉ
๋จ์ผ ์ปค๋ฐ์ ๋ํด ๋ ์ด์์ CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ๋ ๊ฒฝ์ฐ ์ด ๋ช ๋ น์์ ์์ฑ๋ ๊ฐ ๊ฒฐ๊ณผ ์ธํธ์ ๋ํด SARIF ๋ฒ์ฃผ๋ฅผ ์ง์ ํด์ผ ํฉ๋๋ค. GitHub์ ๊ฒฐ๊ณผ๋ฅผ ์ ๋ก๋ํ ๋ code scanning์์๋ ์ด ๋ฒ์ฃผ๋ฅผ ์ฌ์ฉํ์ฌ ๊ฐ ์ธ์ด์ ๋ํ ๊ฒฐ๊ณผ๋ฅผ ๋ณ๋๋ก ์ ์ฅํฉ๋๋ค. ์ด ์์ ์ ์ํํ์ง ์์ผ๋ฉด ๊ฐ ์ ๋ก๋๊ฐ ์ด์ ๊ฒฐ๊ณผ๋ฅผ ๋ฎ์ด์๋๋ค.
codeql database analyze <database> --format=<format> \
--sarif-category=<language-specifier> --output=<output> \
<packs,queries>
<database>
, --format
, --output
์ ์ง์ ํด์ผ ํฉ๋๋ค. ์ํํ ๋ถ์์ ๋ฐ๋ผ ์ถ๊ฐ ์ต์
์ ์ง์ ํ ์ ์์ต๋๋ค.
์ต์ | ํ์ | ์ฌ์ฉ |
---|---|---|
<database> | ๋ถ์ํ CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํฌํจ๋ ๋๋ ํฐ๋ฆฌ์ ๊ฒฝ๋ก๋ฅผ ์ง์ ํฉ๋๋ค. | |
<packs,queries> | ์คํํ CodeQL ํฉ ๋๋ ์ฟผ๋ฆฌ๋ฅผ ์ง์ ํฉ๋๋ค. code scanning์ ์ฌ์ฉ๋๋ ํ์ค ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ค๋ฉด ์ด ๋งค๊ฐ ๋ณ์๋ฅผ ์๋ตํฉ๋๋ค. CodeQL CLI ๋ฒ๋ค์ ํฌํจ๋ ๋ค๋ฅธ ์ฟผ๋ฆฌ ๋ชจ์์ ๋ณด๋ ค๋ฉด codeql resolve queries ๋ฅผ ์คํํฉ๋๋ค. ์ฌ๊ธฐ์ ๋์ด๋ ์ ํ๊ตฐ์ .qls ํ์ฅ ์ฌ๋ถ์ ๊ด๊ณ์์ด ์ ๊ณต๋ ์ ์์ต๋๋ค. ๊ณ ์ ํ ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ๋ด์ฉ์ CodeQL CLI ์ค๋ช
์์์ "CodeQL ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์ ๋ง๋ค๊ธฐ"์(๋ฅผ) ์ฐธ์กฐํ์ธ์. | |
--format | ๋ถ์ ์ค์ ์์ฑ๋ ๊ฒฐ๊ณผ ํ์ผ์ ํ์์ ์ง์ ํฉ๋๋ค. CSV, SARIF ๋ฐ ๊ทธ๋ํ ํ์์ ํฌํจํ์ฌ ๋ค์ํ ํ์์ด ์ง์๋ฉ๋๋ค. GitHub์ ์
๋ก๋ํ๋ ๊ฒฝ์ฐ sarif-latest ์ฌ์ผ ํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฝ๋ ๊ฒ์ฌ์ ๋ํ SARIF ์ง์์(๋ฅผ) ์ฐธ์กฐํ์ธ์. | |
--output | .sarif ํ์ฅ๋ช
์ ๊ฐ์ง ์ํ๋ ํ์ผ ์ด๋ฆ์ ํฌํจํ์ฌ SARIF ๊ฒฐ๊ณผ ํ์ผ์ ์ ์ฅํ ์์น๋ฅผ ์ง์ ํฉ๋๋ค. | |
--sarif-category | ๋จ์ผ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถ์์ ๊ฒฝ์ฐ ์ ํ ์ฌํญ์
๋๋ค. ๋ฆฌํฌ์งํ ๋ฆฌ์์ ๋จ์ผ ์ปค๋ฐ์ ๋ํด ์ฌ๋ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ๋ ๊ฒฝ์ฐ ์ธ์ด๋ฅผ ์ ์ํ๋ ๋ฐ ํ์ํฉ๋๋ค. ์ด ๋ถ์์ ์ํด SARIF ๊ฒฐ๊ณผ ํ์ผ์ ํฌํจํ ๋ฒ์ฃผ๋ฅผ ์ง์ ํฉ๋๋ค. ๋ฒ์ฃผ๋ ๋ค์ํ ์ธ์ด ๋๋ ๋ค์ํ ์ฝ๋ ๋ถ๋ถ์์ ์ํ๋์ง๋ง ๋์ผํ ๋๊ตฌ์ ์ปค๋ฐ์ ๋์์ผ๋ก ํ๋ ์ฌ๋ฌ ๋ถ์์ ๊ตฌ๋ถํ๋ ๋ฐ ์ฌ์ฉ๋ฉ๋๋ค. | |
--sarif-add-baseline-file-info | ๊ถ์ฅ. ๋๊ตฌ ์ํ ํ์ด์ง์ ํ์ผ ์ ์ฉ ๋ฒ์ ์ ๋ณด๋ฅผ ์ ์ถํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ์ฝ๋ ์ค์บ์ ์ํ ๋๊ตฌ ์ํ ํ์ด์ง ์ ๋ณด์(๋ฅผ) ์ฐธ์กฐํ์ธ์. | |
--sarif-include-query-help | SARIF ์ถ๋ ฅ์ ์ฟผ๋ฆฌ ๋์๋ง์ ํฌํจํ ์ง ์ฌ๋ถ๋ฅผ ์ง์ ํฉ๋๋ค. ๋ค์ ์ค ํ๋: always : ๋ชจ๋ ์ฟผ๋ฆฌ์ ๋ํ ์ฟผ๋ฆฌ ๋์๋ง์ ํฌํจํฉ๋๋ค. custom_queries_only (๊ธฐ๋ณธ๊ฐ): ์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ, ์ฆ, codeql/<lang>-queries ํ์์ด ์๋ ์ฟผ๋ฆฌ์ ๋ํด์๋ง ์ฟผ๋ฆฌ ๋์๋ง์ ํฌํจํฉ๋๋ค. never : ์ฟผ๋ฆฌ์ ๋ํ ์ฟผ๋ฆฌ ๋์๋ง์ ํฌํจํ์ง ์์ต๋๋ค. SARIF ์ถ๋ ฅ์ ํฌํจ๋ ์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ์ ์ฟผ๋ฆฌ ๋์๋ง์ ์ฟผ๋ฆฌ์ ๋ํ ์ฝ๋ ๊ฒ์ ๊ฒฝ๊ณ ์ ํ์๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ CodeQL CLI์์ ์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ์(๋ฅผ) ์ฐธ์กฐํ์ธ์. | |
<packs> | ๋ถ์์ CodeQL ์ฟผ๋ฆฌ ํฉ์ ํฌํจํ๋ ค๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค. ์์ธํ ๋ด์ฉ์ CodeQL ํฉ ๋ค์ด๋ก๋ ๋ฐ ์ฌ์ฉ์ ์ฐธ์กฐํ์ธ์. | |
--download | CodeQL ์ฟผ๋ฆฌ ํฉ ์ค ์ผ๋ถ๊ฐ ์์ง ๋์คํฌ์ ์์ด์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ ์ ๋ค์ด๋ก๋ํด์ผ ํ๋ ๊ฒฝ์ฐ์ ์ฌ์ฉํฉ๋๋ค. | |
--threads | ๋ ์ด์์ ์ค๋ ๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ค๋ ๊ฒฝ์ฐ ์ฌ์ฉํฉ๋๋ค. ๊ธฐ๋ณธ๊ฐ์ 1 ์
๋๋ค. ๋ ๋ง์ ์ค๋ ๋๋ฅผ ์ง์ ํ์ฌ ์ฟผ๋ฆฌ ์คํ ์๋๋ฅผ ๋์ผ ์ ์์ต๋๋ค. ์ค๋ ๋ ์๋ฅผ ๋
ผ๋ฆฌ ํ๋ก์ธ์ ์๋ก ์ค์ ํ๋ ค๋ฉด 0 ์ ์ง์ ํฉ๋๋ค. | |
--verbose | ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ ํ๋ก์ธ์ค์์ ๋ถ์ ํ๋ก์ธ์ค ๋ฐ ์ง๋จ ๋ฐ์ดํฐ์ ๊ดํ ๋ ์์ธํ ์ ๋ณด๋ฅผ ๊ฐ์ ธ์ค๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. | |
--threat-model | (๊ณต๊ฐ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ) ์ํ ๋ชจ๋ธ์ ์ถ๊ฐํ์ฌ CodeQL ๋ถ์์์ ์ถ๊ฐ ์๋ณธ์ ๊ตฌ์ฑํ๋ ๋ฐ ์ฌ์ฉํฉ๋๋ค. ๊ณต๊ฐ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ์์ ์ํ ๋ชจ๋ธ์ Java ๋ถ์์์๋ง ์ง์๋ฉ๋๋ค. ์์ธํ ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถ์์(๋ฅผ) ์ฐธ์กฐํ์ธ์. |
์ฐธ๊ณ ํญ๋ชฉ
๋ฐ์ดํฐ๋ฒ ์ด์ค ์ ๊ทธ๋ ์ด๋
CodeQL CLI v2.3.3 ์ดํ์์ ๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒฝ์ฐ ์ต์ ๋ฒ์ ์ CodeQL CLI์ผ๋ก ๋ถ์์ ์คํํ๋ ค๋ฉด ๋จผ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ช
์์ ์ผ๋ก ์
๊ทธ๋ ์ด๋ํด์ผ ํฉ๋๋ค. ์ด ๋จ๊ณ๊ฐ ํ์ํ ๊ฒฝ์ฐ database analyze
(์)๋ฃฐ ์คํํ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์
๊ทธ๋ ์ด๋๊ฐ ํ์ํ๋ค๋ ๋ฉ์์ง๊ฐ ํ์๋ฉ๋๋ค.
CodeQL CLI v2.3.4 ์ด์์์ ๋ง๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๊ฒฝ์ฐ CLI๋ ํ์ํ ์ ๊ทธ๋ ์ด๋๋ฅผ ์์์ ์ผ๋ก ์คํํฉ๋๋ค. ์ ๊ทธ๋ ์ด๋ ๋ช ๋ น์ ๋ช ์์ ์ผ๋ก ์คํํ ํ์๋ ์์ต๋๋ค.
๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ ๋ ์ฌ์ฉํ ์ ์๋ ๋ชจ๋ ์ต์ ์ ๋ํ ์ ์ฒด ๋ด์ฉ์ ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถ์์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถ์ ๊ธฐ๋ณธ ์์
์ด ์์ ์์๋ /codeql-dbs/example-repo
์ ์ ์ฅ๋ CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ๊ณ ๊ทธ ๊ฒฐ๊ณผ๋ฅผ SARIF ํ์ผ/temp/example-repo-js.sarif
๋ก ์ ์ฅํฉ๋๋ค. --sarif-category
๋ฅผ ์ฌ์ฉํ์ฌ ๊ฒฐ๊ณผ๋ฅผ JavaScript๋ก ์๋ณํ๋ SARIF ํ์ผ์ ์ถ๊ฐ ์ ๋ณด๋ฅผ ํฌํจํฉ๋๋ค. ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋จ์ผ ์ปค๋ฐ์ ๋ํด ๋ถ์ํ CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ์ฌ๋ฌ ๊ฐ ์๋ ๊ฒฝ์ฐ ๋ฐ๋์ ์ด๋ ๊ฒ ํด์ผ ํฉ๋๋ค.
$ codeql database analyze /codeql-dbs/example-repo \
javascript-code-scanning.qls --sarif-category=javascript-typescript \
--format=sarif-latest --output=/temp/example-repo-js.sarif
> Running queries.
> Compiling query plan for /codeql-home/codeql/qlpacks/codeql-javascript/AngularJS/DisablingSce.ql.
...
> Shutting down query evaluator.
> Interpreting results.
๋ชจ๋ํฐ๋ง์ ์ํด ๊ฒฐ๊ณผ์ ํ์ผ ์ ์ฉ ๋ฒ์ ์ ๋ณด ์ถ๊ฐ
ํ์์ ๋ฐ๋ผ GitHub์ ํ์ผ ์ ์ฉ ๋ฒ์ ์ ๋ณด๋ฅผ ์ ์ถํ์ฌ code scanning์ ๋ํ ๋๊ตฌ ์ํ ํ์ด์ง์ ํ์ํ ์ ์์ต๋๋ค. ํ์ผ ์ ์ฉ ๋ฒ์ ์ ๋ณด์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฝ๋ ์ค์บ์ ์ํ ๋๊ตฌ ์ํ ํ์ด์ง ์ ๋ณด์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
code scanning ๊ฒฐ๊ณผ์ ํ์ผ ์ ์ฉ ๋ฒ์ ์ ๋ณด๋ฅผ ํฌํจํ๋ ค๋ฉด CI ์์คํ
์ --sarif-add-baseline-file-info
ํ๋๊ทธ๋ฅผ codeql database analyze
ํธ์ถ์ ์ถ๊ฐํฉ๋๋ค. ์๋ฅผ ๋ค๋ฉด ๋ค์๊ณผ ๊ฐ์ต๋๋ค.
$ codeql database analyze /codeql-dbs/example-repo \
javascript-code-scanning.qls --sarif-category=javascript-typescript \
--sarif-add-baseline-file-info \ --format=sarif-latest \
--output=/temp/example-repo-js.sarif
๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ถ์ ์คํ์ ์์
๋ค์ ์์ ์์๋ CodeQL ํฉ์ ์ฌ์ฉํ์ฌ database analyze
(์)๋ฅผ ์คํํ๋ ๋ฐฉ๋ฒ๊ณผ CodeQL ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ก์ปฌ ์ฒดํฌ์์์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ ์ค๋๋ค. ์ด ์์ ์์๋ CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ CodeQL ๋ฆฌํฌ์งํ ๋ฆฌ์ ๋ก์ปฌ ๋ณต์ฌ๋ณธ์ ํ์ ์ธ ๋๋ ํฐ๋ฆฌ์ ๋ง๋ค์ด์ก๋ค๊ณ ๊ฐ์ ํฉ๋๋ค.
CodeQL ์ฟผ๋ฆฌ ํฉ ์คํ
GitHub Container registry์์ ๊ธฐ์กด CodeQL ์ฟผ๋ฆฌ ํฉ์ ์คํํ๋ ค๋ฉด ํ๋ ์ด์์ ํฉ ์ด๋ฆ์ ์ง์ ํ ์ ์์ต๋๋ค.
codeql database analyze <database> microsoft/coding-standards@1.0.0 github/security-queries --format=sarifv2.1.0 --output=query-results.sarif --download
์ด ๋ช
๋ น์ ๋ ๊ฐ์ CodeQL ์ฟผ๋ฆฌ ํฉ( microsoft/coding-standards
๋ฒ์ 1.0.0 ๋ฐ ์ง์ ๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ์ต์ ๋ฒ์ ์ github/security-queries
) ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์์ ์คํํฉ๋๋ค. ๊ธฐ๋ณธ ๋๊ตฌ ๋ชจ์์ ๋ํ ์์ธํ ์ ๋ณด๋ CodeQL ํฉ ๊ฒ์ ๋ฐ ์ฌ์ฉ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
--download
ํ๋๊ทธ๋ ์ ํ ์ฌํญ์
๋๋ค. ์ด๋ฅผ ์ฌ์ฉํ์ฌ ์ฟผ๋ฆฌ ํฉ์ ๋ก์ปฌ์์ ์์ง ์ฌ์ฉํ ์ ์๋ ๊ฒฝ์ฐ ๋ค์ด๋ก๋ํฉ๋๋ค.
๋จ์ผ ์ฟผ๋ฆฌ ์คํ
JavaScript ์ฝ๋๋ฒ ์ด์ค์ฉ์ผ๋ก CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ๋จ์ผ ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ค๋ฉด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํฌํจ๋ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
codeql database analyze --download <javascript-database> codeql/javascript-queries:Declarations/UnusedVariable.ql --format=csv --output=js-analysis/js-results.csv
์ด ๋ช ๋ น์ ์ฌ์ฉ๋์ง ์๋ ๋ณ์, ๊ฐ์ ธ์ค๊ธฐ, ํจ์ ๋๋ ํด๋์ค์ ๊ด๋ จ๋ ์ ์ฌ์ ์ธ ๋ฒ๊ทธ๋ฅผ ์ฐพ๋ ๊ฐ๋จํ ์ฟผ๋ฆฌ๋ฅผ ์คํํฉ๋๋ค. ์ด๋ CodeQL ๋ฆฌํฌ์งํ ๋ฆฌ์ ํฌํจ๋ JavaScript ์ฟผ๋ฆฌ ์ค ํ๋์ ํด๋นํฉ๋๋ค. ๋น์ทํ ๊ฒฝ๋ก์ ๊ณต๋ฐฑ์ผ๋ก ๊ตฌ๋ถ๋ ๋ชฉ๋ก์ ์ง์ ํ์ฌ ๋ ์ด์์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
๋ถ์์ผ๋ก ์ ๋๋ ํฐ๋ฆฌ(js-analysis
)์ CSV ํ์ผ(js-results.csv
)์ ์์ฑํฉ๋๋ค.
๋๋ CodeQL ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ์ฒดํฌ ์์๋ ๊ฒฝ์ฐ ์ฟผ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ง์ ์ง์ ํ์ฌ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
codeql database analyze <javascript-database> ../ql/javascript/ql/src/Declarations/UnusedVariable.ql --format=csv --output=js-analysis/js-results.csv
database analyze
๋ช
๋ น์ ์ฌ์ฉํ์ฌ ์์ฒด ์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์๋ ์์ต๋๋ค.
CodeQL CLI๊ณผ(์) ํจ๊ป ์ฌ์ฉํ ์ฟผ๋ฆฌ ์ค๋น์ ๋ํ ์์ธํ ๋ด์ฉ์ CodeQL CLI์์ ์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ ์ฌ์ฉํ๊ธฐ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
๋๋ ํฐ๋ฆฌ์์ ๋ชจ๋ ์ฟผ๋ฆฌ ์คํ
๋ชจ๋ ๊ฐ๋ณ ์ฟผ๋ฆฌ ํ์ผ์ ๋์ดํ๋ ๋์ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ ๊ณตํ์ฌ ๋๋ ํฐ๋ฆฌ์ ์๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์ต๋๋ค. ๊ฒฝ๋ก๋ ์ฌ๊ท์ ์ผ๋ก ๊ฒ์๋๋ฏ๋ก ํ์ ํด๋์ ํฌํจ๋ ๋ชจ๋ ์ฟผ๋ฆฌ๋ ์คํ๋ฉ๋๋ค.
์ค์
๋ช
๋ น๊ณผ ํจ๊ป ์ฌ์ฉํ๋๋ก ์ค๊ณ๋์ง ์์ ์ผ๋ถ ํน์ ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ ์ ์์ผ๋ฏ๋ก database analyze
(์)๋ฅผ ์คํํ ๋ ํต์ฌ CodeQL ์ฟผ๋ฆฌ ํฉ์ ๋ฃจํธ๋ฅผ ์ง์ ํ์ง ์์์ผ ํฉ๋๋ค. ๋์ ์ฟผ๋ฆฌ ํฉ์ ์คํํ์ฌ ํฉ์ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ฅผ ๋ถ์์ ํฌํจํ๊ฑฐ๋ ์ฝ๋ ๊ฒ์ ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์ ์ค ํ๋๋ฅผ ์คํํฉ๋๋ค.
์๋ฅผ ๋ค์ด codeql/python-queries
์ฟผ๋ฆฌ ํฉ์ Functions
๋๋ ํฐ๋ฆฌ์ ํฌํจ๋ ๋ชจ๋ Python ์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ค๋ฉด ๋ค์์ ์คํํฉ๋๋ค.
codeql database analyze <python-database> codeql/python-queries:Functions --format=sarif-latest --output=python-analysis/python-results.sarif --download
๋๋ CodeQL ๋ฆฌํฌ์งํ ๋ฆฌ๊ฐ ์ฒดํฌ ์์๋ ๊ฒฝ์ฐ ๋๋ ํฐ๋ฆฌ ๊ฒฝ๋ก๋ฅผ ์ง์ ์ง์ ํ์ฌ ๋์ผํ ์ฟผ๋ฆฌ๋ฅผ ์คํํ ์ ์์ต๋๋ค.
codeql database analyze <python-database> ../ql/python/ql/src/Functions/ --format=sarif-latest --output=python-analysis/python-results.sarif
๋ถ์์ด ์๋ฃ๋๋ฉด SARIF ๊ฒฐ๊ณผ ํ์ผ์ด ์์ฑ๋ฉ๋๋ค. --format=sarif-latest
(์)๋ฅผ ์ง์ ํ๋ฉด CodeQL์์ ์ง์ํ๋ ์ต์ SARIF ์ฌ์์ ๋ฐ๋ผ ๊ฒฐ๊ณผ์ ํ์์ด ์ง์ ๋ฉ๋๋ค.
CodeQL ํฉ์์ ์ฟผ๋ฆฌ์ ํ์ ์งํฉ ์คํ
CodeQL CLI v2.8.1 ์ด์์ ์ฌ์ฉํ๋ ๊ฒฝ์ฐ ํฉ ์ฌ์์ ๋์ ๊ฒฝ๋ก๋ฅผ ํฌํจํ์ฌ ํฉ ๋ด์์ ์ฟผ๋ฆฌ์ ํ์ ์งํฉ์ ์คํํ ์ ์์ต๋๋ค. ์ด๋ ํฉ ๋ด์์ ์ฟผ๋ฆฌ๋ฅผ ์ฐพ๊ฑฐ๋ ์คํํ๋ ๋ชจ๋ ๋ช ๋ น์ ์ ์ฉ๋ฉ๋๋ค.
์ฟผ๋ฆฌ ์งํฉ์ ์ง์ ํ๋ ์์ ํ ๋ฐฉ๋ฒ์ scope/name@range:path
ํ์์ ์์ต๋๋ค.
-
scope/name
(์)๋ CodeQL ํฉ์ ์ ๊ทํ๋ ์ด๋ฆ์ ๋๋ค. -
range
(์)๋ semver(์๋ฏธ๋ก ์ ๋ฒ์ ๊ด๋ฆฌ) ๋ฒ์์ ๋๋ค. -
path
๋ ๋จ์ผ ์ฟผ๋ฆฌ, ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ ๋๋ ํฐ๋ฆฌ ๋๋ ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์ ํ์ผ์ ๋ํ ํ์ผ ์์คํ ๊ฒฝ๋ก์ ๋๋ค.
scope/name
(์)๋ฅผ ์ง์ ํ๋ฉด range
๋ฐ path
(์)๋ ์ ํ ์ฌํญ์
๋๋ค. range
์(๋ฅผ) ์๋ตํ๋ฉด ์ง์ ๋ ํฉ์ ์ต์ ๋ฒ์ ์ด ์ฌ์ฉ๋ฉ๋๋ค. path
(์)๋ฅผ ์๋ตํ๋ฉด ์ง์ ๋ ํฉ์ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์์ด ์ฌ์ฉ๋ฉ๋๋ค.
path
์(๋) \*.ql
์ฟผ๋ฆฌ ํ์ผ, ํ๋ ์ด์์ ์ฟผ๋ฆฌ๊ฐ ํฌํจ๋ ๋๋ ํฐ๋ฆฌ ๋๋ .qls
์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์ ํ์ผ ์ค ํ๋๊ฐ ๋ ์ ์์ต๋๋ค. ํฉ ์ด๋ฆ์ ์๋ตํ๋ฉด ํ์ฌ ํ๋ก์ธ์ค์ ์์
๋๋ ํฐ๋ฆฌ๋ฅผ ๊ธฐ์ค์ผ๋ก ํด์๋๋ path
(์)๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
scope/name
(์)๊ณผ path
(์)๋ฅผ ์ง์ ํ๋ฉด path
(์)๋ ์ ๋๊ฐ์ด ๋ ์ ์์ต๋๋ค. CodeQL ํฉ์ ๋ฃจํธ๋ฅผ ๊ธฐ์ค์ผ๋ก ๊ณ ๋ ค๋ฉ๋๋ค.
codeql/cpp-queries
CodeQL ํฉ ๋ด experimental/Security
ํด๋์ ๋ชจ๋ ์ฟผ๋ฆฌ๋ฅผ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
codeql database analyze --format=sarif-latest --output=results <db> \
codeql/cpp-queries:experimental/Security
codeql/cpp-queries
CodeQL ํฉ์์ RedundantNullCheckParam.ql
์ฟผ๋ฆฌ๋ฅผ ์คํํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํฉ๋๋ค.
codeql database analyze --format=sarif-latest --output=results <db> \
'codeql/cpp-queries:experimental/Likely Bugs/RedundantNullCheckParam.ql'
= 0.0.3 ๋ฐ < 0.1.0(๊ฐ์ฅ ํธํ๋๋ ๋ฒ์ ์ด ์ ํ๋จ)์ธ
codeql/cpp-queries
CodeQL ํฉ์ ๋ฒ์ ์์cpp-security-and-quality.qls
์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์์ ์ฌ์ฉํ์ฌ ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ๋ ค๋ฉด ๋ค์์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
codeql database analyze --format=sarif-latest --output=results <db> \
'codeql/cpp-queries@~0.0.3:codeql-suites/cpp-security-and-quality.qls'
๊ฒฝ๋ก์ ๋ฆฌํฐ๋ด @
๋๋ :
์ด ํฌํจ๋ ์ฟผ๋ฆฌ ํ์ผ, ๋๋ ํฐ๋ฆฌ ๋๋ ๋๊ตฌ ๋ชจ์์ ์ฐธ์กฐํด์ผ ํ๋ ๊ฒฝ์ฐ ๋ค์๊ณผ ๊ฐ์ด ์ฟผ๋ฆฌ ์ฌ์์์ path:
๋ฅผ ๋ถ์ผ ์ ์์ต๋๋ค.
codeql database analyze --format=sarif-latest --output=results <db> \
path:C:/Users/ci/workspace@2/security/query.ql
CodeQL ํฉ์ ๋ํ ์์ธํ ๋ด์ฉ์ "CodeQL ํฉ์ ์ฌ์ฉํ์ฌ ๋ถ์ ์ฌ์ฉ์ ์ง์ "์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์ ์คํ
C/C++ ์ฝ๋๋ฒ ์ด์ค์ฉ์ผ๋ก CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค์ ๋ํด ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์์ ์คํํ๊ธฐ ์ํด ๋ฐ์ดํฐ๋ฒ ์ด์ค๊ฐ ํฌํจ๋ ๋๋ ํฐ๋ฆฌ์์ ๋ค์ ๋ช ๋ น์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
codeql database analyze <cpp-database> codeql/cpp-queries:codeql-suites/cpp-code-scanning.qls --format=sarifv2.1.0 --output=cpp-results.sarif --download
์ด ๋ช
๋ น์ codeql/cpp-queries
CodeQL ์ฟผ๋ฆฌ ํฉ์ ๋ค์ด๋ก๋ํ๊ณ , ๋ถ์์ ์คํํ๊ณ , ๋ชจ๋ ๋ฒ์ ์ GitHub์์ ์ง์ํ๋ SARIF ๋ฒ์ 2.1.0 ํ์์ ํ์ผ์ ์์ฑํฉ๋๋ค. ์ด ํ์ผ์ codeql github upload-results
๋ฅผ ์คํํ๊ฑฐ๋ ์ฝ๋ ๊ฒ์ API๋ฅผ ํตํด GitHub์ ์
๋ก๋ํ ์ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ GitHub์ CodeQL ๋ถ์ ๊ฒฐ๊ณผ ์
๋ก๋ ๋๋ ์ฝ๋ ๊ฒ์์ ๋ํ REST API ์๋ํฌ์ธํธ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
CodeQL ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์์ ์ง์๋ฌธ์ ์ฌ์ฉํ์ฌ ํน์ ๋ฉํ๋ฐ์ดํฐ ์์ฑ์ ๋ฐ๋ผ ์คํํ ์ฟผ๋ฆฌ๋ฅผ ์ ํํ๋ .qls
ํ์ผ์
๋๋ค. ํ์ค CodeQL ํฉ์๋ ์ฝ๋ ๊ฒ์ฌ์์ ์ฌ์ฉํ๋ ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์์ ์์น๋ฅผ ์ง์ ํ๋ ๋ฉํ๋ฐ์ดํฐ๊ฐ ์์ผ๋ฏ๋ก CodeQL CLI(์)๋ ์ด๋ฌํ ๋๊ตฌ ๋ชจ์ ํ์ผ์ ์๋์ผ๋ก ์ฐพ์ ์์น๋ฅผ ์๊ณ ์๊ธฐ ๋๋ฌธ์ ๋ช
๋ น์ค์์ ์ ์ฒด ๊ฒฝ๋ก๋ฅผ ์ง์ ํ ํ์๊ฐ ์์ต๋๋ค.
์์ธํ ๋ด์ฉ์ CodeQL ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์ ๋ง๋ค๊ธฐ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
์ฌ์ฉ์ ์ง์ ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์์ ๋ง๋๋ ๋ฐฉ๋ฒ์ ๋ํ ์์ธํ ๋ด์ฉ์ CodeQL ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์ ๋ง๋ค๊ธฐ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
์ค์ผ๋ ๋ฐ์ดํฐ์ ์ ์ฌ์ ์๋ณธ์ ์ถ๊ฐํ๊ธฐ ์ํ ๋ชจ๋ธ ํฉ ํฌํจ
์ฐธ๊ณ ํญ๋ชฉ
์ํ ๋ชจ๋ธ์ ํ์ฌ ๊ณต๊ฐ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๋ฒ์ ์ด๋ฉฐ ๋ณ๊ฒฝ๋ ์ ์์ต๋๋ค. ๊ณต๊ฐ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๋์, ์ํ ๋ชจ๋ธ์ Java/Kotlin ๋ฐ C#์ฉ์ผ๋ก๋ง ์ง์ํฉ๋๋ค.
code scanning ๋ถ์์์ ์ํ ๋ชจ๋ธ์ ๊ตฌ์ฑํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ CodeQL ์ค๋ช ์์ Threat models for Java and Kotlin ๋ฐ Threat models for C#๋ฅผ ์ฐธ์กฐํ์ธ์.
$ codeql database analyze /codeql-dbs/my-company --format=sarif-latest \
--threat-model=local \
--output=/temp/my-company.sarif codeql/java-queries
์ด ์์ ์์ ํ์ค ์ฟผ๋ฆฌ ํฉ codeql/java-queries
์ ๊ด๋ จ ์ฟผ๋ฆฌ๋ remote
๋ฐ์ดํฐ ํ๋ฆ ์๋ณธ์ ๋ํ ๊ธฐ๋ณธ ์ํ ๋ชจ๋ธ๋ฟ๋ง ์๋๋ผ local
์ํ ๋ชจ๋ธ๋ ์ฌ์ฉํฉ๋๋ค. ๋ก์ปฌ ์๋ณธ(์: ํ์ผ ์์คํ
, ๋ช
๋ น์ค ์ธ์, ๋ฐ์ดํฐ๋ฒ ์ด์ค ๋ฐ ํ๊ฒฝ ๋ณ์)์ ๋ฐ์ดํฐ๋ฅผ ์ฝ๋๋ฒ ์ด์ค์ ๋ํด ์ค์ผ๋ ๋ฐ์ดํฐ์ ์ ์ฌ์ ์๋ณธ์ผ๋ก ๊ฐ์ฃผํ๋ ๊ฒฝ์ฐ local
์ํ ๋ชจ๋ธ์ ์ฌ์ฉํด์ผ ํฉ๋๋ค.
๊ฒฐ๊ณผ
๋ถ์ ๊ฒฐ๊ณผ๋ฅผ SARIF ๋ฐ CSV๋ฅผ ๋น๋กฏํ ๋ค์ํ ํ์์ผ๋ก ์ ์ฅํ ์ ์์ต๋๋ค.
SARIF ํ์์ ๊ด๋ฒ์ํ ์ ์ ๋ถ์ ๋๊ตฌ์ ์ถ๋ ฅ์ ๋ํ๋ด๋๋ก ๋์์ธ๋์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ CodeQL CLI SARIF ์ถ๋ ฅ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
CSV ํ์์ ๊ฒฐ๊ณผ ๋ชจ์ต์ ๋ํ ์์ธํ ๋ด์ฉ์ CodeQL CLI CSV ์ถ๋ ฅ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
๊ฒฐ๊ณผ ํ์ผ์ ์ฌ์ฉ์ ๊ณ ์ ์ ์ฝ๋ ๊ฒํ ๋๋ ๋๋ฒ๊น ์ธํ๋ผ์ ํตํฉํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด SARIF ํ์ผ ์ถ๋ ฅ์ ์ฌ์ฉํ์ฌ IDE์ฉ SARIF ๋ทฐ์ด ํ๋ฌ๊ทธ์ธ์ ์ฌ์ฉํ์ฌ ์์ค ์ฝ๋์ ์ฌ๋ฐ๋ฅธ ์์น์์ ๊ฒฝ๊ณ ๋ฅผ ๊ฐ์กฐ ํ์ํ ์ ์์ต๋๋ค.
๋ก๊ทธ ๋ฐ ์ง๋จ ์ ๋ณด ๋ณด๊ธฐ
code scanning ์ฟผ๋ฆฌ ๋๊ตฌ ๋ชจ์์ ์ฌ์ฉํ์ฌ CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ๋ถ์ํ ๋, CLI๋ ๊ฒฝ๊ณ ์ ๋ํ ์์ธ ์ ๋ณด๋ฅผ ์์ฑํ๋ ๊ฒ ์ธ์๋ ๋ฐ์ดํฐ๋ฒ ์ด์ค ์์ฑ ๋จ๊ณ ๋ฐ ์์ฝ ๋ฉํธ๋ฆญ์ ์ง๋จ ๋ฐ์ดํฐ๋ฅผ ๋ณด๊ณ ํฉ๋๋ค. SARIF ์ถ๋ ฅ์ ์์ฑํ๋๋ก ์ ํํ๋ฉด ์ถ๊ฐ ๋ฐ์ดํฐ๋ SARIF ํ์ผ์ ํฌํจ๋ฉ๋๋ค. ๊ฒฝ๊ณ ๊ฐ ๊ฑฐ์ ์๋ ๋ฆฌํฌ์งํ ๋ฆฌ์ ๊ฒฝ์ฐ ์ด ์ ๋ณด๋ ์ฝ๋์ ๋ฌธ์ ๊ฐ ๊ฑฐ์ ์๋์ง ๋๋ CodeQL ๋ฐ์ดํฐ๋ฒ ์ด์ค๋ฅผ ์์ฑํ๋ ๋์ ์ค๋ฅ๊ฐ ์์๋์ง ํ์ธํ๋ ๋ฐ ์ ์ฉํ ์ ์์ต๋๋ค. codeql database analyze
์์ ๋ณด๋ค ์์ธํ ์ถ๋ ฅ์ ์ป์ผ๋ ค๋ฉด --verbose
์ต์
์ ์ฌ์ฉํฉ๋๋ค.
์ฌ์ฉ ๊ฐ๋ฅํ ์ง๋จ ์ ๋ณด์ ์ ํ์ ๋ํ ์์ธํ ๋ด์ฉ์ ์ฝ๋ ๊ฒ์ฌ ๋ก๊ทธ ๋ณด๊ธฐ์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
CodeQL ๋ถ์์ด ์คํจํ๋๋ผ๋ ์ง๋จ ์ ๋ณด๋ฅผ ๋ด๋ณด๋ด๊ณ GitHub์ ์ ๋ก๋ํ๋๋ก ์ ํํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ GitHub์ CodeQL ๋ถ์ ๊ฒฐ๊ณผ ์ ๋ก๋์(๋ฅผ) ์ฐธ์กฐํ์ธ์.
๋ค์ ๋จ๊ณ
- CodeQL ๋ถ์ ๊ฒฐ๊ณผ๋ฅผ GitHub์ ์ ๋ก๋ํ๋ ๋ฐฉ๋ฒ์ ์์๋ณด๋ ค๋ฉด GitHub์ CodeQL ๋ถ์ ๊ฒฐ๊ณผ ์ ๋ก๋์(๋ฅผ) ์ฐธ์กฐํ์ธ์.