피드로 돌아가기
Node.js Test CI Security Incident
Node.js BlogNode.js Blog
DevOps

Node.js 프로젝트가 CI 빌드 트리거와 코드 체크아웃 사이의 Time-of-Check-Time-of-Use(TOCTOU) 취약점을 Git commit SHA 검증으로 해결해 24대 손상된 호스트를 격리 및 재구축

Node.js Test CI Security Incident

2025년 4월 23일8advanced

Context

Node.js Jenkins CI 시스템이 Git 참조(refs/pull/<pr_id>/head)를 사용하면서 CI 빌드 트리거 후 공격자가 pull request를 변조할 수 있는 TOCTOU 취약점을 가지고 있었다. 이 취약점을 악용하면 request-ci 또는 commit-queue 레이블을 통해 승인되지 않은 코드 변경이 메인라인에 병합될 수 있었다.

Technical Solution

  • Jenkins CI 접근 제어 강화: 새로운 Jenkins CI 실행 시작 권한을 제한해 추가 손상 방지
  • Commit SHA 기반 검증 로직 도입: 모든 pull request에 대해 Jenkins 작업이 체크아웃된 코드의 SHA를 예상 SHA와 비교 후 일치할 때만 진행
  • request-ci 및 commit-queue 레이블 동작 변경: 날짜 비교 대신 검증된 commit SHA에 의존하도록 수정
  • 140개 Jenkins 작업 감사 및 수정: 자주 사용되는 작업부터 우선 취약점 검사 및 패치 적용
  • GitHub 워크플로우 보안 강화: 유사한 공격에 취약한 워크플로우 임시 비활성화 후 패치 및 재활성화
  • 손상된 호스트 재구축: 24대의 손상된 머신을 Jenkins에서 제거 후 완전히 재구축

Impact

2025년 3월 21일부터 4월 1일까지 약 11일에 걸쳐 인시던트 대응 완료. 140개 Jenkins 작업 중 대부분이 commit SHA 검증으로 업데이트됨. 2025년 4월 15일 이전에 개발 인프라 완전 복구 예정.

Key Takeaway

CI/CD 시스템에서 권한 검증과 코드 체크아웃 사이의 시간 간격을 제거하거나 암호화 검증(예: commit SHA)으로 보호해야 한다. 자동 빌드 트리거 시스템은 commit 레벨의 불변 식별자로 코드 무결성을 보장해야 한다.


Jenkins, GitHub Actions 등 CI/CD를 운영하는 팀에서 pull request 기반 자동화 작업을 설정할 때, Git 참조 대신 구체적인 commit SHA를 사용하고 빌드 시작 시점에 승인 상태를 고정하는 방식을 적용하면 TOCTOU 취약점으로 인한 무단 코드 실행을 방지할 수 있다.

원문 읽기