Reddit

Linux Patched For Silent User-Space Data Loss Bug That's Existed Since 2023

Linux, 2023년부터 존재한 '조용한' 유저스페이스 데이터 유실 버그 패치

Linux 커널에서 transparent hugepage(THP)와 cgroup 메모리 제한이 함께 쓰이는 환경에서 MADV_FREE 이후의 쓰기가 통째로 유실될 수 있는 버그가 수정됐습니다. 이 버그는 2023년 7월에 도입돼 Linux 6.6 이후 모든 커널에 존재했으며, Polars 라이브러리 사용자가 프로덕션 환경에서 실제 데이터 손실을 겪으며 드러났습니다. 수정은 단 한 줄의 코드 변경으로 이뤄졌습니다.

본문

Linux 7.3-rc3 릴리스 직후 x86/urgent 머지의 일부로 중요한 수정이 커널에 반영됐습니다. 지난 3년간 커널에 존재해 온, 유저스페이스의 데이터를 아무런 경고 없이 유실시키는 버그를 고치는 패치입니다. 이달 초 버그 리포트와 함께 문제를 재현할 수 있는 작은 C 프로그램이 공개되면서 수정 작업이 시작됐습니다.

버그가 발생하는 조건

이 버그는 커널에서 transparent hugepage(THP)가 활성화돼 있고, 동시에 cgroup 메모리 제한이 적용된 상태일 때 발동합니다. 이런 환경에서 프로세스가 MADV_FREE를 호출한 뒤 수행한 쓰기가 완전히 사라질 수 있습니다. MADV_FREE는 해당 메모리 영역을 더 이상 필요 없다고 커널에 알려 reclaim 대상으로 만드는 힌트인데, 여기에 transparent hugepage 사용과 심한 메모리 reclaim 압박이라는 조합이 정확히 맞아떨어져야 버그가 트리거됩니다. 즉 세 가지 조건 — THP 사용, MADV_FREE 사용, 강한 메모리 회수 압박 — 이 모두 충족돼야 데이터 유실이 발생하는 구조입니다.

프로덕션에서 확인된 실제 피해

이 버그는 이론적 가능성에 그치지 않습니다. 데이터 분석 라이브러리인 Polars의 사용자들이 프로덕션 환경에서 이 커널 버그로 인한 데이터 손실을 실제로 발견한 사례가 보고됐습니다. 에러나 경고 없이 쓰기가 유실되는 '조용한(silent)' 형태의 버그이기 때문에, 발견하기까지 시간이 걸렸고 피해가 누적됐을 가능성이 있습니다. 메모리 부족 상황에서 커널이 페이지를 회수하는 과정과 유저스페이스의 madvise 힌트 처리가 얽히면서 쓰기 데이터가 보존되지 못한 것으로 보입니다.

단 한 줄의 수정과 백포트

다행히 수정 자체는 단 한 줄의 코드 변경으로 이뤄졌습니다. 패치는 이번 주 x86/urgent 머지에 포함돼 메인라인에 들어갔고, 현재 지원 중인 stable 커널 시리즈로의 백포트도 예정돼 있습니다. 버그는 2023년 7월에 도입됐으며 Linux 6.6부터 릴리스된 커널에 계속 존재해 왔습니다. 컨테이너·cgroup 기반으로 메모리 제한을 걸어 운영하는 서버 환경에서 THP를 쓰고 있다면, stable 백포트가 내려오는 대로 커널 업데이트를 검토할 필요가 있습니다.

Reddit 반응

  • @u/yrro — 'THP가 활성화돼 있고 cgroup 제한 아래에서 동작할 때 MADV_FREE 호출 이후의 쓰기가 완전히 유실될 수 있다'는 본문 문장을 인용하며 'oof'라고 경악을 표했습니다. THP와 cgroup 제한이 동시에 적용된 환경 — 전형적인 컨테이너 서버 환경 — 에서 데이터가 조용히 사라진다는 조건의 위험성에 반응한 것입니다.

원문: Phoronix / 번역·요약: Trawling