Received: by 2002:ad5:4acb:0:0:0:0:0 with SMTP id n11csp4443087imw; Tue, 12 Jul 2022 08:03:14 -0700 (PDT) X-Google-Smtp-Source: AGRyM1sYXoTYhFUHcedmHQ/T9yPZ16sKzwwJHfINp7e9WNCGyYUzWnyFL+r2CVDOnOYzmWUYQLt/ X-Received: by 2002:a17:903:1c7:b0:16c:4f00:65df with SMTP id e7-20020a17090301c700b0016c4f0065dfmr9437608plh.158.1657638194205; Tue, 12 Jul 2022 08:03:14 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1657638194; cv=none; d=google.com; s=arc-20160816; b=zfU1kY76Q1WIXjlVmGM2GeWD54O/McimMoNMbVbcyKprYu+8v6yVnH29lyExXIDSVQ riE/cpSVy7L0P2MJkNujX3lj3IuGVWqURkvKa4r60janHhAyq/okTzHIrkmlTwT8jy0L E8eXUSRdke2PN4TUken8tCQkasCiu/GM24U/s+uV6MmSt9zoPsL5zh49s7j9a1CjW06H lhMiJ4qD38SMxhB1QGJ9GCiCK6LYWJSBU4FASVdjeHh89ub5/lOcUzjK7iI76pwxzc0c C7rDYNeaYXDsQrKEh0Vakoo4Pwm2yl0EEooPheOwJFTJ3C2vDNDPLXRBRDqegqRx5mbn 2fVA== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=list-id:precedence:content-transfer-encoding:mime-version :references:in-reply-to:message-id:date:subject:cc:to:from :dkim-signature; bh=QgfSb7dECbTAHcInZBU6YqysYjB2PYG5wvQRH565Jew=; b=u37kQ8cEhw88xV/DioGSFuC/XddUtYoU2UtNVXy7WsSd7iUSVLwpP94x1F/2W35Cw7 1M2uGL6ptI/gUqsNILz0w2X7E6zjKoIgsMRUSU71DntV+8LBlDxgWreu1orT9KKgosJg 0BGvezZH/E3s7ERLV1C8FePKcisw6DXGiI1yeUg/NVbgBRWooAvOdnZ2js03dfRKTutO 3JFtjTZq/nvAwCB5TDliFmloJKv4OOaKwo2dDhLeBDF+7pCJrKWc7NN1eMbpxDX0xhy3 Ts1grjTBLySn3+Xj179ug4dGD1ppZ1+OlyzYgyEyxhjreCBkHaDf/HbPy5NcEt/XO+U1 7eWQ== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Qw80ROL5; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Return-Path: Received: from out1.vger.email (out1.vger.email. [2620:137:e000::1:20]) by mx.google.com with ESMTP id 204-20020a6300d5000000b004160306e040si7724209pga.241.2022.07.12.08.02.59; Tue, 12 Jul 2022 08:03:14 -0700 (PDT) Received-SPF: pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) client-ip=2620:137:e000::1:20; Authentication-Results: mx.google.com; dkim=pass header.i=@redhat.com header.s=mimecast20190719 header.b=Qw80ROL5; spf=pass (google.com: domain of linux-kernel-owner@vger.kernel.org designates 2620:137:e000::1:20 as permitted sender) smtp.mailfrom=linux-kernel-owner@vger.kernel.org; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=redhat.com Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S233488AbiGLPAo (ORCPT + 99 others); Tue, 12 Jul 2022 11:00:44 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:53264 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S233263AbiGLO7u (ORCPT ); Tue, 12 Jul 2022 10:59:50 -0400 Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.133.124]) by lindbergh.monkeyblade.net (Postfix) with ESMTP id A8B22ACF5F for ; Tue, 12 Jul 2022 07:59:22 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=redhat.com; s=mimecast20190719; t=1657637961; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:cc:mime-version:mime-version: content-transfer-encoding:content-transfer-encoding: in-reply-to:in-reply-to:references:references; bh=QgfSb7dECbTAHcInZBU6YqysYjB2PYG5wvQRH565Jew=; b=Qw80ROL5w3zsrFfVA19nyDhHjg019u+fSPcbr5E67yWX6yM6VPToWsGqBPVNZ9LbEMKaYT GwaQ/cbbXcwiW2+2spzs5PmkxZs5SHvnPsOrzUgqq1c0Ev8YH1CMp9uxfATdkXXSEZf7U6 UPM4bEeHtXX5J26XVIO6efX8ZYpGu1g= Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-478-b6OaMCBnMBSFmByfnYzLkQ-1; Tue, 12 Jul 2022 10:59:09 -0400 X-MC-Unique: b6OaMCBnMBSFmByfnYzLkQ-1 Received: from smtp.corp.redhat.com (int-mx06.intmail.prod.int.rdu2.redhat.com [10.11.54.6]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id 0FD831032964; Tue, 12 Jul 2022 14:59:08 +0000 (UTC) Received: from plouf.redhat.com (unknown [10.39.195.8]) by smtp.corp.redhat.com (Postfix) with ESMTP id A423E2166B26; Tue, 12 Jul 2022 14:59:04 +0000 (UTC) From: Benjamin Tissoires To: Greg KH , Jiri Kosina , Alexei Starovoitov , Daniel Borkmann , Andrii Nakryiko , Martin KaFai Lau , Song Liu , Yonghong Song , John Fastabend , KP Singh , Shuah Khan , Dave Marchevsky , Joe Stringer , Jonathan Corbet Cc: Tero Kristo , linux-kernel@vger.kernel.org, linux-input@vger.kernel.org, netdev@vger.kernel.org, bpf@vger.kernel.org, linux-kselftest@vger.kernel.org, linux-doc@vger.kernel.org, Benjamin Tissoires Subject: [PATCH bpf-next v6 02/23] bpf/verifier: allow kfunc to read user provided context Date: Tue, 12 Jul 2022 16:58:29 +0200 Message-Id: <20220712145850.599666-3-benjamin.tissoires@redhat.com> In-Reply-To: <20220712145850.599666-1-benjamin.tissoires@redhat.com> References: <20220712145850.599666-1-benjamin.tissoires@redhat.com> MIME-Version: 1.0 Content-Transfer-Encoding: 8bit X-Scanned-By: MIMEDefang 2.78 on 10.11.54.6 X-Spam-Status: No, score=-2.7 required=5.0 tests=BAYES_00,DKIMWL_WL_HIGH, DKIM_SIGNED,DKIM_VALID,DKIM_VALID_AU,DKIM_VALID_EF,RCVD_IN_DNSWL_NONE, SPF_HELO_NONE,SPF_NONE,T_SCC_BODY_TEXT_LINE autolearn=unavailable autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on lindbergh.monkeyblade.net Precedence: bulk List-ID: X-Mailing-List: linux-kernel@vger.kernel.org When a kfunc was trying to access data from context in a syscall eBPF program, the verifier was rejecting the call. This is because the syscall context is not known at compile time, and so we need to check this when actually accessing it. Check for the valid memory access and allow such situation to happen. Signed-off-by: Benjamin Tissoires --- new in v6 --- kernel/bpf/verifier.c | 16 ++++++++++++++++ 1 file changed, 16 insertions(+) diff --git a/kernel/bpf/verifier.c b/kernel/bpf/verifier.c index 328cfab3af60..f6af57a84247 100644 --- a/kernel/bpf/verifier.c +++ b/kernel/bpf/verifier.c @@ -248,6 +248,7 @@ struct bpf_call_arg_meta { struct bpf_map *map_ptr; bool raw_mode; bool pkt_access; + bool is_kfunc; u8 release_regno; int regno; int access_size; @@ -5170,6 +5171,7 @@ static int check_helper_mem_access(struct bpf_verifier_env *env, int regno, struct bpf_call_arg_meta *meta) { struct bpf_reg_state *regs = cur_regs(env), *reg = ®s[regno]; + enum bpf_prog_type prog_type = resolve_prog_type(env->prog); u32 *max_access; switch (base_type(reg->type)) { @@ -5223,6 +5225,19 @@ static int check_helper_mem_access(struct bpf_verifier_env *env, int regno, env, regno, reg->off, access_size, zero_size_allowed, ACCESS_HELPER, meta); + case PTR_TO_CTX: + /* in case of a kfunc called in a program of type SYSCALL, the context is + * user supplied, so not computed statically. + * Dynamically check it now + */ + if (prog_type == BPF_PROG_TYPE_SYSCALL && meta && meta->is_kfunc) { + enum bpf_access_type access_t = meta->raw_mode ? BPF_WRITE : BPF_READ; + + return check_mem_access(env, env->insn_idx, regno, access_size, BPF_B, + access_t, -1, false); + } + + fallthrough; default: /* scalar_value or invalid ptr */ /* Allow zero-byte read from NULL, regardless of pointer type */ if (zero_size_allowed && access_size == 0 && @@ -5335,6 +5350,7 @@ int check_kfunc_mem_size_reg(struct bpf_verifier_env *env, struct bpf_reg_state WARN_ON_ONCE(regno < BPF_REG_2 || regno > BPF_REG_5); memset(&meta, 0, sizeof(meta)); + meta.is_kfunc = true; if (may_be_null) { saved_reg = *mem_reg; -- 2.36.1