• John Fastabend's avatar
    bpf: sockmap, strparser, and tls are reusing qdisc_skb_cb and colliding · e0dc3b93
    John Fastabend authored
    Strparser is reusing the qdisc_skb_cb struct to stash the skb message handling
    progress, e.g. offset and length of the skb. First this is poorly named and
    inherits a struct from qdisc that doesn't reflect the actual usage of cb[] at
    this layer.
    
    But, more importantly strparser is using the following to access its metadata.
    
      (struct _strp_msg *)((void *)skb->cb + offsetof(struct qdisc_skb_cb, data))
    
    Where _strp_msg is defined as:
    
      struct _strp_msg {
            struct strp_msg            strp;                 /*     0     8 */
            int                        accum_len;            /*     8     4 */
    
            /* size: 12, cachelines: 1, members: 2 */
            /* last cacheline: 12 bytes */
      };
    
    So we use 12 bytes of ->data[] in struct. However in BPF code running parser
    and verdict the user has read capabilities into the data[] array as well. Its
    not too problematic, but we should not be exposing internal state to BPF
    program. If its really needed then we can use the probe_read() APIs which allow
    reading kernel memory. And I don't believe cb[] layer poses any API breakage by
    moving this around because programs can't depend on cb[] across layers.
    
    In order to fix another issue with a ctx rewrite we need to stash a temp
    variable somewhere. To make this work cleanly this patch builds a cb struct
    for sk_skb types called sk_skb_cb struct. Then we can use this consistently
    in the strparser, sockmap space. Additionally we can start allowing ->cb[]
    write access after this.
    
    Fixes: 604326b4 ("bpf, sockmap: convert to generic sk_msg interface")
    Signed-off-by: default avatarJohn Fastabend <john.fastabend@gmail.com>
    Signed-off-by: default avatarDaniel Borkmann <daniel@iogearbox.net>
    Tested-by: default avatarJussi Maki <joamaki@gmail.com>
    Reviewed-by: default avatarJakub Sitnicki <jakub@cloudflare.com>
    Link: https://lore.kernel.org/bpf/20211103204736.248403-5-john.fastabend@gmail.com
    e0dc3b93
strparser.h 3.98 KB