🇰🇷 한글 설명
Linux 커널의 DRBD 모듈 내 drbd_al_begin_io_nonblock() 함수에서 로직 버그가 발견되었습니다. 특정 타이밍에 활동 로그(activity log) 잠금에 실패하더라도 에러를 반환하지 않아, 데이터 동기화 중 상호 배제성이 보장되지 않거나 참조 횟수 오류로 인해 커널 패닉(crash)이 발생할 수 있습니다.
💡 쉬운 설명
데이터를 복제하는 과정에서 시스템이 일시적인 혼란을 겪어 데이터가 제대로 동기화되지 않거나 컴퓨터가 갑자기 꺼질 수 있는 문제입니다. 특정 상황에서 시스템이 오류를 제대로 처리하지 못해 발생하는 소프트웨어 결함입니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
drbd: fix "LOGIC BUG" in drbd_al_begin_io_nonblock()
Even though we check that we "should" be able to do lc_get_cumulative()
while holding the device->al_lock spinlock, it may still fail,
if some other code path decided to do lc_try_lock() with bad timing.
If that happened, we logged "LOGIC BUG for enr=...",
but still did not return an error.
The rest of the code now assumed that this request has references
for the relevant activity log extents.
The implcations are that during an active resync, mutual exclusivity of
resync versus application IO is not guaranteed. And a potential crash
at this point may not realizs that these extents could have been target
of in-flight IO and would need to be resynced just in case.
Also, once the request completes, it will give up activity log references it
does not even hold, which will trigger a BUG_ON(refcnt == 0) in lc_put().
Fix:
Do not crash the kernel for a condition that is harmless during normal
operation: also catch "e->refcnt == 0", not only "e == NULL"
when being noisy about "al_complete_io() called on inactive extent %u\n".
And do not try to be smart and "guess" whether something will work, then
be surprised when it does not.
Deal with the fact that it may or may not work. If it does not, remember a
possible "partially in activity log" state (only possible for requests that
cross extent boundaries), and return an error code from
drbd_al_begin_io_nonblock().
A latter call for the same request will then resume from where we left off.
📍 영향받는 시스템
DRBD(Distributed Replicated Block Device) 모듈을 사용하는 Linux 커널 시스템
⚔️ 공격 벡터
직접적인 외부 공격보다는 특정 타이밍의 입출력(I/O) 작업이 겹칠 때 발생하는 레이스 컨디션(Race Condition) 기반의 시스템 불안정성 유발
🛡️ 대응 방법
DRBD 로직 버그가 수정된 최신 버전의 Linux 커널로 업데이트하십시오.
🔧 검증 코드
출력된 커널 버전을 확인하여 해당 취약점이 패치된 최신 보안 업데이트 버전인지 확인하십시오.