Received: by 2002:a05:6a10:206:0:0:0:0 with SMTP id 6csp4072710pxj; Tue, 15 Jun 2021 14:58:13 -0700 (PDT) X-Google-Smtp-Source: ABdhPJwcUl5vv4JdlOxhCABRI9YyNMyKg0/YOHFnrVS+2fCeLaWEhX/j9GZCVKTG5J+An9TFlo2B X-Received: by 2002:a05:6402:cb5:: with SMTP id cn21mr324392edb.164.1623794293593; Tue, 15 Jun 2021 14:58:13 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1623794293; cv=none; d=google.com; s=arc-20160816; b=XTrf7A6RpErC12EvZ1P/jC6vEk1EONsNwyu3puGmw+fbi7cEkD1NU3wp13deBnMrKS a4wdhQbJUewxNHRUR4zv87f6/qlh9qLUdMZZtLfnB2TKFalBKNPkqp7d1kAsK63rZHaS cP/9g5uDVRFCP/6LPwufBKHKMPGlE8BEZ7erEGuv8Ihghbx1wOqQNI7N5QqaISKXAYRF v0Z8rqrsO58fozPuxEU+6hDHKogjrjJl0C8SJtIZgZ0Vfg05eRwEFz6a4AYDf2slYq2B K+Knic6FnYJBFo1EJswpT4s8cKu4qJEyf2by2jTiaBcEBAPqABySKZT/CHClzYMpfvBq +6GA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:content-language :in-reply-to:mime-version:user-agent:date:message-id:from:references :cc:to:subject; bh=k3ccg9mpyGuJlP4StkHf/KwlYBnsSRYrs6zxKfc17wc=; b=CG38TYh67KQsuCt+wYc4qMHNu5TMYpPQ/QSTfBCjJV+eSonqX2u6pkwd8C1QRcnfBe mSHjmtJ0xTnQKsVpzmGEtWaRof2IQ4bWs0uo2Mkyp+ePjPxsOVvxS7LXLUdUuiNZN8Bk CiBJ3w4SnyPlODvvQ8ye5TS1u6QDIsrYue6BYWhUsZ2+lHZrsb89zW+BYvDDopEkYG1k 8kemqjgFhxP0J870VDLG+zKx6BCtnHL4fGAD0fCbDDxpPQMxxq2JI1gbZhmWUSdllFVJ 3zCic3BJnLOXfIjFY94ti2kux4EI2MT758VMMP20NRIp67gVn2nNEBaoQ8e3XKMSy8zk uiSg== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [23.128.96.18]) by mx.google.com with ESMTP id y16si46182edd.314.2021.06.15.14.57.47; Tue, 15 Jun 2021 14:58:13 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) client-ip=23.128.96.18; Authentication-Results: mx.google.com; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 23.128.96.18 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S230516AbhFOV4y (ORCPT + 99 others); Tue, 15 Jun 2021 17:56:54 -0400 Received: from www62.your-server.de ([213.133.104.62]:57422 "EHLO www62.your-server.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S230045AbhFOV4x (ORCPT ); Tue, 15 Jun 2021 17:56:53 -0400 Received: from sslproxy01.your-server.de ([78.46.139.224]) by www62.your-server.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92.3) (envelope-from ) id 1ltH19-0009sn-8n; Tue, 15 Jun 2021 23:54:43 +0200 Received: from [85.7.101.30] (helo=linux-3.home) by sslproxy01.your-server.de with esmtpsa (TLSv1.3:TLS_AES_256_GCM_SHA384:256) (Exim 4.92) (envelope-from ) id 1ltH18-000IMK-PK; Tue, 15 Jun 2021 23:54:42 +0200 Subject: Re: [PATCH v5] bpf: core: fix shift-out-of-bounds in ___bpf_prog_run To: Eric Biggers Cc: Edward Cree , Kurt Manucredo , syzbot+bed360704c521841c85d@syzkaller.appspotmail.com, keescook@chromium.org, yhs@fb.com, dvyukov@google.com, andrii@kernel.org, ast@kernel.org, bpf@vger.kernel.org, davem@davemloft.net, hawk@kernel.org, john.fastabend@gmail.com, kafai@fb.com, kpsingh@kernel.org, kuba@kernel.org, linux-kernel@vger.kernel.org, netdev@vger.kernel.org, songliubraving@fb.com, syzkaller-bugs@googlegroups.com, nathan@kernel.org, ndesaulniers@google.com, clang-built-linux@googlegroups.com, kernel-hardening@lists.openwall.com, kasan-dev@googlegroups.com References: <752cb1ad-a0b1-92b7-4c49-bbb42fdecdbe@fb.com> <1aaa2408-94b9-a1e6-beff-7523b66fe73d@fb.com> <202106101002.DF8C7EF@keescook> <85536-177443-curtm@phaethon> From: Daniel Borkmann Message-ID: <4713f6e9-2cfb-e2a6-c42d-b2a62f035bf2@iogearbox.net> Date: Tue, 15 Jun 2021 23:54:41 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:60.0) Gecko/20100101 Thunderbird/60.7.2 MIME-Version: 1.0 In-Reply-To: Content-Type: text/plain; charset=utf-8; format=flowed Content-Language: en-US Content-Transfer-Encoding: 7bit X-Authenticated-Sender: daniel@iogearbox.net X-Virus-Scanned: Clear (ClamAV 0.103.2/26202/Tue Jun 15 13:21:24 2021) Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 6/15/21 11:38 PM, Eric Biggers wrote: > On Tue, Jun 15, 2021 at 02:32:18PM -0700, Eric Biggers wrote: >> On Tue, Jun 15, 2021 at 11:08:18PM +0200, Daniel Borkmann wrote: >>> On 6/15/21 9:33 PM, Eric Biggers wrote: >>>> On Tue, Jun 15, 2021 at 07:51:07PM +0100, Edward Cree wrote: >>>>> >>>>> As I understand it, the UBSAN report is coming from the eBPF interpreter, >>>>> which is the *slow path* and indeed on many production systems is >>>>> compiled out for hardening reasons (CONFIG_BPF_JIT_ALWAYS_ON). >>>>> Perhaps a better approach to the fix would be to change the interpreter >>>>> to compute "DST = DST << (SRC & 63);" (and similar for other shifts and >>>>> bitnesses), thus matching the behaviour of most chips' shift opcodes. >>>>> This would shut up UBSAN, without affecting JIT code generation. >>>> >>>> Yes, I suggested that last week >>>> (https://lkml.kernel.org/netdev/YMJvbGEz0xu9JU9D@gmail.com). The AND will even >>>> get optimized out when compiling for most CPUs. >>> >>> Did you check if the generated interpreter code for e.g. x86 is the same >>> before/after with that? >> >> Yes, on x86_64 with gcc 10.2.1, the disassembly of ___bpf_prog_run() is the same >> both before and after (with UBSAN disabled). Here is the patch I used: >> >> diff --git a/kernel/bpf/core.c b/kernel/bpf/core.c >> index 5e31ee9f7512..996db8a1bbfb 100644 >> --- a/kernel/bpf/core.c >> +++ b/kernel/bpf/core.c >> @@ -1407,12 +1407,30 @@ static u64 ___bpf_prog_run(u64 *regs, const struct bpf_insn *insn) >> DST = (u32) DST OP (u32) IMM; \ >> CONT; >> >> + /* >> + * Explicitly mask the shift amounts with 63 or 31 to avoid undefined >> + * behavior. Normally this won't affect the generated code. The last one should probably be more specific in terms of 'normally', e.g. that it is expected that the compiler is optimizing this away for archs like x86. Is arm64 also covered by this ... do you happen to know on which archs this won't be the case? Additionally, I think such comment should probably be more clear in that it also needs to give proper guidance to JIT authors that look at the interpreter code to see what they need to implement, in other words, that they don't end up copying an explicit AND instruction emission if not needed there. >> + */ >> +#define ALU_SHIFT(OPCODE, OP) \ >> + ALU64_##OPCODE##_X: \ >> + DST = DST OP (SRC & 63);\ >> + CONT; \ >> + ALU_##OPCODE##_X: \ >> + DST = (u32) DST OP ((u32)SRC & 31); \ >> + CONT; \ >> + ALU64_##OPCODE##_K: \ >> + DST = DST OP (IMM & 63); \ >> + CONT; \ >> + ALU_##OPCODE##_K: \ >> + DST = (u32) DST OP ((u32)IMM & 31); \ >> + CONT; For the *_K cases these are explicitly rejected by the verifier already. Is this required here nevertheless to suppress UBSAN false positive? >> ALU(ADD, +) >> ALU(SUB, -) >> ALU(AND, &) >> ALU(OR, |) >> - ALU(LSH, <<) >> - ALU(RSH, >>) >> + ALU_SHIFT(LSH, <<) >> + ALU_SHIFT(RSH, >>) >> ALU(XOR, ^) >> ALU(MUL, *) >> #undef ALU > > Note, I missed the arithmetic right shifts later on in the function. Same > result there, though. > > - Eric >