lkml.org 
[lkml]   [2017]   [Jun]   [7]   [last100]   RSS Feed
Views: [wrap][no wrap]   [headers]  [forward] 
 
Messages in this thread
    Patch in this message
    /
    From
    Subject[PATCH 3.10 119/250] netlabel: out of bound access in cipso_v4_validate()
    Date
    From: Eric Dumazet <edumazet@google.com>

    commit d71b7896886345c53ef1d84bda2bc758554f5d61 upstream.

    syzkaller found another out of bound access in ip_options_compile(),
    or more exactly in cipso_v4_validate()

    Fixes: 20e2a8648596 ("cipso: handle CIPSO options correctly when NetLabel is disabled")
    Fixes: 446fda4f2682 ("[NetLabel]: CIPSOv4 engine")
    Signed-off-by: Eric Dumazet <edumazet@google.com>
    Reported-by: Dmitry Vyukov <dvyukov@google.com>
    Cc: Paul Moore <paul@paul-moore.com>
    Acked-by: Paul Moore <paul@paul-moore.com>
    Signed-off-by: David S. Miller <davem@davemloft.net>
    Signed-off-by: Willy Tarreau <w@1wt.eu>
    ---
    include/net/cipso_ipv4.h | 4 ++++
    net/ipv4/cipso_ipv4.c | 4 ++++
    2 files changed, 8 insertions(+)

    diff --git a/include/net/cipso_ipv4.h b/include/net/cipso_ipv4.h
    index a8c2ef6..9078b31 100644
    --- a/include/net/cipso_ipv4.h
    +++ b/include/net/cipso_ipv4.h
    @@ -303,6 +303,10 @@ static inline int cipso_v4_validate(const struct sk_buff *skb,
    }

    for (opt_iter = 6; opt_iter < opt_len;) {
    + if (opt_iter + 1 == opt_len) {
    + err_offset = opt_iter;
    + goto out;
    + }
    tag_len = opt[opt_iter + 1];
    if ((tag_len == 0) || (opt[opt_iter + 1] > (opt_len - opt_iter))) {
    err_offset = opt_iter + 1;
    diff --git a/net/ipv4/cipso_ipv4.c b/net/ipv4/cipso_ipv4.c
    index 667c1d4..4322372d 100644
    --- a/net/ipv4/cipso_ipv4.c
    +++ b/net/ipv4/cipso_ipv4.c
    @@ -1649,6 +1649,10 @@ int cipso_v4_validate(const struct sk_buff *skb, unsigned char **option)
    goto validate_return_locked;
    }

    + if (opt_iter + 1 == opt_len) {
    + err_offset = opt_iter;
    + goto validate_return_locked;
    + }
    tag_len = tag[1];
    if (tag_len > (opt_len - opt_iter)) {
    err_offset = opt_iter + 1;
    --
    2.8.0.rc2.1.gbe9624a
    \
     
     \ /
      Last update: 2017-06-12 01:16    [W:4.150 / U:0.164 seconds]
    ©2003-2020 Jasper Spaans|hosted at Digital Ocean and TransIP|Read the blog|Advertise on this site