๋ณธ๋ฌธ ๋ฐ”๋กœ๊ฐ€๊ธฐ

NETWORK ยท CLOUD ยท SECURITY ยท AUTOMATION

Network History๐ŸŒ

๋„คํŠธ์›Œํฌ/ํด๋ผ์šฐ๋“œ ์—”์ง€๋‹ˆ์–ด๋ฅผ ๊ฟˆ๊พธ๋Š” ์ „์ž๊ณตํ•™๋„์˜ ์„ฑ์žฅ ๊ธฐ๋ก โœ๏ธ AI, Windows, ๋ณด์•ˆ, ํด๋ผ์šฐ๋“œ, ๋„คํŠธ์›Œํฌ, ์ž๋™ํ™”์™€ ๊ฐœ๋ฐœ·๋ฐฐํฌ๊นŒ์ง€. ํ˜„์žฅ์—์„œ ๋งˆ์ฃผ์น˜๋Š” IT ๋ฌธ์ œ๋ฅผ ์›์ธ๋ถ€ํ„ฐ ํ•ด๊ฒฐ๊นŒ์ง€ ๊ธฐ๋กํ•ฉ๋‹ˆ๋‹ค. ์ด๋ก ์„ ๋„˜์–ด ์‹ค๋ฌด๋กœ ํ–ฅํ•˜๋Š” ์—ฌ์ •, "Network History ๐ŸŒ"

๊ฐœ๋ฐœ·๋ฐฐํฌ

GitHub Actions pull_request_target 11์›”๋ถ€ํ„ฐ ์ž๋™ ์ฐจ๋‹จ - CI ๋ฉˆ์ถ”๊ธฐ ์ „ Pwn Request ๋ง‰๋Š” ์ „ํ™˜๋ฒ•

Network History๐ŸŒ Last Updated: 2026. 9. 19. 23:39

๐Ÿšจ ๊ณต๊ฐœ GitHub ์ €์žฅ์†Œ์—์„œ pull_request_target์„ ์“ฐ๋Š” CI/CD๋ผ๋ฉด ์ง€๊ธˆ ํ•œ ๋ฒˆ ์ ๊ฒ€ํ•  ์ด์œ ๊ฐ€ ์ƒ๊ฒผ์Šต๋‹ˆ๋‹ค. GitHub๋Š” 2026๋…„ 9์›” 17์ผ Workflow Execution Protections๋ฅผ ์ •์‹ ์ถœ์‹œํ–ˆ๊ณ , ๋ณ„๋„ ์ •์ฑ…์ด ์—†๋Š” ๊ณต๊ฐœ ์ €์žฅ์†Œ์—๋Š” pull_request_target์„ ์ฐจ๋‹จํ•˜๋Š” ๊ธฐ๋ณธ ์ •์ฑ…์„ ์ ์šฉํ•˜๊ธฐ ์‹œ์ž‘ํ–ˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ‘‹ Network History ๋…์ž ์—ฌ๋Ÿฌ๋ถ„, ์•ˆ๋…•ํ•˜์„ธ์š”. YH์ž…๋‹ˆ๋‹ค.

ํ˜„์žฌ๋Š” Evaluate Mode๋กœ ์˜ํ–ฅ์„ ๋จผ์ € ํ™•์ธํ•  ์ˆ˜ ์žˆ์ง€๋งŒ, GitHub๋Š” 2026๋…„ 11์›” 2์ผ๋ถ€ํ„ฐ ๋Œ€์ƒ ๊ณต๊ฐœ ์ €์žฅ์†Œ์˜ ๊ธฐ๋ณธ ์ •์ฑ…์„ ์‹ค์ œ๋กœ ๊ฐ•์ œํ•  ์˜ˆ์ •์ž…๋‹ˆ๋‹ค. ๊ทธ๋Œ€๋กœ ๋‘๋ฉด ๊ธฐ์กด ์ž๋™ํ™”๊ฐ€ ์‹คํŒจํ•  ์ˆ˜ ์žˆ๊ณ , ๋ฐ˜๋Œ€๋กœ ๋ฌด์ž‘์ • ํ—ˆ์šฉํ•˜๋ฉด ์˜ค๋ž˜์ „๋ถ€ํ„ฐ ๋ฌธ์ œ๊ฐ€ ๋œ

Pwn Request

๊ณต๊ฒฉ๋ฉด์„ ๋‹ค์‹œ ์—ด ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

ํ•ต์‹ฌ์€ “์ฐจ๋‹จ์„ ํ’€๊นŒ ๋ง๊นŒ”๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. PR ์ฝ”๋“œ ํ…Œ์ŠคํŠธ๋Š” ๋‚ฎ์€ ๊ถŒํ•œ์œผ๋กœ, ๋ผ๋ฒจ·๋Œ“๊ธ€·๋ฐฐํฌ์ฒ˜๋Ÿผ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ์ž‘์—…์€ ๋ณ„๋„ ์‹ ๋ขฐ ๊ฒฝ๊ณ„๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

์˜ค๋Š˜์€ ์ตœ์‹  ์ •์ฑ… ๋ณ€๊ฒฝ์„ ๊ณ„๊ธฐ๋กœ ์™œ pull_request_target์ด ์œ„ํ—˜ํ•œ์ง€ → ๋‚ด ์ €์žฅ์†Œ ์˜ํ–ฅ ํ™•์ธ → ์•ˆ์ „ํ•œ pull_request ์ „ํ™˜ → ๊ผญ ํ•„์š”ํ•œ ๊ฒฝ์šฐ์˜ ํ•˜๋“œ๋‹ → Evaluate Mode ๊ฒ€์ฆ → ์žฌ๋ฐœ๋ฐฉ์ง€๊นŒ์ง€ ์ •๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿ“… ์ •์ฑ… ๋ณ€ํ™”

๊ณต๊ฐœ ์ €์žฅ์†Œ ๊ธฐ๋ณธ ์ฐจ๋‹จ ์ •์ฑ…์€ ํ˜„์žฌ ํ‰๊ฐ€ ์ค‘์ด๋ฉฐ 11์›” 2์ผ๋ถ€ํ„ฐ ๋Œ€์ƒ ์ €์žฅ์†Œ์— ๊ฐ•์ œ๋ฉ๋‹ˆ๋‹ค.

โš ๏ธ ํ•ต์‹ฌ ์œ„ํ—˜

Fork PR์˜ ์ฝ”๋“œ๋ฅผ ๋†’์€ ๊ถŒํ•œ Workflow์—์„œ ์‹คํ–‰ํ•˜๋ฉด Secret·Token ํƒˆ์ทจ๋กœ ์ด์–ด์งˆ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๐Ÿ”’ ๊ธฐ๋ณธ ํ•ด๋ฒ•

ํ…Œ์ŠคํŠธ๋Š” pull_request, ๊ถŒํ•œ ์ž‘์—…์€ ๋ณ„๋„ Workflow๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.

๐Ÿงช ์•ˆ์ „ํ•œ ์ „ํ™˜

Actions Policies์˜ Evaluate Mode๋กœ ์ฐจ๋‹จ๋  ์‹คํ–‰์„ ๋จผ์ € ํ™•์ธํ•œ ๋’ค ์ ์šฉํ•ฉ๋‹ˆ๋‹ค.

ํ•ต์‹ฌ ํ•œ ์ค„

pull_request_target์„ ๊ณ„์† ํ—ˆ์šฉํ•˜๋Š” ๊ฒƒ๋ณด๋‹ค “์‹ ๋ขฐ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ ์‹คํ–‰”๊ณผ “Secret·์“ฐ๊ธฐ ๊ถŒํ•œ”์„ ์„œ๋กœ ๋‹ค๋ฅธ Workflow๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ์žฅ๊ธฐ์ ์ธ ํ•ด๋ฒ•์ž…๋‹ˆ๋‹ค.


์™œ pull_request_target์ด ์ด๋ ‡๊ฒŒ ์œ„ํ—˜ํ•˜๊ฒŒ ์ทจ๊ธ‰๋ ๊นŒ์š”?

pull_request์™€ pull_request_target์€ ์ด๋ฆ„์€ ๋น„์Šทํ•˜์ง€๋งŒ ์‹ ๋ขฐ ์ˆ˜์ค€์ด ๋‹ค๋ฆ…๋‹ˆ๋‹ค.

๊ตฌ๋ถ„ pull_request pull_request_target
๊ธฐ๋ณธ ๋ชฉ์  PR ์ฝ”๋“œ์˜ ๋นŒ๋“œ·ํ…Œ์ŠคํŠธ PR ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ ์ฒ˜๋ฆฌ·๋ผ๋ฒจ·๋Œ“๊ธ€ ๋“ฑ
Workflow ๊ธฐ์ค€ PR Merge Commit ์ปจํ…์ŠคํŠธ Base Repository ๊ธฐ๋ณธ ๋ธŒ๋žœ์น˜ ์ปจํ…์ŠคํŠธ
๊ถŒํ•œ ์ˆ˜์ค€ Fork PR์—์„œ๋Š” ์ œํ•œ์  ๋†’์€ ์‹ ๋ขฐ ์ปจํ…์ŠคํŠธ
Secret ์ ‘๊ทผ Fork PR์—๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์ œ๊ณต๋˜์ง€ ์•Š์Œ Repository·Organization Secret ์ ‘๊ทผ ๊ฐ€๋Šฅ์„ฑ ์กด์žฌ
์ฃผ์š” ์œ„ํ—˜ ํ…Œ์ŠคํŠธ ์‹คํŒจ·์•…์„ฑ ์ฝ”๋“œ ์‹คํ–‰ ์ž์ฒด ์•…์„ฑ ์ฝ”๋“œ + ๋†’์€ ๊ถŒํ•œ ๊ฒฐํ•ฉ

๋ฌธ์ œ๋Š” pull_request_target ์ž์ฒด๊ฐ€ ์•…์„ฑ์ด๋ผ๋Š” ๋œป์ด ์•„๋‹™๋‹ˆ๋‹ค. ์ด ์ด๋ฒคํŠธ๋Š” ์™ธ๋ถ€ ๊ธฐ์—ฌ์ž์˜ PR์—๋„ ๋ผ๋ฒจ์„ ๋ถ™์ด๊ฑฐ๋‚˜ ๋Œ“๊ธ€์„ ๋‚จ๊ฒจ์•ผ ํ•  ๋•Œ์ฒ˜๋Ÿผ ๋†’์€ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ์ž๋™ํ™”๋ฅผ ์œ„ํ•ด ์กด์žฌํ•ฉ๋‹ˆ๋‹ค.

์œ„ํ—˜์€ ์—ฌ๊ธฐ์— ์‹ ๋ขฐ๋˜์ง€ ์•Š์€ Fork PR ์ฝ”๋“œ๋ฅผ Checkoutํ•˜๊ณ  ์‹ค์ œ๋กœ ์‹คํ–‰ํ•˜๋Š” ์ˆœ๊ฐ„ ์ƒ๊น๋‹ˆ๋‹ค.

Fork PR pull_request_target PR Head Checkout Build·Test ์‹คํ–‰ Secret·Token ์œ„ํ—˜

Checkout๋งŒ ํ–ˆ๋‹ค๊ณ  ๋ฐ”๋กœ ์ทจ์•ฝํ•œ ๊ฒƒ์€ ์•„๋‹™๋‹ˆ๋‹ค.

GitHub ๋ฌธ์„œ๊ฐ€ ๊ฐ•์กฐํ•˜๋Š” ํ•ต์‹ฌ์€ ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ์ฝ”๋“œ๋ฅผ ๋†’์€ ๊ถŒํ•œ ์ปจํ…์ŠคํŠธ์—์„œ ์‹คํ–‰ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค. npm install, make test, Build Script, ์„ค์ •ํŒŒ์ผ, Dependency Hook๋„ ๋ชจ๋‘ ์‹คํ–‰ ๊ฒฝ๋กœ๊ฐ€ ๋  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.


๋‚ด ์ €์žฅ์†Œ๊ฐ€ ์˜ํ–ฅ์„ ๋ฐ›๋Š”์ง€ ๋จผ์ € ์ฐพ๋Š” ๋ฐฉ๋ฒ•

์ •์ฑ…์ด ์ ์šฉ๋˜๊ธฐ ์ „์— ๊ฐ€์žฅ ๋จผ์ € ํ•ด์•ผ ํ•  ์ผ์€ ์ €์žฅ์†Œ์—์„œ pull_request_target์„ ์‹ค์ œ๋กœ ์“ฐ๋Š” Workflow๋ฅผ ์ฐพ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๋กœ์ปฌ Repository์—์„œ Trigger ๊ฒ€์ƒ‰

grep -R -n "pull_request_target" .github/workflows

๊ฒฐ๊ณผ๊ฐ€ ์žˆ๋‹ค๋ฉด ํ•ด๋‹น Workflow์—์„œ PR์˜ Head Commit์ด๋‚˜ Fork Repository๋ฅผ ๋‹ค์‹œ ๊ฐ€์ ธ์˜ค๋Š” ์ฝ”๋“œ๊ฐ€ ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.

grep -R -nE "head\.sha|head\.repo|refs/pull|gh pr checkout|git fetch" .github/workflows
ํŒจํ„ด ์œ„ํ—˜ ํŒ๋‹จ
๋ผ๋ฒจ·๋Œ“๊ธ€๋งŒ ์ฒ˜๋ฆฌ ์ฝ”๋“œ ์‹คํ–‰์ด ์—†๋‹ค๋ฉด ์ƒ๋Œ€์ ์œผ๋กœ ๋‚ฎ์€ ์œ„ํ—˜
Fork PR Head Checkout ์ฃผ์˜ ํ•„์š”
Checkout ํ›„ npm install / test / build ๋†’์€ ์œ„ํ—˜
Secret ์‚ฌ์šฉ + PR ์ฝ”๋“œ ์‹คํ–‰ ์ตœ์šฐ์„  ์ˆ˜์ • ๋Œ€์ƒ
write ๊ถŒํ•œ GITHUB_TOKEN + PR ์ฝ”๋“œ ์‹คํ–‰ ์ตœ์šฐ์„  ์ˆ˜์ • ๋Œ€์ƒ

actions/checkout๋งŒ ๊ฒ€์ƒ‰ํ•˜๋ฉด ๋†“์น  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

GitHub๊ฐ€ ๊ฐ•ํ™”ํ•œ actions/checkout ๋ณดํ˜ธ๋Š” ํ”ํ•œ ์œ„ํ—˜ ํŒจํ„ด์„ ๋ง‰์•„์ฃผ์ง€๋งŒ, git fetch, gh pr checkout, ์™ธ๋ถ€ Artifact ๋‹ค์šด๋กœ๋“œ์ฒ˜๋Ÿผ ๋‹ค๋ฅธ ๋ฐฉ๋ฒ•์œผ๋กœ ์‹ ๋ขฐ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€ ์‹คํ–‰ํ•˜๋Š” ๊ฒฝ์šฐ๊นŒ์ง€ ๋ชจ๋‘ ์—†์• ์ฃผ์ง€๋Š” ์•Š์Šต๋‹ˆ๋‹ค.


๊ฐ€์žฅ ์•ˆ์ „ํ•œ ๊ธฐ๋ณธํ˜•์€ ํ…Œ์ŠคํŠธ๋ฅผ pull_request๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค

์Šต๋‹ˆ๋‹ค. ์ด ์ž‘์—…์€ ๋‚ฎ์€ ์‹ ๋ขฐ ์ปจํ…์ŠคํŠธ์ธ pull_request๋กœ ์˜ฎ๊ธฐ๋Š” ๊ฒƒ์ด ๊ธฐ๋ณธ์ž…๋‹ˆ๋‹ค.

name: PR Test

on:
  pull_request:

permissions:
  contents: read

jobs:
  test:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v7

      - name: Install
        run: npm ci

      - name: Test
        run: npm test

์ด ๊ตฌ์กฐ์˜ ์žฅ์ ์€ Fork PR์—์„œ ๊ณต๊ฒฉ์ž๊ฐ€ Build Script๋ฅผ ๋ฐ”๊พธ๋”๋ผ๋„ Repository Secret๊ณผ ๋†’์€ ์“ฐ๊ธฐ ๊ถŒํ•œ์ด ๊ฐ™์€ ์‹คํ–‰๊ณต๊ฐ„์— ์กด์žฌํ•˜์ง€ ์•Š๋„๋ก ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์›์น™

์‹ ๋ขฐ๋˜์ง€ ์•Š์€ ์ฝ”๋“œ ์‹คํ–‰ = ๋‚ฎ์€ ๊ถŒํ•œ / Secret·์“ฐ๊ธฐ ๊ถŒํ•œ = ์‹ ๋ขฐ๋œ ์ฝ”๋“œ๋งŒ

ํ•„์š”ํ•œ ๊ถŒํ•œ๋„ ๋ช…์‹œ์ ์œผ๋กœ ์ค„์ด๋Š” ๊ฒƒ์ด ์ข‹์Šต๋‹ˆ๋‹ค. ๋‹จ์ˆœ ํ…Œ์ŠคํŠธ๋ผ๋ฉด contents: read ์ •๋„๋กœ ์ถฉ๋ถ„ํ•œ์ง€ ๋จผ์ € ๊ฒ€ํ† ํ•˜๊ณ , ๋ถˆํ•„์š”ํ•œ write ๊ถŒํ•œ์€ ์ฃผ์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


๋ผ๋ฒจ·๋Œ“๊ธ€ ์ž๋™ํ™”๋Š” pull_request_target์„ ๋‚จ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค

pull_request_target์ด ํ•ญ์ƒ ์ œ๊ฑฐ ๋Œ€์ƒ์€ ์•„๋‹™๋‹ˆ๋‹ค. ์™ธ๋ถ€ PR์— ๋ผ๋ฒจ์„ ๋ถ™์ด๊ฑฐ๋‚˜, ๋ฉ”ํƒ€๋ฐ์ดํ„ฐ๋ฅผ ์ฝ๊ณ  ๋Œ“๊ธ€์„ ๋‚จ๊ธฐ๋Š” ์ž๋™ํ™”์ฒ˜๋Ÿผ PR ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ์ž‘์—…์—๋Š” ์—ฌ์ „ํžˆ ์œ ์šฉํ•ฉ๋‹ˆ๋‹ค.

name: PR Triage

on:
  pull_request_target:
    types: [opened]

permissions:
  contents: read
  pull-requests: write

jobs:
  label:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/github-script@v8
        with:
          script: |
            await github.rest.issues.addLabels({
              owner: context.repo.owner,
              repo: context.repo.repo,
              issue_number: context.issue.number,
              labels: ['needs-review']
            })

์ด Workflow์—๋Š” PR Head Code๋ฅผ Checkoutํ•˜๋Š” ๋‹จ๊ณ„๊ฐ€ ์—†์Šต๋‹ˆ๋‹ค. ๊ณต๊ฒฉ์ž๊ฐ€ ์ˆ˜์ •ํ•œ Repository ํŒŒ์ผ์„ Buildํ•˜๊ฑฐ๋‚˜ ์‹คํ–‰ํ•˜์ง€๋„ ์•Š์Šต๋‹ˆ๋‹ค.

๊ถŒํ•œ์ด ํ•„์š”ํ•œ Workflow์—์„œ๋Š” “์ฝ”๋“œ๋ฅผ ์•ˆ ๊ฐ€์ ธ์˜ค๋Š” ๊ฒƒ”๋„ ๊ฐ•๋ ฅํ•œ ๋ฐฉ์–ด์ž…๋‹ˆ๋‹ค.

Secret์„ ์ง€ํ‚ค๋ ค๋ฉด Secret masking์—๋งŒ ์˜์กดํ•˜๊ธฐ๋ณด๋‹ค, ๊ณต๊ฒฉ์ž๊ฐ€ ์ œ์–ดํ•˜๋Š” ์ฝ”๋“œ์™€ Secret์ด ๊ฐ™์€ Job ์•ˆ์—์„œ ๋งŒ๋‚  ์ˆ˜ ์—†๋„๋ก ๊ตฌ์กฐ์ ์œผ๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ํŽธ์ด ์ข‹์Šต๋‹ˆ๋‹ค.


๊ผญ pull_request_target์ด ํ•„์š”ํ•˜๋‹ค๋ฉด ๋‹ค์„ฏ ๊ฐ€์ง€๋ฅผ ๊ฐ™์ด ๋ณด์„ธ์š”

์—…๋ฌด์ƒ pull_request_target์ด ๊ผญ ํ•„์š”ํ•œ ํ™˜๊ฒฝ์ด๋ผ๋ฉด Trigger ํ•˜๋‚˜๋งŒ ํ—ˆ์šฉํ•˜๊ณ  ๋๋‚ด๋ฉด ์•ˆ ๋ฉ๋‹ˆ๋‹ค.

1
PR Code ์‹คํ–‰ ์—ฌ๋ถ€ ํ™•์ธ
Fork Head·Merge Commit·์™ธ๋ถ€ Repository๋ฅผ ๊ฐ€์ ธ์™€ Build·Test·Installํ•˜์ง€ ์•Š๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
2
GITHUB_TOKEN ์ตœ์†Œ๊ถŒํ•œ
Workflow์— ์‹ค์ œ๋กœ ํ•„์š”ํ•œ read/write ๋ฒ”์œ„๋งŒ ๋ช…์‹œํ•ฉ๋‹ˆ๋‹ค.
3
Secret ์ตœ์†Œํ™”
ํ•ด๋‹น Job์— ํ•„์š”ํ•˜์ง€ ์•Š์€ Repository·Organization Secret์„ ์ฐธ์กฐํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.
4
Cache ์“ฐ๊ธฐ ์ œํ•œ
pull_request_target๊ณผ ๊ฐ™์€ ๋‚ฎ์€ ์‹ ๋ขฐ Trigger๊ฐ€ ๊ณต์œ  Cache๋ฅผ ์˜ค์—ผ์‹œํ‚ค์ง€ ์•Š๋„๋ก ๊ธฐ๋ณธ read-only ๋ณดํ˜ธ๋ฅผ ์œ ์ง€ํ•ฉ๋‹ˆ๋‹ค.
5
์ •์ฑ…์œผ๋กœ ํ—ˆ์šฉ๋ฒ”์œ„ ์ขํžˆ๊ธฐ
Repository ์ „์ฒด๊ฐ€ ์•„๋‹ˆ๋ผ ํ•„์š”ํ•œ Workflow ํŒŒ์ผ์—๋งŒ Execution Policy๋ฅผ ์ ์šฉํ•˜๋Š” ๋ฐฉ์‹๋„ ๊ฒ€ํ† ํ•ฉ๋‹ˆ๋‹ค.

GitHub๋Š” Workflow Execution Protections์˜ GA์™€ ํ•จ๊ป˜ Workflow File Targeting์„ ์ œ๊ณตํ•ด, ์˜ˆ๋ฅผ ๋“ค์–ด ์ผ๋ฐ˜ CI๋Š” ์—ด์–ด๋‘๋˜ ๋ฐฐํฌ Workflow๋งŒ ํŠน์ • Actor·Event๋กœ ์ œํ•œํ•˜๋Š” ์‹์˜ ์ •์ฑ… ์„ค๊ณ„๊ฐ€ ๊ฐ€๋Šฅํ•ด์กŒ์Šต๋‹ˆ๋‹ค.


11์›” 2์ผ ์ „์— Evaluate Mode๋กœ ๋จผ์ € ๊ฒ€์ฆํ•˜์„ธ์š”

๊ณต๊ฐœ ์ €์žฅ์†Œ์— ๋Œ€ํ•œ ๊ธฐ๋ณธ pull_request_target ์ •์ฑ…์€ ๊ณง๋ฐ”๋กœ ๋ชจ๋“  Workflow๋ฅผ ๋Š๋Š” ๋ฐฉ์‹์ด ์•„๋‹™๋‹ˆ๋‹ค. GitHub๋Š” ๋จผ์ € Evaluate Mode์—์„œ ์–ด๋–ค ์‹คํ–‰์ด ์ฐจ๋‹จ๋ ์ง€๋ฅผ ๋ณผ ์ˆ˜ ์žˆ๋„๋ก ์ œ๊ณตํ•ฉ๋‹ˆ๋‹ค.

1
Settings → Actions → Policies
Repository ๋˜๋Š” Organization์˜ Actions ์ •์ฑ… ํ™”๋ฉด์„ ์—ฝ๋‹ˆ๋‹ค.
2
ํ˜„์žฌ Event Policy ํ™•์ธ
pull_request_target ๊ด€๋ จ ๊ธฐ๋ณธ ๋˜๋Š” ์‚ฌ์šฉ์ž ์ •์ฑ…์ด ์žˆ๋Š”์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
3
Evaluate ๊ฒฐ๊ณผ ํ™•์ธ
Policy Insights์—์„œ ์–ด๋–ค Workflow Run์ด ํ–ฅํ›„ ์ฐจ๋‹จ๋ ์ง€ ํ™•์ธํ•ฉ๋‹ˆ๋‹ค.
4
์•ˆ์ „ํ•œ Workflow๋กœ ์ „ํ™˜
๊ฐ€๋Šฅํ•˜๋ฉด pull_request๋กœ ์˜ฎ๊ธฐ๊ณ , ๊ถŒํ•œ์ž‘์—…์€ ๋ณ„๋„ Workflow๋กœ ๋ถ„๋ฆฌํ•ฉ๋‹ˆ๋‹ค.
5
ํ•„์š”ํ•œ ๊ฒฝ์šฐ๋งŒ ๋ช…์‹œ์  ํ—ˆ์šฉ
ํ•˜๋“œ๋‹์„ ๋๋‚ธ ํŠน์ • Workflow๋งŒ Allowlist ํ•˜๋Š” ๋ฐฉ์‹์œผ๋กœ ๋ฒ”์œ„๋ฅผ ์ค„์ž…๋‹ˆ๋‹ค.

๊ธฐ๋ณธ ์ฐจ๋‹จ์€ ๋ชจ๋“  ์ €์žฅ์†Œ์— ๋™์ผํ•˜๊ฒŒ ์ ์šฉ๋˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค.

GitHub์˜ ํ˜„์žฌ ์•ˆ๋‚ด ๊ธฐ์ค€์œผ๋กœ ๊ธฐ๋ณธ ์ •์ฑ…์€ ์ ์šฉ ๊ฐ€๋Šฅํ•œ ๋ณ„๋„ Event Policy๊ฐ€ ์—†๋Š” ๊ณต๊ฐœ ์ €์žฅ์†Œ๋ฅผ ๋Œ€์ƒ์œผ๋กœ ํ•˜๋ฉฐ, Private·Internal Repository์—๋Š” ์ด ๊ธฐ๋ณธ ์ฐจ๋‹จ์ด ์ ์šฉ๋˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.


actions/checkout ๋ณดํ˜ธ๊ฐ€ ์žˆ์–ด๋„ ๊ตฌ์กฐ์  ๋ถ„๋ฆฌ๋Š” ๊ณ„์† ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค

GitHub๋Š” 2026๋…„ ์ค‘ actions/checkout์—๋„ pull_request_target์—์„œ Fork PR Head๋ฅผ ์œ„ํ—˜ํ•˜๊ฒŒ ๊ฐ€์ ธ์˜ค๋Š” ์ผ๋ฐ˜์ ์ธ ํŒจํ„ด์„ ์ฐจ๋‹จํ•˜๋Š” ๋ณดํ˜ธ๋ฅผ ๊ฐ•ํ™”ํ–ˆ์Šต๋‹ˆ๋‹ค.

ํ•˜์ง€๋งŒ ์ด๊ฒƒ๋งŒ ๋ฏฟ๊ณ  Workflow๋ฅผ ๊ทธ๋Œ€๋กœ ๋‘๋Š” ๊ฒƒ์€ ์ถฉ๋ถ„ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค.

์ƒํ™ฉ checkout ๋ณดํ˜ธ๋กœ ํ•ด๊ฒฐ?
์œ„ํ—˜ํ•œ Fork Head checkout ๋Œ€ํ‘œ์ ์ธ ํŒจํ„ด์€ ์ฐจ๋‹จ ๊ฐ€๋Šฅ
git fetch๋กœ ์ง์ ‘ ๊ฐ€์ ธ์˜ค๊ธฐ ๋ณ„๋„ ๊ฒ€ํ†  ํ•„์š”
gh pr checkout ์‚ฌ์šฉ ๋ณ„๋„ ๊ฒ€ํ†  ํ•„์š”
Untrusted Artifact ์‹คํ–‰ ๋ณ„๋„ ๊ฒ€ํ†  ํ•„์š”
issue_comment ๋“ฑ ๋‹ค๋ฅธ Privileged Trigger ๋ณ„๋„ ๊ฒ€ํ†  ํ•„์š”

๊ฒฐ๊ตญ ๊ฐ€์žฅ ์˜ค๋ž˜ ๊ฐ€๋Š” ๋ณด์•ˆ ์„ค๊ณ„๋Š” ํŠน์ • Action์ด ๋ง‰์•„์ฃผ๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ์ด ์•„๋‹ˆ๋ผ

Untrusted Code์™€ Privileged Context๋ฅผ ์•„ํ‚คํ…์ฒ˜ ์ˆ˜์ค€์—์„œ ๋ถ„๋ฆฌ

ํ•˜๋Š” ๊ฒƒ์ž…๋‹ˆ๋‹ค.


Workflow๋ฅผ ๋‘ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆŒ ๋•Œ๋„ Artifact๋ฅผ ์‹ ๋ขฐํ•˜์ง€ ๋งˆ์„ธ์š”

๋ณต์žกํ•œ ํ”„๋กœ์ ํŠธ์—์„œ๋Š” pull_request Workflow์—์„œ ํ…Œ์ŠคํŠธ๋ฅผ ์ˆ˜ํ–‰ํ•˜๊ณ , ํ›„์† workflow_run์—์„œ ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ์ž‘์—…์„ ์ˆ˜ํ–‰ํ•˜๋Š” ๊ตฌ์กฐ๋ฅผ ์‚ฌ์šฉํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

์ด๋•Œ๋„ ์ฒซ Workflow๊ฐ€ ๋งŒ๋“  Artifact๋ฅผ ๋‘ ๋ฒˆ์งธ Privileged Workflow๊ฐ€ ๋ฌด์กฐ๊ฑด ์‹ ๋ขฐํ•ด ์‹คํ–‰ํ•˜๋ฉด ๋‹ค์‹œ ๊ณต๊ฒฉ๊ฒฝ๋กœ๊ฐ€ ์ƒ๊ธธ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

Untrusted PR Low-Privilege Test Artifact = Untrusted Data ๊ฒ€์ฆ Privileged Action

“Workflow๋ฅผ ๋ถ„๋ฆฌํ–ˆ์œผ๋‹ˆ ์•ˆ์ „ํ•˜๋‹ค”๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค.

์‹ ๋ขฐ๋˜์ง€ ์•Š์€ Workflow๊ฐ€ ๋งŒ๋“  ์‹คํ–‰ํŒŒ์ผ·Script·์••์ถ•ํŒŒ์ผ์„ Privileged Workflow์—์„œ ์‹คํ–‰ํ•˜๋ฉด ๊ฒฝ๊ณ„๊ฐ€ ๋‹ค์‹œ ๋ฌด๋„ˆ์ง‘๋‹ˆ๋‹ค. ํ›„์† Workflow์—๋Š” ํ•„์š”ํ•œ ์ตœ์†Œ ๋ฐ์ดํ„ฐ๋งŒ ์ „๋‹ฌํ•˜๊ณ , ์‹คํ–‰ ๊ฐ€๋Šฅํ•œ Artifact๋Š” ํŠนํžˆ ์‹ ์ค‘ํ•˜๊ฒŒ ๋‹ค๋ค„์•ผ ํ•ฉ๋‹ˆ๋‹ค.


์กฐ์ง์—์„œ๋Š” YAML ์ˆ˜์ •๊ณผ ์ •์ฑ… ์ ์šฉ์„ ํ•จ๊ป˜ ๊ฐ€์ ธ๊ฐ€์„ธ์š”

Repository๊ฐ€ ์ˆ˜์‹ญ·์ˆ˜๋ฐฑ ๊ฐœ๋ผ๋ฉด ๊ฐ ํŒ€์ด YAML์„ ์˜ฌ๋ฐ”๋ฅด๊ฒŒ ์ž‘์„ฑํ•˜๊ธฐ๋ฅผ ๊ธฐ๋‹ค๋ฆฌ๋Š” ๊ฒƒ๋งŒ์œผ๋กœ๋Š” ํ•œ๊ณ„๊ฐ€ ์žˆ์Šต๋‹ˆ๋‹ค.

Workflow Execution Protections๋Š” Actor Rule๊ณผ Event Rule์„ Enterprise·Organization·Repository ์ˆ˜์ค€์—์„œ ์ ์šฉํ•  ์ˆ˜ ์žˆ๊ณ , Evaluate Mode๋กœ ์˜ํ–ฅ๋„๋ฅผ ๋จผ์ € ๋ณผ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

๋ณดํ˜ธ์ธต ์—ญํ• 
Workflow YAML ์ตœ์†Œ๊ถŒํ•œ·์•ˆ์ „ํ•œ Trigger·Secret ๋ถ„๋ฆฌ
Checkout ๋ณดํ˜ธ ๋Œ€ํ‘œ์ ์ธ Pwn Request ํŒจํ„ด ์ฐจ๋‹จ
Execution Policy ํ—ˆ์šฉ Actor·Event๋ฅผ ์‹คํ–‰ ์ „์— ํ†ต์ œ
Code Scanning ์œ„ํ—˜ํ•œ Actions Workflow ํŒจํ„ด ํƒ์ง€
Review ์ •์ฑ… ์˜ˆ์™ธ์™€ Privileged Workflow ๋ณ€๊ฒฝ ๊ฐ์‹œ

์ •์ฑ…์€ ์ž˜๋ชป๋œ Workflow๊ฐ€ ์‹คํ–‰๋˜๊ธฐ ์ „์— ๋ง‰๋Š” ๋ฐฉ์–ด์„ ์ด๊ณ , YAML ํ•˜๋“œ๋‹์€ Workflow ์ž์ฒด์˜ ๊ณต๊ฒฉ๋ฉด์„ ์ค„์ด๋Š” ๋ฐฉ์–ด์„ ์ž…๋‹ˆ๋‹ค. ๋‘˜ ์ค‘ ํ•˜๋‚˜๋งŒ ์„ ํƒํ•  ํ•„์š”๋Š” ์—†์Šต๋‹ˆ๋‹ค.


๋งˆ๋ฌด๋ฆฌ

GitHub์˜ 2026๋…„ 9์›” Workflow Execution Protections GA๋Š” ๋‹จ์ˆœํ•œ ์ƒˆ ์„ค์ • ๋ฉ”๋‰ด๊ฐ€ ์•„๋‹™๋‹ˆ๋‹ค. ๊ณต๊ฐœ ์ €์žฅ์†Œ์˜ pull_request_target์ด ์–ผ๋งˆ๋‚˜ ์ž์ฃผ ์ž˜๋ชป ์‚ฌ์šฉ๋ผ ์™”๋Š”์ง€๋ฅผ ๋ณด์—ฌ์ฃผ๋Š” ๋ณ€ํ™”์ด๊ธฐ๋„ ํ•ฉ๋‹ˆ๋‹ค.

11์›” 2์ผ ์ „๊นŒ์ง€ ํ•ด์•ผ ํ•  ์ผ์€ ๋‹จ์ˆœํžˆ ์ฐจ๋‹จ ์ •์ฑ…์„ ํ•ด์ œํ•˜๋Š” ๊ฒƒ์ด ์•„๋‹™๋‹ˆ๋‹ค. PR ์ฝ”๋“œ๋ฅผ ์‹ค์ œ๋กœ ์‹คํ–‰ํ•ด์•ผ ํ•˜๋Š” Workflow๋Š” pull_request๋กœ ์ด๋™ํ•˜๊ณ , ๊ถŒํ•œ์ด ํ•„์š”ํ•œ ์ž๋™ํ™”๋Š” PR ์ฝ”๋“œ๋ฅผ ์‹คํ–‰ํ•˜์ง€ ์•Š๋Š” ๋ณ„๋„ Workflow๋กœ ๋ถ„๋ฆฌํ•˜๋Š” ๊ฒƒ์ด ๋จผ์ €์ž…๋‹ˆ๋‹ค.

๐Ÿ” ์˜ค๋Š˜ ํ•˜๋‚˜๋งŒ ์ ๊ฒ€ํ•œ๋‹ค๋ฉด Repository์—์„œ pull_request_target์„ ๊ฒ€์ƒ‰ํ•œ ๋’ค, ๊ทธ Workflow๊ฐ€ Fork PR ์ฝ”๋“œ๋ฅผ ๊ฐ€์ ธ์™€

Build·Install·Test ์ค‘ ํ•˜๋‚˜๋ผ๋„ ์‹คํ–‰ํ•˜๋Š”์ง€

ํ™•์ธํ•ด๋ณด์„ธ์š”. ๊ทธ ํ•œ ์ค„์ด Pwn Request ์—ฌ๋ถ€๋ฅผ ๊ฐ€๋ฅด๋Š” ๊ฐ€์žฅ ์ค‘์š”ํ•œ ์ถœ๋ฐœ์ ์ž…๋‹ˆ๋‹ค.

๐Ÿ‘‹ Network History์˜ YH์˜€์Šต๋‹ˆ๋‹ค.

โ€ป ์ด ๊ธ€์€ 2026๋…„ 9์›” 18์ผ ๊ธฐ์ค€ GitHub ๊ณต์‹ Changelog์™€ GitHub Actions ๋ณด์•ˆ ๋ฌธ์„œ๋ฅผ ๋ฐ”ํƒ•์œผ๋กœ ์ž‘์„ฑํ–ˆ์Šต๋‹ˆ๋‹ค. Workflow Execution Policy์˜ ์ ์šฉ๋ฒ”์œ„์™€ ๊ธฐ๋ณธ์ •์ฑ… ์ผ์ •์€ ์ดํ›„ ๋ณ€๊ฒฝ๋  ์ˆ˜ ์žˆ์œผ๋ฏ€๋กœ ์‹ค์ œ ์ ์šฉ ์ „ ์ตœ์‹  GitHub ๋ฌธ์„œ๋ฅผ ๋‹ค์‹œ ํ™•์ธํ•˜์„ธ์š”.


๐Ÿ”— ๊ณต์‹ ์ถœ์ฒ˜

'๊ฐœ๋ฐœยท๋ฐฐํฌ' ์นดํ…Œ๊ณ ๋ฆฌ์˜ ๋‹ค๋ฅธ ๊ธ€

GitHub CLI apt update EXPKEYSIGยทNO_PUBKEY ์˜ค๋ฅ˜ ํ•ด๊ฒฐ๋ฒ•  (0) 2026.09.10