Linux 커널에서는 다음 취약점이 해결되었습니다. dcache: 최소 버킷 수를 2개로 제한합니다. 사용자가 설정할 때 dentry_hashtable에 OOB 읽기 문제가 있습니다. 'dhash_entries=1': 버그: 주소: ffff888b30b774b0에 대한 페이지 오류를 처리할 수 없습니다. #PF: 커널 모드의 감독자 읽기 액세스 #PF: error_code(0x0000) - 존재하지 않는 페이지 이런: 이런: 0000 [#1] SMP PTI RIP: 0010:__d_lookup+0x56/0x120 통화 추적: d_lookup.cold+0x16/0x5d lookup_dcache+0x27/0xf0 내가
Linux 커널에서는 다음 취약점이 해결되었습니다.
dcache: 최소 버킷 수를 2개로 제한합니다.
사용자가 설정할 때 dentry_hashtable에 OOB 읽기 문제가 있습니다. 'dhash_entries=1': 버그: 주소: ffff888b30b774b0에 대한 페이지 오류를 처리할 수 없습니다. #PF: 커널 모드의 감독자 읽기 액세스 #PF: error_code(0x0000) - 존재하지 않는 페이지 이런: 이런: 0000 [#1] SMP PTI RIP: 0010:__d_lookup+0x56/0x120 통화 추적: d_lookup.cold+0x16/0x5d lookup_dcache+0x27/0xf0 lookup_one_qstr_excl+0x2a/0x180 start_dirop+0x55/0xa0 simple_start_creating+0x8d/0xa0 debugfs_start_creating+0x8c/0x180 debugfs_create_dir+0x1d/0x1c0 pinctrl_init+0x6d/0x140 do_one_initcall+0x6d/0x3d0 kernel_init_freeable+0x39f/0x460 kernel_init+0x2a/0x260
dhash_entries가 다음과 같은 경우 dentry_hashtable에는 버킷이 하나만 있습니다. 1로 설정하고 d_hash_shift는 dcache_init()에 의해 32로 계산됩니다. 그런 다음, 다음 프로세스는 둘 이상의 버킷(메모리 영역)에 액세스합니다. 할당되지 않음) dentry_hashtable에서: d_lookup b = d_hash(해시) dentry_hashtable + ((u32)hashlen >> d_hash_shift) // C 표준은 오른쪽 이동량의 동작을 정의합니다. // 정의되지 않은 피연산자의 비트 너비를 초과합니다. 는 // '(u32)hashlen >> d_hash_shift'의 결과는 'hashlen'이 됩니다. // 그래서 'b'는 할당되지 않은 메모리 영역을 가리킬 것입니다. hlist_bl_for_each_entry_rcu(b) hlist_bl_first_rcu(헤드) h->first // OOB를 읽어보세요!
dentry_hashtable 버킷의 최소 수를 2개로 제한하여 문제를 해결하세요. 그래서 'd_hash_shift'는 u32 유형의 비트 너비를 초과하지 않습니다.
왜 이 VPI인가 (설명가능 · 실험적)
VPI 산정 기준
| 영향도 | 91.00 |
| 악용 신호(추가 악용신호 없음) | ×1.00 |
| VPI | 91.00 |
VPI 공식 vpi-v1 기준