• Kees Cook's avatar
    net: Restrict unwhitelisted proto caches to size 0 · 289a4860
    Kees Cook authored
    Now that protocols have been annotated (the copy of icsk_ca_ops->name
    is of an ops field from outside the slab cache):
    
    $ git grep 'copy_.*_user.*sk.*->'
    caif/caif_socket.c: copy_from_user(&cf_sk->conn_req.param.data, ov, ol)) {
    ipv4/raw.c:   if (copy_from_user(&raw_sk(sk)->filter, optval, optlen))
    ipv4/raw.c:       copy_to_user(optval, &raw_sk(sk)->filter, len))
    ipv4/tcp.c:       if (copy_to_user(optval, icsk->icsk_ca_ops->name, len))
    ipv4/tcp.c:       if (copy_to_user(optval, icsk->icsk_ulp_ops->name, len))
    ipv6/raw.c:       if (copy_from_user(&raw6_sk(sk)->filter, optval, optlen))
    ipv6/raw.c:           if (copy_to_user(optval, &raw6_sk(sk)->filter, len))
    sctp/socket.c: if (copy_from_user(&sctp_sk(sk)->subscribe, optval, optlen))
    sctp/socket.c: if (copy_to_user(optval, &sctp_sk(sk)->subscribe, len))
    sctp/socket.c: if (copy_to_user(optval, &sctp_sk(sk)->initmsg, len))
    
    we can switch the default proto usercopy region to size 0. Any protocols
    needing to add whitelisted regions must annotate the fields with the
    useroffset and usersize fields of struct proto.
    
    This patch is modified from Brad Spengler/PaX Team's PAX_USERCOPY
    whitelisting code in the last public patch of grsecurity/PaX based on my
    understanding of the code. Changes or omissions from the original code are
    mine and don't reflect the original grsecurity/PaX code.
    
    Cc: "David S. Miller" <davem@davemloft.net>
    Cc: Eric Dumazet <edumazet@google.com>
    Cc: Paolo Abeni <pabeni@redhat.com>
    Cc: David Howells <dhowells@redhat.com>
    Cc: netdev@vger.kernel.org
    Signed-off-by: default avatarKees Cook <keescook@chromium.org>
    289a4860
sock.c 82.5 KB