NGINX Rift: 18년 묵은 버그와 버려진 인그레스 컨트롤러 이야기

|Operation Risk|10분 읽기

조용한 금요일 오후에 터진 폭탄

지난 5월 13일, CVE-2026-42945라는 보안 취약점이 공개됐습니다. NGINX Rift라는 이름이 붙은 이 버그는 CVSS 9.2점으로 심각 등급입니다. 그런데 정작 문제는 이 버그 자체가 아니라, 패치를 받을 수 없다는 사실이었습니다.

쿠버네티스 프로젝트는 6개월 전인 2026년 3월에 ingress-nginx 지원을 종료했거든요. 저장소는 보관 처리되어 읽기 전용이 됐고, 새로운 패치는 더 이상 나오지 않습니다. 하필이면 이 타이밍에 18년 묵은 버그가 세상에 드러났습니다.

18년간 숨어있던 힙 버퍼 오버플로우

NGINX Rift는 2008년 NGINX 0.6.27 버전부터 존재해온 버그입니다. ngx_http_rewrite_module에서 발생하는 힙 버퍼 오버플로우로, 거의 20년 가까이 아무도 몰랐던 셈이죠.

버그의 동작 원리는 이렇습니다. NGINX 리라이트 엔진은 두 단계로 실행되는데, 첫 번째에서는 메모리 크기를 계산하고 두 번째에서는 실제 데이터를 기록합니다. 문제는 두 단계에서 계산하는 길이가 달라질 수 있다는 점입니다.

리라이트 지시문의 대체 문자에 물음표가 포함되면서 캡처 재참조가 일어날 때, 길이 계산 로직에서 실수가 발생합니다. +, %, & 같은 문자가 URL 인코딩되면서 1바이트에서 3바이트로 확장되는데, 이때 할당된 버퍼 범위를 넘어서 데이터를 쓰게 됩니다.

결과적으로 워커 프로세스가 다운되고, ASLR이 비활성화된 환경에서는 원격 코드 실행도 가능합니다. 다행히 최신 시스템에서는 RCE보다는 지속적인 서비스 거부 공격(DoS)이 더 현실적인 위험이긴 하지만요.

패치는 있는데 받을 곳이 없다

정작 아이러니한 건 패치 자체는 간단하다는 점입니다. 공식 NGINX는 같은 날 1.30.1과 1.31.0 버전으로 수정 사항을 배포했거든요. NGINX Plus도 패치된 버전들이 나왔습니다.

하지만 kubernetes/ingress-nginx를 찾아보면 v1.15.1이 마지막 릴리스입니다. 취약한 코드가 그대로 들어있고, 새로운 버전은 나오지 않을 예정입니다.

이게 바로 오픈소스 생태계의 함정입니다. 자원봉사자들이 수년간 프로젝트를 유지 관리해왔는데, 정작 이 컨트롤러로 수익을 내는 벤더들은 기여를 하지 않았습니다. 결국 유지 관리자들이 지쳐 떠나면서 프로젝트가 종료됐고, 이제 같은 벤더들이 패치를 유료로 판매하고 있는 상황입니다.

HeroDevs와 상업적 해결책

HeroDevs는 프로젝트 종료 한 달 만인 4월에 'NES(Never Ending Support)'를 발표했습니다. ingress-nginx v1.15.1을 기반으로 한 상용 포크입니다.

이번 CVE-2026-42945에 대해서도 빠르게 대응했습니다. 업스트림 NGINX 1.30.1 수정 사항을 가져와서 ingress-nginx 빌드에 적용하고, VEX 문서로 CVE 스캐너가 해결된 것으로 인식하도록 했습니다.

오픈소스 관리자가 이 작업을 하는 데 걸리는 시간은 0시간입니다. 애초에 오픈소스 관리자라는 사람이 없으니까요.

가격은 공개되지 않았고 "영업팀 문의"라고만 되어 있습니다. HeroDevs는 AngularJS, Node.js, .NET, Spring 등 지원 종료된 프로젝트들에 대해 유료 평생 지원을 제공하는 비즈니스 모델을 운영하고 있습니다.

실제 운영 환경에서의 충격

규제 대상 산업에서는 상황이 더욱 심각합니다. FDA 규정을 준수하는 병원 환자 모니터링 시스템 같은 경우, 지원 종료된 소프트웨어를 L7 데이터 경로에서 실행하는 것은 SOC 2에서 자동으로 지적되는 사항입니다.

PCI-DSS, ISO 27001, HIPAA도 마찬가지고, FDA Class II 의료기기나 EU MDR Class IIa에서는 더욱 엄격합니다. 사이버 보안 위험 파일에 알려진 취약점을 반드시 포함해야 하는데, CVE-2026-42945는 이제 모든 ingress-nginx 1.15.1 배포 환경의 공식적인 취약점이 됐습니다.

감사관들은 "커뮤니티를 기다리자"라는 계획에는 관심이 없습니다. 실행 가능한 시정 계획이 있는지만 봅니다.

현실적인 대응 방안들:

  • HeroDevs NES: 상용이지만 감사 방어력까지 확보
  • Gateway API 마이그레이션: 엔지니어링 프로젝트, 몇 주 소요
  • 인그레스 컨트롤러 교체: Traefik, F5 상용 버전, HAProxy, Cilium 게이트웨이 등
  • 프런트엔드 WAF: Cloudflare, Akamai, AWS WAF로 임시 완화

이건 예외가 아닌 패턴입니다

최근 몇 년간 비슷한 일들이 계속 반복되고 있습니다.

Redis(2024): 라이선스 변경 → 커뮤니티가 Valkey로 포크 Elasticsearch(2021): 라이선스 변경 → AWS가 OpenSearch 포크 Terraform(2023): 라이선스 변경 → 커뮤니티가 OpenTofu 포크 MongoDB(2018): SSPL 도입으로 클라우드 관리형 서비스 견제

Ingress NGINX는 메커니즘은 다르지만 결과는 같습니다. 커뮤니티가 지쳐 떠나고, 클라우드 네이티브 세계 절반이 사용하는 인프라가 "당신의 문제"가 됐습니다.

중요한 건 개별 사건이 아니라 패턴입니다. 중요한 오픈소스 프로젝트에는 제도적 면역 체계가 없습니다. 자원봉사자가 지쳐 쓰러지면 사용자가 대가를 치러야 합니다.

영향 범위 확인하기

모든 쿠버네티스 환경이 위험한 건 아닙니다. 당황하기 전에 현재 상황을 확인해보세요.

영향 없음:

  • AWS 로드 밸런서 컨트롤러 (ALB는 NGINX 사용 안함)
  • EKS 앞 AWS API Gateway
  • Istio, Traefik, HAProxy, Contour, Cilium Gateway

영향 있음:

  • kubernetes/ingress-nginx v1.15.1
  • F5 상용 NGINX Ingress Controller 일부 버전 (이미 패치 배포됨)

문제는 Datadog 조사에 따르면 클라우드 네이티브 환경의 50% 정도가 여전히 ingress-nginx를 사용하고 있다는 점입니다. 쿠버네티스 운영위원회가 5개월 전에 종료를 발표했지만, 대부분의 팀이 마이그레이션을 완료하지 못한 상황입니다.

진짜 걱정거리는 다음 CVE입니다

CVE-2026-42945 자체는 6주 내에 대부분 해결될 겁니다. 하지만 다음 CVE는 어떻게 할까요?

NGINX 리라이트 모듈은 이제 전 세계 클라우드 네이티브 배포 환경 절반에 걸쳐 방치된 C 코드베이스로 남아 있습니다. 실제로 2026년 5월 릴리스에서만 동일한 소스 파일에서 4개의 메모리 손상 버그가 발견됐고, CVE-2026-9256이라는 다섯 번째 버그도 추가됐습니다.

여섯 번째도 있을 거고, 일곱 번째도 나올 겁니다.

문득 이런 생각이 듭니다. 오픈소스 인프라는 결코 공짜가 아니구나. 누군가는 항상 비용을 지불하고 있었는데, 지금까지는 자원봉사자들의 시간이었고, 이제부터는 우리의 몫이 됐습니다.

#쿠버네티스#NGINX#보안취약점#인그레스컨트롤러#DevOps