🇰🇷 한글 설명
Linux 커널의 IPv4 멀티패스 해시 시드 처리 코드에서 구조체 전체를 READ_ONCE/WRITE_ONCE로 접근하면서 발생한 정렬(alignment) 문제를 수정합니다. Clang과 LTO 환경에서 64비트 ldar 명령이 4바이트 정렬 주소에 실행되어 ARM64에서 커널 패닉이 발생할 수 있으며, 쓰기 측도 두 개의 32비트 쓰기로 나뉘어 원자성이 깨지는 문제가 함께 수정되었습니다.
💡 쉬운 설명
리눅스 커널이 네트워크 경로 선택에 쓰는 내부 값을 잘못된 방식으로 읽고 써서, 특정 환경(ARM64 + Clang LTO)에서 시스템이 갑자기 멈출 수 있었습니다. 이번 패치는 값을 올바른 크기 단위로 읽고 쓰도록 바로잡아 이 문제를 해결합니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
net: ipv4: fix ARM64 alignment fault in multipath hash seed
`struct sysctl_fib_multipath_hash_seed` contains two u32 fields
(user_seed and mp_seed), making it an 8-byte structure with a 4-byte
alignment requirement.
In `fib_multipath_hash_from_keys()`, the code evaluates the entire
struct atomically via `READ_ONCE()`:
mp_seed = READ_ONCE(net->ipv4.sysctl_fib_multipath_hash_seed).mp_seed;
While this silently works on GCC by falling back to unaligned regular
loads which the ARM64 kernel tolerates, it causes a fatal kernel panic
when compiled with Clang and LTO enabled.
Commit e35123d83ee3 ("arm64: lto: Strengthen READ_ONCE() to acquire
when CONFIG_LTO=y") strengthens `READ_ONCE()` to use Load-Acquire
instructions (`ldar` / `ldapr`) to prevent compiler reordering bugs
under Clang LTO. Since the macro evaluates the full 8-byte struct,
Clang emits a 64-bit `ldar` instruction. ARM64 architecture strictly
requires `ldar` to be naturally aligned, thus executing it on a 4-byte
aligned address triggers a strict Alignment Fault (FSC = 0x21).
Fix the read side by moving the `READ_ONCE()` directly to the `u32`
member, which emits a safe 32-bit `ldar Wn`.
Furthermore, Eric Dumazet pointed out that `WRITE_ONCE()` on the entire
struct in `proc_fib_multipath_hash_set_seed()` is also flawed. Analysis
shows that Clang splits this 8-byte write into two separate 32-bit
`str` instructions. While this avoids an alignment fault, it destroys
atomicity and exposes a tear-write vulnerability. Fix this by
explicitly splitting the write into two 32-bit `WRITE_ONCE()`
operations.
Finally, add the missing `READ_ONCE()` when reading `user_seed` in
`proc_fib_multipath_hash_seed()` to ensure proper pairing and
concurrency safety.
📍 영향받는 시스템
패치가 적용되지 않은 Linux 커널 (ARM64 아키텍처, Clang 및 LTO로 빌드된 커널에서 커널 패닉 위험; 배포판별 수정 버전은 각 벤더 보안 공지 참조)
⚔️ 공격 벡터
원격 공격 경로는 명확히 보고되지 않았으며, 로컬에서 멀티패스 해시 시드 sysctl을 변경하는 작업 등 정상 동작 중 발생하는 정렬 오류·원자성 문제에 해당하여 시스템 안정성(서비스 거부) 또는 값 손상 위험이 있습니다.
🛡️ 대응 방법
배포판 벤더가 제공하는 최신 보안 업데이트 커널로 업그레이드하고 재부팅하거나, 해당 커밋을 포함한 커널 버전을 사용하세요.
🔧 검증 코드
출력된 커널 버전을 배포판 보안 공지에서 CVE-2026-23316 수정이 포함된 패키지 버전과 비교하여, 현재 버전이 같거나 더 새로우면 패치된 것이고 이전 버전이면 업데이트가 필요합니다.
uname -r && (dpkg -l linux-image-$(uname -r) 2>/dev/null || rpm -q kernel 2>/dev/null) | head -5