Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
Kirill Smelkov
linux
Commits
69049d52
Commit
69049d52
authored
Nov 22, 2019
by
Paul Walmsley
Browse files
Options
Browse Files
Download
Plain Diff
Merge branch 'next/seccomp' into for-next
parents
a99d8080
5340627e
Changes
6
Hide whitespace changes
Inline
Side-by-side
Showing
6 changed files
with
70 additions
and
4 deletions
+70
-4
arch/riscv/Kconfig
arch/riscv/Kconfig
+14
-0
arch/riscv/include/asm/seccomp.h
arch/riscv/include/asm/seccomp.h
+10
-0
arch/riscv/include/asm/thread_info.h
arch/riscv/include/asm/thread_info.h
+4
-1
arch/riscv/kernel/entry.S
arch/riscv/kernel/entry.S
+25
-2
arch/riscv/kernel/ptrace.c
arch/riscv/kernel/ptrace.c
+10
-0
tools/testing/selftests/seccomp/seccomp_bpf.c
tools/testing/selftests/seccomp/seccomp_bpf.c
+7
-1
No files found.
arch/riscv/Kconfig
View file @
69049d52
...
...
@@ -31,6 +31,7 @@ config RISCV
select GENERIC_SMP_IDLE_THREAD
select GENERIC_ATOMIC64 if !64BIT
select HAVE_ARCH_AUDITSYSCALL
select HAVE_ARCH_SECCOMP_FILTER
select HAVE_ASM_MODVERSIONS
select HAVE_MEMBLOCK_NODE_MAP
select HAVE_DMA_CONTIGUOUS
...
...
@@ -272,6 +273,19 @@ menu "Kernel features"
source "kernel/Kconfig.hz"
config SECCOMP
bool "Enable seccomp to safely compute untrusted bytecode"
help
This kernel feature is useful for number crunching applications
that may need to compute untrusted bytecode during their
execution. By using pipes or other transports made available to
the process as file descriptors supporting the read/write
syscalls, it's possible to isolate those applications in
their own address space using seccomp. Once seccomp is
enabled via prctl(PR_SET_SECCOMP), it cannot be disabled
and the task is only allowed to execute a few safe syscalls
defined by each seccomp mode.
endmenu
menu "Boot options"
...
...
arch/riscv/include/asm/seccomp.h
0 → 100644
View file @
69049d52
/* SPDX-License-Identifier: GPL-2.0 */
#ifndef _ASM_SECCOMP_H
#define _ASM_SECCOMP_H
#include <asm/unistd.h>
#include <asm-generic/seccomp.h>
#endif
/* _ASM_SECCOMP_H */
arch/riscv/include/asm/thread_info.h
View file @
69049d52
...
...
@@ -75,6 +75,7 @@ struct thread_info {
#define TIF_MEMDIE 5
/* is terminating due to OOM killer */
#define TIF_SYSCALL_TRACEPOINT 6
/* syscall tracepoint instrumentation */
#define TIF_SYSCALL_AUDIT 7
/* syscall auditing */
#define TIF_SECCOMP 8
/* syscall secure computing */
#define _TIF_SYSCALL_TRACE (1 << TIF_SYSCALL_TRACE)
#define _TIF_NOTIFY_RESUME (1 << TIF_NOTIFY_RESUME)
...
...
@@ -82,11 +83,13 @@ struct thread_info {
#define _TIF_NEED_RESCHED (1 << TIF_NEED_RESCHED)
#define _TIF_SYSCALL_TRACEPOINT (1 << TIF_SYSCALL_TRACEPOINT)
#define _TIF_SYSCALL_AUDIT (1 << TIF_SYSCALL_AUDIT)
#define _TIF_SECCOMP (1 << TIF_SECCOMP)
#define _TIF_WORK_MASK \
(_TIF_NOTIFY_RESUME | _TIF_SIGPENDING | _TIF_NEED_RESCHED)
#define _TIF_SYSCALL_WORK \
(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT)
(_TIF_SYSCALL_TRACE | _TIF_SYSCALL_TRACEPOINT | _TIF_SYSCALL_AUDIT | \
_TIF_SECCOMP)
#endif
/* _ASM_RISCV_THREAD_INFO_H */
arch/riscv/kernel/entry.S
View file @
69049d52
...
...
@@ -226,8 +226,25 @@ check_syscall_nr:
/
*
Check
to
make
sure
we
don
't jump to a bogus syscall number. */
li
t0
,
__NR_syscalls
la
s0
,
sys_ni_syscall
/
*
Syscall
number
held
in
a7
*/
bgeu
a7
,
t0
,
1
f
/
*
*
The
tracer
can
change
syscall
number
to
valid
/
invalid
value
.
*
We
use
syscall_set_nr
helper
in
syscall_trace_enter
thus
we
*
cannot
trust
the
current
value
in
a7
and
have
to
reload
from
*
the
current
task
pt_regs
.
*/
REG_L
a7
,
PT_A7
(
sp
)
/
*
*
Syscall
number
held
in
a7
.
*
If
syscall
number
is
above
allowed
value
,
redirect
to
ni_syscall
.
*/
bge
a7
,
t0
,
1
f
/
*
*
Check
if
syscall
is
rejected
by
tracer
or
seccomp
,
i
.
e
.
,
a7
==
-
1
.
*
If
yes
,
we
pretend
it
was
executed
.
*/
li
t1
,
-
1
beq
a7
,
t1
,
ret_from_syscall_rejected
/
*
Call
syscall
*/
la
s0
,
sys_call_table
slli
t0
,
a7
,
RISCV_LGPTR
add
s0
,
s0
,
t0
...
...
@@ -238,6 +255,12 @@ check_syscall_nr:
ret_from_syscall
:
/
*
Set
user
a0
to
kernel
a0
*/
REG_S
a0
,
PT_A0
(
sp
)
/
*
*
We
didn
't execute the actual syscall.
*
Seccomp
already
set
return
value
for
the
current
task
pt_regs
.
*
(
If
it
was
configured
with
SECCOMP_RET_ERRNO
/
TRACE
)
*/
ret_from_syscall_rejected
:
/
*
Trace
syscalls
,
but
only
if
requested
by
the
user
.
*/
REG_L
t0
,
TASK_TI_FLAGS
(
tp
)
andi
t0
,
t0
,
_TIF_SYSCALL_WORK
...
...
arch/riscv/kernel/ptrace.c
View file @
69049d52
...
...
@@ -154,6 +154,16 @@ __visible void do_syscall_trace_enter(struct pt_regs *regs)
if
(
tracehook_report_syscall_entry
(
regs
))
syscall_set_nr
(
current
,
regs
,
-
1
);
/*
* Do the secure computing after ptrace; failures should be fast.
* If this fails we might have return value in a0 from seccomp
* (via SECCOMP_RET_ERRNO/TRACE).
*/
if
(
secure_computing
(
NULL
)
==
-
1
)
{
syscall_set_nr
(
current
,
regs
,
-
1
);
return
;
}
#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
if
(
test_thread_flag
(
TIF_SYSCALL_TRACEPOINT
))
trace_sys_enter
(
regs
,
syscall_get_nr
(
current
,
regs
));
...
...
tools/testing/selftests/seccomp/seccomp_bpf.c
View file @
69049d52
...
...
@@ -112,6 +112,8 @@ struct seccomp_data {
# define __NR_seccomp 383
# elif defined(__aarch64__)
# define __NR_seccomp 277
# elif defined(__riscv)
# define __NR_seccomp 277
# elif defined(__hppa__)
# define __NR_seccomp 338
# elif defined(__powerpc__)
...
...
@@ -1587,6 +1589,10 @@ TEST_F(TRACE_poke, getpid_runs_normally)
# define ARCH_REGS struct user_pt_regs
# define SYSCALL_NUM regs[8]
# define SYSCALL_RET regs[0]
#elif defined(__riscv) && __riscv_xlen == 64
# define ARCH_REGS struct user_regs_struct
# define SYSCALL_NUM a7
# define SYSCALL_RET a0
#elif defined(__hppa__)
# define ARCH_REGS struct user_regs_struct
# define SYSCALL_NUM gr[20]
...
...
@@ -1676,7 +1682,7 @@ void change_syscall(struct __test_metadata *_metadata,
EXPECT_EQ
(
0
,
ret
)
{}
#if defined(__x86_64__) || defined(__i386__) || defined(__powerpc__) || \
defined(__s390__) || defined(__hppa__
)
defined(__s390__) || defined(__hppa__) || defined(__riscv
)
{
regs
.
SYSCALL_NUM
=
syscall
;
}
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment