Return-Path: Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1957299AbdDZIyy (ORCPT ); Wed, 26 Apr 2017 04:54:54 -0400 Received: from mail-qk0-f177.google.com ([209.85.220.177]:35744 "EHLO mail-qk0-f177.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1957247AbdDZIyc (ORCPT ); Wed, 26 Apr 2017 04:54:32 -0400 MIME-Version: 1.0 In-Reply-To: <20170425.135543.1706004185593424024.davem@davemloft.net> References: <20170425131827.66498-1-glider@google.com> <20170425.135543.1706004185593424024.davem@davemloft.net> From: Alexander Potapenko Date: Wed, 26 Apr 2017 10:54:30 +0200 Message-ID: Subject: Re: [PATCH] ipv6: ensure message length for raw socket is at least sizeof(ipv6hdr) To: David Miller Cc: Dmitriy Vyukov , Kostya Serebryany , Eric Dumazet , Alexey Kuznetsov , LKML , Networking Content-Type: text/plain; charset=UTF-8 Sender: linux-kernel-owner@vger.kernel.org List-ID: X-Mailing-List: linux-kernel@vger.kernel.org Content-Transfer-Encoding: 8bit X-MIME-Autoconverted: from quoted-printable to 8bit by mail.home.local id v3Q8uBL8000399 Content-Length: 1736 Lines: 59 On Tue, Apr 25, 2017 at 7:55 PM, David Miller wrote: > From: Alexander Potapenko > Date: Tue, 25 Apr 2017 15:18:27 +0200 > >> rawv6_send_hdrinc() expects that the buffer copied from the userspace >> contains the IPv6 header, so if too few bytes are copied parts of the >> header may remain uninitialized. >> >> This bug has been detected with KMSAN. >> >> Signed-off-by: Alexander Potapenko > > Hmmm, ipv4 seems to lack this check as well. > > I think we need to be careful here and fully understand why KMSAN doesn't > seem to be triggering in the ipv4 case but for ipv6 it is before I apply > this. Maybe I just couldn't come up with a decent test case for ipv4 yet. syzkaller generated the equivalent of the following program for ipv6: ======================================= #define _GNU_SOURCE #include #include #include #include int main() { int sock = socket(PF_INET6, SOCK_RAW, IPPROTO_RAW); struct sockaddr_in6 dest_addr; memset(&dest_addr, 0, sizeof(dest_addr)); dest_addr.sin6_family = AF_INET6; inet_pton(AF_INET6, "ff00::", &dest_addr.sin6_addr); int err = sendto(sock, 0, 0, 0, &dest_addr, sizeof(dest_addr)); if (err == -1) perror("sendto"); return 0; } ======================================= I attempted to replace INET6 and such with INET and provide a legal IPv4 address to inet_pton(), but couldn't trigger the warning. > Thanks. -- Alexander Potapenko Software Engineer Google Germany GmbH Erika-Mann-Straße, 33 80636 München Geschäftsführer: Matthew Scott Sucherman, Paul Terence Manicle Registergericht und -nummer: Hamburg, HRB 86891 Sitz der Gesellschaft: Hamburg