[하루한줄] CVE-2021-20226: Linux kernel Reference counting bug

URL

CVE-2021-20226

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; 
}