์ถœ์ฒ˜: https://thehackernews.com/2025/03/github-action-compromise-puts-cicd.html

 

GitHub Action ์นจํ•ด๋กœ 23,000๊ฐœ ์ด์ƒ์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ CI/CD ๋ณด์•ˆ์ด ์œ„ํ—˜์— ์ฒ˜ํ•˜๋‹ค

 

์‚ฌ์ด๋ฒ„ ๋ณด์•ˆ ์—ฐ๊ตฌ์›๋“ค์€ GitHub Action์ธ tj-actions/changed-files๊ฐ€ ์ง€์†์ ์œผ๋กœ CI/CD ์›Œํฌํ”Œ๋กœ์šฐ์—์„œ ์‚ฌ์šฉ๋˜๋ฉด์„œ ๋ณด์•ˆ ์ •๋ณด๊ฐ€ ์œ ์ถœ๋˜์—ˆ๋‹ค๋Š” ์‚ฌ๊ฑด์— ์ฃผ๋ชฉํ•˜๊ณ  ์žˆ๋‹ค.

์ด๋ฒˆ ์‚ฌ๊ฑด์˜ ๋Œ€์ƒ์€ tj-actions/changed-files๊ฐ€ ์‚ฌ์šฉ๋œ 23,000๊ฐœ ์ด์ƒ์˜ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ, ํ•ด๋‹น ์•ก์…˜์€ ํŒŒ์ผ๊ณผ ๋””๋ ‰ํ† ๋ฆฌ์˜ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์„ ์ถ”์ ํ•˜๊ณ  ๊ฒ€์ƒ‰ํ•˜๋Š” ๋ฐ ํ™œ์šฉ๋œ๋‹ค.

์ด ๊ณต๊ธ‰๋ง ์นจํ•ด ์‚ฌ๊ฑด์€ CVE ์‹๋ณ„์ž CVE-2025-30066์ด ๋ถ€์—ฌ๋˜์—ˆ์œผ๋ฉฐ, 2025๋…„ 3์›” 14์ผ์— ๋ฐœ์ƒํ–ˆ๋‹ค.

๊ณต๊ฒฉ ๊ณผ์ •์—์„œ ํ•ด์ปค๋“ค์€ ์•ก์…˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ , ๋‹ค์ˆ˜์˜ ํƒœ๊ทธ ๋ฒ„์ „์„ ์†Œ๊ธ‰ ์—…๋ฐ์ดํŠธํ•˜์—ฌ ์•…์„ฑ ์ปค๋ฐ‹์„ ์ฐธ์กฐํ•˜๋„๋ก ๋งŒ๋“ค์—ˆ๋‹ค. ์ด ์นจํ•ด๋œ ์•ก์…˜์€ GitHub Action ๋นŒ๋“œ ๋กœ๊ทธ์— CI/CD ์‹œํฌ๋ฆฟ์„ ์œ ์ถœํ•˜๋Š” ์—ญํ• ์„ ํ•œ๋‹ค.

๊ฒฐ๊ณผ์ ์œผ๋กœ, ๊ณต๊ฐœ๋œ ์›Œํฌํ”Œ๋กœ์šฐ ๋กœ๊ทธ๋Š” ์•ก์…˜์ด ์‹คํ–‰ ์ค‘์ผ ๋•Œ ๋น„์ธ๊ฐ€ ๋ฏผ๊ฐ ์ •๋ณด๊ฐ€ ์œ ์ถœ๋  ์ˆ˜ ์žˆ์Œ์„ ๋ณด์—ฌ์ค€๋‹ค. ์ด ์‹œํฌ๋ฆฟ์—๋Š” AWS ์•ก์„ธ์Šค ํ‚ค, GitHub PAT, npm ํ† ํฐ, ๊ฐœ์ธ RSA ํ‚ค ๋“ฑ์ด ํฌํ•จ๋˜์–ด ์žˆ์œผ๋‚˜, ์œ ์ถœ๋œ ์ •๋ณด๊ฐ€ ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ์ธํ”„๋ผ๋กœ ์ด๋™ํ–ˆ๋‹ค๋Š” ์ฆ๊ฑฐ๋Š” ์—†๋‹ค.

ํŠนํžˆ, ์•…์„ฑ ์‚ฝ์ž… ์ฝ”๋“œ๋Š” runner ์›Œ์ปค ํ”„๋กœ์„ธ์Šค์˜ CI/CD ์‹œํฌ๋ฆฟ์„ ์œ ์ถœํ•˜๋Š” ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ GitHub Gist์—์„œ ์‹คํ–‰ํ•˜๋„๋ก ์„ค๊ณ„๋˜์—ˆ์œผ๋ฉฐ, ์ด๋Š” ํ™•์ธ๋˜์ง€ ์•Š์€ ์†Œ์Šค ์ฝ”๋“œ ์ปค๋ฐ‹์—์„œ ๋น„๋กฏ๋˜์—ˆ๋‹ค. ์ดํ›„ GitHub Gist๋Š” ์…ง๋‹ค์šด ์ƒํƒœ์— ๋“ค์–ด๊ฐ”๋‹ค.

tj-actions/changed-files๋Š” ์กฐ์ง์˜ ์†Œํ”„ํŠธ์›จ์–ด ๊ฐœ๋ฐœ ํŒŒ์ดํ”„๋ผ์ธ์—์„œ ์‚ฌ์šฉ๋˜๋ฉฐ, ๊ฐœ๋ฐœ์ž๋“ค์ด ์ฝ”๋“œ ๋ฆฌ๋ทฐ ํ›„ ๋ณดํ†ต ๋ฉ”์ธ ๋ธŒ๋žœ์น˜์— ๋ณ‘ํ•ฉํ•œ ์ฝ”๋“œ๋ฅผ ๊ธฐ๋ฐ˜์œผ๋กœ ํŒŒ์ดํ”„๋ผ์ธ์„ ํ†ตํ•ด ๋นŒ๋“œ ๋ฐ ๋ฐฐํฌ๋ฅผ ์ง„ํ–‰ํ•˜๋Š” ๊ณผ์ •์—์„œ ํ™œ์šฉ๋œ๋‹ค. ์ด ์•ก์…˜์€ ์ปค๋ฐ‹, ๋ธŒ๋žœ์น˜, PR ๊ฐ„์— ํŒŒ์ผ์ด ์ถ”๊ฐ€, ์ˆ˜์ •, ์‚ญ์ œ๋œ ๋‚ด์—ญ์„ ์ถ”์ ํ•  ์ˆ˜ ์žˆ๋„๋ก ํ•ด์ค€๋‹ค.

ํ•ด์ปค๋“ค์€ ์•ก์…˜ ์ฝ”๋“œ๋ฅผ ์ˆ˜์ •ํ•˜๊ณ  ์•…์„ฑ ์ปค๋ฐ‹์„ ์ฐธ์กฐํ•˜๊ธฐ ์œ„ํ•ด ๋‹ค์ˆ˜์˜ ํƒœ๊ทธ ๋ฒ„์ „์„ ์†Œ๊ธ‰ ์—…๋ฐ์ดํŠธํ–ˆ์œผ๋ฉฐ, ์ด๋กœ ์ธํ•ด ์ˆ˜์ฒœ ๊ฐœ์˜ CI ํŒŒ์ดํ”„๋ผ์ธ์— ์˜ํ–ฅ์„ ๋ฏธ์น˜๋ฉด์„œ CI/CD ์‹œํฌ๋ฆฟ์„ ์œ ์ถœํ•˜๋Š” ์•…์„ฑ ํŒŒ์ด์ฌ ์Šคํฌ๋ฆฝํŠธ๋ฅผ ์‹คํ–‰ํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

์ด๋ฒˆ tj-actions/changed-files ์นจํ•ด ์‚ฌ๊ฑด์€ ํ™•์‚ฐ ์ค‘์ธ CI/CD ํ™˜๊ฒฝ์—์„œ์˜ ๊ณต๊ธ‰๋ง ๊ณต๊ฒฉ ์œ„ํ—˜์„ ๋‹ค์‹œ ํ•œ๋ฒˆ ๋ถ€๊ฐ์‹œํ‚จ๋‹ค. ์•…์„ฑ ํŽ˜์ด๋กœ๋“œ๋Š” ์ž๋™ ์Šค์บ๋‹ ๋„๊ตฌ์˜ ํƒ์ง€๋ฅผ ํ”ผํ•˜๊ธฐ ์œ„ํ•ด ์ •๊ตํ•˜๊ฒŒ ์ˆจ๊ฒจ์ ธ ์žˆ์—ˆ๋‹ค.

ํ”„๋กœ์ ํŠธ ์†Œ์œ ์ž๋“ค์€ ์ต๋ช…์˜ ํ•ด์ปค๋“ค์ด ์นจํ•ด๋œ ๋ฆฌํฌ์ง€ํ† ๋ฆฌ์— ์ ‘๊ทผ ๊ถŒํ•œ์ด ์žˆ๋Š” @tj-actions-bot์ด ์‚ฌ์šฉํ•œ GitHub PAT์„ ํ•ดํ‚นํ•˜๋ ค ์‹œ๋„ํ–ˆ๋‹ค๊ณ  ์ „ํ•œ๋‹ค. ์ด์— ๋”ฐ๋ผ ๊ณ„์ • ๋น„๋ฐ€๋ฒˆํ˜ธ๋Š” ์—…๋ฐ์ดํŠธ๋˜์—ˆ๊ณ , ์ธ์ฆ ๋ฐฉ์‹์€ ํŒจ์Šคํ‚ค ์‚ฌ์šฉ์œผ๋กœ ์—…๊ทธ๋ ˆ์ด๋“œ๋˜์—ˆ์œผ๋ฉฐ, ๊ถŒํ•œ ์ˆ˜์ค€๋„ ์ตœ๊ณ  ๋“ฑ๊ธ‰์œผ๋กœ ์žฌ์„ค์ •๋˜์—ˆ๊ณ , ์นจํ•ด๋œ PAT์€ ์‚ฌ์šฉ ์ค‘์ง€๋˜์—ˆ๋‹ค.

์˜ํ–ฅ์„ ๋ฐ›์€ ๊ฐœ์ธ ์•ก์„ธ์Šค ํ† ํฐ์€ ์‚ฌ์šฉ ์ค‘์ง€๋œ GitHub Action ์‹œํฌ๋ฆฟ์— ์ €์žฅ๋˜์–ด ์žˆ์œผ๋ฉฐ, ์žฌ๋ฐœ ๋ฐฉ์ง€๋ฅผ ์œ„ํ•ด ๋ชจ๋“  tj-actions ์กฐ์ง์˜ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” ๋” ์ด์ƒ PAT ์‚ฌ์šฉ์ด ํ—ˆ์šฉ๋˜์ง€ ์•Š์„ ์˜ˆ์ •์ด๋‹ค.

GitHub Action ์‚ฌ์šฉ์ž๋“ค์€ ์ตœ์‹  ๋ฒ„์ „์œผ๋กœ ์—…๋ฐ์ดํŠธํ•  ๊ฒƒ์„ ๊ถŒ๊ณ ํ•˜๋ฉฐ, 3์›” 14์ผ~15์ผ ์‚ฌ์ด์— ์‹คํ–‰๋œ ์›Œํฌํ”Œ๋กœ์šฐ๋ฅผ ๊ฒ€ํ† ํ•ด ๋ณ€๊ฒฝ๋œ ํŒŒ์ผ๋กœ ์ธํ•œ ์˜ˆ๊ธฐ์น˜ ์•Š์€ ๊ฒฐ๊ณผ๊ฐ€ ์—†๋Š”์ง€ ํ™•์ธํ•ด์•ผ ํ•œ๋‹ค.

์ด๋ฒˆ ๋ณด์•ˆ ์ด์Šˆ๋Š” ์ฒ˜์Œ์ด ์•„๋‹ˆ๋‹ค. 2024๋…„ 1์›”, tj-actions/changed-files์™€ tj-actions/branch-names์—์„œ ์ž„์˜์˜ ์ฝ”๋“œ ์‹คํ–‰์„ ํ—ˆ์šฉํ•˜๋Š” ์น˜๋ช…์  ๊ฒฐํ•จ(CVE-2023-49291, CVSS ์ ์ˆ˜: 9.8)์ด ๋ฐœ๊ฒฌ๋œ ๋ฐ” ์žˆ๋‹ค.

์ด๋ฒˆ ์‚ฌ๊ฑด์„ ํ†ตํ•ด ์˜คํ”ˆ์†Œ์Šค ์†Œํ”„ํŠธ์›จ์–ด๊ฐ€ ์ตœ์ข… ์‚ฌ์šฉ์ž์—๊ฒŒ ์ „๋‹ฌ๋˜๋Š” ๊ณต๊ธ‰๋ง ์œ„ํ—˜์— ๋…ธ์ถœ๋  ์ˆ˜ ์žˆ์Œ์„ ๋‹ค์‹œ ํ•œ ๋ฒˆ ์‹ค๊ฐํ•˜๊ฒŒ ๋˜์—ˆ๋‹ค.

2025๋…„ 3์›” 15์ผ, ๋ชจ๋“  ๋ฒ„์ „์˜ tj-actions/changed-files Action์ด ๊ณต๊ฒฉ์„ ๋ฐ›์•˜๋‹ค. ํ•ด์‹œ ํ•€(hash-pinned) ๋ฒ„์ „์„ ์‚ฌ์šฉ ์ค‘์ด๋˜ ๊ณ ๊ฐ๋“ค์€ ๊ณต๊ฒฉ ์‹œ์ ์— ์—…๋ฐ์ดํŠธํ•˜์ง€ ์•Š์•˜๋‹ค๋ฉด ์˜ํ–ฅ์„ ๋ฐ›์ง€ ์•Š์„ ๊ฒƒ์œผ๋กœ ๋ณด์ธ๋‹ค.


CI/CD

CI(Continuous Integration): ์ง€์†์ ์ธ ํ†ตํ•ฉ

→ ์ฝ”๋“œ ๋ณ€๊ฒฝ ์‚ฌํ•ญ์ด ์ •๊ธฐ์ ์œผ๋กœ ๋นŒ๋“œ ๋ฐ ํ…Œ์ŠคํŠธ๋˜์–ด ๊ณต์œ  ๋ ˆํฌ์ง€ํ† ๋ฆฌ์— ํ†ตํ•ฉ๋˜๋Š” ๊ฒƒ

  • ๋น ๋ฅธ ๋ฒ„๊ทธ ํ™•์ธ ๋ฐ ํ•ด๊ฒฐ
  • ์†Œํ”„ํŠธ์›จ์–ด ํ’ˆ์งˆ ๊ฐœ์„ 
  • ์ƒˆ๋กœ์šด ์—…๋ฐ์ดํŠธ์˜ ๊ฒ€์ฆ ๋ฐ ๋ฆด๋ฆฌ์ฆˆ ์‹œ๊ฐ„ ๋‹จ์ถ•

CD(Continuous Delivery/Deployment): ์ง€์†์ ์ธ ๋ฐฐํฌ

→ ๊ณต์œ  ๋ฆฌํฌ์ง€ํ† ๋ฆฌ๋กœ ์ž๋™์œผ๋กœ ๋ฆด๋ฆฌ์ฆˆ & ํ”„๋กœ๋•์…˜ ๋ ˆ๋ฒจ๊นŒ์ง€ ์ž๋™์œผ๋กœ ๋ฐฐํฌ

  • ๋น ๋ฅธ ์‹œ๊ฐ„ ๋‚ด์— ๊ณ ๊ฐ์—๊ฒŒ ๋ฆด๋ฆฌ์ฆˆ ๋˜๋Š” ๊ฒƒ

  • compromise: ์นจํ•ด
  • retrieve: ๊ฒ€์ƒ‰ํ•˜๋‹ค
  • retroactively: ์†Œ๊ธ‰ํ•˜์—ฌ
  • siphon: ์ด๋™ํ•˜๋‹ค
  • unverified: ํ™•์ธ๋˜์ง€ ์•Š์€
  • deploy: ๋ฐฐํฌ
  • revoked: ์ทจ์†Œ๋จ
  • pave: ๋ฎ์–ด์“ฐ๋‹ค
  • susceptible: ๋А๋ผ๊ธฐ ์‰ฌ์šด

+ Recent posts