From patchwork Wed Jul 22 17:14:02 2020 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: KP Singh X-Patchwork-Id: 11678985 Return-Path: Received: from mail.kernel.org (pdx-korg-mail-1.web.codeaurora.org [172.30.200.123]) by pdx-korg-patchwork-2.web.codeaurora.org (Postfix) with ESMTP id 382A713B6 for ; Wed, 22 Jul 2020 17:14:18 +0000 (UTC) Received: from vger.kernel.org (vger.kernel.org [23.128.96.18]) by mail.kernel.org (Postfix) with ESMTP id 1AA61206D7 for ; Wed, 22 Jul 2020 17:14:18 +0000 (UTC) Authentication-Results: mail.kernel.org; dkim=pass (1024-bit key) header.d=chromium.org header.i=@chromium.org header.b="Rrb+tR37" Received: (majordomo@vger.kernel.org) by vger.kernel.org via listexpand id S1726907AbgGVROR (ORCPT ); Wed, 22 Jul 2020 13:14:17 -0400 Received: from lindbergh.monkeyblade.net ([23.128.96.19]:49392 "EHLO lindbergh.monkeyblade.net" rhost-flags-OK-OK-OK-OK) by vger.kernel.org with ESMTP id S1726717AbgGVROR (ORCPT ); Wed, 22 Jul 2020 13:14:17 -0400 Received: from mail-wr1-x444.google.com (mail-wr1-x444.google.com [IPv6:2a00:1450:4864:20::444]) by lindbergh.monkeyblade.net (Postfix) with ESMTPS id A2EDCC0619DC for ; Wed, 22 Jul 2020 10:14:16 -0700 (PDT) Received: by mail-wr1-x444.google.com with SMTP id r12so2608306wrj.13 for ; Wed, 22 Jul 2020 10:14:16 -0700 (PDT) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=chromium.org; s=google; h=from:to:cc:subject:date:message-id:mime-version :content-transfer-encoding; bh=4g5Wo+MJzHD6SkvQzHsaFSmorwkBVvAJxppiWNfFnRA=; b=Rrb+tR373Lgh1/d2MyOIRScKbc0sdaCkTsgCEKTt5/phwUX7IRReOBtAzfP3hXY8iT ef3ws5TWXre1NO4DkSMMbgQDr1CAMp2UH3bbbuIICNJw+aaPTCF0Lw+67QSwc0jOTWIj WyLG3y2TddUhhB7jo7UoxLJIUF0Bqbi55YshA= 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:mime-version :content-transfer-encoding; bh=4g5Wo+MJzHD6SkvQzHsaFSmorwkBVvAJxppiWNfFnRA=; b=q6NKpNv4uVfPK2P5SnE+zWrDiGIItr7GedmzRptYgiJl+Ng2b5gbuwPVgxXNLxj9FQ /EZ/J0LudwQeYDNAmf42onw+xhhpcmc/Qtv5z52BpLK6oZmp/GYVzV79PsQ2bUVc92/k 6rpkV4KDAGVbzT7eGnsdM3fL7kATB6ekZbsxn1EXJe9i9xsOPH3m+d8+2L3x9bkEGFpE 8FcBii2gRTcUXjYai9Q0npX7cjnu8ZeCYrse6K11ZF1T+t/n3jq4oz4GVIlnCgRC7Z1C dwtOUPvJcuwnV5fMCv6yp9goBhooTQuHRK/ouNqzdbuwvHgZikqdzha/qDDJWs6+F1am Wgvg== X-Gm-Message-State: AOAM531ukx2kv8LSQHYqgJbp/lISqt/OTUQwtDxcwfQq4jdE/xSj5PNX PJM+JaMtwYD3R/+BIgROPjBNVA== X-Google-Smtp-Source: ABdhPJyR1NdJvRXOKbmKRM1bBsO/XJWpqoRWjiyntuF6GUEEN3ja1qVDOtvbSgwRA6npgWHWG/27wQ== X-Received: by 2002:adf:bc45:: with SMTP id a5mr464362wrh.215.1595438055264; Wed, 22 Jul 2020 10:14:15 -0700 (PDT) Received: from kpsingh.zrh.corp.google.com ([81.6.44.51]) by smtp.gmail.com with ESMTPSA id 26sm349214wmj.25.2020.07.22.10.14.14 (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Wed, 22 Jul 2020 10:14:14 -0700 (PDT) From: KP Singh To: linux-kernel@vger.kernel.org, bpf@vger.kernel.org, linux-security-module@vger.kernel.org Cc: Alexei Starovoitov , Daniel Borkmann , Martin KaFai Lau , Paul Turner , Jann Horn , Florent Revest Subject: [PATCH bpf-next v5 0/7] Generalizing bpf_local_storage Date: Wed, 22 Jul 2020 19:14:02 +0200 Message-Id: <20200722171409.102949-1-kpsingh@chromium.org> X-Mailer: git-send-email 2.28.0.rc0.105.gf9edc3c819-goog MIME-Version: 1.0 Sender: owner-linux-security-module@vger.kernel.org Precedence: bulk List-ID: From: KP Singh # v4 -> v5 - Split non-functional changes into separate commits. - Updated the cache macros to be simpler. - Fixed some bugs noticed by Martin. - Updated the userspace map functions to use an fd for lookups, updates and deletes. - Rebase. # v3 -> v4 - Fixed a missing include to bpf_sk_storage.h in bpf_sk_storage.c - Fixed some functions that were not marked as static which led to W=1 compilation warnings. # v2 -> v3 * Restructured the code as per Martin's suggestions: - Common functionality in bpf_local_storage.c - bpf_sk_storage functionality remains in net/bpf_sk_storage. - bpf_inode_storage is kept separate as it is enabled only with CONFIG_BPF_LSM. * A separate cache for inode and sk storage with macros to define it. * Use the ops style approach as suggested by Martin instead of the enum + switch style. * Added the inode map to bpftool bash completion and docs. * Rebase and indentation fixes. # v1 -> v2 * Use the security blob pointer instead of dedicated member in struct inode. * Better code re-use as suggested by Alexei. * Dropped the inode count arithmetic as pointed out by Alexei. * Minor bug fixes and rebase. bpf_sk_storage can already be used by some BPF program types to annotate socket objects. These annotations are managed with the life-cycle of the object (i.e. freed when the object is freed) which makes BPF programs much simpler and less prone to errors and leaks. This patch series: * Generalizes the bpf_sk_storage infrastructure to allow easy implementation of local storage for other objects * Implements local storage for inodes * Makes both bpf_{sk, inode}_storage available to LSM programs. Local storage is safe to use in LSM programs as the attachment sites are limited and the owning object won't be freed, however, this is not the case for tracing. Usage in tracing is expected to follow a white-list based approach similar to the d_path helper (https://lore.kernel.org/bpf/20200506132946.2164578-1-jolsa@kernel.org). Access to local storage would allow LSM programs to implement stateful detections like detecting the unlink of a running executable from the examples shared as a part of the KRSI series https://lore.kernel.org/bpf/20200329004356.27286-1-kpsingh@chromium.org/ and https://github.com/sinkap/linux-krsi/blob/patch/v1/examples/samples/bpf/lsm_detect_exec_unlink.c KP Singh (7): bpf: Renames to prepare for generalizing sk_storage. bpf: Generalize caching for sk_storage. bpf: Generalize bpf_sk_storage bpf: Split bpf_local_storage to bpf_sk_storage bpf: Implement bpf_local_storage for inodes bpf: Allow local storage to be used from LSM programs bpf: Add selftests for local_storage include/linux/bpf.h | 13 + include/linux/bpf_local_storage.h | 175 ++++ include/linux/bpf_lsm.h | 21 + include/linux/bpf_types.h | 3 + include/net/bpf_sk_storage.h | 12 + include/net/sock.h | 4 +- include/uapi/linux/bpf.h | 54 +- kernel/bpf/Makefile | 2 + kernel/bpf/bpf_inode_storage.c | 356 ++++++++ kernel/bpf/bpf_local_storage.c | 519 ++++++++++++ kernel/bpf/bpf_lsm.c | 21 +- kernel/bpf/syscall.c | 3 +- kernel/bpf/verifier.c | 10 + net/core/bpf_sk_storage.c | 759 ++++-------------- security/bpf/hooks.c | 7 + .../bpf/bpftool/Documentation/bpftool-map.rst | 2 +- tools/bpf/bpftool/bash-completion/bpftool | 3 +- tools/bpf/bpftool/map.c | 3 +- tools/include/uapi/linux/bpf.h | 54 +- tools/lib/bpf/libbpf_probes.c | 5 +- .../bpf/prog_tests/test_local_storage.c | 60 ++ .../selftests/bpf/progs/local_storage.c | 136 ++++ 22 files changed, 1596 insertions(+), 626 deletions(-) create mode 100644 include/linux/bpf_local_storage.h create mode 100644 kernel/bpf/bpf_inode_storage.c create mode 100644 kernel/bpf/bpf_local_storage.c create mode 100644 tools/testing/selftests/bpf/prog_tests/test_local_storage.c create mode 100644 tools/testing/selftests/bpf/progs/local_storage.c