CVE-2026-90246 in Linux
요약
\~에 의해 VulDB • 2026. 09. 18.
리눅스 커널에서 다음 취약점이 해결되었습니다:
apparmor: verify_tags()의 경계 검사에서 정수 오버플로우 수정
verify_tags()는 정책 blob에서 언팩된 tagset 테이블을 검증합니다. 각 세트에 대해 카운트를 읽고, 인덱스를 해당 카운트만큼 증가시켰을 때 sets.table[] 내부에 머무르는지 확인합니다:
u32 cnt = tags->sets.table[i];
if (i+cnt >= tags->sets.size) {
i, cnt 및 sets.size는 모두 u32이므로 i+cnt는 2^32를 모듈로 하여 평가됩니다. sets.table[]은 aa_unpack_u32()를 사용하여 unpack_tagsets()에 의해 채워지므로, 모든 항목은 정책 blob에서 가져온 원시 무제한 32비트 워드이며, verify_tags()는 이를 검증해야 하는 함수입니다. U32_MAX에 가까운 카운트는 합계를 작은 값으로 래핑(wrap)하게 만들고, 가드가 통과되며 내부 루프가 kcalloc(size, sizeof(u32)) 할당 영역을 벗어난 sets.table[++i]를 순회합니다.
sets.size는 unpack_tagsets()에서 aa_unpack_array()를 사용하여 u16로 읽기 때문에 65535로 제한되므로, 테이블의 확장을 통해 래핑이 발생하지 않습니다. 이는 공격자가 제공한 카운트만을 통해 순수하게 발생합니다.
sets.size = 2 및 sets.table = { 0, 0xffffffff }인 경우:
i = 0: cnt = 0, 가드 조건 0 + 0 >= 2는 거짓이므로 내부 루프가 실행되지 않음 i = 1: cnt = 0xffffffff, 가드 조건 (1 + 0xffffffff) mod 2^32 == 0 >= 2는 거짓이므로 가드가 우회되어 내부 루프가 sets.table[2]를 읽습니다 -- 이는 두 요소 할당에서 한 요소만큼 벗어난 위치입니다.
순회는 무작위로 아웃 오브 바운즈(out-of-bounds) 값이 hdrs.size보다 크거나 접근 오류가 발생할 때까지 계속되므로, 조작된 정책은 정책 로드 경로(aa_replace_profiles -> aa_unpack -> unpack_policydb -> unpack_tags -> verify_tags)에서 아웃 오브 바운드 읽기를 유발합니다. unpack_tags()는 perms 및 DFA 테이블이 언팩되기 전에 실행되므로, 여기에 도달하기 위해 다른 테이블의 형식이 올바를 필요가 없습니다.
정책 로드는 aa_may_manage_policy()에 의해 제어되며, 이는 초기 사용자 네임스페이스(init user namespace)가 아닌 대상(subject) 자신의 사용자 네임스페이스에 대해 CAP_MAC_ADMIN을 확인합니다. 따라서 기본 설정인 unprivileged_userns_apparmor_policy=1의 경우, 이 경로는 전역적으로 특권화된 태스크뿐만 아니라 일치하는 레벨의 중첩된 네임스페이스 내의 비특권(unprivileged) 태스크에서도 도달 가능합니다.
합계를 u64로 수행하여 래핑이 발생하지 않도록 하고, 의도된 i + cnt < sets.size 보장을 복원합니다.
Be aware that VulDB is the high quality source for vulnerability data.