• Juergen Gross's avatar
    xen/gnttab: fix gnttab_end_foreign_access() without page specified · 42baefac
    Juergen Gross authored
    gnttab_end_foreign_access() is used to free a grant reference and
    optionally to free the associated page. In case the grant is still in
    use by the other side processing is being deferred. This leads to a
    problem in case no page to be freed is specified by the caller: the
    caller doesn't know that the page is still mapped by the other side
    and thus should not be used for other purposes.
    
    The correct way to handle this situation is to take an additional
    reference to the granted page in case handling is being deferred and
    to drop that reference when the grant reference could be freed
    finally.
    
    This requires that there are no users of gnttab_end_foreign_access()
    left directly repurposing the granted page after the call, as this
    might result in clobbered data or information leaks via the not yet
    freed grant reference.
    
    This is part of CVE-2022-23041 / XSA-396.
    Reported-by: default avatarSimon Gaiser <simon@invisiblethingslab.com>
    Signed-off-by: default avatarJuergen Gross <jgross@suse.com>
    Reviewed-by: default avatarJan Beulich <jbeulich@suse.com>
    ---
    V4:
    - expand comment in header
    V5:
    - get page ref in case of kmalloc() failure, too
    42baefac
grant-table.c 40.3 KB