React CVE-2025-55182 보안 이슈, 배포 단계에서 자동으로 차단하기

2025년 12월 30일


최근 React 관련 보안 취약점 **CVE-2025-55182**가 공개됐다. CVSS 점수 10점 크리티컬 이슈다.

  • 대상: react-server-dom-webpack 등 서버 컴포넌트(RSC) 관련 패키지 19.x 버전
  • Pre-authentication: 인증 없이 공격 가능
  • Remote Code Execution (원격 코드 실행): 서버에서 임의 명령 실행 가능 (DB 삭제, 데이터 탈취 등)
  • Unsafe Deserialization: 클라이언트 Payload를 서버가 검증 없이 객체로 변환하는 과정에서 악성 코드 실행

이 이슈를 보며 두 가지 문제가 드러났다.

  1. 의존성 지옥: 의존성이 복잡하게 얽혀 있다면 버전 업그레이드 자체가 큰일이다.
  2. 정보의 비대칭: 매일 쏟아지는 수많은 CVE를 개발자가 일일이 확인하는 건 불가능에 가깝다.

배포 파이프라인에서 위험한 버전이 감지되면 자동으로 배포를 멈춰주는 도구를 찾아보니 Trivy가 있었다.


Trivy란?

컨테이너 이미지와 파일 시스템을 검사하는 오픈소스 보안 스캐너다.

작동 원리

  1. 데이터베이스 동기화: NVD(미국 국립 취약점 DB) 등 전 세계 보안 DB를 실시간으로 가져온다.
  2. 스캔: Docker 이미지나 파일 시스템에서 두 가지를 확인한다.
    • OS 패키지: 리눅스 시스템 패키지 (OpenSSL, CURL 등)
    • 애플리케이션 의존성: package-lock.json, yarn.lock 등을 분석해 라이브러리 버전 확인.
  3. 매칭: 프로젝트 라이브러리 버전과 보안 DB의 취약점 정보를 대조해 경고를 출력한다.

위험도에 따른 Two-Track 대응 전략

Node.js 생태계 특성상 직접 설치하지 않은 하위 의존성에서 High 취약점이 발생하거나, 아직 패치가 나오지 않은 경우도 많다. 사소한 경고 하나 때문에 모든 배포가 막히면 개발 생산성이 떨어진다.

위험도(Severity)에 따라 대응 방식을 분리한다.

A. 차단

  • 대상: CRITICAL (CVSS 9.0~10.0)
  • 예시: Log4Shell, RCE, 이번 React 이슈 수준의 결함
  • 조치: 취약점 발견 시 배포 파이프라인 즉시 중단

B. 경고

  • 대상: HIGH, MEDIUM
  • 조치: 배포는 허용하되, 슬랙으로 리포트 전송
  • 목적: 서비스가 즉시 위험하지 않더라도 인지하고 일정 내에 수정하도록 유도

GitHub Actions 적용 코드

deploy.yml의 빌드 단계에 아래 코드를 추가한다. Trivy로 파일 시스템을 스캔하고, 결과를 텍스트 파일로 저장한 뒤 쉘 스크립트로 분기 처리하는 방식이다.

# ----------------------------------------------------------------
# Trivy 파일시스템 스캔 (fs)
# ----------------------------------------------------------------
- name: Run Trivy (Filesystem Scan)
  uses: aquasecurity/trivy-action@0.29.0
  with:
    scan-type: "fs"
    scan-ref: "."
    format: "table"
    output: "trivy-report.txt"
    exit-code: "0" # 일단 0으로 통과시키고, 뒤에서 쉘 스크립트로 직접 제어
    severity: "CRITICAL,HIGH,MEDIUM"
  env:
    TRIVY_DISABLE_VEX_NOTICE: "true"

# ----------------------------------------------------------------
# 결과 분석 및 알림 (Block or Notify)
# ----------------------------------------------------------------
- name: Analyze Trivy Results & Notify
  id: security_check
  run: |
    # 보고서 내용 읽기 (너무 길면 슬랙 전송 실패하므로 앞부분만 자름)
    REPORT=$(cat trivy-report.txt | head -c 2000)

    # [함수] 슬랙 전송용 함수
    send_slack() {
      local color=$1
      local icon=$2
      local message=$3
      
      jq -n \
        --arg username "$SLACK_USERNAME" \
        --arg icon "$icon" \
        --arg text "$message" \
        --arg report "$REPORT" \
        --arg color "$color" \
        '{
          username: $username,
          icon_emoji: $icon,
          text: $text,
          attachments: [{
            color: $color,
            title: "Trivy Scan Report",
            text: ("```" + $report + "```")
          }]
        }' > payload.json
      
      curl -X POST -H 'Content-type: application/json' --data @payload.json "$SLACK_WEBHOOK_URL"
    }

    # 1. 취약점 없음 (Total: 0)
    if grep -q "Total: 0" trivy-report.txt; then
      echo "No vulnerabilities found."
      exit 0
    fi

    # 2. CRITICAL 발견 -> 배포 차단 (Exit 1)
    # "CRITICAL: 0"은 무시하고, "CRITICAL: 1" 이상인 경우(숫자 1~9)만 잡는다
    if grep -E -q "CRITICAL: [1-9]" trivy-report.txt; then
      echo "Critical issues found!"
      send_slack "#ff0000" ":rotating_light:" "치명적인 보안 취약점(CRITICAL) 발견! 배포를 중단합니다."
      exit 1
    fi

    # 3. HIGH/MEDIUM 발견 -> 경고만 함 (Exit 0)
    if grep -E -q "HIGH: [1-9]|MEDIUM: [1-9]" trivy-report.txt; then
      echo "Non-critical issues found."
      send_slack "#ffcc00" ":warning:" "보안 경고(High/Medium)가 있습니다. (배포는 진행됨)"
      exit 0
    fi

Trivy의 자동 감지 능력

Trivy의 파일시스템(fs) 스캔 모드는 지정된 폴더(scan-ref: ".")를 스캔하면서 아래 파일들을 자동으로 탐지한다.

  • pnpm-lock.yaml
  • package-lock.json
  • yarn.lock
  • requirements.txt (Python)
  • pom.xml (Java)

특히 pnpm-lock.yaml 같은 Lock 파일은 pnpm의 트리 구조 덕분에 라이브러리의 전이 의존성(Transitive Dependency)이 전부 기록되어 있어, Trivy가 수천 개의 CVE 데이터베이스와 대조해 숨은 취약점까지 찾아낸다.


실제 적용 결과

Critical 이슈 발견 시 (배포 중단)

Trivy Critical 이슈 예시 (배포 중단 상황)

슬랙으로 "치명적인 보안 취약점 발견! 배포를 중단합니다" 알림이 오고, GitHub Actions가 실패 처리된다. 해당 이슈 URL 클릭 시 NVD 정보 페이지로 이동한다.

High/Medium 이슈 발견 시 (배포 진행)

Trivy High/Medium 경고 예시

배포는 정상적으로 진행되지만, 슬랙으로 경고 알림이 온다. GitHub Actions 로그에서 어떤 라이브러리가 문제인지 확인할 수 있다.


아무리 많이 쓰이는 메이저 라이브러리라도 언제든 취약점이 발견될 수 있다. 이를 인간이 직접 매일 체크하는 건 현실적으로 불가능하다. 보안 검사를 자동화해서 파이프라인에 심어두면 몰라서 지나치는 경우를 방지할 수 있다.