• Baokun Li's avatar
    cachefiles: cyclic allocation of msg_id to avoid reuse · 19f4f399
    Baokun Li authored
    Reusing the msg_id after a maliciously completed reopen request may cause
    a read request to remain unprocessed and result in a hung, as shown below:
    
           t1       |      t2       |      t3
    -------------------------------------------------
    cachefiles_ondemand_select_req
     cachefiles_ondemand_object_is_close(A)
     cachefiles_ondemand_set_object_reopening(A)
     queue_work(fscache_object_wq, &info->work)
                    ondemand_object_worker
                     cachefiles_ondemand_init_object(A)
                      cachefiles_ondemand_send_req(OPEN)
                        // get msg_id 6
                        wait_for_completion(&req_A->done)
    cachefiles_ondemand_daemon_read
     // read msg_id 6 req_A
     cachefiles_ondemand_get_fd
     copy_to_user
                                    // Malicious completion msg_id 6
                                    copen 6,-1
                                    cachefiles_ondemand_copen
                                     complete(&req_A->done)
                                     // will not set the object to close
                                     // because ondemand_id && fd is valid.
    
                    // ondemand_object_worker() is done
                    // but the object is still reopening.
    
                                    // new open req_B
                                    cachefiles_ondemand_init_object(B)
                                     cachefiles_ondemand_send_req(OPEN)
                                     // reuse msg_id 6
    process_open_req
     copen 6,A.size
     // The expected failed copen was executed successfully
    
    Expect copen to fail, and when it does, it closes fd, which sets the
    object to close, and then close triggers reopen again. However, due to
    msg_id reuse resulting in a successful copen, the anonymous fd is not
    closed until the daemon exits. Therefore read requests waiting for reopen
    to complete may trigger hung task.
    
    To avoid this issue, allocate the msg_id cyclically to avoid reusing the
    msg_id for a very short duration of time.
    
    Fixes: c8383054 ("cachefiles: notify the user daemon when looking up cookie")
    Signed-off-by: default avatarBaokun Li <libaokun1@huawei.com>
    Link: https://lore.kernel.org/r/20240628062930.2467993-9-libaokun@huaweicloud.comAcked-by: default avatarJeff Layton <jlayton@kernel.org>
    Reviewed-by: default avatarGao Xiang <hsiangkao@linux.alibaba.com>
    Reviewed-by: default avatarJia Zhu <zhujia.zj@bytedance.com>
    Signed-off-by: default avatarChristian Brauner <brauner@kernel.org>
    19f4f399
internal.h 16.3 KB