• K
    uaccess: Add minimum bounds check on kernel buffer size · 04ffde13
    Kees Cook 提交于
    While there is logic about the difference between ksize and usize,
    copy_struct_from_user() didn't check the size of the destination buffer
    (when it was known) against ksize. Add this check so there is an upper
    bounds check on the possible memset() call, otherwise lower bounds
    checks made by callers will trigger bounds warnings under -Warray-bounds.
    Seen under GCC 13:
    
    In function 'copy_struct_from_user',
        inlined from 'iommufd_fops_ioctl' at
    ../drivers/iommu/iommufd/main.c:333:8:
    ../include/linux/fortify-string.h:59:33: warning: '__builtin_memset' offset [57, 4294967294] is out of the bounds [0, 56] of object 'buf' with type 'union ucmd_buffer' [-Warray-bounds=]
       59 | #define __underlying_memset     __builtin_memset
          |                                 ^
    ../include/linux/fortify-string.h:453:9: note: in expansion of macro '__underlying_memset'
      453 |         __underlying_memset(p, c, __fortify_size); \
          |         ^~~~~~~~~~~~~~~~~~~
    ../include/linux/fortify-string.h:461:25: note: in expansion of macro '__fortify_memset_chk'
      461 | #define memset(p, c, s) __fortify_memset_chk(p, c, s, \
          |                         ^~~~~~~~~~~~~~~~~~~~
    ../include/linux/uaccess.h:334:17: note: in expansion of macro 'memset'
      334 |                 memset(dst + size, 0, rest);
          |                 ^~~~~~
    ../drivers/iommu/iommufd/main.c: In function 'iommufd_fops_ioctl':
    ../drivers/iommu/iommufd/main.c:311:27: note: 'buf' declared here
      311 |         union ucmd_buffer buf;
          |                           ^~~
    
    Cc: Christian Brauner <brauner@kernel.org>
    Cc: Rasmus Villemoes <linux@rasmusvillemoes.dk>
    Cc: Arnd Bergmann <arnd@arndb.de>
    Cc: Dinh Nguyen <dinguyen@kernel.org>
    Cc: Catalin Marinas <catalin.marinas@arm.com>
    Cc: Andrew Morton <akpm@linux-foundation.org>
    Cc: Geert Uytterhoeven <geert@linux-m68k.org>
    Cc: Alexander Potapenko <glider@google.com>
    Acked-by: NAleksa Sarai <cyphar@cyphar.com>
    Signed-off-by: NKees Cook <keescook@chromium.org>
    Link: https://lore.kernel.org/lkml/20230203193523.never.667-kees@kernel.org/
    04ffde13
uaccess.h 13.5 KB