How Cloudflare responded to the "Copy Fail" Linux vulnerability
요약
Linux 커널의 'Copy Fail' 취약점(CVE-2026-31431)이 공개된 후, Cloudflare는 즉각적인 대응을 통해 서비스 안정성과 보안 무결성을 입증했습니다. 이 취약점은 `splice()` 시스템 호출과 암호화 API(`AF_ALG`)를 악용하여 페이지 캐시의 데이터를 오버플로우 방식으로 덮어쓰는 로컬 권한 상승(LPE) 공격이었습니다. Cloudflare는 사전에 패치를 통합하고 배포하는 체계적인 커널 업데이트 프로세스 덕분에, 취약점이 공개되었을 때 이미 대부분의 인프라가 수정된 LTS 버전을 사용하고 있었으며, 고객 데이터나 서비스 중단 없이 위협에 대응할 수 있었습니다.
핵심 포인트
- Cloudflare는 330개 도시에 분산된 대규모 Linux 인프라를 운영하며 커스텀 커널 빌드를 유지한다.
- 취약점은 `splice()` 시스템 호출과 암호화 API(`AF_ALG`)의 메모리 처리 과정에서 발생하는 Out-of-bounds Write 취약점을 이용한 LPE 공격이다.
- Cloudflare는 사전에 패치를 통합하고 배포하는 체계적인 커널 업데이트 및 테스트 파이프라인을 갖추고 있어, 제로데이 위협에 효과적으로 대응할 수 있었다.
- 공격자는 페이지 캐시를 조작하여 setuid-root 바이너리(`/usr/bin/su`)와 같은 중요한 시스템 파일을 오염시켜 권한 상승을 시도한다.
2026 년 4 월 29 일, "Copy Fail" (CVE-2026-31431)이라는 이름으로 공개된 Linux 커널 로컬 권한 상승 취약점이 공개되었습니다. Cloudflare 의 Security 및 Engineering 팀은 이 취약점이 공개되자마자 평가하기 시작했습니다. 우리는 공격 기법을 검토하고, 인프라 전반의 노출 정도를 평가했으며, 기존 행동 기반 탐지 기능이 몇 분 내에 공격 패턴을 식별할 수 있음을 검증했습니다.
Cloudflare 환경에는 영향을 미치지 않았으며, 고객 데이터가 위험에 처해있지 않았습니다. 또한 서비스도 어느 시점에서든 중단되지 않았습니다. 준비된 대응이 어떻게 효과를 발휘했는지 확인하세요.
Background
Our Linux kernel release process
Cloudflare 는 전 세계적으로 거대한 규모를 가진 Linux 서버 인프라를 운영하며, 데이터센터는 __330 개 도시__에 분산되어 있습니다. 이 규모의 업데이트를 효과적으로 관리하기 위해 커뮤니티의 Long-Term Support (LTS) 버전을 기반으로 커스텀 Linux 커널 빌드를 유지하고 있습니다. 언제든지 여러 LTS 버전 중 하나를 사용할 수 있으며, 예를 들어 6.12 또는 6.18 와 같은 다양한 시리즈에서 확장된 업데이트 기간을 제공합니다.
커뮤니티는 정기적으로 보안 및 안정성 업데이트를 병합하여 배포하며, 이는 약 한 주마다 새로운 내부 커널 빌드를 생성하는 자동화된 작업을 트리거합니다. 이러한 빌드는 전 세계 배포 전에 안정성을 보장하기 위해 스테이지 데이터센터에서 테스트됩니다. 성공적인 릴리스 후 Edge Reboot Release (ERR) 파이프라인은 4 주 사이클로 에지 인프라의 체계적인 업데이트 및 재부팅을 관리합니다. 제어 평면 인프라는 일반적으로 최신 커널을 채택하며, 재부팅은 특정 워크로드 요구 사항에 따라 일정으로 잡힙니다.
CVE 가 공개된 시점까지 필요한 수정은 이미 안정적 Linux LTS 릴리스에 통합되어 몇 주 동안 사용되었습니다. 우리가 확립한 절차에 따르면 이러한 패치가 이미 배포되어 있습니다.
"Copy Fail" 공개 당시, 우리 인프라의 대부분은 6.12 LTS 버전을 실행 중이었으며, 일부 머신은 새로운 6.18 LTS 릴리스로 전환하기 시작했습니다.
About the Copy Fail vulnerability
응답 스토리를 이해하기 전에 취약점을 이해하는 것이 도움이 됩니다. 상세한 글은 원래 Xint Code disclosure 포스트에서 찾을 수 있습니다.
AF_ALG and the kernel crypto API
Linux 커널의 내부 암호화 API 는 kTLS 와 IPsec 과 같은 기능을 관리합니다. 사용 공간 프로그램은 AF_ALG 를 통해 이 API 에 접근합니다.
socket family 를 통해 권한이 없는 프로세스가 암호화 또는 복호화를 요청할 수 있게 합니다. algif_aead 모듈은 인증된 암호화 (Authenticated Encryption) 와 추가 데이터 (Associated Data, AEAD) 암호기를 위해 이를 지원합니다.
권한이 없는 프로그램은 다음 단계를 따릅니다:
AF_ALGsocket 를 열고 AEAD 템플릿에 바인딩합니다.- 키를 설정하고 요청 소켓을 수용합니다.
sendmsg()또는splice()를 통해 입력을 제출합니다.recvmsg()를 사용하여 작업을 실행합니다.
splice() 시스템 호출이 여기서 결정적입니다. 페이지 캐시 참조를 전달하여 데이터를 이동시키기 때문입니다.
메모리 역학: 페이지 캐시 및 in-place crypto
page cache 는 파일 콘텐츠를 위한 공유 시스템 캐시입니다. setuid 바이너리에 속한 페이지를 수정하면 해당 페이지가 제거될 때까지 모든 사용자가 그 프로그램을 수정합니다.
암호 API 는 scatterlists 를 사용하며, 이는 다양한 메모리 페이지를 연결하는 구조물입니다. 2017 년 algif_aead는 in-place 작업을 위해 최적화되었으며, 목표 페이지와 참조 페이지를 연결했습니다. 이 설계는 의도된 경계를 넘어 알고리즘이 서술할 것을 방지하기 위한 강제력을 결여하고 있었습니다.
취약점: out-of-bounds write
사용자가 recvmsg() 를 실행하면, 커널의 authencesn 래퍼가 합법적인 출력 영역을 4 바이트 넘어서서 서술합니다:
scatterwalk_map_and_copy(tmp + 1, dst, assoclen + cryptlen, 4, 1);
splice() 를 사용하여 공격자는 목표 파일의 페이지 캐시 페이지를 scatterlist 에 연결할 수 있습니다. out-of-bounds 서술은 캐시된 파일을 오염시키며, 공격자가 수정될 파일, 오프셋 및 서술되는 특정 4 바이트를 제어할 수 있게 합니다. 이는 공격자가 다음을 조작할 수 있음을 의미합니다:
exploit 단계별
기본 exploit 은 거의 모든 배포에 존재하는 setuid-root 바이너리인 /usr/bin/su 를 목표로 합니다.
Cache Reference: O_RDONLY 로 /usr/bin/su 를 열고 read() 하여 페이지 캐시를 채웁니다. 파일 디스크립터에 splice() 를 사용하여 페이지 캐시 참조를 암호학 scatterlist 에 전달합니다.
Setup: 권한 없이도 AF_ALG socket 을 생성하고, authencesn(hmac(sha256),cbc(aes)) 에 바인딩하며, 키를 설정하고 요청 소켓을 수용합니다.
Write Construction: 각 4 바이트 shellcode 조각에 대해:
Trigger: recvmsg() 는 복호화를 시작합니다. authencesn 은 페이지 캐시에서 /usr/bin/su 의 목표 오프셋으로 스크래치 데이터를 서술합니다. 함수가 -EBADMSG 를 반환하더라도, 4 바이트 서술은 이제 글로벌 페이지 캐시에 있습니다.
Execution: execve("/usr/bin/su") 를 실행합니다.
tainted page cache 를 로드합니다. 바이너리가 setuid-root 로 설정되어 있으므로, 주입된 shellcode 는 root 권한으로 실행됩니다.
상류의 수정 (commit a664bf3d603d) 은 2017 년 in-place 최적화를 되돌려 exploit 을 제거합니다.
우리가 어떻게 대응했는지
위험이 공개되었을 때, 여러 작업 스트림이 병행되었습니다:
폭발 반경 매핑: 보안 팀은 kernel engineers 와 협력하여 어떤 kernel 버전이 취약한지 확인하고 잠재적인 노출을 평가했습니다.
커버리지 검증: 보안 팀은 exploit 기법을 검토하고, 기존 행동 기반 탐지들이 내부 검증 과정에서 exploit 패턴을 식별할 수 있는지 확인했습니다.
능동적 위협 사냥: 보안 팀은 공개되기 전에 취약점이 활용되었는지 찾기 위해 48 시간 동안 fleet-wide 로그를 검색하기 시작했습니다.
완화 공학: kernel engineers 는 생산 서비스를 깨뜨리지 않으면서 fleet 을 보호할 runtime mitigation 을 구축하기 시작했습니다.
소프트웨어 업데이트 계속: engineering teams 는 updated Linux kernel 을 제공하는 작업을 수행했으며, 이는 서버 전체에 걸쳐 신중하게 재부팅하고 배포하는 것을 필요로 했습니다.
이 대응 과정에서 고객 영향은 발생하지 않았습니다.
탐지 커버리지 검증
보안 팀의 첫 번째 작업 중 하나는 기존 endpoint detection 이 이 exploit 을 감지할 수 있는지 확인하는 것이었습니다. 서버는 프로세스 실행 패턴을 지속적으로 모니터링하는 행동 기반 탐지를 실행합니다. 특정 취약점에 대한 지식을 기반으로 하지 않으며, fleet 전체에 걸쳐 비정상적인 행동을 관찰합니다.
엔지니어들이 대응 과정에서 내부적으로 취약점을 검증했을 때, 탐지 플랫폼은 몇 분 안에 이를 플래그했습니다. 시스템은 전체 실행 체인을 연결했습니다 - 스크립트 인터프리터에서 시작하여 kernel 의 암호학적 하위 시스템을 거쳐 권한 상승 바이너리에 도달하는 것까지 - fleet-wide 행동 패턴에 기반하여 악성으로 플래그했습니다.
이것은 서명 업데이트 없이, 규칙 변경 없이, 인간 개입 없이 일어났습니다. 우리가 이 특정 Copy File exploit 에 대한 커스텀 로직을 작성하기 전에 이미 행동 기반 탐지 커버리지가 존재했습니다.
확인 작업은 중요했으며, 이는 취약점 특화 규칙을 작성하기 전에 커버리지 가 있음을 의미했습니다.
활용 사냥
공급망 공격 (Supply Chain Attack) 은 소프트웨어 개발 및 배포 과정에서 외부 의존성을 통해 악의적인 코드를 삽입하는 공격 방식입니다. 예를 들어, 오픈소스 라이브러리를 사용하는 경우 해당 라이브러리에 취약점이 존재하면 이를 악용할 수 있습니다.
이러한 공격은 초기 단계에서 발견하기 어렵습니다. 개발자가 직접 작성하지 않은 코드이기 때문에 보안 검토가 제대로 이루어지지 않았을 가능성이 높습니다.
따라서 공급망 공격 대응 시에는 다음과 같은 조치를 취해야 합니다:
- 의존성 관리 도구 (예: Dependabot, Snyk) 를 통해 정기적인 취약점 스캔 수행
- 업데이트를 받을 때 자동으로 설치하는 정책 적용
- 개발 환경과 프로덕션 환경 모두에서 테스트 코드 실행
- 공급망 공격 발생 시 즉시 중단하고 영향 범위 분석
공급망 공격은 시스템 전체에 영향을 줄 수 있으므로, 예방적 대응이 필수적입니다.
| 시간 (UTC) |
이벤트 |
| 2026-04-29 16:00 |
복사 실패 (Copy Fail) 공개披露됨. |
| 2026-04-29 ~21:00 |
보안 및 엔지니어링 팀은 Incident Response 프로세스 전체 발표 전, 플레트 노출 및 완화 옵션을 평가하기 시작함. |
| 2026-04-29 22:52 |
보안 팀은 기존 행동 기반 감지가 Copy Fail 공격 패턴을 포괄함을 확인함. 승인된 내부 검증 중, 감지는 몇 분 안에 해당 활동을 플래그로 표시함. |
| 2026-04-29 23:01 |
기존 행동 기반 감지는 유사 공격 활동에 대한 고중요성 경고를 생성하여, 해당 기법에 대한 감지 커버리지를 확인함. |
| 2026-04-29 (저녁) |
첫 번째 완화 시도가 스테이징 데이터센터로 배포됨. 배포 과정에서 의존성 충돌이 발생하여, 완화는 롤백됨. 프로덕션 시스템은 영향을 받지 않음. |
| 2026-04-29 (밤) |
엔지니어링 팀이 bpf-lsm 완화 프로그램을 작성함. |
| 2026-04-30 03:14 |
보안 사고가 교차 기능 협업 및 긴급성을 유도하기 위해 선언됨. 보안 팀은 Cloudflare 시스템에 악성 활동이 존재하지 않았음을 확인하기 위해 역사적 데이터를 플레트와이드 위협 호스팅을 수행함. |
| 2026-04-30 (아침) |
엔지니어링 팀이 bpf-lsm 완화 프로그램을 테스트하여 프로덕션 준비 완료함. |
| 2026-04-30 14:25 |
엔지니어링 사고가 완화 프로그램 및 Linux 패치 롤아웃을 조정하기 위해 선언됨. |
| 2026-04-30 ~17:00 |
결정: 이전 LTS 라인의 패치 빌드를 리부트 자동화를 통해 배포; 새 LTS는 가속화하지 않음; meantime bpf-lsm에 의존함. |
| 2026-04-30 (오후) |
가시성 파이프라인 (AF_ALG 소켓 사용의 eBPF 추적) 을 플레트와이드 배포함. 모든 합법적인 AF_ALG 사용자에게 완전한 그림을 제공함. |
| 2026-04-30 (저녁) |
bpf-lsm 완화 프로그램을 별도의 게이트를 통해 롤아웃하여 플레트를 완전히 완화함. 이전에 취약한 테스트 노드에서 끝까지 검증이 수행되어, 공격이 더 이상 작동하지 않음을 확인함. |
| 2026-05-04 (아침) |
리부트 자동화가 패치된 커널로 정상적인 속도로 재개됨. |
| 2026-05-04 이후 |
주말에 리부트 자동화를 통해 이미 통과한 서버들이 패치된 커널을 받기 위해 수동으로 리부트함. 패치되지 않은 서버는 우리 일반적인 리부트 자동화 기준 업데이트됨. |
이 그래프는 완화 프로그램이 인프라를 통해 진행하는 과정의 진척도를 보여줌.
우리는 어떻게 이를 완화했나요?
패치된 Linux 커널을 배포하는 데 걸리는 긴 시간대 때문에, 우리는 리부트를 하지 않고도 이 공격을 완화하는 것을 추구함.
모듈 제거
AI 자동 생성 콘텐츠
본 콘텐츠는 HN AI Posts의 원문을 AI가 자동으로 요약·번역·분석한 것입니다. 원 저작권은 원저작자에게 있으며, 정확한 내용은 반드시 원문을 확인해 주세요.
원문 바로가기