Skip to main content

CodeQL ํŒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ถ„์„ ์‚ฌ์šฉ์ž ์ง€์ •

CodeQL ํŒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค๋ฅธ ์‚ฌ์šฉ์ž๊ฐ€ ๊ธฐ๋ณธCodeQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๊ฑฐ๋‚˜ ๊ฐœ๋ฐœํ•œ CodeQL ์ฟผ๋ฆฌ๋ฅผ ๊ณต์œ ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

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

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

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

CodeQL ํŒฉ ์ •๋ณด

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

CodeQL ํŒฉ์—๋Š” ์ฟผ๋ฆฌ ํŒฉ๊ณผ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒฉ, ๋ชจ๋ธ ํŒฉ์˜ ์„ธ ์œ ํ˜•์ด ์žˆ์Šต๋‹ˆ๋‹ค.

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

  • ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒฉ์€ ์ฟผ๋ฆฌ ํŒฉ(๋˜๋Š” ๋‹ค๋ฅธ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒฉ)์—์„œ ์‚ฌ์šฉํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ ์ฟผ๋ฆฌ ์ž์ฒด๋ฅผ ํฌํ•จํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ๋Š” ๋ณ„๋„๋กœ ์ปดํŒŒ์ผ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

  • code scanning ๋ถ„์„์„ ํ™•์žฅํ•˜์—ฌ ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ธ์‹ํ•˜๋Š” ๋ฐ ๋ชจ๋ธ ํŒฉ์„ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋ชจ๋ธ ํŒฉ์€ ํ˜„์žฌ ๊ณต๊ฐœ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ ๋ฒ„์ „์ด๋ฉฐ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๊ณต๊ฐœ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ์—์„œ ๋ชจ๋ธ ํŒฉ์€ C/C++, C#, Java/Kotlin, Python, Ruby ๋ถ„์„์— ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์‹ ๋งŒ์˜ ๋ชจ๋ธ ํŒฉ์„ ๋งŒ๋“œ๋Š” ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ํŒฉ ๋งŒ๋“ค๊ธฐ ๋ฐ ์ž‘์—…์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ง€์›๋˜๋Š” ๋ชจ๋“  ์–ธ์–ด์— ๋Œ€ํ•œ ํ‘œ์ค€ CodeQL ํŒฉ์ด Container registry์— ๊ฒŒ์‹œ๋ฉ๋‹ˆ๋‹ค. CodeQL CLI๋ฅผ ํ‘œ์ค€ ๋ฐฉ์‹์œผ๋กœ ์„ค์น˜ํ•œ ๊ฒฝ์šฐ CodeQL CLI ๋ฒˆ๋“ค์„ ์‚ฌ์šฉํ•˜์—ฌ ํ•ต์‹ฌ ์ฟผ๋ฆฌ ํŒฉ์„ ์ด๋ฏธ ๋‹ค์šด๋กœ๋“œํ•˜์—ฌ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํ™”๋ฉด์€ ๋‹ค์Œ๊ณผ ๊ฐ™์Šต๋‹ˆ๋‹ค.

  • codeql/cpp-queries
  • codeql/csharp-queries
  • codeql/go-queries
  • codeql/java-queries
  • codeql/javascript-queries
  • codeql/python-queries
  • codeql/ruby-queries
  • codeql/swift-queries

CodeQL CLI๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ž์ฒด CodeQL ํŒฉ์„ ๋งŒ๋“ค๊ณ , ํŒฉ์— ์ข…์†์„ฑ์„ ์ถ”๊ฐ€ํ•˜๊ณ , ์ข…์†์„ฑ์„ ์„ค์น˜ํ•˜๊ฑฐ๋‚˜ ์—…๋ฐ์ดํŠธํ•  ์ˆ˜๋„ ์žˆ์Šต๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ํŒฉ ๋งŒ๋“ค๊ธฐ ๋ฐ ์ž‘์—…์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

CodeQL CLI์„ ์‚ฌ์šฉํ•˜์—ฌ ๋งŒ๋“  CodeQL ํŒฉ์„ ๊ฒŒ์‹œํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. CodeQL ํŒฉ ๊ฒŒ์‹œ ๋ฐ ๋‹ค์šด๋กœ๋“œ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ํŒฉ ๊ฒŒ์‹œ ๋ฐ ์‚ฌ์šฉ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

CodeQL ์ฟผ๋ฆฌ ํŒฉ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‚ฌ์šฉ

CodeQL CLI ๋ฒˆ๋“ค์—๋Š” GitHub ์ „๋ฌธ๊ฐ€, ๋ณด์•ˆ ์—ฐ๊ตฌ์› ๋ฐ ์ปค๋ฎค๋‹ˆํ‹ฐ ๊ธฐ์—ฌ์ž๋“ค์ด ์œ ์ง€ ๊ด€๋ฆฌํ•˜๋Š” ์ฟผ๋ฆฌ๊ฐ€ ํฌํ•จ๋˜์–ด ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์กฐ์ง์—์„œ ๊ฐœ๋ฐœํ•œ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•˜๋ ค๋Š” ๊ฒฝ์šฐ, CodeQL ์ฟผ๋ฆฌ ํŒฉ์„ ์‚ฌ์šฉํ•˜๋ฉด ์ฟผ๋ฆฌ๋ฅผ ํšจ์œจ์ ์ด๊ณ  ์•ˆ์ •์ ์œผ๋กœ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์‹คํ–‰ํ•  ์ˆ˜ ์žˆ์œผ๋ฉฐ, ๋ชจ๋ธ ํŒฉ(๊ณต๊ฐœ ๋ฏธ๋ฆฌ ๋ณด๊ธฐ)์„ ์‚ฌ์šฉํ•˜๋ฉด code scanning ๋ถ„์„์„ ํ™•์žฅํ•ด ๊ธฐ๋ณธ์ ์œผ๋กœ ์ง€์›๋˜์ง€ ์•Š๋Š” ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ๋ฐ ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์ธ์‹ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ํŒฉ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL์„ ์‚ฌ์šฉํ•˜๋Š” ์ฝ”๋“œ ๊ฒ€์‚ฌ ์•ˆ๋‚ด์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”. ์ž์ฒด ๋ชจ๋ธ ํŒฉ ์ž‘์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ํŒฉ ๋งŒ๋“ค๊ธฐ ๋ฐ ์ž‘์—…์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

CodeQL ์ฟผ๋ฆฌ ํŒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ๋ฐ์ดํ„ฐ๋ฒ ์ด์Šค๋ฅผ ๋ถ„์„ํ•˜๋ ค๋ฉด GitHub Container registry์—์„œ ํ•„์š”ํ•œ ํŒจํ‚ค์ง€๋ฅผ ๋‹ค์šด๋กœ๋“œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ codeql database analyze ๋ช…๋ น์—์„œ --download ํ”Œ๋ž˜๊ทธ๋ฅผ ์‚ฌ์šฉํ•˜๊ฑฐ๋‚˜ codeql pack download๋ฅผ ์‹คํ–‰ํ•˜์—ฌ ์ˆ˜ํ–‰ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ํŒจํ‚ค์ง€๋ฅผ ๊ณต๊ฐœ์ ์œผ๋กœ ์‚ฌ์šฉํ•  ์ˆ˜ ์—†๋Š” ๊ฒฝ์šฐ GitHub App ๋˜๋Š” personal access token์„ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ๊ณผ ์˜ˆ์ œ๋Š” GitHub์— CodeQL ๋ถ„์„ ๊ฒฐ๊ณผ ์—…๋กœ๋“œ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์˜ต์…˜ํ•„์ˆ˜์‚ฌ์šฉ
<scope/name@version:path>์‰ผํ‘œ๋กœ ๊ตฌ๋ถ„๋œ ๋ชฉ๋ก์„ ์‚ฌ์šฉํ•˜์—ฌ ๋‹ค์šด๋กœ๋“œํ•  ํ•˜๋‚˜ ์ด์ƒ์˜ CodeQL ์ฟผ๋ฆฌ ํŒฉ์˜ ๋ฒ”์œ„์™€ ์ด๋ฆ„์„ ์ง€์ •ํ•ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ๋‹ค์šด๋กœ๋“œํ•˜๊ณ  ์••์ถ•์„ ํ’€ ๋ฒ„์ „์„ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ธฐ๋ณธ์ ์œผ๋กœ ์ด ํŒฉ์˜ ์ตœ์‹  ๋ฒ„์ „์ด ๋‹ค์šด๋กœ๋“œ๋ฉ๋‹ˆ๋‹ค. ํ•„์š”์— ๋”ฐ๋ผ ์‹คํ–‰ํ•  ์ฟผ๋ฆฌ, ๋””๋ ‰ํ„ฐ๋ฆฌ ๋˜๋Š” ์ฟผ๋ฆฌ ๋ชจ์Œ์˜ ๊ฒฝ๋กœ๋ฅผ ํฌํ•จ์‹œํ‚ต๋‹ˆ๋‹ค. ๊ฒฝ๋กœ๊ฐ€ ์—†์œผ๋ฉด ์ด ํŒฉ์˜ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
--github-auth-stdinํ‘œ์ค€ ์ž…๋ ฅ์„ ํ†ตํ•ด ๋น„๋ฐ€ ์ €์žฅ์†Œ์—์„œ GitHub์˜ REST API๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ์ธ์ฆ์„ ์œ„ํ•ด ๋งŒ๋“  GitHub App ๋˜๋Š” personal access token์„(๋ฅผ) CLI์— ์ „๋‹ฌํ•ฉ๋‹ˆ๋‹ค. ๋ช…๋ น์ด ์ด ํ† ํฐ์„ ์‚ฌ์šฉํ•˜์—ฌ ์„ค์ •๋œ GITHUB_TOKEN ํ™˜๊ฒฝ ๋ณ€์ˆ˜์— ์•ก์„ธ์Šคํ•  ์ˆ˜ ์žˆ๋Š” ๊ฒฝ์šฐ์—๋Š” ์ด ํ•ญ๋ชฉ์ด ํ•„์š”ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ฐธ๊ณ  ํ•ญ๋ชฉ

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

ํŒฉ ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ํŒฉ ๊ฒŒ์‹œ ๋ฐ ์‚ฌ์šฉ์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

์ฟผ๋ฆฌ ํŒฉ ๋‹ค์šด๋กœ๋“œ ๋ฐ ์‚ฌ์šฉ์˜ ๊ธฐ๋ณธ ์˜ˆ

์ด ์˜ˆ์ œ์—์„œ๋Š” codeql database analyze ๋ช…๋ น์„ ์‹คํ–‰ํ•˜๊ณ  --download ์˜ต์…˜์„ ์„ ํƒํ•˜์—ฌ ๋‹ค์Œ์„ ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค.

  1. ์ตœ์‹  ๋ฒ„์ „์˜ octo-org/security-queries ํŒฉ์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค.
  2. ๋ฒ„์ „ 1.0.1๊ณผ _ํ˜ธํ™˜_๋˜๋Š” octo-org/optional-security-queries ํŒฉ ๋ฒ„์ „(์ด ์˜ˆ์ œ์—์„œ๋Š” ๋ฒ„์ „ 1.0.2)์„ ๋‹ค์šด๋กœ๋“œํ•ฉ๋‹ˆ๋‹ค. semver ํ˜ธํ™˜์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ npm์˜ ์˜๋ฏธ ์ฒด๊ณ„ ๋ฒ„์ „ ๋ฒ”์œ„ ์„ค๋ช…์„œ๋ฅผ ์ฐธ์กฐํ•˜์„ธ์š”.
  3. octo-org/security-queries์—์„œ ๋ชจ๋“  ๊ธฐ๋ณธ ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
  4. octo-org/optional-security-queries์—์„œ queries/csrf.ql ์ฟผ๋ฆฌ๋งŒ ์‹คํ–‰ํ•ฉ๋‹ˆ๋‹ค.
$ echo $OCTO-ORG_ACCESS_TOKEN | codeql database analyze --download /codeql-dbs/example-repo \
    octo-org/security-queries \
    octo-org/optional-security-queries@~1.0.1:queries/csrf.ql \
    --format=sarif-latest --output=/temp/example-repo-js.sarif

> Download location: /Users/mona/.codeql/packages
> Installed fresh octo-org/security-queries@1.0.0
> Installed fresh octo-org/optional-security-queries@1.0.2
> Running queries.
> Compiling query plan for /Users/mona/.codeql/packages/octo-org/security-queries/1.0.0/potential-sql-injection.ql.
> [1/2] Found in cache: /Users/mona/.codeql/packages/octo-org/security-queries/1.0.0/potential-sql-injection.ql.
> Starting evaluation of octo-org/security-queries/query1.ql.
> Compiling query plan for /Users/mona/.codeql/packages/octo-org/optional-security-queries/1.0.2/queries/csrf.ql.
> [2/2] Found in cache: /Users/mona/.codeql/packages/octo-org/optional-security-queries/1.0.2/queries/csrf.ql.
> Starting evaluation of octo-org/optional-security-queries/queries/csrf.ql.
> [2/2 eval 694ms] Evaluation done; writing results to octo-org/security-queries/query1.bqrs.
> Shutting down query evaluator.
> Interpreting results.

CodeQL ํŒฉ ์ง์ ‘ ๋‹ค์šด๋กœ๋“œ

CodeQL ํŒฉ์„ ์ฆ‰์‹œ ์‹คํ–‰ํ•˜์ง€ ์•Š๊ณ  ๋‹ค์šด๋กœ๋“œํ•˜๋ ค๋ฉด codeql pack download ๋ช…๋ น์„ ์‚ฌ์šฉํ•ฉ๋‹ˆ๋‹ค. ์ด ๋ฐฉ๋ฒ•์€ ์ธํ„ฐ๋„ท์— ์•ก์„ธ์Šคํ•˜์ง€ ์•Š๊ณ  CodeQL ์ฟผ๋ฆฌ๋ฅผ ์‹คํ–‰ํ•  ๋•Œ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค. CodeQL ๋ถ„์„์„ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ ์ด์ „ ์˜ˆ์ œ์™€ ๋™์ผํ•œ ๋ฐฉ์‹์œผ๋กœ ํŒฉ, ๋ฒ„์ „ ๋ฐ ๊ฒฝ๋กœ๋ฅผ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

echo $OCTO-ORG_ACCESS_TOKEN | codeql pack download <scope/name@version:path> <scope/name@version:path> ...

์—ฌ๋Ÿฌ GitHub ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์—์„œ CodeQL ํŒฉ ๋‹ค์šด๋กœ๋“œ

CodeQL ํŒฉ์ด ์—ฌ๋Ÿฌ ์ปจํ…Œ์ด๋„ˆ ๋ ˆ์ง€์ŠคํŠธ๋ฆฌ์— ์žˆ๋Š” ๊ฒฝ์šฐ CodeQL CLI์— ๊ฐ ํŒฉ์„ ์ฐพ์„ ์œ„์น˜๋ฅผ ์ง€์‹œํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ž์„ธํ•œ ๋‚ด์šฉ์€ ์ฝ”๋“œ ๊ฒ€์ƒ‰์„ ์œ„ํ•œ ๊ณ ๊ธ‰ ์„ค์ • ์‚ฌ์šฉ์ž ์ง€์ •์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

CodeQL ํŒฉ์—์„œ ์‹คํ–‰ํ•  ์ฟผ๋ฆฌ ์ง€์ •

์ฟผ๋ฆฌ ์ง€์ •์ž๋Š” codeql database analyze ๋ฐ ์ฟผ๋ฆฌ ์ง‘ํ•ฉ์—์„œ ์ž‘๋™ํ•˜๋Š” ๊ธฐํƒ€ ๋ช…๋ น์—์„œ ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ์ง€์ •์ž์˜ ์ „์ฒด ํ˜•์‹์€ scope/name@range:path์ž…๋‹ˆ๋‹ค. ์—ฌ๊ธฐ์—์„œ:

  • scope/name(์€)๋Š” CodeQL ํŒฉ์˜ ์ •๊ทœํ™”๋œ ์ด๋ฆ„์ž…๋‹ˆ๋‹ค.
  • range(์€)๋Š” semver(์˜๋ฏธ๋ก ์  ๋ฒ„์ „ ๊ด€๋ฆฌ) ๋ฒ”์œ„์ž…๋‹ˆ๋‹ค.
  • path๋Š” ๋‹จ์ผ ์ฟผ๋ฆฌ, ์ฟผ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋˜๋Š” ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ ํŒŒ์ผ์— ๋Œ€ํ•œ ํŒŒ์ผ ์‹œ์Šคํ…œ ๊ฒฝ๋กœ์ž…๋‹ˆ๋‹ค.

scope/name(์„)๋ฅผ ์ง€์ •ํ•˜๋ฉด range ๋ฐ path(์€)๋Š” ์„ ํƒ ์‚ฌํ•ญ์ž…๋‹ˆ๋‹ค. range์„(๋ฅผ) ์ƒ๋žตํ•˜๋ฉด ์ง€์ •๋œ ํŒฉ์˜ ์ตœ์‹  ๋ฒ„์ „์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค. path(์„)๋ฅผ ์ƒ๋žตํ•˜๋ฉด ์ง€์ •๋œ ํŒฉ์˜ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์ด ์‚ฌ์šฉ๋ฉ๋‹ˆ๋‹ค.

path๋Š” .ql ์ฟผ๋ฆฌ ํŒŒ์ผ, ํ•˜๋‚˜ ์ด์ƒ์˜ ์ฟผ๋ฆฌ๊ฐ€ ํฌํ•จ๋œ ๋””๋ ‰ํ„ฐ๋ฆฌ ๋˜๋Š” .qls ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ ํŒŒ์ผ ์ค‘ ํ•˜๋‚˜๊ฐ€ ๋ฉ๋‹ˆ๋‹ค. ํŒฉ ์ด๋ฆ„์„ ์ƒ๋žตํ•˜๋ฉด ํ˜„์žฌ ํ”„๋กœ์„ธ์Šค์˜ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•ด์„๋˜๋Š” path(์„)๋ฅผ ์ œ๊ณตํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. Glob ํŒจํ„ด์€ ์ง€์›๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

scope/name๊ณผ path๋ฅผ ๋ชจ๋‘ ์ง€์ •ํ•˜๋ฉด path๋Š” ์ ˆ๋Œ€๊ฐ’์ด ๋  ์ˆ˜ ์—†์Šต๋‹ˆ๋‹ค. CodeQL ํŒฉ์˜ ๋ฃจํŠธ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ๊ณ ๋ ค๋ฉ๋‹ˆ๋‹ค.

์ฟผ๋ฆฌ ์ง€์ •์ž ์˜ˆ

  • codeql/python-queries - codeql/python-queries ํŒฉ ์ตœ์‹  ๋ฒ„์ „์˜ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์— ์žˆ๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

  • codeql/python-queries@1.2.3 - codeql/python-queries ํŒฉ ๋ฒ„์ „ 1.2.3์˜ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์— ์žˆ๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

  • codeql/python-queries@~1.2.3 - codeql/python-queries ํŒฉ ์ตœ์‹  ๋ฒ„์ „(1.2.3 ์ด์ƒ 1.3.0 ๋ฏธ๋งŒ)์˜ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์— ์žˆ๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

  • codeql/python-queries:Functions - codeql/python-queries ํŒฉ ์ตœ์‹  ๋ฒ„์ „์— ์žˆ๋Š” Functions ๋””๋ ‰ํ„ฐ๋ฆฌ์˜ ๋ชจ๋“  ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

  • codeql/python-queries@1.2.3:Functions - codeql/python-queries ํŒฉ ๋ฒ„์ „ 1.2.3์˜ Functions ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

  • codeql/python-queries@1.2.3:codeql-suites/python-code-scanning.qls - codeql/python-queries ํŒฉ ๋ฒ„์ „ 1.2.3์˜ codeql-suites/python-code-scanning.qls ๋””๋ ‰ํ„ฐ๋ฆฌ์— ์žˆ๋Š” ๋ชจ๋“  ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

  • suites/my-suite.qls - ํ˜„์žฌ ์ž‘์—… ๋””๋ ‰ํ„ฐ๋ฆฌ๋ฅผ ๊ธฐ์ค€์œผ๋กœ ํ•˜๋Š” suites/my-suite.qls ํŒŒ์ผ์˜ ๋ชจ๋“  ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

ํŒ

ํ‘œ์ค€ CodeQL ์ฟผ๋ฆฌ ํŒฉ์˜ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์€ codeql-suites/<lang>-code-scanning.qls์ž…๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ๋ช‡ ๊ฐ€์ง€ ์œ ์šฉํ•œ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์€ ๊ฐ ํŒฉ์˜ codeql-suites ๋””๋ ‰ํ„ฐ๋ฆฌ์—์„œ๋„ ์ฐพ์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ๋ฅผ ๋“ค์–ด codeql/cpp-queries ํŒฉ์—๋Š” ๋‹ค์Œ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์ด ํฌํ•จ๋ฉ๋‹ˆ๋‹ค.

  • cpp-code-scanning.qls - C++์šฉ ํ‘œ์ค€ ์ฝ”๋“œ ๊ฒ€์‚ฌ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค. ์ด ํŒฉ์˜ ๊ธฐ๋ณธ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์ž…๋‹ˆ๋‹ค.
  • C++์šฉ cpp-security-extended.qls๊ธฐ๋ณธ ์ œํ’ˆ๊ตฐ์˜ ์ฟผ๋ฆฌcpp-code-scanning.qls์™€ ๋‚ฎ์€ ์‹ฌ๊ฐ๋„, ์ •๋ฐ€๋„ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.
  • cpp-security-and-quality.qls - cpp-security-extended.qls์˜ ์ฟผ๋ฆฌ์™€ ์œ ์ง€ ๊ด€๋ฆฌ ๊ธฐ๋Šฅ ๋ฐ ์•ˆ์ •์„ฑ ์ฟผ๋ฆฌ์ž…๋‹ˆ๋‹ค.

CodeQL ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์—์„œ ์ด๋Ÿฌํ•œ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ์˜ ์›๋ณธ์„ ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ๋‹ค๋ฅธ ์–ธ์–ด์˜ ์ฟผ๋ฆฌ ๋„๊ตฌ ๋ชจ์Œ๋„ ๋น„์Šทํ•ฉ๋‹ˆ๋‹ค.

๋ชจ๋ธ ํŒฉ์„ ์‚ฌ์šฉํ•˜์—ฌ ์‚ฌ์šฉ์ž ์ง€์ • ์ข…์†์„ฑ ํ˜ธ์ถœ ๋ถ„์„

code scanning ๋ถ„์„์— ๊ฒŒ์‹œ๋œ ๋ชจ๋ธ ํŒฉ์„ --model-packs ์˜ต์…˜๊ณผ ํ•จ๊ป˜ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์˜ˆ์‹œ:

$ codeql database analyze /codeql-dbs/my-company --format=sarif-latest \
  --model-packs my-repo/my-java-model-pack \
  --output=/temp/my-company.sarif codeql/java-queries

์ด ์˜ˆ์—์„œ ํ‘œ์ค€ ์ฟผ๋ฆฌ ํŒฉ codeql/java-queries์˜ ๊ด€๋ จ ์ฟผ๋ฆฌ๋Š” ๋ชจ๋ธ ํŒฉ my-repo/my-java-model-pack์˜ ์ข…์†์„ฑ ์ •๋ณด๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ ํ•ด๋‹น ์ข…์†์„ฑ์„ ํ˜ธ์ถœํ•˜๋Š” ์ฝ”๋“œ์˜ ์ทจ์•ฝ์„ฑ์„ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

์—ฌ๋Ÿฌ ๋ฒˆ ๊ฒŒ์‹œ๋œ ๋ชจ๋ธ ํŒฉ์„ ๋ถ„์„์—์„œ ์ง€์ •ํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ž์ฒด ๋ชจ๋ธ ํŒฉ ์ž‘์„ฑ์— ๋Œ€ํ•œ ์ž์„ธํ•œ ๋‚ด์šฉ์€ CodeQL ํŒฉ ๋งŒ๋“ค๊ธฐ ๋ฐ ์ž‘์—…์„(๋ฅผ) ์ฐธ์กฐํ•˜์„ธ์š”.

๊ฒŒ์‹œ๋œ ํŒฉ ์ •๋ณด

ํŒฉ์ด ๋ถ„์„์— ์‚ฌ์šฉํ•˜๊ธฐ ์œ„ํ•ด ๊ฒŒ์‹œ๋˜๋ฉด codeql pack create ๋˜๋Š” codeql pack publish ๋ช…๋ น์€ ์ฝ˜ํ…์ธ ๊ฐ€ ์™„๋ฃŒ๋˜์—ˆ๋Š”์ง€ ํ™•์ธํ•˜๊ณ  ์ฝ˜ํ…์ธ ์˜ ์ผ๋ถ€๋ฅผ ์ถ”๊ฐ€ํ•ฉ๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ ํŒฉ์˜ ๊ฒฝ์šฐ ํ•ด๋‹น ์ฟผ๋ฆฌ ํŒฉ์ด ๊ฐœ๋ฐœ๋œ ์ •ํ™•ํ•œ ๋ฒ„์ „์˜ ๊ฐ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒฉ์˜ ๋ณต์‚ฌ๋ณธ์ž…๋‹ˆ๋‹ค. ์ฟผ๋ฆฌ ํŒฉ ์‚ฌ์šฉ์ž๋Š” ์ด๋Ÿฌํ•œ ๋ผ์ด๋ธŒ๋Ÿฌ๋ฆฌ ํŒฉ์„ ๋ณ„๋„๋กœ ๋‹ค์šด๋กœ๋“œํ•  ํ•„์š”๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค.

  • ์ฟผ๋ฆฌ ํŒฉ์˜ ๊ฒฝ์šฐ ๊ฐ ์ฟผ๋ฆฌ๋ฅผ ๋ฏธ๋ฆฌ ์ปดํŒŒ์ผํ•œ ํ‘œํ˜„์ž…๋‹ˆ๋‹ค. ๊ฐ ๋ถ„์„์—์„œ ์ฟผ๋ฆฌ์— ๋Œ€ํ•œ QL ์›๋ณธ์„ ์ปดํŒŒ์ผํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ด ๋” ๋น ๋ฆ…๋‹ˆ๋‹ค.

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