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.

출처

Do you want to use VulDB in your project?

Use the official API to access entries easily!