Skip to main content

CodeQL CLI์—์„œ ์‚ฌ์šฉ์ž ์ง€์ • ์ฟผ๋ฆฌ ์‚ฌ์šฉํ•˜๊ธฐ

๊ณ ์œ ํ•œ CodeQL ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํŠน์ •ํ•œ ์ทจ์•ฝ์„ฑ ๋ฐ ์˜ค๋ฅ˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

์‚ฌ์šฉ์ž ์ง€์ • ์ฟผ๋ฆฌ ๋ฐ CodeQL CLI ์•Œ์•„๋ณด๊ธฐ

๊ณ ์œ ํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ CodeQL ๋ถ„์„์„ ์‚ฌ์šฉ์ž ์ง€์ •ํ•จ์œผ๋กœ์จ ํŠน์ •ํ•œ ์ทจ์•ฝ์„ฑ ๋˜๋Š” ์˜ค๋ฅ˜๋ฅผ ๊ฐ•์กฐ ํ‘œ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด ํ•ญ๋ชฉ์—์„œ๋Š” ํŠนํžˆ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ„์„ ๋ช…๋ น๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜์—ฌ ํ•ด์„๋œ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฐฉ๋ฒ•์— ๋Œ€ํ•ด ์„ค๋ช…ํ•ฉ๋‹ˆ๋‹ค.

์ฐธ๊ณ  ํ•ญ๋ชฉ

์ฟผ๋ฆฌ๋Š” ์—„๊ฒฉํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์š”๊ตฌ ์‚ฌํ•ญ์œผ๋กœ database analyze์™€(๊ณผ) ์‹คํ–‰๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ ๋ฐฐ๊ด€ ์ˆ˜์ค€ ํ•˜์œ„ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค.

  • database run-queries- ํ•ด์„๋˜์ง€ ์•Š์€ ๊ฒฐ๊ณผ๋ฅผ BQRS๋ผ๋Š” ์ค‘๊ฐ„ ์ด์ง„ ํ˜•์‹์œผ๋กœ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค.
  • ์ฟผ๋ฆฌ ์‹คํ–‰- BQRS ํŒŒ์ผ์„ ์ถœ๋ ฅํ•˜๊ฑฐ๋‚˜ ๊ฒฐ๊ณผ ํ…Œ์ด๋ธ”์„ ๋ช…๋ น์ค„์— ์ง์ ‘ ์ถœ๋ ฅํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์ค„์—์„œ ์ง์ ‘ ๊ฒฐ๊ณผ๋ฅผ ๋ณด๋Š” ๊ฒƒ์€ CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ˜๋ณต ์ฟผ๋ฆฌ๋ฅผ ๊ฐœ๋ฐœํ•˜๋Š” ๋ฐ ์œ ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ช…๋ น์œผ๋กœ ์‹คํ–‰๋˜๋Š” ์ฟผ๋ฆฌ์—๋Š” ๋™์ผํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์š”๊ตฌ ์‚ฌํ•ญ์ด ์—†์Šต๋‹ˆ๋‹ค. ๊ทธ๋Ÿฌ๋‚˜ ์‚ฌ๋žŒ์ด ์ฝ์„ ์ˆ˜ ์žˆ๋Š” ๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•˜๋ ค๋ฉด bqrs ๋””์ฝ”๋”ฉ ๋ฐฐ๊ด€ ํ•˜์œ„ ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ๊ฐ BQRS ๊ฒฐ๊ณผ ํŒŒ์ผ์„ ์ฒ˜๋ฆฌํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ๋”ฐ๋ผ์„œ ๋Œ€๋ถ€๋ถ„์˜ ์‚ฌ์šฉ ์‚ฌ๋ก€์—์„œ๋Š” ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค ๋ถ„์„์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด์„๋œ ๊ฒฐ๊ณผ๋ฅผ ์ง์ ‘ ์ƒ์„ฑํ•˜๋Š” ๊ฒƒ์ด ๊ฐ€์žฅ ์‰ฝ์Šต๋‹ˆ๋‹ค.

์œ ํšจํ•œ ์ฟผ๋ฆฌ ์ž‘์„ฑํ•˜๊ธฐ

์‚ฌ์šฉ์ž ์ง€์ • ๋ถ„์„์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— ์œ ํšจํ•œ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๊ณ  .ql ํ™•์žฅ์ž๋กœ ๋œ ํŒŒ์ผ์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•˜๋Š” ๋ฐ ๋„์›€์ด ๋˜๋Š” ๊ด‘๋ฒ”์œ„ํ•œ ์„ค๋ช…์„œ๋ฅผ ์ฐธ๊ณ ํ•˜์‹ค ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ์ฟผ๋ฆฌ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฟผ๋ฆฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ํฌํ•จํ•˜๊ธฐ

์ฟผ๋ฆฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ๊ฐ ์ฟผ๋ฆฌ ํŒŒ์ผ์˜ ๋งจ ์œ„์— ํฌํ•จ๋ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋Š” ์‚ฌ์šฉ์ž์—๊ฒŒ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ •๋ณด๋ฅผ ์ œ๊ณตํ•˜๊ณ  CodeQL CLI์— ์ฟผ๋ฆฌ ๊ฒฐ๊ณผ๋ฅผ ์ฒ˜๋ฆฌํ•˜๋Š” ๋ฐฉ๋ฒ•์„ ์•Œ๋ ค์ค๋‹ˆ๋‹ค.

database analyze ๋ช…๋ น์„ ์‚ฌ์šฉํ•˜์—ฌ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ๊ฒฐ๊ณผ๊ฐ€ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ํ•ด์„๋˜๋„๋ก ํ•˜๋ ค๋ฉด ๋‹ค์Œ ๋‘ ๊ฐ€์ง€ ์†์„ฑ์„ ํฌํ•จํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ ์‹๋ณ„์ž(@id): ์†Œ๋ฌธ์ž ๋˜๋Š” ์ˆซ์ž๋กœ ๊ตฌ์„ฑ๋˜๊ณ  / ๋˜๋Š” -์— ์˜ํ•ด ๊ตฌ๋ถ„๋˜๋Š” ๋‹จ์–ด ์‹œํ€€์Šค๋กœ, ์ฟผ๋ฆฌ๋ฅผ ์‹๋ณ„ ๋ฐ ๋ถ„๋ฅ˜ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ ์œ ํ˜•(@kind): ์ฟผ๋ฆฌ๋ฅผ ๊ฐ„๋‹จํ•œ ๊ฒฝ๊ณ (@kind problem), ์ฝ”๋“œ ์œ„์น˜ ์‹œํ€€์Šค์— ์˜ํ•ด ๋ฌธ์„œํ™”๋œ ๊ฒฝ๊ณ (@kind path-problem), ์ถ”์ถœ๊ธฐ ๋ฌธ์ œ ํ•ด๊ฒฐ์šฉ(@kind diagnostic) ๋˜๋Š” ์š”์•ฝ ๋ฉ”ํŠธ๋ฆญ(@kind metric ๋ฐ @tags summary)์˜ ์œ ํ˜•์œผ๋กœ ๊ตฌ๋ถ„ํ•ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์†์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ๋ฐ ์ฟผ๋ฆฌ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์Šคํƒ€์ผ ๊ฐ€์ด๋“œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ฐธ๊ณ  ํ•ญ๋ชฉ

์ฟผ๋ฆฌ๋ฅผ ๋‹ค๋ฅธ ์• ํ”Œ๋ฆฌ์ผ€์ด์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•˜๋ ค๋Š” ๊ฒฝ์šฐ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐํ„ฐ ์š”๊ตฌ ์‚ฌํ•ญ์ด ๋‹ค๋ฅผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์‚ฌ์šฉ์ž ์ง€์ • QL ์ฟผ๋ฆฌ ํŒจํ‚ค์ง•ํ•˜๊ธฐ

๋‹ค๋ฅธ ์‚ฌ์šฉ์ž์™€ ๊ณต์œ ํ•˜๋ ค๋Š” ์˜๋„๋กœ ์‚ฌ์šฉ์ž ๊ณ ์œ ์˜ ์ฟผ๋ฆฌ๋ฅผ ์ž‘์„ฑํ•  ๋•Œ๋Š” ์‚ฌ์šฉ์ž ์ง€์ • CodeQL ํŒฉ์— ์ €์žฅํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. CodeQL ํŒฉ์œผ๋กœ ํŒฉ์„ GitHub Packages์— ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. GitHub Container registry. ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ํŒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์„ ์‚ฌ์šฉ์ž ์ง€์ •์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

CodeQL ํŒฉ์€ CodeQL ๋ถ„์„์— ์‚ฌ์šฉ๋˜๋Š” ํŒŒ์ผ์„ ๊ตฌ์„ฑํ•˜๊ณ  ์ฟผ๋ฆฌ, ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒŒ์ผ, ์ฟผ๋ฆฌ ๋ชจ์Œ ๋ฐ ์ค‘์š”ํ•œ ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ทธ ๋ฃจํŠธ ๋””๋ ‰ํ„ฐ๋ฆฌ์—๋Š” ํŒŒ์ผ ์ด๋ฆ„์ด qlpack.yml(์œผ)๋กœ ์ง€์ •๋œ ํŒŒ์ผ์ด ํฌํ•จ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์‚ฌ์šฉ์ž ์ง€์ • ์ฟผ๋ฆฌ๋Š” CodeQL ํŒฉ ๋ฃจํŠธ ๋˜๋Š” ๊ทธ ํ•˜์œ„ ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์ €์žฅ๋˜์–ด์•ผ ํ•ฉ๋‹ˆ๋‹ค.

๊ฐ CodeQL ํŒฉ์— ๋Œ€ํ•ด qlpack.yml ํŒŒ์ผ์—๋Š” CodeQL CLI์— ์ฟผ๋ฆฌ๋ฅผ ์ปดํŒŒ์ผํ•˜๋Š” ๋ฐฉ๋ฒ•, ํŒฉ์ด ์˜์กดํ•˜๋Š” ๋‹ค๋ฅธ CodeQL ํŒฉ ๋ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ, ์ฟผ๋ฆฌ ๋ชจ์Œ ์ •์˜๋ฅผ ์ฐพ์„ ์ˆ˜ ์žˆ๋Š” ์œ„์น˜๋ฅผ ์•Œ๋ ค์ฃผ๋Š” ์ •๋ณด๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ํŒŒ์ผ์— ํฌํ•จํ•  ํ•ญ๋ชฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ํŒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์„ ์‚ฌ์šฉ์ž ์ง€์ •์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

SARIF ํŒŒ์ผ์— ์‚ฌ์šฉ์ž ์ง€์ • CodeQL ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ๋„์›€๋ง ํฌํ•จํ•˜๊ธฐ

CodeQL CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ œ3์ž CI/CD ์‹œ์Šคํ…œ์—์„œ ์ฝ”๋“œ ์Šค์บ” ๋ถ„์„์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ, ๋ถ„์„ ์ค‘์— ์ƒ์„ฑ๋œ SARIF ํŒŒ์ผ์— ์‚ฌ์šฉ์ž ์ง€์ • ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ๋„์›€๋ง์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. SARIF ํŒŒ์ผ์„ GitHub์— ์—…๋กœ๋“œํ•˜๋ฉด ์‚ฌ์šฉ์ž ์ง€์ • ์ฟผ๋ฆฌ์—์„œ ์ƒ์„ฑ๋œ ๋ชจ๋“  ๊ฒฝ๊ณ ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ๋„์›€๋ง์ด ์ฝ”๋“œ ์Šค์บ” UI์— ํ‘œ์‹œ๋ฉ๋‹ˆ๋‹ค.

CodeQL CLI v2.7.1 ์ด์ƒ์—์„œ๋Š” codeql database analyze ์‹คํ–‰ ์‹œ --sarif-add-query-help ์˜ต์…˜์„ ์ œ๊ณตํ•˜์—ฌ SARIF ํŒŒ์ผ์— Markdown ๋ Œ๋”๋ง ๋œ ์ฟผ๋ฆฌ ๋„์›€๋ง์„ ํฌํ•จํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์‚ฌ์šฉ์ž ์ง€์ • ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ ์ฟผ๋ฆฌ ๋„์›€๋ง์„ Markdown ํŒŒ์ผ์— ์ง์ ‘ ์ž‘์„ฑํ•˜๊ณ  ํ•ด๋‹น ์ฟผ๋ฆฌ์™€ ํ•จ๊ป˜ ์ €์žฅํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋˜๋Š” ํ‘œ์ค€ CodeQL ์ฟผ๋ฆฌ์™€์˜ ์ผ๊ด€์„ฑ์„ ์œ„ํ•ด ์ฟผ๋ฆฌ ๋„์›€๋ง์„ .qhelp ํ˜•์‹์œผ๋กœ ์ž‘์„ฑํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. .qhelp ํŒŒ์ผ์— ์ž‘์„ฑ๋œ ์ฟผ๋ฆฌ ๋„์›€๋ง์€ SARIF ํŒŒ์ผ์— ํฌํ•จ๋  ์ˆ˜ ์—†์œผ๋ฉฐ ์ฝ”๋“œ ์Šค์บ”์œผ๋กœ ์ฒ˜๋ฆฌํ•  ์ˆ˜ ์—†์œผ๋ฏ€๋กœ ๋ถ„์„์„ ์‹คํ–‰ํ•˜๊ธฐ ์ „์— Markdown์œผ๋กœ ๋ณ€ํ™˜ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฟผ๋ฆฌ ๋„์›€๋ง ํŒŒ์ผ ๋ฐ ์ฟผ๋ฆฌ ๋„์›€๋ง ํŒŒ์ผ ํ…Œ์ŠคํŠธํ•˜๊ธฐ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

CodeQL ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ๊ธฐ์—ฌํ•˜๊ธฐ

๋‹ค๋ฅธ CodeQL ์‚ฌ์šฉ์ž์™€ ์ฟผ๋ฆฌ๋ฅผ ๊ณต์œ ํ•˜๋ ค๋ฉด CodeQL ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ๋Œ์–ด์˜ค๊ธฐ ์š”์ฒญ์„ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ "CodeQL์— ๊ธฐ์—ฌํ•˜๊ธฐ"๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.

์ถ”๊ฐ€ ์ฐธ๊ณ  ์ž๋ฃŒ