• Takashi Iwai's avatar
    media: dvb-core: Fix UAF due to refcount races at releasing · fd3d91ab
    Takashi Iwai authored
    The dvb-core tries to sync the releases of opened files at
    dvb_dmxdev_release() with two refcounts: dvbdev->users and
    dvr_dvbdev->users.  A problem is present in those two syncs: when yet
    another dvb_demux_open() is called during those sync waits,
    dvb_demux_open() continues to process even if the device is being
    closed.  This includes the increment of the former refcount, resulting
    in the leftover refcount after the sync of the latter refcount at
    dvb_dmxdev_release().  It ends up with use-after-free, since the
    function believes that all usages were gone and releases the
    resources.
    
    This patch addresses the problem by adding the check of dmxdev->exit
    flag at dvb_demux_open(), just like dvb_dvr_open() already does.  With
    the exit flag check, the second call of dvb_demux_open() fails, hence
    the further corruption can be avoided.
    
    Also for avoiding the races of the dmxdev->exit flag reference, this
    patch serializes the dmxdev->exit set up and the sync waits with the
    dmxdev->mutex lock at dvb_dmxdev_release().  Without the mutex lock,
    dvb_demux_open() (or dvb_dvr_open()) may run concurrently with
    dvb_dmxdev_release(), which allows to skip the exit flag check and
    continue the open process that is being closed.
    
    CVE-2022-41218 is assigned to those bugs above.
    Reported-by: default avatarHyunwoo Kim <imv4bel@gmail.com>
    Cc: <stable@vger.kernel.org>
    Link: https://lore.kernel.org/20220908132754.30532-1-tiwai@suse.deSigned-off-by: default avatarTakashi Iwai <tiwai@suse.de>
    Signed-off-by: default avatarHans Verkuil <hverkuil-cisco@xs4all.nl>
    fd3d91ab
dmxdev.c 35 KB