• Ondrej Mosnacek's avatar
    serial: core: fix suspicious security_locked_down() call · 5e722b21
    Ondrej Mosnacek authored
    The commit that added this check did so in a very strange way - first
    security_locked_down() is called, its value stored into retval, and if
    it's nonzero, then an additional check is made for (change_irq ||
    change_port), and if this is true, the function returns. However, if
    the goto exit branch is not taken, the code keeps the retval value and
    continues executing the function. Then, depending on whether
    uport->ops->verify_port is set, the retval value may or may not be reset
    to zero and eventually the error value from security_locked_down() may
    abort the function a few lines below.
    
    I will go out on a limb and assume that this isn't the intended behavior
    and that an error value from security_locked_down() was supposed to
    abort the function only in case (change_irq || change_port) is true.
    
    Note that security_locked_down() should be called last in any series of
    checks, since the SELinux implementation of this hook will do a check
    against the policy and generate an audit record in case of denial. If
    the operation was to carry on after calling security_locked_down(), then
    the SELinux denial record would be bogus.
    
    See commit 59438b46 ("security,lockdown,selinux: implement SELinux
    lockdown") for how SELinux implements this hook.
    
    Fixes: 794edf30 ("lockdown: Lock down TIOCSSERIAL")
    Acked-by: default avatarKees Cook <keescook@chromium.org>
    Signed-off-by: default avatarOndrej Mosnacek <omosnace@redhat.com>
    Cc: stable <stable@vger.kernel.org>
    Link: https://lore.kernel.org/r/20210507115719.140799-1-omosnace@redhat.comSigned-off-by: default avatarGreg Kroah-Hartman <gregkh@linuxfoundation.org>
    5e722b21
serial_core.c 79.6 KB