
CVE-2026-31694용 수동적 Linux 호스트 취약점 스캐너: 실행 중인 커널, FUSE 구성, 패키지 메타데이터 및 패치 증거를 확인한 다음 맞춤형 완화 지침을 생성합니다.
Linux 호스트를 수동 평가하는 도구로, Linux 커널의 FUSE readdir-cache out-of-bounds write 취약점인 CVE-2026-31694를 대상으로 합니다.
이 스캐너는 실행 중인 커널, FUSE 노출 범위, 로컬 패키지 메타데이터, 커널 소스 증거, 실행 환경, 운영체제 계열을 평가합니다. 호스트가 영향을 받을 수 있는 경우, 감지된 배포판에 맞춰 완화 가이드를 생성합니다.
저자: Aung Myat Thu [w01f]
cve_2026_31694_scanner.py는 로컬에서 실행되는 비악용(non-exploit) 취약점 평가 유틸리티입니다.
영향을 받는 FUSE 코드 경로를 트리거하여 취약점을 확인하지는 않습니다. 대신 여러 수동적 지표를 결합합니다:
CONFIG_FUSE_FS 커널 구성;/dev/fuse 존재 여부 및 현재 사용자 접근 권한;결과는 악용 기반 증명이 아닌 노출 평가입니다.
CVE-2026-31694는 Linux 커널 FUSE readdir 캐시에 영향을 줍니다.
취약한 로직은 서버가 제어하는 이름 길이에서 디렉터리 항목의 직렬화된 크기를 계산한 다음, 해당 레코드를 단일 페이지 캐시 페이지에 복사합니다. 이름 길이가 4095인 디렉터리 항목은 직렬화된 크기가 4120바이트가 될 수 있습니다.
4096바이트 페이지를 사용하는 시스템에서 이 레코드는 한 페이지를 24바이트 초과합니다.
상류 수정은 캐시 복사가 발생하기 전에 단일 페이지에 들어갈 수 없는 디렉터리 레코드를 거부합니다.
fs/fuse/readdir.c fuse_add_dirent_to_cache()
### 스캐너 기준 데이터
스캐너에는 다음과 같은 업스트림 안정 버전 수정 기준이 포함되어 있습니다:
| 커널 시리즈 | 수정 기준 |
|---|---:|
| 5.10 | 5.10.258 |
| 5.15 | 5.15.209 |
| 6.1 | 6.1.175 |
| 6.6 | 6.6.136 |
| 6.12 | 6.12.84 |
| 6.18 | 6.18.25 |
| 7.0 | 7.0.2 |
| Mainline | 7.1 이상 |
이러한 버전은 평가 입력 중 하나로 사용됩니다. 배포판 공급업체가 수정 사항을 백포트하면서도 이전 업스트림 버전 번호를 유지할 수 있으므로, 이 버전들이 유일한 정보 원천으로 취급되지는 않습니다.
---
## 보안 모델
스캐너는 취약한 동작을 호출하지 않도록 설계되었습니다.
### 스캐너가 수행하지 않는 작업
- FUSE 파일시스템을 마운트하지 않음;
- `/dev/fuse`를 열거나 통신하지 않음;
- FUSE 서버를 시작하지 않음;
- 조작된 디렉터리 레코드를 제출하지 않음;
- 페이지 배치 테스트를 위한 메모리를 할당하지 않음;
- 커널 할당자를 정리(groom)하지 않음;
- `/etc/passwd`를 수정하지 않음;
- 커널 구성을 변경하지 않음;
- 커널 모듈을 로드하거나 언로드하지 않음;
- `/dev/fuse` 권한을 수정하지 않음;
- 패키지를 설치하거나 제거하지 않음;
- 시스템을 재부팅하지 않음;
- 권한 상승을 시도하지 않음.
### 스캐너가 수행할 수 있는 작업
- `/proc`, `/boot`, `/lib/modules`, `/usr/lib/modules`, `/usr/src` 및 패키지 메타데이터 디렉터리의 파일을 읽음;
- 제한된 읽기 전용 패키지 쿼리를 실행함;
- 활성 마운트와 파일시스템 등록 상태를 검사함;
- `--output`이 명시적으로 제공된 경우에만 보고서를 작성함;
- 관리자 검토를 위한 완화 명령을 출력함.
완화 명령은 문서 출력입니다. 자동으로 실행되지 않습니다.
---
## 기능
### 호스트 및 커널 식별
- `platform.release()`를 읽고 업스트림 스타일 커널 버전을 파싱합니다.
- `/etc/os-release` 또는 `/usr/lib/os-release`를 읽습니다.
- CPU 아키텍처와 메모리 페이지 크기를 감지합니다.
- 스캔 대상 커널이 현재 운영 체제에 속하는지 식별합니다.
### FUSE 노출 평가
- 사용 가능한 커널 구성 소스에서 `CONFIG_FUSE_FS`를 읽습니다.
- 내장 FUSE 지원 및 로드 가능한 모듈 구성을 감지합니다.
- `/proc/filesystems`를 읽습니다.
- `/dev/fuse` 메타데이터와 현재 사용자의 읽기/쓰기 접근 권한을 확인합니다.
- `fusermount3` 또는 `fusermount`를 찾습니다.
- `/proc/self/mountinfo`에서 활성 FUSE 마운트를 파싱합니다.
### 패치 증거
- 실행 중인 버전을 업스트림 수정 기준과 비교합니다.
- 설치된 커널 소스에서 대용량 레코드 보호 장치를 검색합니다.
- 로컬 RPM 또는 Debian 패키지 변경 로그에서 다음 항목을 확인합니다:
- `CVE-2026-31694`;
- 업스트림 패치 제목.
### 패키지 및 재부팅 상태
- 실행 중인 커널을 소유한 패키지를 식별하려고 시도합니다.
- 저장소를 새로 고치지 않고 로컬 패키지 관리자 메타데이터를 쿼리합니다.
- 호스트 환경이 권위적(authoritative)인 경우 더 새로운 설치 커널을 감지합니다.
- 해당하는 경우 `/var/run/reboot-required`를 확인합니다.
### 환경 인식
- Docker 호환 컨테이너를 감지합니다.
- Podman 호환 컨테이너를 감지합니다.
- 컨테이너 관련 cgroup을 감지합니다.
- WSL을 감지합니다.
- `systemd-detect-virt`가 사용 가능한 경우 가상 머신을 감지합니다.
### 보고
- 사람이 읽을 수 있는 텍스트 출력.
- 기계가 읽을 수 있는 JSON 출력.
- Markdown 보고서 출력.
- 완화 조치 전용 출력.
- 선택적 파일 출력.
- 의미 있는 프로세스 종료 코드.
---
## 요구 사항
### 필수
- 커널 평가를 위한 Linux.
- Python 3.9 이상.
- 일반 시스템 메타데이터에 대한 읽기 접근 권한.
스캐너는 Python 표준 라이브러리만 사용합니다.
### 선택 명령
다음 도구가 있는 경우 추가 증거가 수집됩니다:
| 도구 | 용도 |
|---|---|
| `dpkg-query` | Debian/Ubuntu 커널 패키지 소유권 및 변경 로그 발견 |
| `rpm` | Fedora/RHEL/SUSE 패키지 소유권 및 변경 로그 검사 |
| `pacman` | Arch 계열 커널 패키지 및 업데이트 메타데이터 |
| `apt` | Debian 계열 캐시된 업데이트 쿼리 |
| `dnf` 또는 `dnf5` | Fedora/RHEL 캐시된 업데이트 쿼리 |
| `zypper` | SUSE 캐시된 CVE 패치 쿼리 |
| `apk` | Alpine 패키지/업데이트 쿼리 |
| `systemd-detect-virt` | 컨테이너 및 가상 머신 감지 |
일반 스캔에는 루트 권한이 필요하지 않습니다.
일부 증거는 시스템별 파일 권한으로 인해 권한이 없는 계정에서는 사용할 수 없을 수 있습니다.
---
## 설치
스캐너를 작업 디렉터리에 배치합니다:
### 스캐너 기준 데이터
스캐너에는 다음과 같은 업스트림 안정 버전 수정 기준이 포함되어 있습니다:
| 커널 시리즈 | 수정 기준 |
|---|---:|
| 5.10 | 5.10.258 |
| 5.15 | 5.15.209 |
| 6.1 | 6.1.175 |
| 6.6 | 6.6.136 |
| 6.12 | 6.12.84 |
| 6.18 | 6.18.25 |
| 7.0 | 7.0.2 |
| Mainline | 7.1 이상 |
이러한 버전은 평가 입력 중 하나로 사용됩니다. 배포판 공급업체가 수정 사항을 백포트하면서도 이전 업스트림 버전 번호를 유지할 수 있으므로, 이 버전들이 유일한 정보 원천으로 취급되지는 않습니다.
---
## 보안 모델
스캐너는 취약한 동작을 호출하지 않도록 설계되었습니다.
### 스캐너가 수행하지 않는 작업
- FUSE 파일시스템을 마운트하지 않음;
- `/dev/fuse`를 열거나 통신하지 않음;
- FUSE 서버를 시작하지 않음;
- 조작된 디렉터리 레코드를 제출하지 않음;
- 페이지 배치 테스트를 위한 메모리를 할당하지 않음;
- 커널 할당자를 정리(groom)하지 않음;
- `/etc/passwd`를 수정하지 않음;
- 커널 구성을 변경하지 않음;
- 커널 모듈을 로드하거나 언로드하지 않음;
- `/dev/fuse` 권한을 수정하지 않음;
- 패키지를 설치하거나 제거하지 않음;
- 시스템을 재부팅하지 않음;
- 권한 상승을 시도하지 않음.
### 스캐너가 수행할 수 있는 작업
- `/proc`, `/boot`, `/lib/modules`, `/usr/lib/modules`, `/usr/src` 및 패키지 메타데이터 디렉터리의 파일을 읽음;
- 제한된 읽기 전용 패키지 쿼리를 실행함;
- 활성 마운트와 파일시스템 등록 상태를 검사함;
- `--output`이 명시적으로 제공된 경우에만 보고서를 작성함;
- 관리자 검토를 위한 완화 명령을 출력함.
완화 명령은 문서 출력입니다. 자동으로 실행되지 않습니다.
---
## 기능
### 호스트 및 커널 식별
- `platform.release()`를 읽고 업스트림 스타일 커널 버전을 파싱합니다.
- `/etc/os-release` 또는 `/usr/lib/os-release`를 읽습니다.
- CPU 아키텍처와 메모리 페이지 크기를 감지합니다.
- 스캔 대상 커널이 현재 운영 체제에 속하는지 식별합니다.
### FUSE 노출 평가
- 사용 가능한 커널 구성 소스에서 `CONFIG_FUSE_FS`를 읽습니다.
- 내장 FUSE 지원 및 로드 가능한 모듈 구성을 감지합니다.
- `/proc/filesystems`를 읽습니다.
- `/dev/fuse` 메타데이터와 현재 사용자의 읽기/쓰기 접근 권한을 확인합니다.
- `fusermount3` 또는 `fusermount`를 찾습니다.
- `/proc/self/mountinfo`에서 활성 FUSE 마운트를 파싱합니다.
### 패치 증거
- 실행 중인 버전을 업스트림 수정 기준과 비교합니다.
- 설치된 커널 소스에서 대용량 레코드 보호 장치를 검색합니다.
- 로컬 RPM 또는 Debian 패키지 변경 로그에서 다음 항목을 확인합니다:
- `CVE-2026-31694`;
- 업스트림 패치 제목.
### 패키지 및 재부팅 상태
- 실행 중인 커널을 소유한 패키지를 식별하려고 시도합니다.
- 저장소를 새로 고치지 않고 로컬 패키지 관리자 메타데이터를 쿼리합니다.
- 호스트 환경이 권위적(authoritative)인 경우 더 새로운 설치 커널을 감지합니다.
- 해당하는 경우 `/var/run/reboot-required`를 확인합니다.
### 환경 인식
- Docker 호환 컨테이너를 감지합니다.
- Podman 호환 컨테이너를 감지합니다.
- 컨테이너 관련 cgroup을 감지합니다.
- WSL을 감지합니다.
- `systemd-detect-virt`가 사용 가능한 경우 가상 머신을 감지합니다.
### 보고
- 사람이 읽을 수 있는 텍스트 출력.
- 기계가 읽을 수 있는 JSON 출력.
- Markdown 보고서 출력.
- 완화 조치 전용 출력.
- 선택적 파일 출력.
- 의미 있는 프로세스 종료 코드.
---
## 요구 사항
### 필수
- 커널 평가를 위한 Linux.
- Python 3.9 이상.
- 일반 시스템 메타데이터에 대한 읽기 접근 권한.
스캐너는 Python 표준 라이브러리만 사용합니다.
### 선택 명령
다음 도구가 있는 경우 추가 증거가 수집됩니다:
| 도구 | 용도 |
|---|---|
| `dpkg-query` | Debian/Ubuntu 커널 패키지 소유권 및 변경 로그 발견 |
| `rpm` | Fedora/RHEL/SUSE 패키지 소유권 및 변경 로그 검사 |
| `pacman` | Arch 계열 커널 패키지 및 업데이트 메타데이터 |
| `apt` | Debian 계열 캐시된 업데이트 쿼리 |
| `dnf` 또는 `dnf5` | Fedora/RHEL 캐시된 업데이트 쿼리 |
| `zypper` | SUSE 캐시된 CVE 패치 쿼리 |
| `apk` | Alpine 패키지/업데이트 쿼리 |
| `systemd-detect-virt` | 컨테이너 및 가상 머신 감지 |
일반 스캔에는 루트 권한이 필요하지 않습니다.
일부 증거는 시스템별 파일 권한으로 인해 권한이 없는 계정에서는 사용할 수 없을 수 있습니다.
---
## 설치
스캐너를 작업 디렉터리에 배치합니다:```bash
chmod +x cve_2026_31694_scanner.py
직접 실행하세요:```bash ./cve_2026_31694_scanner.py
또는 Python으로 호출하세요:
python -m src.main
python3 cve_2026_31694_scanner.py
```
Python 패키지 설치가 필요하지 않습니다.
---
## 사용법