• Wenwen Wang's avatar
    ethtool: fix a missing-check bug · 2bb3207d
    Wenwen Wang authored
    In ethtool_get_rxnfc(), the eth command 'cmd' is compared against
    'ETHTOOL_GRXFH' to see whether it is necessary to adjust the variable
    'info_size'. Then the whole structure of 'info' is copied from the
    user-space buffer 'useraddr' with 'info_size' bytes. In the following
    execution, 'info' may be copied again from the buffer 'useraddr' depending
    on the 'cmd' and the 'info.flow_type'. However, after these two copies,
    there is no check between 'cmd' and 'info.cmd'. In fact, 'cmd' is also
    copied from the buffer 'useraddr' in dev_ethtool(), which is the caller
    function of ethtool_get_rxnfc(). Given that 'useraddr' is in the user
    space, a malicious user can race to change the eth command in the buffer
    between these copies. By doing so, the attacker can supply inconsistent
    data and cause undefined behavior because in the following execution 'info'
    will be passed to ops->get_rxnfc().
    
    This patch adds a necessary check on 'info.cmd' and 'cmd' to confirm that
    they are still same after the two copies in ethtool_get_rxnfc(). Otherwise,
    an error code EINVAL will be returned.
    Signed-off-by: default avatarWenwen Wang <wang6495@umn.edu>
    Signed-off-by: default avatarDavid S. Miller <davem@davemloft.net>
    2bb3207d
ethtool.c 73.5 KB