forked from mirrors/linux
		
	- Improve seccomp performance via constant-action bitmaps (YiFei Zhu & Kees Cook)
 
 - Fix bogus __user annotations (Jann Horn)
 
 - Add missed CONFIG for improved selftest coverage (Mickaël Salaün)
 -----BEGIN PGP SIGNATURE-----
 
 iQIzBAABCgAdFiEEpcP2jyKd1g9yPm4TiXL039xtwCYFAl/ZG5IACgkQiXL039xt
 wCbhuw/+P77jwT/p1DRnKp5vG7TXTqqXrdhQZYNyBUxRaKSGCEMydvJn/h3KscyW
 4eEy9vZKTAhIQg5oI5OXZ9jxzFdpxEg8lMPSKReNEga3d0//H9gOJHYc782D/bf1
 +6x6I4qWv+LMM/52P60gznBH+3WFVtyM5Jw+LF5igOCEVSERoZ3ChsmdSZgkALG0
 DJXKL+Dy1Wj9ESeBtuh1UsKoh4ADTAoPC+LvfGuxn2T+VtnxX/sOSDkkrpHfX+2J
 UKkIgWJHeNmq74nwWjpNuDz24ARTiVWOVQX01nOHRohtu39TZcpU774Pdp4Dsj2W
 oDDwOzIWp4/27aQxkOKv6NXMwd29XbrpH1gweyuvQh9cohSbzx6qZlXujqyd9izs
 6Nh74mvC3cns6sQWSWz5ddU4dMQ4rNjpD2CK1P8A7ZVTfH+5baaPmF8CRp126E6f
 /MAUk7Rfbe6YfYdfMwhXXhTvus0e5yenGFXr46gasJDfGnyy4cLS/MO7AZ+mR0CB
 d9DnrsIJVggL5cZ2LZmivIng18JWnbkgnenmHSXahdLstmYVkdpo4ckBl1G/dXK0
 lDmi9j9FoTxB6OrztEKA0RZB+C1e6q7X7euwsHjgF9XKgD5S+DdeYwqd2lypjyvb
 d9VNLFdngD0CRY7wcJZKRma+yPemlPNurdMjF9LrqaAu232G1UA=
 =jJwG
 -----END PGP SIGNATURE-----
Merge tag 'seccomp-v5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux
Pull seccomp updates from Kees Cook:
 "The major change here is finally gaining seccomp constant-action
  bitmaps, which internally reduces the seccomp overhead for many
  real-world syscall filters to O(1), as discussed at Plumbers this
  year.
   - Improve seccomp performance via constant-action bitmaps (YiFei Zhu
     & Kees Cook)
   - Fix bogus __user annotations (Jann Horn)
   - Add missed CONFIG for improved selftest coverage (Mickaël Salaün)"
* tag 'seccomp-v5.11-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/kees/linux:
  selftests/seccomp: Update kernel config
  seccomp: Remove bogus __user annotations
  seccomp/cache: Report cache data through /proc/pid/seccomp_cache
  xtensa: Enable seccomp architecture tracking
  sh: Enable seccomp architecture tracking
  s390: Enable seccomp architecture tracking
  riscv: Enable seccomp architecture tracking
  powerpc: Enable seccomp architecture tracking
  parisc: Enable seccomp architecture tracking
  csky: Enable seccomp architecture tracking
  arm: Enable seccomp architecture tracking
  arm64: Enable seccomp architecture tracking
  selftests/seccomp: Compare bitmap vs filter overhead
  x86: Enable seccomp architecture tracking
  seccomp/cache: Add "emulator" to check if filter is constant allow
  seccomp/cache: Lookup syscall allowlist bitmap for fast path
		
	
			
		
			
				
	
	
		
			131 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
			
		
		
	
	
			131 lines
		
	
	
	
		
			3.5 KiB
		
	
	
	
		
			C
		
	
	
	
	
	
/* SPDX-License-Identifier: GPL-2.0 */
 | 
						|
#ifndef _LINUX_SECCOMP_H
 | 
						|
#define _LINUX_SECCOMP_H
 | 
						|
 | 
						|
#include <uapi/linux/seccomp.h>
 | 
						|
 | 
						|
#define SECCOMP_FILTER_FLAG_MASK	(SECCOMP_FILTER_FLAG_TSYNC | \
 | 
						|
					 SECCOMP_FILTER_FLAG_LOG | \
 | 
						|
					 SECCOMP_FILTER_FLAG_SPEC_ALLOW | \
 | 
						|
					 SECCOMP_FILTER_FLAG_NEW_LISTENER | \
 | 
						|
					 SECCOMP_FILTER_FLAG_TSYNC_ESRCH)
 | 
						|
 | 
						|
/* sizeof() the first published struct seccomp_notif_addfd */
 | 
						|
#define SECCOMP_NOTIFY_ADDFD_SIZE_VER0 24
 | 
						|
#define SECCOMP_NOTIFY_ADDFD_SIZE_LATEST SECCOMP_NOTIFY_ADDFD_SIZE_VER0
 | 
						|
 | 
						|
#ifdef CONFIG_SECCOMP
 | 
						|
 | 
						|
#include <linux/thread_info.h>
 | 
						|
#include <linux/atomic.h>
 | 
						|
#include <asm/seccomp.h>
 | 
						|
 | 
						|
struct seccomp_filter;
 | 
						|
/**
 | 
						|
 * struct seccomp - the state of a seccomp'ed process
 | 
						|
 *
 | 
						|
 * @mode:  indicates one of the valid values above for controlled
 | 
						|
 *         system calls available to a process.
 | 
						|
 * @filter: must always point to a valid seccomp-filter or NULL as it is
 | 
						|
 *          accessed without locking during system call entry.
 | 
						|
 *
 | 
						|
 *          @filter must only be accessed from the context of current as there
 | 
						|
 *          is no read locking.
 | 
						|
 */
 | 
						|
struct seccomp {
 | 
						|
	int mode;
 | 
						|
	atomic_t filter_count;
 | 
						|
	struct seccomp_filter *filter;
 | 
						|
};
 | 
						|
 | 
						|
#ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER
 | 
						|
extern int __secure_computing(const struct seccomp_data *sd);
 | 
						|
static inline int secure_computing(void)
 | 
						|
{
 | 
						|
	if (unlikely(test_syscall_work(SECCOMP)))
 | 
						|
		return  __secure_computing(NULL);
 | 
						|
	return 0;
 | 
						|
}
 | 
						|
#else
 | 
						|
extern void secure_computing_strict(int this_syscall);
 | 
						|
#endif
 | 
						|
 | 
						|
extern long prctl_get_seccomp(void);
 | 
						|
extern long prctl_set_seccomp(unsigned long, void __user *);
 | 
						|
 | 
						|
static inline int seccomp_mode(struct seccomp *s)
 | 
						|
{
 | 
						|
	return s->mode;
 | 
						|
}
 | 
						|
 | 
						|
#else /* CONFIG_SECCOMP */
 | 
						|
 | 
						|
#include <linux/errno.h>
 | 
						|
 | 
						|
struct seccomp { };
 | 
						|
struct seccomp_filter { };
 | 
						|
struct seccomp_data;
 | 
						|
 | 
						|
#ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER
 | 
						|
static inline int secure_computing(void) { return 0; }
 | 
						|
static inline int __secure_computing(const struct seccomp_data *sd) { return 0; }
 | 
						|
#else
 | 
						|
static inline void secure_computing_strict(int this_syscall) { return; }
 | 
						|
#endif
 | 
						|
 | 
						|
static inline long prctl_get_seccomp(void)
 | 
						|
{
 | 
						|
	return -EINVAL;
 | 
						|
}
 | 
						|
 | 
						|
static inline long prctl_set_seccomp(unsigned long arg2, char __user *arg3)
 | 
						|
{
 | 
						|
	return -EINVAL;
 | 
						|
}
 | 
						|
 | 
						|
static inline int seccomp_mode(struct seccomp *s)
 | 
						|
{
 | 
						|
	return SECCOMP_MODE_DISABLED;
 | 
						|
}
 | 
						|
#endif /* CONFIG_SECCOMP */
 | 
						|
 | 
						|
#ifdef CONFIG_SECCOMP_FILTER
 | 
						|
extern void seccomp_filter_release(struct task_struct *tsk);
 | 
						|
extern void get_seccomp_filter(struct task_struct *tsk);
 | 
						|
#else  /* CONFIG_SECCOMP_FILTER */
 | 
						|
static inline void seccomp_filter_release(struct task_struct *tsk)
 | 
						|
{
 | 
						|
	return;
 | 
						|
}
 | 
						|
static inline void get_seccomp_filter(struct task_struct *tsk)
 | 
						|
{
 | 
						|
	return;
 | 
						|
}
 | 
						|
#endif /* CONFIG_SECCOMP_FILTER */
 | 
						|
 | 
						|
#if defined(CONFIG_SECCOMP_FILTER) && defined(CONFIG_CHECKPOINT_RESTORE)
 | 
						|
extern long seccomp_get_filter(struct task_struct *task,
 | 
						|
			       unsigned long filter_off, void __user *data);
 | 
						|
extern long seccomp_get_metadata(struct task_struct *task,
 | 
						|
				 unsigned long filter_off, void __user *data);
 | 
						|
#else
 | 
						|
static inline long seccomp_get_filter(struct task_struct *task,
 | 
						|
				      unsigned long n, void __user *data)
 | 
						|
{
 | 
						|
	return -EINVAL;
 | 
						|
}
 | 
						|
static inline long seccomp_get_metadata(struct task_struct *task,
 | 
						|
					unsigned long filter_off,
 | 
						|
					void __user *data)
 | 
						|
{
 | 
						|
	return -EINVAL;
 | 
						|
}
 | 
						|
#endif /* CONFIG_SECCOMP_FILTER && CONFIG_CHECKPOINT_RESTORE */
 | 
						|
 | 
						|
#ifdef CONFIG_SECCOMP_CACHE_DEBUG
 | 
						|
struct seq_file;
 | 
						|
 | 
						|
int proc_pid_seccomp_cache(struct seq_file *m, struct pid_namespace *ns,
 | 
						|
			   struct pid *pid, struct task_struct *task);
 | 
						|
#endif
 | 
						|
#endif /* _LINUX_SECCOMP_H */
 |