Received: by 10.192.165.148 with SMTP id m20csp2814074imm; Mon, 7 May 2018 01:25:42 -0700 (PDT) X-Google-Smtp-Source: AB8JxZq/AUz8TU2s3ftTy25AJfa9cOjV4A0HVb5vpWgxvINaFmmM4aVaxEaRqJYOGoI3pfAiKp6E X-Received: by 10.98.69.68 with SMTP id s65mr36175642pfa.150.1525681542554; Mon, 07 May 2018 01:25:42 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1525681542; cv=none; d=google.com; s=arc-20160816; b=quxCvYj5tw/PuaxQ4JsDN8+XI7SxyCqiy6eT+eSdiIFmTs5+UcxvmYZt1gbRN+Az5D uSuyaKBwtrjX0nAdwZX4079+bhm81sbVYQgtW0ViPfpvRJ1CMeFZvtohnAYA1oed38xI K6FYBXVMPmtoUCnY4hT/ik8RvkNy721FMwXhsKn68PQHBzvAPMiiuTXm9r58lni5Z75P jKTNAc4fuFwC1FBDshPzLuerrcL0zCjUDfMjrqIs2LUgJzTJ/g3PsJGI9eEZ/QuOqm3B hwqiuo0w+LmIGAqwwM6sYKm2lIqvj0pbDQFVlPuECENJ+6bzDwFHQQ1Yq4KZm3NvT50n S6kA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:sender:content-transfer-encoding :content-language:in-reply-to:mime-version:user-agent:date :message-id:from:references:to:subject:arc-authentication-results; bh=4g8wSFd45fbhQKAV7WvYGUl8TDhCbVuTyZk9Omzrzwo=; b=BVQINbXCaty1EkokWVFJ3oDbXKQiZac1ewTKd2hjyHhE2WcCT8HvehQEOYVUp1+BCT LVYCSJ093ZDO+FhesVT3kYg6NYmBVVLWAA+eJOkX8ZTuOPcu2x4gBtVS9wNQHgwoEp+k 0JPpYGNpltrDKCDGhjmmQq2oTmMQ6/TNfXAm6fauhSJmoS4qZ6ralnqj0G4Eus+4WNUE suR+0bed9yJ1vLtTuXxEPf8O6hYLE5NSwvpHwSHgiRcPss+Ur/5BBarzYJkod6m5ZYhP t8KS+yPOj+5eVm1JU6mQLAgJuEJI6z0MRSDbWTIP9z6Dn+PV+hkIjKlsj/8quHRzPYoR CZ4Q== ARC-Authentication-Results: i=1; mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Return-Path: Received: from vger.kernel.org (vger.kernel.org. [209.132.180.67]) by mx.google.com with ESMTP id h13-v6si14459646pgq.138.2018.05.07.01.25.28; Mon, 07 May 2018 01:25:42 -0700 (PDT) Received-SPF: pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) client-ip=209.132.180.67; Authentication-Results: mx.google.com; spf=pass (google.com: best guess record for domain of linux-kernel-owner@vger.kernel.org designates 209.132.180.67 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752068AbeEGIZE (ORCPT + 99 others); Mon, 7 May 2018 04:25:04 -0400 Received: from www62.your-server.de ([213.133.104.62]:53539 "EHLO www62.your-server.de" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751900AbeEGIZD (ORCPT ); Mon, 7 May 2018 04:25:03 -0400 Received: from [188.63.75.139] (helo=linux.home) by www62.your-server.de with esmtpsa (TLSv1.2:DHE-RSA-AES256-SHA:256) (Exim 4.85_2) (envelope-from ) id 1fFbS9-00035r-Bq; Mon, 07 May 2018 10:25:01 +0200 Subject: Re: [PATCH] bpf: fix misaligned access for BPF_PROG_TYPE_PERF_EVENT program type on x86_32 platform To: Wang YanQing , Alexei Starovoitov , ast@kernel.org, netdev@vger.kernel.org, linux-kernel@vger.kernel.org References: <20180426095749.GA29207@udknight> <20180427224854.2g7ximim7nwkgdpd@ast-mbp> <20180428052917.GA1579@udknight> <20180507072305.GA11275@udknight> From: Daniel Borkmann Message-ID: <18f92cb4-4afe-deed-b5ce-3de2a5a5625c@iogearbox.net> Date: Mon, 7 May 2018 10:25:00 +0200 User-Agent: Mozilla/5.0 (X11; Linux x86_64; rv:52.0) Gecko/20100101 Thunderbird/52.3.0 MIME-Version: 1.0 In-Reply-To: <20180507072305.GA11275@udknight> Content-Type: text/plain; charset=utf-8 Content-Language: en-US Content-Transfer-Encoding: 7bit X-Authenticated-Sender: daniel@iogearbox.net X-Virus-Scanned: Clear (ClamAV 0.99.3/24547/Mon May 7 06:32:00 2018) Sender: linux-kernel-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org On 05/07/2018 09:23 AM, Wang YanQing wrote: > On Sat, Apr 28, 2018 at 01:29:17PM +0800, Wang YanQing wrote: >> On Sat, Apr 28, 2018 at 01:33:15AM +0200, Daniel Borkmann wrote: >>> On 04/28/2018 12:48 AM, Alexei Starovoitov wrote: >>>> On Thu, Apr 26, 2018 at 05:57:49PM +0800, Wang YanQing wrote: >>>>> All the testcases for BPF_PROG_TYPE_PERF_EVENT program type in >>>>> test_verifier(kselftest) report below errors on x86_32: >>>>> " >>>>> 172/p unpriv: spill/fill of different pointers ldx FAIL >>>>> Unexpected error message! >>>>> 0: (bf) r6 = r10 >>>>> 1: (07) r6 += -8 >>>>> 2: (15) if r1 == 0x0 goto pc+3 >>>>> R1=ctx(id=0,off=0,imm=0) R6=fp-8,call_-1 R10=fp0,call_-1 >>>>> 3: (bf) r2 = r10 >>>>> 4: (07) r2 += -76 >>>>> 5: (7b) *(u64 *)(r6 +0) = r2 >>>>> 6: (55) if r1 != 0x0 goto pc+1 >>>>> R1=ctx(id=0,off=0,imm=0) R2=fp-76,call_-1 R6=fp-8,call_-1 R10=fp0,call_-1 fp-8=fp >>>>> 7: (7b) *(u64 *)(r6 +0) = r1 >>>>> 8: (79) r1 = *(u64 *)(r6 +0) >>>>> 9: (79) r1 = *(u64 *)(r1 +68) >>>>> invalid bpf_context access off=68 size=8 >>>>> >>>>> 378/p check bpf_perf_event_data->sample_period byte load permitted FAIL >>>>> Failed to load prog 'Permission denied'! >>>>> 0: (b7) r0 = 0 >>>>> 1: (71) r0 = *(u8 *)(r1 +68) >>>>> invalid bpf_context access off=68 size=1 >>>>> >>>>> 379/p check bpf_perf_event_data->sample_period half load permitted FAIL >>>>> Failed to load prog 'Permission denied'! >>>>> 0: (b7) r0 = 0 >>>>> 1: (69) r0 = *(u16 *)(r1 +68) >>>>> invalid bpf_context access off=68 size=2 >>>>> >>>>> 380/p check bpf_perf_event_data->sample_period word load permitted FAIL >>>>> Failed to load prog 'Permission denied'! >>>>> 0: (b7) r0 = 0 >>>>> 1: (61) r0 = *(u32 *)(r1 +68) >>>>> invalid bpf_context access off=68 size=4 >>>>> >>>>> 381/p check bpf_perf_event_data->sample_period dword load permitted FAIL >>>>> Failed to load prog 'Permission denied'! >>>>> 0: (b7) r0 = 0 >>>>> 1: (79) r0 = *(u64 *)(r1 +68) >>>>> invalid bpf_context access off=68 size=8 >>>>> " >>>>> >>>>> This patch fix it, the fix isn't only necessary for x86_32, it will fix the >>>>> same problem for other platforms too, if their size of bpf_user_pt_regs_t >>>>> can't divide exactly into 8. >>>>> >>>>> Signed-off-by: Wang YanQing >>>>> --- >>>>> Hi all! >>>>> After mainline accept this patch, then we need to submit a sync patch >>>>> to update the tools/include/uapi/linux/bpf_perf_event.h. >>>>> >>>>> Thanks. >>>>> >>>>> include/uapi/linux/bpf_perf_event.h | 2 +- >>>>> 1 file changed, 1 insertion(+), 1 deletion(-) >>>>> >>>>> diff --git a/include/uapi/linux/bpf_perf_event.h b/include/uapi/linux/bpf_perf_event.h >>>>> index eb1b9d2..ff4c092 100644 >>>>> --- a/include/uapi/linux/bpf_perf_event.h >>>>> +++ b/include/uapi/linux/bpf_perf_event.h >>>>> @@ -12,7 +12,7 @@ >>>>> >>>>> struct bpf_perf_event_data { >>>>> bpf_user_pt_regs_t regs; >>>>> - __u64 sample_period; >>>>> + __u64 sample_period __attribute__((aligned(8))); >>>> >>>> I don't think this necessary. >>>> imo it's a bug in pe_prog_is_valid_access >>>> that should have allowed 8-byte access to 4-byte aligned sample_period. >>>> The access rewritten by pe_prog_convert_ctx_access anyway, >>>> no alignment issues as far as I can see. >>> >>> Right, good point. Wang, could you give the below a test run: >>> >>> diff --git a/kernel/trace/bpf_trace.c b/kernel/trace/bpf_trace.c >>> index 56ba0f2..95b9142 100644 >>> --- a/kernel/trace/bpf_trace.c >>> +++ b/kernel/trace/bpf_trace.c >>> @@ -833,8 +833,14 @@ static bool pe_prog_is_valid_access(int off, int size, enum bpf_access_type type >>> return false; >>> if (type != BPF_READ) >>> return false; >>> - if (off % size != 0) >>> - return false; >>> + if (off % size != 0) { >>> + if (sizeof(long) != 4) >>> + return false; >>> + if (size != 8) >>> + return false; >>> + if (off % size != 4) >>> + return false; >>> + } >>> >>> switch (off) { >>> case bpf_ctx_range(struct bpf_perf_event_data, sample_period): >> Hi all! >> >> I have tested this patch, but test_verifier reports the same errors >> for the five testcases. >> >> The reason is they all failed to pass the test of bpf_ctx_narrow_access_ok. >> >> Thanks. > Hi! Daniel Borkmann. > > Do you have any plan to fix bpf_ctx_narrow_access_ok for these problems? Yep, sorry for the delay, will get to it during this week. Thanks, Daniel