All of lore.kernel.org
 help / color / mirror / Atom feed
  • * [PATCH iproute2 v3] ipnetns: use-after-free problem in get_netnsid_from_name func
           [not found] ` <815afacc-4cd2-61b4-2181-aabce6582309@huawei.com>
           [not found]   ` <20190429092808.GZ31599@orbyte.nwl.cc>
    @ 2019-05-04  7:26   ` Zhiqiang Liu
      2019-05-04 15:08     ` David Ahern
                           ` (2 more replies)
      1 sibling, 3 replies; 7+ messages in thread
    From: Zhiqiang Liu @ 2019-05-04  7:26 UTC (permalink / raw)
      To: stephen, liuhangbin, kuznet
      Cc: nicolas.dichtel, phil, wangxiaogang (F), Mingfangsen,
    	Zhoukang (A), kouhuiying, netdev
    
    From: Zhiqiang Liu <liuzhiqiang26@huawei.com>
    
    Follow the following steps:
    # ip netns add net1
    # export MALLOC_MMAP_THRESHOLD_=0
    # ip netns list
    then Segmentation fault (core dumped) will occur.
    
    In get_netnsid_from_name func, answer is freed before rta_getattr_u32(tb[NETNSA_NSID]),
    where tb[] refers to answer`s content. If we set MALLOC_MMAP_THRESHOLD_=0, mmap will
    be adoped to malloc memory, which will be freed immediately after calling free func.
    So reading tb[NETNSA_NSID] will access the released memory after free(answer).
    
    Here, we will call get_netnsid_from_name(tb[NETNSA_NSID]) before free(answer).
    
    Fixes: 86bf43c7c2f ("lib/libnetlink: update rtnl_talk to support malloc buff at run time")
    Reported-by: Huiying Kou <kouhuiying@huawei.com>
    Signed-off-by: Zhiqiang Liu <liuzhiqiang26@huawei.com>
    Acked-by: Phil Sutter <phil@nwl.cc>
    ---
    v2->v3: add Cc:netdev@vger.kernel.org suggested by Phil Sutter
    v1->v2: correct commit log
    
     ip/ipnetns.c | 5 +++--
     1 file changed, 3 insertions(+), 2 deletions(-)
    
    diff --git a/ip/ipnetns.c b/ip/ipnetns.c
    index 430d884..d72be95 100644
    --- a/ip/ipnetns.c
    +++ b/ip/ipnetns.c
    @@ -107,7 +107,7 @@ int get_netnsid_from_name(const char *name)
     	struct nlmsghdr *answer;
     	struct rtattr *tb[NETNSA_MAX + 1];
     	struct rtgenmsg *rthdr;
    -	int len, fd;
    +	int len, fd, ret = -1;
    
     	netns_nsid_socket_init();
    
    @@ -134,8 +134,9 @@ int get_netnsid_from_name(const char *name)
     	parse_rtattr(tb, NETNSA_MAX, NETNS_RTA(rthdr), len);
    
     	if (tb[NETNSA_NSID]) {
    +		ret = rta_getattr_u32(tb[NETNSA_NSID]);
     		free(answer);
    -		return rta_getattr_u32(tb[NETNSA_NSID]);
    +		return ret;
     	}
    
     err_out:
    -- 
    1.8.3.1
    
    
    
    
    ^ permalink raw reply related	[flat|nested] 7+ messages in thread

  • end of thread, other threads:[~2019-05-06 15:51 UTC | newest]
    
    Thread overview: 7+ messages (download: mbox.gz follow: Atom feed
    -- links below jump to the message on this page --
         [not found] <f6c76a60-d5c4-700f-2fbf-912fc1545a31@huawei.com>
         [not found] ` <815afacc-4cd2-61b4-2181-aabce6582309@huawei.com>
         [not found]   ` <20190429092808.GZ31599@orbyte.nwl.cc>
    2019-05-04  7:08     ` [PATCH v2] ipnetns: use-after-free problem in get_netnsid_from_name func Zhiqiang Liu
    2019-05-04  7:26   ` [PATCH iproute2 v3] " Zhiqiang Liu
    2019-05-04 15:08     ` David Ahern
    2019-05-05  1:15       ` Zhiqiang Liu
    2019-05-05  1:59     ` [PATCH iproute2 v4] " Zhiqiang Liu
    2019-05-06 15:42     ` [PATCH iproute2 v3] " Stephen Hemminger
    2019-05-06 15:50       ` Zhiqiang Liu
    

    This is an external index of several public inboxes,
    see mirroring instructions on how to clone and mirror
    all data and code used by this external index.