Skip to main content

CodeQL ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ฝ”๋“œ ๋ถ„์„

์ฝ”๋“œ๋ฒ ์ด์Šค์—์„œ ์ถ”์ถœ๋œ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ˆ„๊ฐ€ ์ด ๊ธฐ๋Šฅ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ๋‚˜์š”?

CodeQL์€(๋Š”) ๋‹ค์Œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ ์œ ํ˜•์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  • GitHub.com์˜ ํผ๋ธ”๋ฆญ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ, GitHub CodeQL ์‚ฌ์šฉ ์•ฝ๊ด€ ์ฐธ์กฐ
  • GitHub Code Security๊ฐ€ ํ™œ์„ฑํ™”๋œ GitHub Team ๋˜๋Š” GitHub Enterprise Cloud์˜ ์กฐ์ง ์†Œ์œ  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ

CodeQL CLI๋กœ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ„์„ ์ •๋ณด

์ฝ”๋“œ๋ฒ ์ด์Šค๋ฅผ ๋ถ„์„ํ•˜๊ธฐ ์œ„ํ•ด, ์ฝ”๋“œ์—์„œ ์ถ”์ถœ๋œ CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค์— ๋Œ€ํ•ด ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CodeQL ๋ถ„์„์€ GitHub์— ์—…๋กœ๋“œํ•˜์—ฌ ์ฝ”๋“œ ๊ฒ€์ƒ‰ ๊ฒฝ๊ณ ๋ฅผ ์ƒ์„ฑํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•ฉ๋‹ˆ๋‹ค.

ํ•„์ˆ˜ ์กฐ๊ฑด

๋ถ„์„์„ ์‹œ์ž‘ํ•˜๊ธฐ ์ „์— ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ€์žฅ ๊ฐ„๋‹จํ•œ codeql database analyze ์‹คํ–‰ ๋ฐฉ๋ฒ•์€ CodeQL CLI ๋ฒˆ๋“ค์— ํฌํ•จ๋œ ํ‘œ์ค€ ์ฟผ๋ฆฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

codeql database analyze ์‹คํ–‰

database analyze(์„)๋ฅผ ์‹คํ–‰ํ•˜๋ฉด:

  1. ํ•„์š”์— ๋”ฐ๋ผ ๋กœ์ปฌ์—์„œ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ์ฐธ์กฐ๋œ CodeQL ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  2. CodeQL ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ํ†ตํ•ด ์‹คํ–‰ํ•˜์—ฌ ํ•˜๋‚˜ ์ด์ƒ์˜ ์ฟผ๋ฆฌ ํŒŒ์ผ์„ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  3. ํŠน์ • ์ฟผ๋ฆฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ๊ฒฐ๊ณผ๋ฅผ ํ•ด์„ํ•˜์—ฌ ์†Œ์Šค ์ฝ”๋“œ์˜ ์˜ฌ๋ฐ”๋ฅธ ์œ„์น˜์— ๊ฒฝ๊ณ ๋ฅผ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.
  4. ์ง„๋‹จ ๋ฐ ์š”์•ฝ ์ฟผ๋ฆฌ์˜ ๊ฒฐ๊ณผ๋ฅผ ํ‘œ์ค€ ์ถœ๋ ฅ์— ๋ณด๊ณ ํ•ฉ๋‹ˆ๋‹ค.

๋‹ค์Œ ๋ช…๋ น์„ ์‹คํ–‰ํ•˜์—ฌ ๋ฐ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ถ„์„ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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-helpSARIF ์ถœ๋ ฅ์— ์ฟผ๋ฆฌ ๋„์›€๋ง์„ ํฌํ•จํ• ์ง€ ์—ฌ๋ถ€๋ฅผ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ์ค‘ ํ•˜๋‚˜: always: ๋ชจ๋“  ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ๋„์›€๋ง์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. custom_queries_only (๊ธฐ๋ณธ๊ฐ’): ์‚ฌ์šฉ์ž ์ง€์ • ์ฟผ๋ฆฌ, ์ฆ‰, codeql/<lang>-queries ํ˜•์‹์ด ์•„๋‹Œ ์ฟผ๋ฆฌ์— ๋Œ€ํ•ด์„œ๋งŒ ์ฟผ๋ฆฌ ๋„์›€๋ง์„ ํฌํ•จํ•ฉ๋‹ˆ๋‹ค. never: ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ๋„์›€๋ง์„ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. SARIF ์ถœ๋ ฅ์— ํฌํ•จ๋œ ์‚ฌ์šฉ์ž ์ง€์ • ์ฟผ๋ฆฌ์˜ ์ฟผ๋ฆฌ ๋„์›€๋ง์€ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ฝ”๋“œ ๊ฒ€์ƒ‰ ๊ฒฝ๊ณ ์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL CLI์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ์ฟผ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.
<packs>๋ถ„์„์— CodeQL ์ฟผ๋ฆฌ ํŒฉ์„ ํฌํ•จํ•˜๋ ค๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ํŒฉ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‚ฌ์šฉ์„ ์ฐธ์กฐํ•˜์„ธ์š”.
--downloadCodeQL ์ฟผ๋ฆฌ ํŒฉ ์ค‘ ์ผ๋ถ€๊ฐ€ ์•„์ง ๋””์Šคํฌ์— ์—†์–ด์„œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•˜๋Š” ๊ฒฝ์šฐ์— ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค.
--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 ๋ถ„์„ ๊ฒฐ๊ณผ ์—…๋กœ๋“œ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

๋‹ค์Œ ๋‹จ๊ณ„