提交 25c90cb2 编写于 作者: D Daniel Borkmann 提交者: Laibin Qiu

bpf: Add kconfig knob for disabling unpriv bpf by default

stable inclusion
from linux-4.19.230
commit 07e7f7cc619d15645e45d04b1c99550c6d292e9c

--------------------------------

commit 08389d88 upstream.

Add a kconfig knob which allows for unprivileged bpf to be disabled by default.
If set, the knob sets /proc/sys/kernel/unprivileged_bpf_disabled to value of 2.

This still allows a transition of 2 -> {0,1} through an admin. Similarly,
this also still keeps 1 -> {1} behavior intact, so that once set to permanently
disabled, it cannot be undone aside from a reboot.

We've also added extra2 with max of 2 for the procfs handler, so that an admin
still has a chance to toggle between 0 <-> 2.

Either way, as an additional alternative, applications can make use of CAP_BPF
that we added a while ago.
Signed-off-by: NDaniel Borkmann <daniel@iogearbox.net>
Signed-off-by: NAlexei Starovoitov <ast@kernel.org>
Link: https://lore.kernel.org/bpf/74ec548079189e4e4dffaeb42b8987bb3c852eee.1620765074.git.daniel@iogearbox.net
[fllinden@amazon.com: backported to 4.19]
Signed-off-by: NFrank van der Linden <fllinden@amazon.com>
Signed-off-by: NGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Signed-off-by: NYongqiang Liu <liuyongqiang13@huawei.com>
Signed-off-by: NLaibin Qiu <qiulaibin@huawei.com>
上级 33d04298
...@@ -95,6 +95,7 @@ show up in /proc/sys/kernel: ...@@ -95,6 +95,7 @@ show up in /proc/sys/kernel:
- sysctl_writes_strict - sysctl_writes_strict
- tainted - tainted
- threads-max - threads-max
- unprivileged_bpf_disabled
- unknown_nmi_panic - unknown_nmi_panic
- watchdog - watchdog
- watchdog_thresh - watchdog_thresh
...@@ -1072,6 +1073,26 @@ available RAM pages threads-max is reduced accordingly. ...@@ -1072,6 +1073,26 @@ available RAM pages threads-max is reduced accordingly.
============================================================== ==============================================================
unprivileged_bpf_disabled:
Writing 1 to this entry will disable unprivileged calls to bpf();
once disabled, calling bpf() without CAP_SYS_ADMIN will return
-EPERM. Once set to 1, this can't be cleared from the running kernel
anymore.
Writing 2 to this entry will also disable unprivileged calls to bpf(),
however, an admin can still change this setting later on, if needed, by
writing 0 or 1 to this entry.
If BPF_UNPRIV_DEFAULT_OFF is enabled in the kernel config, then this
entry will default to 2 instead of 0.
0 - Unprivileged calls to bpf() are enabled
1 - Unprivileged calls to bpf() are disabled without recovery
2 - Unprivileged calls to bpf() are disabled
==============================================================
unknown_nmi_panic: unknown_nmi_panic:
The value in this file affects behavior of handling NMI. When the The value in this file affects behavior of handling NMI. When the
......
...@@ -1539,6 +1539,16 @@ config BPF_JIT_ALWAYS_ON ...@@ -1539,6 +1539,16 @@ config BPF_JIT_ALWAYS_ON
Enables BPF JIT and removes BPF interpreter to avoid Enables BPF JIT and removes BPF interpreter to avoid
speculative execution of BPF instructions by the interpreter speculative execution of BPF instructions by the interpreter
config BPF_UNPRIV_DEFAULT_OFF
bool "Disable unprivileged BPF by default"
depends on BPF_SYSCALL
help
Disables unprivileged BPF by default by setting the corresponding
/proc/sys/kernel/unprivileged_bpf_disabled knob to 2. An admin can
still reenable it by setting it to 0 later on, or permanently
disable it by setting it to 1 (from which no other transition to
0 is possible anymore).
config USERFAULTFD config USERFAULTFD
bool "Enable userfaultfd() system call" bool "Enable userfaultfd() system call"
select ANON_INODES select ANON_INODES
......
...@@ -48,7 +48,8 @@ static DEFINE_SPINLOCK(prog_idr_lock); ...@@ -48,7 +48,8 @@ static DEFINE_SPINLOCK(prog_idr_lock);
static DEFINE_IDR(map_idr); static DEFINE_IDR(map_idr);
static DEFINE_SPINLOCK(map_idr_lock); static DEFINE_SPINLOCK(map_idr_lock);
int sysctl_unprivileged_bpf_disabled __read_mostly; int sysctl_unprivileged_bpf_disabled __read_mostly =
IS_BUILTIN(CONFIG_BPF_UNPRIV_DEFAULT_OFF) ? 2 : 0;
static const struct bpf_map_ops * const bpf_map_types[] = { static const struct bpf_map_ops * const bpf_map_types[] = {
#define BPF_PROG_TYPE(_id, _ops) #define BPF_PROG_TYPE(_id, _ops)
......
...@@ -257,6 +257,28 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write, ...@@ -257,6 +257,28 @@ static int sysrq_sysctl_handler(struct ctl_table *table, int write,
#endif #endif
#ifdef CONFIG_BPF_SYSCALL
static int bpf_unpriv_handler(struct ctl_table *table, int write,
void *buffer, size_t *lenp, loff_t *ppos)
{
int ret, unpriv_enable = *(int *)table->data;
bool locked_state = unpriv_enable == 1;
struct ctl_table tmp = *table;
if (write && !capable(CAP_SYS_ADMIN))
return -EPERM;
tmp.data = &unpriv_enable;
ret = proc_dointvec_minmax(&tmp, write, buffer, lenp, ppos);
if (write && !ret) {
if (locked_state && unpriv_enable != 1)
return -EPERM;
*(int *)table->data = unpriv_enable;
}
return ret;
}
#endif
static struct ctl_table kern_table[]; static struct ctl_table kern_table[];
static struct ctl_table vm_table[]; static struct ctl_table vm_table[];
static struct ctl_table fs_table[]; static struct ctl_table fs_table[];
...@@ -1247,10 +1269,9 @@ static struct ctl_table kern_table[] = { ...@@ -1247,10 +1269,9 @@ static struct ctl_table kern_table[] = {
.data = &sysctl_unprivileged_bpf_disabled, .data = &sysctl_unprivileged_bpf_disabled,
.maxlen = sizeof(sysctl_unprivileged_bpf_disabled), .maxlen = sizeof(sysctl_unprivileged_bpf_disabled),
.mode = 0644, .mode = 0644,
/* only handle a transition from default "0" to "1" */ .proc_handler = bpf_unpriv_handler,
.proc_handler = proc_dointvec_minmax, .extra1 = &zero,
.extra1 = &one, .extra2 = &two,
.extra2 = &one,
}, },
#endif #endif
#if defined(CONFIG_TREE_RCU) || defined(CONFIG_PREEMPT_RCU) #if defined(CONFIG_TREE_RCU) || defined(CONFIG_PREEMPT_RCU)
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册