Linux Kernel · Security · CVE-2026-31694

FUSE 디렉터리 캐시: 남은 공간과 전체 용량은 다릅니다

다음 페이지로 옮긴다고 큰 레코드가 작아지지는 않습니다. 이 경계 오류에서는 한 엔트리가 페이지 한 장에 들어가는지 확인하는 검사가 빠져 있었습니다.

검사해야 할 두 크기

FUSE는 사용자 공간 파일 시스템 서버의 응답을 커널에서 처리합니다. CVE-2026-31694의 대상은 fs/fuse/readdir.c의 fuse_add_dirent_to_cache()입니다. 기존 코드는 엔트리가 현재 페이지의 남은 공간보다 크면 새 페이지로 이동했지만, 엔트리 자체가 PAGE_SIZE를 넘는지는 검사하지 않았습니다. 수정은 한 페이지에 담을 수 없는 엔트리를 캐시에 복사하기 전에 거부합니다.

서로 다른 두 판단: 페이지 전체에 들어가는가, 현재 남은 곳에 들어가는가
  1. 전체 레코드 길이와 페이지 용량을 비교합니다. 페이지보다 크면 캐시에 복사하지 않습니다.

  2. 한 페이지에 들어가는 레코드라도 현재 남은 공간이 부족하면 새 페이지가 필요합니다.

  3. 복사는 검증된 페이지 범위 안에서 이루어져야 합니다. 페이지 이동만으로 길이 검사를 대신하지 않습니다.

Linux 커널 CVE 공지

공식 결함과 연구자의 영향 사례를 구분합니다

2026년 5월 1일 커널 공지는 4 KiB 페이지에서 직렬화된 4,120 B 레코드가 24 B를 초과해 쓰는 사례를 설명합니다. 이것은 페이지 경계 오류의 확인이며, 모든 시스템에서 같은 권한 상승이 가능하다는 판정은 아닙니다.

Stanley Shaw는 자신의 연구 환경에서 읽기 전용 파일의 메모리 내 페이지 캐시를 바꿔 로컬 권한을 높인 사례를 보고했습니다. 이는 연구자에게 귀속한 결과이며 이 글에서 독립 재현하지 않았습니다. 디스크에 저장된 파일 변경과 메모리 캐시 손상은 같은 사건이 아닙니다. 공격 코드·배치 도식·재현 절차는 다루지 않습니다.

연구자의 원인 분석과 영향 보고

실제 커널 패키지로 수정 여부를 확인합니다

커널 공지는 6.6.136·6.12.84·6.18.25·7.0.2·7.1-rc1의 수정 지점을 열거합니다. 이것을 모든 배포판에 공통인 취약 버전 구간으로 읽으면 안 됩니다. 코드 도입 시점과 각 배포판에서 문제가 도달 가능한 시점도 구분해야 합니다.

2026년 10월 27일 확인한 Ubuntu 공지에는 커널 패키지·릴리스에 따라 Fixed·Vulnerable·Not affected가 함께 표시됩니다. 같은 배포판 이름만으로 다른 커널 계열의 상태를 대신할 수 없습니다. 설치한 패키지와 실제 실행 중인 커널을 확인하고, 공급자의 보안 공지에서 해당 계열의 수정 패키지를 찾으십시오. 업데이트 후에는 수정된 커널이 실행 중인지 확인합니다.

Ubuntu 패키지별 상태 · Debian 상태 확인 링크

블록 무결성과 메모리 경계 검사는 별개입니다

dm-verity는 블록 장치 데이터를 읽을 때 암호학적 해시로 무결성을 검사합니다. 이미 읽은 페이지 캐시의 바이트를 CPU가 접근할 때마다 다시 검증하는 기능으로 해석해서는 안 됩니다. 저장 장치의 무결성 검사가 커널의 모든 런타임 메모리 오류를 대신 막아 주지는 않습니다.

코드 검토에서는 외부 길이가 버퍼의 전체 용량 안에 있는지와 현재 남은 공간에 들어가는지를 별도로 확인합니다. 이 글의 흐름도는 이 두 판단을 설명하기 위한 자체 도식이며, 공격 메모리 배치나 완전한 커널 구현을 나타내지 않습니다.

커널 dm-verity 문서