🇰🇷 한글 설명
Linux 커널의 MCTP 라우팅에서 mctp_flow_prepare_output() 함수가 key->lock을 보유하지 않고 key->dev를 확인·수정하여 발생하는 경쟁 조건(race condition)입니다. 여러 CPU가 동시에 접근할 때 참조 카운트가 누수되어 리소스 누출이 발생합니다.
💡 쉬운 설명
Linux 커널이 여러 작업을 동시에 처리할 때 같은 메모리 영역을 제어하는 과정에서 충돌이 발생합니다. 결과적으로 할당된 자원이 해제되지 않아 시스템 메모리가 계속 줄어듭니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
mctp: route: hold key->lock in mctp_flow_prepare_output()
mctp_flow_prepare_output() checks key->dev and may call
mctp_dev_set_key(), but it does not hold key->lock while doing so.
mctp_dev_set_key() and mctp_dev_release_key() are annotated with
__must_hold(&key->lock), so key->dev access is intended to be
serialized by key->lock. The mctp_sendmsg() transmit path reaches
mctp_flow_prepare_output() via mctp_local_output() -> mctp_dst_output()
without holding key->lock, so the check-and-set sequence is racy.
Example interleaving:
CPU0 CPU1
---- ----
mctp_flow_prepare_output(key, devA)
if (!key->dev) // sees NULL
mctp_flow_prepare_output(
key, devB)
if (!key->dev) // still NULL
mctp_dev_set_key(devB, key)
mctp_dev_hold(devB)
key->dev = devB
mctp_dev_set_key(devA, key)
mctp_dev_hold(devA)
key->dev = devA // overwrites devB
Now both devA and devB references were acquired, but only the final
key->dev value is tracked for release. One reference can be lost,
causing a resource leak as mctp_dev_release_key() would only decrease
the reference on one dev.
Fix by taking key->lock around the key->dev check and
mctp_dev_set_key() call.
📍 영향받는 시스템
Linux kernel with MCTP module enabled (모든 배포판의 최신 커널)
⚔️ 공격 벡터
로컬 공격자가 race condition을 반복 유발하여 서비스 거부(DoS) 또는 권한 상승
🛡️ 대응 방법
Linux kernel 패치 적용 또는 CONFIG_MCTP 비활성화
🔧 검증 코드
커널 버전을 확인하고 MCTP 모듈이 로드되어 있으면 취약함. MCTP가 로드되지 않으면 안전.
uname -r && lsmod 2>/dev/null | grep -i mctp || echo 'MCTP not loaded'