From patchwork Tue Jan 16 23:51:50 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jakub Kicinski X-Patchwork-Id: 861957 X-Patchwork-Delegate: bpf@iogearbox.net Return-Path: X-Original-To: patchwork-incoming@ozlabs.org Delivered-To: patchwork-incoming@ozlabs.org Authentication-Results: ozlabs.org; spf=none (mailfrom) smtp.mailfrom=vger.kernel.org (client-ip=209.132.180.67; helo=vger.kernel.org; envelope-from=netdev-owner@vger.kernel.org; receiver=) Authentication-Results: ozlabs.org; dkim=pass (2048-bit key; unprotected) header.d=netronome-com.20150623.gappssmtp.com header.i=@netronome-com.20150623.gappssmtp.com header.b="PB7Tlst0"; dkim-atps=neutral Received: from vger.kernel.org (vger.kernel.org [209.132.180.67]) by ozlabs.org (Postfix) with ESMTP id 3zLn8t3Vbbz9sNc for ; Wed, 17 Jan 2018 10:53:02 +1100 (AEDT) Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1752090AbeAPXxB (ORCPT ); Tue, 16 Jan 2018 18:53:01 -0500 Received: from mail-pl0-f67.google.com ([209.85.160.67]:46349 "EHLO mail-pl0-f67.google.com" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1751869AbeAPXw7 (ORCPT ); Tue, 16 Jan 2018 18:52:59 -0500 Received: by mail-pl0-f67.google.com with SMTP id 66so7379803plc.13 for ; Tue, 16 Jan 2018 15:52:59 -0800 (PST) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=netronome-com.20150623.gappssmtp.com; s=20150623; h=from:to:cc:subject:date:message-id:in-reply-to:references; bh=EYyBdK9Xb2a4NA6ySn793rUNR2s2cS3uq9bVI49jzCI=; b=PB7Tlst0r0Q5A0E4oHXFRUxm7QDDBpDc9lLKs3lNwj9M/esxPTwgtUizYyo4+9ooTn 1Yk4wcr6pNWq59RN9e1zDTQLjgCq2Wy7C3PkI6A3F3fuAXHtFTkrWPf00Fc+pxZyDb8c XeoSvA7N9UAqr2l7DpvVALTTRwukqQPbKjhQR7pJ9xTPH87wcVvj43MabS6K82cqkk0s x/HP3lwjJIsh9sRfN5I6DDjQFmmSvmgPzXtHkOUYTiiXk2UFAeML3xbG9ReczdpTrz6+ FQLMVvlXMVI98kKX7A2YFe7qf7nU7ZOdMHw2eUR1SaQ6MKDF/SJFszpuvzqVBPBa+iig p45g== X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20161025; h=x-gm-message-state:from:to:cc:subject:date:message-id:in-reply-to :references; bh=EYyBdK9Xb2a4NA6ySn793rUNR2s2cS3uq9bVI49jzCI=; b=pZHGSyONV5Neakej2KIVpdP17rFCGe7WQ5vcUHa5/S/XyZcHRoMX86agWNZ0XblBDc thDFFj7I2o7s7aVMP5beEN1NHYEEWTdJmmsRsPuSZZYo5Z3PJeYJ3TOyY3IzVBogUUHu EEpBMEct2bZKfsJBQxoJDus0Brrqu5jwesHPF9XgrMWnxeBRsKXxUMBx3oJN7C7FAGmE Uae9eFEqQDI1n0srMf3hhZHM8c+kkc9Y1SEdEpxcdf1nh5cx94SOi1DAr3+AjENLKcqG jJ1JqGzyceHaEGXDZ+KB0DDV+yYDR6GjT3q6SqDXiDZ6/5ZMhtEfQtjNZxPmMIAi5Bk2 5YOw== X-Gm-Message-State: AKwxytfB/TxmawFqkO0Rdab8KgSxGCqXo/VMu8vx8FJYZ6O3BhYh1nYu jz8gdj1aclEx7PVaK9F5hFrUMw== X-Google-Smtp-Source: ACJfBotylAwqUmcyCHl5Cfl/ePlmXC353tL8lu5NNrU4yAc6y1w3S0n1aIT4WOwQVv9xemIhjCjPdA== X-Received: by 10.84.218.11 with SMTP id q11mr8762838pli.207.1516146778724; Tue, 16 Jan 2018 15:52:58 -0800 (PST) Received: from jkicinski-Precision-T1700.netronome.com ([75.53.12.129]) by smtp.gmail.com with ESMTPSA id t1sm5044119pgs.73.2018.01.16.15.52.57 (version=TLS1_2 cipher=ECDHE-RSA-AES128-SHA bits=128/128); Tue, 16 Jan 2018 15:52:58 -0800 (PST) From: Jakub Kicinski To: daniel@iogearbox.net, alexei.starovoitov@gmail.com Cc: netdev@vger.kernel.org, oss-drivers@netronome.com, Quentin Monnet Subject: [PATCH bpf-next 6/6] nfp: bpf: reject program on instructions unknown to the JIT compiler Date: Tue, 16 Jan 2018 15:51:50 -0800 Message-Id: <20180116235150.28651-7-jakub.kicinski@netronome.com> X-Mailer: git-send-email 2.15.1 In-Reply-To: <20180116235150.28651-1-jakub.kicinski@netronome.com> References: <20180116235150.28651-1-jakub.kicinski@netronome.com> Sender: netdev-owner@vger.kernel.org Precedence: bulk List-ID: X-Mailing-List: netdev@vger.kernel.org From: Quentin Monnet If an eBPF instruction is unknown to the driver JIT compiler, we can reject the program at verification time. Signed-off-by: Quentin Monnet Reviewed-by: Jakub Kicinski Reviewed-by: Jiong Wang --- drivers/net/ethernet/netronome/nfp/bpf/jit.c | 5 +++++ drivers/net/ethernet/netronome/nfp/bpf/main.h | 1 + drivers/net/ethernet/netronome/nfp/bpf/verifier.c | 6 ++++++ 3 files changed, 12 insertions(+) diff --git a/drivers/net/ethernet/netronome/nfp/bpf/jit.c b/drivers/net/ethernet/netronome/nfp/bpf/jit.c index cdc949fabe98..56451edf01c2 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/jit.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/jit.c @@ -2907,6 +2907,11 @@ void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt) } } +bool nfp_bpf_supported_opcode(u8 code) +{ + return !!instr_cb[code]; +} + void *nfp_bpf_relo_for_vnic(struct nfp_prog *nfp_prog, struct nfp_bpf_vnic *bv) { unsigned int i; diff --git a/drivers/net/ethernet/netronome/nfp/bpf/main.h b/drivers/net/ethernet/netronome/nfp/bpf/main.h index 80855d43b25e..424fe8338105 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/main.h +++ b/drivers/net/ethernet/netronome/nfp/bpf/main.h @@ -324,6 +324,7 @@ struct nfp_bpf_vnic { void nfp_bpf_jit_prepare(struct nfp_prog *nfp_prog, unsigned int cnt); int nfp_bpf_jit(struct nfp_prog *prog); +bool nfp_bpf_supported_opcode(u8 code); extern const struct bpf_prog_offload_ops nfp_bpf_analyzer_ops; diff --git a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c index 81dab462456c..479f602887e9 100644 --- a/drivers/net/ethernet/netronome/nfp/bpf/verifier.c +++ b/drivers/net/ethernet/netronome/nfp/bpf/verifier.c @@ -290,6 +290,12 @@ nfp_verify_insn(struct bpf_verifier_env *env, int insn_idx, int prev_insn_idx) meta = nfp_bpf_goto_meta(nfp_prog, meta, insn_idx, env->prog->len); nfp_prog->verifier_meta = meta; + if (!nfp_bpf_supported_opcode(meta->insn.code)) { + pr_vlog(env, "instruction %#02x not supported\n", + meta->insn.code); + return -EINVAL; + } + if (meta->insn.src_reg >= MAX_BPF_REG || meta->insn.dst_reg >= MAX_BPF_REG) { pr_vlog(env, "program uses extended registers - jit hardening?\n");