
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 패키지 설치가 필요하지 않습니다.
---
## 사용법
### 표준 평가```bash
python3 cve_2026_31694_scanner.py
```
### JSON 출력```bash
python3 cve_2026_31694_scanner.py --format json
```
아래의 호환성 별칭은 동일한 형식을 생성합니다:```bash
python3 cve_2026_31694_scanner.py --json
```
### Markdown 보고서```bash
python3 cve_2026_31694_scanner.py --format markdown
```
### 보고서 저장```bash
python3 cve_2026_31694_scanner.py \
--format markdown \
--output cve-2026-31694-report.md
```
### 수정 지침만 출력```bash
python3 cve_2026_31694_scanner.py --mitigation-only
```
### 패키지 업데이트 확인 건너뛰기```bash
python3 cve_2026_31694_scanner.py --no-package-query
```
### 보고 후 항상 성공을 반환```bash
python3 cve_2026_31694_scanner.py --no-exit-status
```
이 옵션은 취약점 상태로 인해 오케스트레이션 작업이 실패하지 않도록 하면서 보고서를 수집할 때 유용합니다.
---
## 명령줄 옵션
| 옵션 | 설명 |
|---|---|
| `--format text` | 사람이 읽을 수 있는 터미널 출력입니다. 기본값입니다. |
| `--format json` | JSON 형식의 완전한 구조화된 보고서. |
| `--format markdown` | 기술 Markdown 보고서. |
| `--json` | `--format json`의 별칭. |
| `--output PATH` | 표준 출력 대신 보고서를 파일에 씁니다. |
| `--mitigation-only` | 생성된 완화 섹션만 반환합니다. |
| `--no-package-query` | 로컬 패키지 관리자 업데이트 쿼리를 건너뜁니다. |
| `--no-exit-status` | 출력 생성 후 항상 상태 `0`으로 종료합니다. |
| `-h`, `--help` | 명령 도움말을 표시합니다. |
---
## 평가 워크플로
스캐너는 다음 순서로 증거를 평가합니다.
### 1. 운영 체제 및 환경 감지
스캐너는 다음을 확인합니다:
- 운영 체제가 Linux인지 여부;
- 배포판 ID 및 계열;
- 패키지 관리자;
- 프로세스가 다음에서 실행 중인지 여부:
- 일반 호스트;
- 가상 머신;
- 컨테이너;
- WSL.
환경 감지는 패키지 및 재부팅 데이터의 해석을 변경합니다.
예를 들어, 컨테이너는 호스트 커널을 볼 수 있지만 일반적으로 컨테이너 파일시스템에서 호스트 커널 패키지를 확인할 수 없습니다.
### 2. FUSE 구성
스캐너는 다음 위치에서 실행 중인 커널 구성을 검색합니다:```text
/proc/config.gz
/boot/config-$(uname -r)
/lib/modules/$(uname -r)/build/.config
/usr/lib/modules/$(uname -r)/build/.config
```
다음을 평가합니다:```text
CONFIG_FUSE_FS=y
CONFIG_FUSE_FS=m
CONFIG_FUSE_FS is not set
```
Interpretation:
| Value | 의미 |
|---|---|
| `y` | FUSE가 커널에 내장되어 있습니다. 모듈 블랙리스트로 비활성화할 수 없습니다. |
| `m` | FUSE를 로드 가능한 모듈로 사용할 수 있습니다. |
| `n` | 감지된 구성에서 FUSE가 비활성화되어 있습니다. |
| unknown | 읽을 수 있는 구성 소스를 사용할 수 없습니다. |
### 3. 런타임 노출
스캐너는 다음을 확인합니다:```text
/proc/filesystems
/dev/fuse
PATH for fusermount3 or fusermount
/proc/self/mountinfo
```
`/dev/fuse` 또는 `fusermount3`가 없으면 현재 환경에서의 즉시 사용성이 떨어지지만, 커널이 패치되었음을 증명하지는 않습니다.
### 4. 페이지 크기 지오메트리
문서화된 초대형 레코드는 `4120`바이트입니다.
호스트 페이지 크기가 최소 `4120`바이트이면 문서화된 레코드는 페이지 경계를 넘지 않습니다. 스캐너는 시스템이 문서화된 페이지 지오메트리에 노출되지 않았다고 보고할 수 있습니다.
이 결론은 문서화된 레코드와 평가된 구현 동작에만 적용됩니다. 더 큰 페이지 시스템에서 모든 FUSE 메모리 안전성 문제가 불가능하다는 일반적인 진술은 아닙니다.
### 5. 설치된 소스 검사
설치된 소스가 있는 경우 스캐너는 다음을 검색합니다:```text
fs/fuse/readdir.c
```
취약한 함수와 `reclen > PAGE_SIZE`를 거부하는 가드에 해당하는 부분을 찾습니다.
소스 직접 증거는 버전 비교보다 신뢰도가 높습니다.
검사된 소스는 결과가 권위적이려면 실행 중인 커널과 일치해야 합니다. `/usr/src` 아래의 배포판 소스 트리는 설치된 커널과 다를 수 있습니다.
### 6. 커널 패키지 증거
스캐너는 감지된 배포판의 패키지 데이터베이스를 사용하여 실행 중인 커널 이미지를 소유 패키지에 매핑하려고 시도합니다.
가능한 메커니즘은 다음과 같습니다:```text
dpkg-query -S
rpm -qf
pacman -Qo
apk info -W
```
패키지가 식별되면, 로컬 변경 로그 메타데이터에서 CVE ID 또는 패치 제목을 검사할 수 있습니다.
변경 로그에서 일치 항목이 없다고 해서 취약점이 없다는 증거는 아닙니다. 공급업체는 로컬에 설치된 변경 로그에 개별 CVE 참조를 항상 포함하지는 않습니다.
### 7. 업스트림 버전 비교
구문 분석된 커널 버전은 스캐너의 고정 기준선 테이블과 비교됩니다.
버전 비교는 휴리스틱 결과를 생성합니다. 그 이유는 다음과 같습니다.
- 공급업체 커널에는 백포트가 포함될 수 있으며;
- 커널 패키지 릴리스 버전은 배포판별로 다릅니다;
- 클라우드, 실시간, 강화 및 하드웨어 지원 커널은 별도의 패치 타임라인을 가질 수 있습니다;
- 버전 문자열은 수정되지 않은 업스트림 릴리스가 아닌 공급업체가 유지 관리하는 브랜치를 나타낼 수 있습니다.
### 8. 패키지 업데이트 메타데이터
지원되는 경우, 스캐너는 기존 로컬 메타데이터에 대해 읽기 전용 쿼리를 실행합니다.
저장소를 새로 고치지 않습니다.
예시:```text
apt list --upgradable
pacman -Qu
dnf --cacheonly --quiet check-upgrade
zypper --no-refresh list-patches --all --cve=CVE-2026-31694
apk version -l <
```
사용 가능한 업데이트가 없다는 결과는 캐시된 저장소 메타데이터만큼만 최신 상태입니다.
### 9. 재부팅 상태
일반 호스트 또는 가상 머신에서 스캐너는 실행 중인 커널을 감지된 설치 커널과 비교하고 Debian 계열 시스템에서 사용하는 재부팅 마커를 확인합니다.
컨테이너 또는 WSL 게스트 내부에서는 이 검사가 게스트 파일을 호스트 커널과 비교하는 대신 호스트 제어로 표시됩니다.
### 10. 판정 생성
증거 우선순위는 대략 다음과 같습니다:
1. 직접적인 소스 또는 패키지 패치 증거;
2. FUSE 비활성화;
3. 문서화된 페이지 지오메트리가 노출되지 않음;
4. 업스트림 수정 또는 영향 없는 기준선;
5. 업스트림 잠재적 영향 버전;
6. 결정적이지 않은 증거.
---
## 판정
### `PATCHED`
직접적인 로컬 증거가 수정 사항이 존재함을 나타냅니다.
예:
- 관련 커널 소스의 일치하는 소스 가드;
- 로컬 커널 패키지 메타데이터가 CVE 또는 패치를 참조함.
신뢰도는 일반적으로 높지만, 소스와 실행 중인 커널의 일치 여부는 여전히 검증해야 합니다.
### `NOT_EXPOSED`
감지된 실행 커널 구성에서 FUSE가 비활성화되어 있습니다.
이는 노출 결과이지 커널 소스 자체에 수정 사항이 포함되어 있다는 증거는 아닙니다.
### `NOT_EXPOSED_BY_DOCUMENTED_PAGE_GEOMETRY`
메모리 페이지 크기가 문서화된 `4120`바이트 레코드를 페이지 경계를 넘지 않고 포함할 수 있을 만큼 충분히 큽니다.
이 판정은 문서화된 취약점 지오메트리에 한정됩니다.
### `UPSTREAM_BASELINE_SAFE`
파싱된 실행 버전이 알려진 수정된 업스트림 기준선을 충족하거나 영향을 받는 구현 이전 버전입니다.
공급업체 패키지 검증이 여전히 바람직합니다.
### `POTENTIALLY_VULNERABLE`
파싱된 커널이 영향을 받는 업스트림 범위에 있으며 직접적인 로컬 패치 증거가 발견되지 않았습니다.
이 결과는 설치된 커널을 취약하다고 판단하기 전에 운영체제 공급업체 권고를 확인해야 합니다.
### `INCONCLUSIVE`
스캐너가 충분한 증거를 확보하지 못했습니다.
일반적인 원인:
- 사용할 수 없는 커널 구성;
- 인식할 수 없는 버전 문자열;
- 접근할 수 없는 소스 또는 패키지 메타데이터;
- 지원되지 않는 배포판;
- 컨테이너 내부 실행;
- 호스트 관리 커널;
- 공급업체 백포트 상태를 로컬에서 확인할 수 없음.
### `NOT_APPLICABLE`
현재 운영체제는 Linux가 아닙니다.
---
## 종료 코드
| Code | Meaning |
|---:|---|
| `0` | 패치 증거, 안전한 업스트림 기준선, 또는 문서화된 노출이 없음 |
| `1` | 잠재적으로 취약함 |
| `2` | 결정적이지 않음 |
| `3` | 스캐너 또는 보고서 생성 오류 |
예:```bash
python3 cve_2026_31694_scanner.py
status=$?
case "$status" in
0)
echo "No actionable exposure detected by the scanner"
;;
1)
echo "Potential exposure detected"
;;
2)
echo "Assessment inconclusive"
;;
3)
echo "Scanner execution failed"
;;
esac
```
`--no-exit-status`가 지정되면 스캐너는 보고서를 생성한 후 `0`을 반환합니다.
---
## 탐지 소스
스캐너는 사용 가능한 경우 다음 로컬 소스를 사용합니다:
| 소스 | 정보 |
|---|---|
| `/etc/os-release` | 배포판 식별 |
| `/usr/lib/os-release` | 배포판 식별 대체 |
| `/proc/version` | 커널 및 WSL 표시 |
| `/proc/config.gz` | 실행 중인 커널 구성 |
| `/boot/config-*` | 커널 구성 |
| `/lib/modules/*/build/.config` | 커널 빌드 구성 |
| `/proc/filesystems` | 등록된 파일시스템 |
| `/proc/self/mountinfo` | 활성 FUSE 마운트 |
| `/proc/1/cgroup` | 컨테이너 표시 |
| `/dev/fuse` | 장치 존재 및 권한 |
| `/usr/src/*/fs/fuse/readdir.c` | 선택적 소스 수준 패치 증거 |
| `/lib/modules` | 설치된 커널 목록 |
| `/usr/lib/modules` | 설치된 커널 목록 |
| `/boot/vmlinuz-*` | 설치된 커널 목록 |
| `/var/run/reboot-required` | Debian 계열 재부팅 표시 |
| 패키지 데이터베이스 | 커널 패키지 소유권 |
| 패키지 변경 로그 | 선택적 로컬 백포트 증거 |
| 패키지 캐시 | 선택적 업데이트 가용성 증거 |
---
## 배포판 지원
### 배포 계열 감지
| 계열 | 인식되는 배포판 |
|---|---|
| Ubuntu | Ubuntu, Linux Mint, Pop!_OS, elementary OS, Zorin OS |
| Debian | Debian, Kali Linux, Raspbian, Parrot OS |
| Arch | Arch Linux, Manjaro, Garuda Linux, EndeavourOS, CachyOS |
| Fedora | Fedora Linux |
| RHEL | RHEL, CentOS, Rocky Linux, AlmaLinux, Oracle Linux, Amazon Linux |
| SUSE | openSUSE Tumbleweed, openSUSE Leap, SLES, SLED |
| Alpine | Alpine Linux |
| Gentoo | Gentoo Linux |
| Void | Void Linux |
| NixOS | NixOS |
| Unknown | 일반 Linux 안내 |
### 로컬 업데이트 조회 지원
| 계열 | 읽기 전용 업데이트 조회 |
|---|---|
| Debian/Ubuntu | `apt list --upgradable` |
| Arch | `pacman -Qu` |
| Fedora/RHEL | 캐시된 `dnf check-upgrade` |
| SUSE | `zypper`로 캐시된 CVE 패치 목록 |
| Alpine | `apk version -l <` |
| Gentoo | 구현되지 않음 |
| Void | 구현되지 않음 |
| NixOS | 구현되지 않음 |
| Unknown | 구현되지 않음 |
로컬에서 업데이트가 보이지 않는다고 해서 수정된 패키지를 사용할 수 없다는 뜻은 아닙니다. 저장소 메타데이터가 오래되었거나 배포판이 아직 패키지를 게시하지 않았을 수 있습니다.
---
## 완화 조치 생성
완화 조치 안내는 다음에 따라 선택됩니다:
- 배포 계열;
- 패키지 관리자;
- 컨테이너 또는 WSL 상태;
- FUSE 구성;
- `/dev/fuse` 가용성;
- 활성 FUSE 마운트;
- 재부팅 상태;
- 최종 판정.
스캐너는 명령을 출력하지만 절대 실행하지 않습니다.
### Debian 및 Ubuntu 계열
일반적으로 생성되는 순서:```bash
sudo apt update
sudo apt full-upgrade
sudo reboot
```
제안된 패키지 트랜잭션을 승인하기 전에 검토하십시오.
재부팅 후:```bash
uname -r
python3 cve_2026_31694_scanner.py
```
### Arch 및 Manjaro 계열
일반적인 생성 시퀀스:```bash
sudo pacman -Syu
sudo reboot
```
Arch 계열 시스템은 전체 시스템 업그레이드가 필요합니다. `pacman -Sy`로 패키지 데이터베이스를 새로 고친 다음 업그레이드를 완료하지 않고 선택한 패키지를 설치하지 마십시오.
### Fedora 및 RHEL 계열
일반적인 생성 순서:```bash
sudo dnf upgrade --refresh
sudo systemctl reboot
```
`yum`을 사용하는 시스템은 해당 `yum` 명령을 받을 수 있습니다.
### SUSE 계열
일반적인 생성 순서:```bash
sudo zypper refresh
sudo zypper patch --cve=CVE-2026-31694
sudo zypper patch --category security
sudo systemctl reboot
```
CVE 특정 패치는 모든 SUSE 제품 또는 저장소 상태에서 별도의 트랜잭션으로 제공되지 않을 수 있습니다.
### Alpine Linux
일반적인 생성 시퀀스:```bash
doas apk update
doas apk upgrade
doas reboot
```
권한 접두사는 스캐너가 `sudo`, `doas` 또는 이미 루트인 세션을 발견하는지 여부에 따라 달라집니다.
### Gentoo Linux
일반적인 생성 시퀀스:```bash
sudo emaint sync -a
sudo emerge --ask --update --deep --newuse @world
```
커널 설치 및 활성화는 호스트에 구성된 Gentoo 커널 워크플로에 따라 달라집니다.
### Void Linux
일반적으로 생성되는 시퀀스:```bash
sudo xbps-install -Suv
sudo reboot
```
### NixOS
일반적인 생성 시퀀스:```bash
sudo nixos-rebuild switch --upgrade
sudo systemctl reboot
```
### 임시 통제
패치를 즉시 완료할 수 없는 경우, 스캐너는 임시 통제를 제안할 수 있습니다.
가능한 권장 사항은 다음과 같습니다:
- 활성화된 FUSE 마운트가 없을 때 FUSE 모듈을 언로드합니다;
- 로드 가능한 FUSE 모듈을 블랙리스트에 등록합니다;
- `/dev/fuse`를 일시적으로 제한합니다;
- 신뢰할 수 없는 컨테이너에서 `/dev/fuse`를 제거합니다;
- `CAP_SYS_ADMIN`을 제거합니다;
- `--privileged` 컨테이너를 피합니다.
이러한 통제는 다음과 같은 합법적인 워크로드를 방해할 수 있습니다:
- SSHFS;
- AppImage;
- rclone 마운트;
- 데스크톱 포털;
- 루트리스 컨테이너 도구;
- 사용자 공간 파일시스템.
임시 제한은 공급업체가 수정한 커널 설치를 대체해서는 안 됩니다.
---
## 컨테이너 및 WSL 동작
### 컨테이너
컨테이너는 일반적으로 호스트 커널을 공유합니다.
컨테이너 내부에서 실행된 스캐너는 다음을 감지할 수 있습니다:
- 호스트 커널 릴리스;
- 컨테이너 파일시스템 패키지 메타데이터;
- 일치하는 호스트 커널 패키지 없음;
- 호스트에 FUSE가 활성화되어 있어도 `/dev/fuse`가 없음.
이러한 이유로 스캐너는 호스트 의존 증거를 비권위적(non-authoritative)으로 표시하고 완화 조치를 컨테이너 호스트로 안내합니다.
권위 있는 패키지 및 재부팅 평가를 위해 호스트에서 직접 스캐너를 실행하십시오.
컨테이너 강화 지침에는 다음 제거가 포함됩니다:```text
--device /dev/fuse
--cap-add SYS_ADMIN
--privileged
```
동등한 Compose 구성도 검토해야 합니다:```yaml
devices:
- /dev/fuse:/dev/fuse
cap_add:
- SYS_ADMIN
privileged: true
```
### WSL
WSL 커널은 Linux 게스트 배포판의 커널 패키지가 아니라 Windows에 의해 관리됩니다.
일반적인 생성 안내:```powershell
wsl --update
wsl --shutdown
```
Windows PowerShell에서 다음 명령을 실행하고, 배포판을 다시 시작한 후 스캐너를 다시 실행하세요.
`apt`, `dnf` 또는 다른 Linux 패키지 관리자로 게스트 패키지만 업데이트하는 것은 WSL 커널을 대체하지 않습니다.
### 가상 머신
가상 머신은 일반적으로 자체 게스트 커널을 소유합니다. 배포판별 패키지 및 재부팅 확인은 게스트 내부에서 여전히 적용됩니다.
하이퍼바이저 호스트는 별도로 평가해야 합니다.
---
## 보고서 형식
### 텍스트
텍스트 출력은 터미널에서 직접 사용하기 위한 것입니다.```bash
python3 cve_2026_31694_scanner.py --format text
```
보고서에는 다음이 포함됩니다:
- 호스트 요약;
- 증거 확인;
- 표시되는 경우 패키지 업데이트;
- 판정 및 신뢰도;
- 완화 가이드;
- 검증 명령;
- 주의사항;
- 메모;
- 종료 코드.
### JSON
JSON 출력에는 완전한 dataclass 기반 보고서가 포함됩니다.```bash
python3 cve_2026_31694_scanner.py \
--format json \
--output report.json
```
필드 선택 예시:```bash
python3 cve_2026_31694_scanner.py --format json --no-exit-status |
python3 -c '
import json
import sys
report = json.load(sys.stdin)
print(report["hostname"])
print(report["verdict"])
print(report["confidence"])
print(report["kernel_release"])
'
```
### Markdown
Markdown 출력은 기술 기록, 티켓, 평가 보고서에 적합합니다.```bash
python3 cve_2026_31694_scanner.py \
--format markdown \
--output report.md
```
### 완화 전용 보고서```bash
python3 cve_2026_31694_scanner.py \
--mitigation-only \
--format markdown
```
JSON 형식에서 완화 전용 모드는 전체 호스트 보고서 대신 완화 객체를 반환합니다.
---
## 자동화 및 통합
### Shell gate```bash
#!/usr/bin/env bash
set -u
report="cve-2026-31694-$(hostname)-$(date +%Y%m%d-%H%M%S).json"
python3 cve_2026_31694_scanner.py \
--format json \
--output "$report"
status=$?
case "$status" in
0)
echo "Assessment completed without a potential-vulnerability verdict"
;;
1)
echo "Potential CVE-2026-31694 exposure detected: $report" >&2
;;
2)
echo "Assessment inconclusive: $report" >&2
;;
*)
echo "Scanner failure: $report" >&2
;;
esac
exit "$status"
```
### 작업 실패 없이 보고서 수집```bash
python3 cve_2026_31694_scanner.py \
--format json \
--output /var/tmp/cve-2026-31694.json \
--no-exit-status
```
### Cron 예제```cron
30 3 * * * /usr/bin/python3 /opt/security/cve_2026_31694_scanner.py --format json --output /var/log/cve-2026-31694.json --no-exit-status
```
이것은 동일한 보고서 파일을 덮어씁니다. 기록용 보고서가 필요한 경우 래퍼 스크립트를 사용하세요.
### Systemd 서비스 예제```ini
[Unit]
Description=Passive CVE-2026-31694 assessment
After=local-fs.target
[Service]
Type=oneshot
ExecStart=/usr/bin/python3 /opt/security/cve_2026_31694_scanner.py --format json --output /var/log/cve-2026-31694.json --no-exit-status
NoNewPrivileges=yes
PrivateTmp=yes
ProtectSystem=strict
ProtectHome=yes
ReadWritePaths=/var/log
```
The scanner needs read access to kernel and package metadata. Additional sandbox restrictions may hide evidence and produce an inconclusive report.
### Fleet usage
For fleet assessment:
1. place the script on each Linux host;
2. execute it locally;
3. collect JSON output;
4. group results by:
- distribution;
- kernel release;
- verdict;
- confidence;
- environment type;
5. verify potentially affected hosts against vendor advisories;
6. patch and reboot;
7. rescan.
Do not treat a scan from a container image build as a host-kernel assessment.
---
## Operational Guidance
### Recommended response to `POTENTIALLY_VULNERABLE`
1. Identify the exact running kernel: ```bash
uname -r
```
2. 설치된 배포판과 릴리스를 확인합니다: ```bash
cat /etc/os-release
```
3. 배포판 공급업체의 CVE 상태를 해당 커널 패키지 및 플레이버로 검토합니다.
4. 패키지 메타데이터를 새로 고칩니다.
5. 공급업체가 지원하는 수정된 커널 패키지를 설치합니다.
6. 호스트를 재부팅합니다.
7. 실행 중인 커널이 변경되었는지 확인합니다: ```bash
uname -r
```
8. 스캐너를 다시 실행하십시오.
### `INCONCLUSIVE`에 대한 권장 대응
누락된 증거를 수집하십시오:```bash
uname -a
getconf PAGE_SIZE
cat /etc/os-release
grep CONFIG_FUSE_FS /boot/config-"$(uname -r)" 2>/dev/null
cat /proc/filesystems
ls -l /dev/fuse 2>/dev/null
findmnt -t fuse,fuseblk,fusectl
```
그런 다음 정확한 커널 패키지를 공급업체 권고와 대조하여 확인하십시오.
### 재부팅 검증
수정된 커널 패키지를 설치해도 현재 실행 중인 커널은 변경되지 않습니다.
설치된 커널과 실행 중인 커널을 모두 확인한 다음 필요에 따라 재부팅하십시오.
예시:```bash
uname -r
ls -1 /lib/modules
```
Debian 계열 시스템은 다음도 제공할 수 있습니다:```bash
test -e /var/run/reboot-required && cat /var/run/reboot-required
```
### FUSE 종속성 검토
FUSE를 일시적으로 언로드하거나 차단하기 전에:```bash
findmnt -t fuse,fuseblk,fusectl
lsmod | grep '^fuse'
ps aux | grep -E '[f]usermount|[s]shfs|[r]clone'
```
활성 FUSE 파일시스템이 마운트된 상태에서 모듈을 언로드하지 마십시오.
---
## 제한 사항
### 악용 확인 없음
스캐너는 의도적으로 취약한 코드 경로를 트리거하지 않습니다.
`POTENTIALLY_VULNERABLE` 판정은 사용 가능한 수동적 증거가 노출과 일치함을 의미합니다. 이는 악용이 성공한다는 증거가 아닙니다.
### 공급업체 백포트
배포판 커널은 보안 수정 사항을 자주 백포트합니다.
오래된 것처럼 보이는 업스트림 버전이 패치되었을 수 있습니다.
공급업체 권고 및 정확한 패키지 릴리스가 배포판 관리 커널에 대한 권위 있는 정보입니다.
### 소스 트리 불일치
`/usr/src` 아래에서 발견된 소스 트리는 실행 중인 커널과 일치하지 않을 수 있습니다.
소스 패치 증거는 다음에 대해 검증되어야 합니다:```bash
uname -r
```
및 해당 정확한 커널에 사용된 소스 패키지 또는 빌드 디렉터리.
### 오래된 패키지 메타데이터
스캐너는 리포지토리를 새로 고치지 않습니다.
패키지 업데이트 확인은 기존 로컬 캐시 상태에 의존합니다.
최신 패키지 결정을 위해 생성된 배포판별 새로 고침 및 업그레이드 명령을 사용합니다.
### 컨테이너
컨테이너는 호스트 커널을 보지만 일반적으로 다른 패키지 메타데이터를 가집니다.
호스트에서 스캐너를 실행합니다.
### WSL
Linux 게스트 패키지 상태는 WSL 커널 패치 상태를 결정하지 않습니다.
Windows에서 WSL을 업데이트합니다.
### 사용자 정의 커널
사용자 정의, 임베디드, 어플라이언스, 벤더 및 자체 빌드 커널에는 패키지 메타데이터나 인식 가능한 버전 문자열이 없을 수 있습니다.
실제 소스 커밋 또는 벤더 릴리스 노트를 확인합니다.
### 라이브 패칭
스캐너는 라이브 패치 프레임워크가 실행 중인 커널에 이 특정 수정 사항을 적용했는지 여부를 확인하지 않습니다.
라이브 패치 벤더의 상태 도구와 권고 데이터를 사용합니다.
### 보안 부팅 및 부트로더 상태
스캐너는 다음을 확인하지 않습니다:
- 부트로더가 다음에 어떤 커널을 선택할지;
- 보안 부팅이 설치된 이미지를 수락하는지;
- 새 initramfs가 올바르게 생성되었는지;
- 시스템이 예상 커널로 성공적으로 재부팅되었는지.
### 분산 파일 시스템 및 네임스페이스
스캐너는 현재 프로세스 네임스페이스를 평가합니다.
네임스페이스로 숨겨진 마운트 또는 장치 접근은 보고서에 나타나지 않을 수 있습니다.
---
## 문제 해결
### `Kernel configuration could not be determined`
다음 파일 중 하나가 존재하는지 확인합니다:```bash
ls -l /proc/config.gz
ls -l /boot/config-"$(uname -r)"
ls -l /lib/modules/"$(uname -r)"/build/.config
```
일부 배포판에서는 `/proc/config.gz`를 통해 실행 중인 구성을 노출하지 않습니다.
### `Running kernel package could not be identified`
가능한 원인:
- 컨테이너 내부에서 실행 중;
- 현재 파일시스템에 커널 이미지가 없음;
- 사용자 지정 커널;
- 패키지 데이터베이스를 사용할 수 없음;
- 플랫폼에서 제공되는 커널;
- 권한이 부족함.
확인:```bash
uname -r
ls -l /boot
ls -l /lib/modules/"$(uname -r)"
```
### 패키지 업데이트 조회 결과 업데이트 없음
생성된 완화 가이드를 사용하여 패키지 메타데이터를 새로 고친 다음 스캐너를 다시 실행하십시오.
패시브 스캐너는 저장소를 자동으로 새로 고치지 않습니다.
### 업데이트 설치 후 `POTENTIALLY_VULNERABLE`
새 커널이 실행 중인지 확인하십시오:```bash
uname -r
```
설치된 커널 디렉토리와 비교하세요:```bash
ls -1 /lib/modules
```
재부팅이 여전히 필요할 수 있습니다.
또한 공급업체 권고를 확인하세요. 수정된 백포트가 업스트림 버전 기준과 일치하지 않을 수 있기 때문입니다.
### FUSE가 커널에 내장되어 있음
보고서에 다음이 표시되면:```text
CONFIG_FUSE_FS=y
```
`modprobe -r fuse` 및 모듈 블랙리스트는 FUSE를 비활성화할 수 없습니다.
패치된 커널 또는 FUSE 지원 없이 빌드된 커널을 사용하세요.
### systemd 샌드박싱 환경에서 스캐너 출력이 불완전합니다
스캐너는 다음에 대한 읽기 권한이 필요할 수 있습니다:```text
/proc
/boot
/lib/modules
/usr/lib/modules
/usr/src
package database directories
package cache directories
```
이 경로를 읽을 수 있도록 서비스 강화 구성을 조정하세요.
---
## 파일 구조
권장 프로젝트 구조:```text
cve-2026-31694-scanner/
├── README.md
└── cve_2026_31694_scanner.py
```
권장 설치 레이아웃:```text
/opt/security/cve-2026-31694/
├── README.md
└── cve_2026_31694_scanner.py
```
예시:```bash
sudo install -d -m 0755 /opt/security/cve-2026-31694
sudo install -m 0755 \
cve_2026_31694_scanner.py \
/opt/security/cve-2026-31694/
sudo install -m 0644 \
README.md \
/opt/security/cve-2026-31694/
```
---
## 참조
- CVE 레코드: <https://www.cve.org/CVERecord?id=CVE-2026-31694>
- NVD 레코드: <https://nvd.nist.gov/vuln/detail/CVE-2026-31694>
- Linux 안정 패치 참조: <https://git.kernel.org/stable/c/51a8de6c50bf947c8f534cd73da4c8f0a13e7bed>
- Ubuntu 상태: <https://ubuntu.com/security/CVE-2026-31694>
- Debian 보안 추적기: <https://security-tracker.debian.org/tracker/CVE-2026-31694>
- Red Hat CVE 데이터베이스: <https://access.redhat.com/security/cve/CVE-2026-31694>
- SUSE CVE 데이터베이스: <https://www.suse.com/security/cve/CVE-2026-31694.html>
---
## 저자
**Aung Myat Thu [w01f]**