🇰🇷 한글 설명
Linux 커널에서 cgroup freezer의 잠금 순서 문제가 해결되었습니다. freezer_mutex와 cpu_hotplug_lock 사이의 순환 잠금 의존성으로 인해 교착 상태가 발생할 수 있었으며, cpus_read_lock() 호출 위치를 mutex_lock(&freezer_mutex) 이전으로 옮겨 잠금 순서를 교정했습니다.
💡 쉬운 설명
여러 작업이 동시에 특정 잠금을 기다리면서 시스템이 멈출 수 있는 교착 상태 버그가 있었습니다. 잠금을 잡는 순서를 바꿔서 이 멈춤 문제를 해결했습니다.
🇺🇸 원문 (English)
In the Linux kernel, the following vulnerability has been resolved:
cgroup,freezer: hold cpu_hotplug_lock before freezer_mutex
syzbot is reporting circular locking dependency between cpu_hotplug_lock
and freezer_mutex, for commit f5d39b020809 ("freezer,sched: Rewrite core
freezer logic") replaced atomic_inc() in freezer_apply_state() with
static_branch_inc() which holds cpu_hotplug_lock.
cpu_hotplug_lock => cgroup_threadgroup_rwsem => freezer_mutex
cgroup_file_write() {
cgroup_procs_write() {
__cgroup_procs_write() {
cgroup_procs_write_start() {
cgroup_attach_lock() {
cpus_read_lock() {
percpu_down_read(&cpu_hotplug_lock);
}
percpu_down_write(&cgroup_threadgroup_rwsem);
}
}
cgroup_attach_task() {
cgroup_migrate() {
cgroup_migrate_execute() {
freezer_attach() {
mutex_lock(&freezer_mutex);
(...snipped...)
}
}
}
}
(...snipped...)
}
}
}
freezer_mutex => cpu_hotplug_lock
cgroup_file_write() {
freezer_write() {
freezer_change_state() {
mutex_lock(&freezer_mutex);
freezer_apply_state() {
static_branch_inc(&freezer_active) {
static_key_slow_inc() {
cpus_read_lock();
static_key_slow_inc_cpuslocked();
cpus_read_unlock();
}
}
}
mutex_unlock(&freezer_mutex);
}
}
}
Swap locking order by moving cpus_read_lock() in freezer_apply_state()
to before mutex_lock(&freezer_mutex) in freezer_change_state().
📍 영향받는 시스템
Linux 커널 (f5d39b020809 커밋이 포함된 버전, freezer 로직 재작성 이후 커널)
⚔️ 공격 벡터
권한 있는 로컬 사용자가 cgroup 파일에 반복적으로 쓰기 작업을 수행해 교착 상태를 유발하면 서비스 거부(DoS)가 발생할 수 있습니다.
🛡️ 대응 방법
패치된 Linux 커널 버전으로 업데이트하거나 배포판의 보안 업데이트를 설치하세요.
🔧 검증 코드
출력된 커널 버전이 배포판의 패치된 버전 이상인지 배포판 보안 공지와 비교해 확인하고, 해당 커밋이 포함되었는지 확인하려면 패키지 changelog를 조회하세요.