Alexei Starovoitov
b2157399cc
bpf: prevent out-of-bounds speculation
...
Under speculation, CPUs may mis-predict branches in bounds checks. Thus,
memory accesses under a bounds check may be speculated even if the
bounds check fails, providing a primitive for building a side channel.
To avoid leaking kernel data round up array-based maps and mask the index
after bounds check, so speculated load with out of bounds index will load
either valid value from the array or zero from the padded area.
Unconditionally mask index for all array types even when max_entries
are not rounded to power of 2 for root user.
When map is created by unpriv user generate a sequence of bpf insns
that includes AND operation to make sure that JITed code includes
the same 'index & index_mask' operation.
If prog_array map is created by unpriv user replace
bpf_tail_call(ctx, map, index);
with
if (index >= max_entries) {
index &= map->index_mask;
bpf_tail_call(ctx, map, index);
}
(along with roundup to power 2) to prevent out-of-bounds speculation.
There is secondary redundant 'if (index >= max_entries)' in the interpreter
and in all JITs, but they can be optimized later if necessary.
Other array-like maps (cpumap, devmap, sockmap, perf_event_array, cgroup_array)
cannot be used by unpriv, so no changes there.
That fixes bpf side of "Variant 1: bounds check bypass (CVE-2017-5753)" on
all architectures with and without JIT.
v2->v3:
Daniel noticed that attack potentially can be crafted via syscall commands
without loading the program, so add masking to those paths as well.
Signed-off-by: Alexei Starovoitov <ast@kernel.org>
Acked-by: John Fastabend <john.fastabend@gmail.com>
Signed-off-by: Daniel Borkmann <daniel@iogearbox.net>
2018-01-09 00:53:49 +01:00
..
bpf
bpf: prevent out-of-bounds speculation
2018-01-09 00:53:49 +01:00
cgroup
Revert "cgroup/cpuset: remove circular dependency deadlock"
2017-12-04 14:55:59 -08:00
configs
debug
kdb: Fix handling of kallsyms_symbol_next() return value
2017-12-06 16:12:43 -06:00
events
locking/barriers: Convert users of lockless_dereference() to READ_ONCE()
2017-12-17 13:57:15 +01:00
gcov
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
irq
genirq/matrix: Fix the precedence fix for real
2017-12-04 20:50:35 +01:00
livepatch
Merge branch 'for-linus' of ssh://gitolite.kernel.org/pub/scm/linux/kernel/git/jikos/livepatching
2017-11-15 10:21:58 -08:00
locking
locking/lockdep: Remove the cross-release locking checks
2017-12-12 12:38:51 +01:00
power
Revert "cpuset: Make cpuset hotplug synchronous"
2017-12-04 14:41:11 -08:00
printk
remove task and stack pointer printout from oops dump
2017-12-05 08:23:20 -08:00
rcu
Merge branch 'timers-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2017-11-13 17:56:58 -08:00
sched
sched/rt: Do not pull from current CPU if only one CPU to pull
2017-12-15 16:28:02 +01:00
time
posix-timer: Properly check sigevent->sigev_notify
2017-12-15 11:08:40 +01:00
trace
tracing: Fix possible double free on failure of allocating trace buffer
2017-12-27 14:21:27 -05:00
.gitignore
acct.c
Merge branch 'linus' into locking/core, to resolve conflicts
2017-11-07 10:32:44 +01:00
async.c
audit.c
Audit: remove unused audit_log_secctx function
2017-11-10 16:08:47 -05:00
audit.h
audit/stable-4.15 PR 20171113
2017-11-15 13:28:48 -08:00
audit_fsnotify.c
audit_tree.c
Merge branch 'fsnotify' of git://git.kernel.org/pub/scm/linux/kernel/git/jack/linux-fs
2017-11-14 14:08:20 -08:00
audit_watch.c
auditfilter.c
audit: filter PATH records keyed on filesystem magic
2017-11-10 16:08:56 -05:00
auditsc.c
audit/stable-4.15 PR 20171113
2017-11-15 13:28:48 -08:00
backtracetest.c
bounds.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
capability.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
compat.c
sched_rr_get_interval(): move compat to native, get rid of set_fs()
2017-09-20 00:30:57 -04:00
configs.c
context_tracking.c
cpu.c
Merge branch 'smp-urgent-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2017-12-06 17:45:36 -08:00
cpu_pm.c
crash_core.c
kdump: print a message in case parse_crashkernel_mem resulted in zero bytes
2017-11-17 16:10:03 -08:00
crash_dump.c
cred.c
delayacct.c
dma.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
elfcore.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
exec_domain.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
exit.c
arch: define weak abort()
2017-12-14 16:00:49 -08:00
extable.c
kprobes, x86/alternatives: Use text_mutex to protect smp_alt_modules
2017-11-07 12:20:09 +01:00
fork.c
Merge branch 'x86-pti-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2017-12-23 11:53:04 -08:00
freezer.c
futex.c
futex: futex_wake_op, fix sign_extend32 sign bits
2017-12-10 12:50:57 -08:00
futex_compat.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
groups.c
kernel: make groups_sort calling a responsibility group_info allocators
2017-12-14 16:00:49 -08:00
hung_task.c
irq_work.c
Merge branch 'irq-core-for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip
2017-11-13 17:33:11 -08:00
jump_label.c
jump_label: Invoke jump_label_test() via early_initcall()
2017-11-14 08:41:41 +01:00
kallsyms.c
kallsyms: take advantage of the new '%px' format
2017-11-29 10:30:13 -08:00
kcmp.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
Kconfig.freezer
Kconfig.hz
Kconfig.locks
Kconfig.preempt
kcov.c
kcov: fix comparison callback signature
2017-12-14 16:00:48 -08:00
kexec.c
kexec_core.c
kexec_file.c
resource: Provide resource struct in resource walk callback
2017-11-07 15:35:57 +01:00
kexec_internal.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
kmod.c
kmod: move #ifdef CONFIG_MODULES wrapper to Makefile
2017-09-08 18:26:51 -07:00
kprobes.c
kprobes: Disable the jprobes APIs
2017-10-20 11:02:29 +02:00
ksysfs.c
kthread.c
treewide: Remove TIMER_FUNC_TYPE and TIMER_DATA_TYPE casts
2017-11-21 16:35:54 -08:00
latencytop.c
Makefile
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
memremap.c
memremap: add scheduling point to devm_memremap_pages
2017-10-03 17:54:25 -07:00
module-internal.h
module.c
kallsyms: take advantage of the new '%px' format
2017-11-29 10:30:13 -08:00
module_signing.c
notifier.c
nsproxy.c
padata.c
treewide: setup_timer() -> timer_setup()
2017-11-21 15:57:07 -08:00
panic.c
kernel/panic.c: add TAINT_AUX
2017-11-17 16:10:04 -08:00
params.c
kernel/params.c: improve STANDARD_PARAM_DEF readability
2017-10-03 17:54:26 -07:00
pid.c
pid: remove pidhash
2017-11-17 16:10:04 -08:00
pid_namespace.c
pid: remove pidhash
2017-11-17 16:10:04 -08:00
profile.c
ptrace.c
range.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
reboot.c
kernel/reboot.c: add devm_register_reboot_notifier()
2017-11-17 16:10:04 -08:00
relay.c
resource.c
x86/mm, resource: Use PAGE_KERNEL protection for ioremap of memory pages
2017-11-07 15:35:58 +01:00
seccomp.c
locking/barriers: Convert users of lockless_dereference() to READ_ONCE()
2017-12-17 13:57:15 +01:00
signal.c
Merge branch 'akpm' (patches from Andrew)
2017-11-17 16:56:17 -08:00
smp.c
smp/core: Use lockdep to assert IRQs are disabled/enabled
2017-11-08 11:13:50 +01:00
smpboot.c
watchdog/core, powerpc: Lock cpus across reconfiguration
2017-10-04 10:53:54 +02:00
smpboot.h
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
softirq.c
kmemcheck: rip it out
2017-11-15 18:21:05 -08:00
stacktrace.c
stop_machine.c
sys.c
arm64 updates for 4.15
2017-11-15 10:56:56 -08:00
sys_ni.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
sysctl.c
kernel/sysctl.c: code cleanups
2017-11-17 16:10:03 -08:00
sysctl_binary.c
License cleanup: add SPDX GPL-2.0 license identifier to files with no license
2017-11-02 11:10:55 +01:00
task_work.c
locking/barriers: Convert users of lockless_dereference() to READ_ONCE()
2017-12-17 13:57:15 +01:00
taskstats.c
test_kprobes.c
kprobes: Disable the jprobes test code
2017-10-20 11:02:54 +02:00
torture.c
tracepoint.c
tsacct.c
ucount.c
uid16.c
kernel: make groups_sort calling a responsibility group_info allocators
2017-12-14 16:00:49 -08:00
umh.c
kernel/umh.c: optimize 'proc_cap_handler()'
2017-11-17 16:10:01 -08:00
up.c
smp: Avoid using two cache lines for struct call_single_data
2017-08-29 15:14:38 +02:00
user-return-notifier.c
user.c
userns: use union in {g,u}idmap struct
2017-10-31 17:22:58 -05:00
user_namespace.c
Merge branch 'for-linus' of git://git.kernel.org/pub/scm/linux/kernel/git/ebiederm/user-namespace
2017-11-16 12:20:15 -08:00
utsname.c
utsname_sysctl.c
watchdog.c
Merge branch 'linus' into sched/core, to pick up fixes
2017-11-08 10:17:15 +01:00
watchdog_hld.c
Merge branch 'linus' into core/urgent, to pick up dependent commits
2017-11-04 08:53:04 +01:00
workqueue.c
workqueue: remove unneeded kallsyms include
2017-12-11 07:15:43 -08:00
workqueue_internal.h
Merge branch 'for-4.14-fixes' of git://git.kernel.org/pub/scm/linux/kernel/git/tj/wq
2017-11-06 12:26:49 -08:00