[하루한줄] CVE-2021-20226: Linux kernel Reference counting bug
URL
Target
Linux kernel 5.6
Explain
Linux kernel 5.1에서 하나의 시스템콜로 여러 I/O작업을 수행할 수 있는 io_uring(비동기 I/O) 기능이 도입되었습니다. Linux kernel 5.6으로 올라오면서 해당 기능에 취약점이 생겼습니다. 시스템 콜이 커널 쓰레드로 files_structure
를 전달해도 io_grab_files()
의 reference counter가 증가하지 않아 IORING_OP_CLOSE
작업이 진행되는 동안 files_structure
의 존재 유무를 판단하지 못하게 됩니다. 즉, 해당 files_structure
가 할당 해체된 이후에도 접근할 수 있게 되고 DoS로 이어질 수 있습니다.
static int io_grab_files(struct io_kiocb *req)
{
// ...
rcu_read_lock();
spin_lock_irq(&ctx->inflight_lock);spin_lock_irq(&ctx->inflight_lock);
if (fcheck(ctx->ring_fd) == ctx->ring_file) {
list_add(&req->inflight_entry, &ctx->inflight_list);
req->flags |= REQ_F_INFLIGHT;
req->work.files = current->files; // vuln here
ret = 0;
}
spin_unlock_irq(&ctx->inflight_lock);
rcu_read_unlock();
return ret;
}
본 글은 CC BY-SA 4.0 라이선스로 배포됩니다. 공유 또는 변경 시 반드시 출처를 남겨주시기 바랍니다.