🇰🇷 한글 설명
Linux 커널의 liveupdate 기능에서 FLB retrieve() 호출 실패 시 해당 상태를 저장하지 않는 취약점이 발견되었습니다. 이로 인해 실패한 retrieve를 재시도할 경우, 이미 해제된 데이터 구조체에 접근하여 시스템 불안정성을 초래할 수 있습니다.
💡 쉬운 설명
프로그램이 데이터를 가져오려다 실패했을 때, 그 실패 기록을 남기지 않아 똑같은 실수를 반복하게 만드는 문제입니다. 이 과정에서 이미 사라진 데이터를 다시 건드리려다 컴퓨터 시스템이 멈추거나 오류가 발생할 수 있습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
liveupdate: Remember FLB retrieve() status
LUO keeps track of successful retrieve attempts on an FLB. It does so
to avoid multiple retrievals of the same FLB. Multiple retrievals cause
problems because once the FLB is retrieved, the serialized data
structures are likely freed and the FLB is likely in a very different
state from what the code expects.
All this works well when retrieve succeeds. When it fails,
luo_flb_retrieve_one() returns the error immediately, without ever
storing anywhere that a retrieve was attempted or what its error code
was. If the user attempts to retrieve another file registered with the
same FLB, LUO will attempt to call the FLB's retrieve() callback again.
The retry is problematic for much of the same reasons listed above. The
FLB is likely in a very different state than what the retrieve logic
normally expects (e.g. some KHO pages may have already been restored and
freed).
There is no sane way of attempting the retrieve again. Remember the
error retrieve returned and directly return it on a retry.
This is done by changing the retrieved bool to a retrieve_status
integer. A value of 0 means retrieve was never attempted, a positive
value means it succeeded, and a negative value means it failed and the
error code is the value.
This is similar to commit f85b1c6af5bc ("liveupdate: luo_file: remember
retrieve() status") which did the same for LUO files.
📍 영향받는 시스템
Linux Kernel (liveupdate/LUO 기능이 활성화된 버전)
⚔️ 공격 벡터
FLB retrieve() 호출이 실패하도록 유도한 후 동일한 FLB에 대해 재시도를 수행하여 메모리 오류 유발
🛡️ 대응 방법
Linux 커널을 최신 보안 패치가 적용된 버전으로 업데이트하여 retrieve 상태 저장 로직을 적용해야 합니다.
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 수정된 패치 버전 이후인지 확인합니다.