🇰🇷 한글 설명
리눅스 커널의 block/rq_qos 계층에서 디스크 제거와 cgroup 설정 간의 동기화 문제로 인해 발생하는 취약점입니다. 이로 인해 경합 조건(Race Condition)이 발생하여 Null 포인터 역참조 또는 메모리 누수가 발생할 수 있습니다.
💡 쉬운 설명
디스크를 제거하는 과정과 디스크 설정을 변경하는 과정이 동시에 일어날 때 시스템이 충돌하거나 메모리가 낭비될 수 있는 문제입니다. 새로운 잠금(Lock) 장치를 추가하여 이러한 충돌을 방지하도록 수정되었습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
block/rq_qos: protect rq_qos apis with a new lock
commit 50e34d78815e ("block: disable the elevator int del_gendisk")
move rq_qos_exit() from disk_release() to del_gendisk(), this will
introduce some problems:
1) If rq_qos_add() is triggered by enabling iocost/iolatency through
cgroupfs, then it can concurrent with del_gendisk(), it's not safe to
write 'q->rq_qos' concurrently.
2) Activate cgroup policy that is relied on rq_qos will call
rq_qos_add() and blkcg_activate_policy(), and if rq_qos_exit() is
called in the middle, null-ptr-dereference will be triggered in
blkcg_activate_policy().
3) blkg_conf_open_bdev() can call blkdev_get_no_open() first to find the
disk, then if rq_qos_exit() from del_gendisk() is done before
rq_qos_add(), then memory will be leaked.
This patch add a new disk level mutex 'rq_qos_mutex':
1) The lock will protect rq_qos_exit() directly.
2) For wbt that doesn't relied on blk-cgroup, rq_qos_add() can only be
called from disk initialization for now because wbt can't be
destructed until rq_qos_exit(), so it's safe not to protect wbt for
now. Hoever, in case that rq_qos dynamically destruction is supported
in the furture, this patch also protect rq_qos_add() from wbt_init()
directly, this is enough because blk-sysfs already synchronize
writers with disk removal.
3) For iocost and iolatency, in order to synchronize disk removal and
cgroup configuration, the lock is held after blkdev_get_no_open()
from blkg_conf_open_bdev(), and is released in blkg_conf_exit().
In order to fix the above memory leak, disk_live() is checked after
holding the new lock.
📍 영향받는 시스템
Linux Kernel (rq_qos 관련 모듈을 사용하는 시스템)
⚔️ 공격 벡터
로컬 공격자가 cgroup 설정을 조작하거나 디스크 제거 프로세스를 유도하여 경합 조건을 발생시킴
🛡️ 대응 방법
리눅스 커널을 최신 보안 패치가 적용된 버전으로 업데이트
🔧 검증 코드
출력된 커널 버전이 해당 취약점이 해결된 패치 버전 이후인지 확인