구독해서 새 게시물에 대한 알림을 받으세요.

2025년 12월 5일 Cloudflare 서비스 중단

2025-12-05

5분 읽기

2025년 12월 5일 8시 47분 UTC(본 블로그의 모든 시간은 UTC 기준임)에, Cloudflare 네트워크의 일부에서 심각한 장애가 발생하기 시작했습니다. 이 사고는 09시 12분에 해결되어(영향받은 총 시간, 약 25분) 모든 서비스가 완전히 복구되었습니다.

일부 고객이 영향을 받았으며, 이는 Cloudflare에서 처리하는 전체 HTTP 트래픽의 약 28%에 해당합니다. 개별 고객이 아래와 같이 영향을 받으려면 여러 요인이 결합되어야 합니다.

이번 문제는 Cloudflare의 시스템에 대한 사이버 공격이나 어떠한 종류의 악의적인 활동에 의해 직접적 또는 간접적으로 야기된 것이 아닙니다. 대신 이번 주에 공개된 React Server Components에서 업계 전반의 취약점을 감지하고 완화하려고 당사에서 시도하는 동안 본문 구문 분석 로직에 대하여 수행된 변경 사항에 의해 트리거되었습니다.

Cloudflare 시스템의 중단은 결코 용납할 수 없는 일이며, 저희는 11월 18일 사고 이후 다시 인터넷이 다운되었다는 것을 잘 알고 있습니다. 이러한 유형의 사고가 발생하지 않도록 Cloudflare에서 수행하는 작업에 대한 세부 정보를 다음 주에 게시할 예정입니다.

사건 발생 과정

아래 그래프에는 사고 기간 동안 네트워크에서 발생한 HTTP 500 오류(하단의 빨간색 선)와 영향을 받지 않은 총 Cloudflare 트래픽(상단의 녹색 선)이 나와 있습니다.

500 error codes served by Cloudflare’s network during the incident

Cloudflare의 웹 애플리케이션 방화벽(WAF)은 고객에게 악의적인 페이로드에 대한 보호를 제공하여, 이를 탐지하고 차단할 수 있도록 합니다. 이를 위해 Cloudflare 프록시는 HTTP 요청 본문 콘텐츠를 분석을 위해 메모리에 버퍼링합니다. 오늘 이전에는 버퍼 크기가 128KB로 설정되었습니다.

중요한 취약점인 CVE-2025-55182로부터 React를 사용하는 고객을 보호하기 위한 지속적인 작업의 일환으로 당사에서는 최대한 많은 고객을 보호할 수 있도록 버퍼 크기를 Next.js 애플리케이션에서 허용하는 기본 제한인 1MB로 늘렸습니다.

이 첫 번째 변경 사항은 우리의 단계적 배포 시스템을 통해 롤아웃되고 있었습니다. 배포 진행 중에, 내부 WAF 테스트 도구가 증가한 버퍼 크기를 지원하지 않는다는 것을 발견했습니다. 이 내부 테스트 도구는 당시 필요하지도 않았고 고객 트래픽에도 영향을 주지 않았기 때문에, 우리는 두 번째 변경을 통해 해당 도구를 비활성화했습니다.

WAF 테스트 도구를 비활성화하는 이 두 번째 변경은 우리의 글로벌 구성 시스템을 통해 이루어졌습니다. 이 시스템은 점진적인 롤아웃 방식을 사용하지 않고 변경 사항을 수 초 내에 네트워크 내 전체 서버에 전파하며, 11월 18일에 발생한 서비스 중단으로 인해 현재 검토가 진행 중입니다. 

안타깝게도, 우리의 FL1 버전 프록시에서는 특정 상황에서 WAF 룰 테스트 도구를 비활성화하는 두 번째 변경이 오류 상태를 유발하여 네트워크에서 500 HTTP 오류 코드가 반환되는 문제가 발생했습니다.

해당 변경 사항이 Cloudflare 네트워크에 전파되자마자, FL1 프록시에서 실행된 코드가 규칙 모듈의 버그에 도달하여 다음과 같은 Lua 예외로 이어졌습니다.

[lua] Failed to run module rulesets callback late_routing: /usr/local/nginx-fl/lua/modules/init.lua:314: attempt to index field 'execute' (a nil value)

HTTP 코드 500 오류 발생.

이 문제는 변경 사항이 적용된 직후에 확인되었으며, 09:12에 변경 사항을 되돌린 후 모든 트래픽이 정상적으로 처리되었습니다.

영향을 받은 고객은 저희 기존 FL1 프록시를 통해 웹 자산이 제공되고 아울러 Cloudflare 관리 규칙 집합이 배포된 고객이었습니다. 이 상태에 있는 웹 사이트에 대한 모든 요청은 /cdn-cgi/trace와 같은 소규모 테스트 엔드포인트를 제외하고 HTTP 500 오류를 반환했습니다.

위에 언급된 구성이 적용되지 않은 고객은 영향을 받지 않았습니다. 당사의 중국 네트워크에서 처리하는 고객 트래픽 또한 영향을 받지 않았습니다.

런타임 오류

Cloudflare의 규칙 집합 시스템은 시스템에 들어오는 각 요청에 대해 평가되는 규칙들의 집합으로 이루어져 있습니다. 각 규칙은 일부 트래픽을 선택하는 필터와, 해당 트래픽에 효과를 적용하는 동작으로 구성됩니다. 일반적인 동작은 '차단', '로그', '건너뛰기' 입니다. 또 하나의 동작은 다른 규칙 집합의 평가를 트리거하는 데 사용되는 '실행'입니다.

저희 내부 로깅 시스템에서는 이 기능을 사용하여 새로운 규칙을 공개하기 전에 평가합니다. 최상위 규칙 집합은 테스트 규칙을 포함하는 다른 규칙 집합을 실행합니다. 저희가 비활성화하려고 시도했던 것은 바로 이러한 테스트 규칙이었습니다.

저희는 오동작하는 규칙을 신속하게 비활성화할 수 있도록 하는 킬 스위치 하위 시스템을 규칙 집합 시스템의 일부로 도입했습니다. 이 킬 스위치 시스템은 이전 섹션에서 언급한 글로벌 구성 시스템으로부터 정보를 받습니다. 저희는 과거에 여러 차례 이 킬 스위치 시스템을 사용하여 사고를 완화했으며, 이번 사고에서는 잘 정의된 표준 운영 절차를 준수했습니다.

그러나, 'execute' 동작을 가진 규칙에 킬 스위치를 적용한 적은 없습니다. 킬 스위치가 적용되었을 때, 코드는 실행 동작 평가를 제대로 건너뛰었으며, 해당 동작이 가리키는 하위 규칙 집합을 평가하지 않았습니다. 그러나 규칙 집합을 평가한 전체 결과를 처리하는 중 오류가 발생했습니다.

if rule_result.action == "execute" then
  rule_result.execute.results = ruleset_results[tonumber(rule_result.execute.results_index)]
end

이 코드는 규칙 집합에 action="execute"가 있는 경우 "rule_result.execute" 개체가 존재할 것으로 예상합니다. 그러나 규칙이 건너뛰어졌기 때문에 rule_result.execute 개체가 존재하지 않았고, Lua는 nil 값에서 값을 찾으려고 시도하여 오류를 반환했습니다.

이는 코드의 명백한 오류로, 여러 해 동안 감지되지 않고 존재했습니다. 강력한 타입 시스템을 갖춘 언어에서는 이런 오류가 발생하지 않습니다. Rust로 작성한 새로운 FL2 프록시에서 이 코드를 교체했을 때에는 해당 오류가 발생하지 않았습니다.

2025년 11월 18일 사건 이후 변경된 사항은 무엇일까요?

저희는 관련 없는 변경을 수행하여 2주 전 2025년 11월 18일에 비슷하고 더 긴 가용성 사고가 초래되었습니다. 두 경우 모두 고객의 보안 문제를 완화하기 위한 배포가 전체 네트워크에 적용되어 전체 네트워크에 영향을 미쳤고, 결과적으로 거의 모든 고객에게 오류가 발생했습니다.

해당 사고 이후 수백 명의 고객과 직접 소통하며, 단일 업데이트로 인해 이처럼 광범위한 영향이 발생하지 않도록 변경할 계획을 공유했습니다. 저희는 이러한 변경 사항이 금일 발생한 사고의 영향을 방지하는 데 도움이 되었을 것이라고 생각하지만, 안타깝게도 아직 배포를 완료하지 못했습니다.

아직 이 작업이 완료되지 않아 실망하고 계실 것을 알고 있습니다. 이는 조직 전체에 걸쳐서 계속해서 우리가 추구할 최우선 과제입니다. 특히, 이하 설명하는 프로젝트는 이러한 종류의 변경 사항의 영향을 억제하는 데 도움이 될 것입니다.

  • 향상된 롤아웃 및 버전 관리: 엄격한 상태 유효성 검사를 통해 소프트웨어를 점진적으로 배포하는 방식과 유사하게, 빠른 위협 대응 및 일반적인 구성을 위해 사용되는 데이터 역시 동일한 안전 및 피해 완화 기능을 갖춰야 합니다. 여기에는 상태 유효성 검사, 빠른 롤백 기능 등이 포함됩니다.

  • 간소화된 브레이크 글래스 기능: 추가적인 유형의 오류가 발생하더라도 중요 작업을 계속 수행할 수 있도록 보장합니다. 이는 내부 서비스는 물론 모든 Cloudflare 고객이 사용하는 Cloudflare 제어판과의 모든 표준 상호 작용 방식에도 적용됩니다.

  • '장애 개방' 오류 처리: 복원력 강화의 일환으로, 모든 주요 Cloudflare 데이터 영역 구성 요소에서 잘못 적용된 하드 페일 로직을 교체하고 있습니다. 구성 파일이 손상되었거나 범위를 벗어난 경우(예: 기능 제한 초과), 시스템은 오류를 기록하고 요청을 삭제하는 대신 신뢰할 수 있는 상태로 기본 설정하거나 점수 없이 트래픽을 전달합니다. 일부 서비스는 특정 시나리오에서 고객에게 장애 개방 또는 폐쇄 옵션을 제공할 수 있습니다. 여기에는 이러한 사항이 지속적으로 시행되도록 보장하기 위한 드리프트 방지 기능이 포함됩니다.

다음 주가 끝나기 전에 위에 나열된 프로젝트를 포함하여 진행 중인 모든 복원력 프로젝트에 대한 자세한 분석을 게시할 예정입니다. 해당 작업이 진행되는 동안, 당사에서는 다시 시작하기 전에 더 나은 완화 및 롤백 시스템을 확보하기 위해 네트워크에 대한 모든 변경 사항을 통제하고 있습니다.

이러한 종류의 사고와 이들이 얼마나 밀접하게 클러스터링되어 있는지는 당사와 같은 네트워크에서는 허용되지 않습니다. 이 사고로 인해 고객과 인터넷에 끼친 영향과 어려움에 대해 Cloudflare 팀을 대표하여 다시 한 번 사과의 말씀을 전합니다.

일정

시간(UTC)

상태

설명

08:47

사고 시작

구성 변경 사항이 네트워크에 배포 및 전파됨

08:48

최대 영향

변경 사항이 완전히 전파됨

08:50

사고 발생 선언됨

자동화된 알림

09:11

변경 사항이 되돌려짐

구성 변경 사항이 롤백되었으며 전파가 시작됨

09:12

사고 종료

완전 롤백됨, 모든 트래픽 복구 완료

Cloudflare에서는 전체 기업 네트워크를 보호하고, 고객이 인터넷 규모의 애플리케이션을 효과적으로 구축하도록 지원하며, 웹 사이트와 인터넷 애플리케이션을 가속화하고, DDoS 공격을 막으며, 해커를 막고, Zero Trust로 향하는 고객의 여정을 지원합니다.

어떤 장치로든 1.1.1.1에 방문해 인터넷을 더 빠르고 안전하게 만들어 주는 Cloudflare의 무료 애플리케이션을 사용해 보세요.

더 나은 인터넷을 만들기 위한 Cloudflare의 사명을 자세히 알아보려면 여기에서 시작하세요. 새로운 커리어 경로를 찾고 있다면 채용 공고를 확인해 보세요.
중단사후

X에서 팔로우하기

Dane Knecht|@dok2001
Cloudflare|@cloudflare

관련 게시물