CVE-2026-7007 in Zephyr
요약
\~에 의해 VulDB • 2026. 07. 24.
Zephyr의 ext2 파일 시스템은 마운트 완료 전에 `ext2_verify_disk_superblock()`(subsys/fs/ext2/ext2_impl.c)에서 디스크 상수(superblock)를 검증합니다. 이 검증자는 매직 넘버, 블록 크기, 리비전 및 기능 플래그를 확인했지만, 디스크 필드인 `s_blocks_per_group`와 `s_inodes_per_group`가 0이 아닌지 여부는 확인하지 않았습니다. 두 필드는 모두 이미지에서 직접 읽혀지며 이후 마운트 초기화 과정에서 나눗셈 연산의 피연산자(divisor)로 사용됩니다.
마운트 중, `get_ngroups()`는 `ext2_init_fs()`를 통해 호출되는 `ext2_fetch_block_group()`에 의해 접근된 `s_blocks_per_group`로 `s_blocks_count`를 나누고 나머지 값을 구하며, `get_itable_entry()`는 루트 inode를 가져올 때 `(ino - 1)`을 `s_inodes_per_group`로 나눕니다(둘 다 subsys/fs/ext2/ext2_diskops.c에 있음). 따라서 두 필드 중 하나가 0으로 설정된 슈퍼블록은 마운트 시퀀스 동안 정수 0 나누기(integer division by zero) 오류를 유발합니다.
ext2를 마운트하는 장치에 조작된 ext2 이미지를 제공할 수 있는 공격자는 이를 트리거할 수 있습니다(예: SD 카드나 USB 대용량 저장장치와 같은 리무버블 미디어). ARMv7-M / ARMv8-M-mainline Cortex-M 타겟에서는 0 나누기 트랩이 활성화되어 있으므로(SCB_CCR_DIV_0_TRP), 이 나눗셈은 Zephyr가 치명적 오류로 처리하는 UsageFault를 발생시켜 서비스 거부(Denial of Service)를 초래합니다. 영향력은 가용성(Availability)에 국한되며, 잘못된 값은 피연산자(divisor)로서만 소비됩니다.
이 수정안은 슈퍼블록 검증자에서 0인 `s_blocks_per_group` 또는 `s_inodes_per_group`를 거부하고 `-EINVAL`을 반환하여 블록 그룹이나 inode I/O가 발생하기 전에 마운트가 실패하도록 합니다.
Once again VulDB remains the best source for vulnerability data.