You've already forked linux-apfs
mirror of
https://github.com/linux-apfs/linux-apfs.git
synced 2026-05-01 15:00:59 -07:00
Merge branch 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security
Pull security subsystem updates from James Morris:
"Highlights:
- TPM core and driver updates/fixes
- IPv6 security labeling (CALIPSO)
- Lots of Apparmor fixes
- Seccomp: remove 2-phase API, close hole where ptrace can change
syscall #"
* 'next' of git://git.kernel.org/pub/scm/linux/kernel/git/jmorris/linux-security: (156 commits)
apparmor: fix SECURITY_APPARMOR_HASH_DEFAULT parameter handling
tpm: Add TPM 2.0 support to the Nuvoton i2c driver (NPCT6xx family)
tpm: Factor out common startup code
tpm: use devm_add_action_or_reset
tpm2_i2c_nuvoton: add irq validity check
tpm: read burstcount from TPM_STS in one 32-bit transaction
tpm: fix byte-order for the value read by tpm2_get_tpm_pt
tpm_tis_core: convert max timeouts from msec to jiffies
apparmor: fix arg_size computation for when setprocattr is null terminated
apparmor: fix oops, validate buffer size in apparmor_setprocattr()
apparmor: do not expose kernel stack
apparmor: fix module parameters can be changed after policy is locked
apparmor: fix oops in profile_unpack() when policy_db is not present
apparmor: don't check for vmalloc_addr if kvzalloc() failed
apparmor: add missing id bounds check on dfa verification
apparmor: allow SYS_CAP_RESOURCE to be sufficient to prlimit another task
apparmor: use list_next_entry instead of list_entry_next
apparmor: fix refcount race when finding a child profile
apparmor: fix ref count leak when profile sha1 hash is read
apparmor: check that xindex is in trans_table bounds
...
This commit is contained in:
@@ -126,6 +126,7 @@ national,lm80 Serial Interface ACPI-Compatible Microprocessor System Hardware M
|
||||
national,lm85 Temperature sensor with integrated fan control
|
||||
national,lm92 ±0.33°C Accurate, 12-Bit + Sign Temperature Sensor and Thermal Window Comparator with Two-Wire Interface
|
||||
nuvoton,npct501 i2c trusted platform module (TPM)
|
||||
nuvoton,npct601 i2c trusted platform module (TPM2)
|
||||
nxp,pca9556 Octal SMBus and I2C registered interface
|
||||
nxp,pca9557 8-bit I2C-bus and SMBus I/O port with reset
|
||||
nxp,pcf8563 Real-time clock/calendar
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
Required properties:
|
||||
- compatible: should be one of the following
|
||||
"st,st33htpm-spi"
|
||||
"infineon,slb9670"
|
||||
"tcg,tpm_tis-spi"
|
||||
- spi-max-frequency: Maximum SPI frequency (depends on TPMs).
|
||||
|
||||
Optional SoC Specific Properties:
|
||||
- pinctrl-names: Contains only one value - "default".
|
||||
- pintctrl-0: Specifies the pin control groups used for this controller.
|
||||
|
||||
Example (for ARM-based BeagleBoard xM with TPM_TIS on SPI4):
|
||||
|
||||
&mcspi4 {
|
||||
|
||||
status = "okay";
|
||||
|
||||
tpm_tis@0 {
|
||||
|
||||
compatible = "tcg,tpm_tis-spi";
|
||||
|
||||
spi-max-frequency = <10000000>;
|
||||
};
|
||||
};
|
||||
@@ -128,6 +128,7 @@ idt Integrated Device Technologies, Inc.
|
||||
ifi Ingenieurburo Fur Ic-Technologie (I/F/I)
|
||||
iom Iomega Corporation
|
||||
img Imagination Technologies Ltd.
|
||||
infineon Infineon Technologies
|
||||
inforce Inforce Computing
|
||||
ingenic Ingenic Semiconductor
|
||||
innolux Innolux Corporation
|
||||
@@ -255,6 +256,7 @@ syna Synaptics Inc.
|
||||
synology Synology, Inc.
|
||||
SUNW Sun Microsystems, Inc
|
||||
tbs TBS Technologies
|
||||
tcg Trusted Computing Group
|
||||
tcl Toby Churchill Ltd.
|
||||
technexion TechNexion
|
||||
technologic Technologic Systems
|
||||
|
||||
@@ -303,6 +303,7 @@ Code Seq#(hex) Include File Comments
|
||||
<mailto:buk@buks.ipn.de>
|
||||
0xA0 all linux/sdp/sdp.h Industrial Device Project
|
||||
<mailto:kenji@bitgate.com>
|
||||
0xA1 0 linux/vtpm_proxy.h TPM Emulator Proxy Driver
|
||||
0xA2 00-0F arch/tile/include/asm/hardwall.h
|
||||
0xA3 80-8F Port ACL in development:
|
||||
<mailto:tlewis@mindspring.com>
|
||||
|
||||
@@ -0,0 +1,71 @@
|
||||
Virtual TPM Proxy Driver for Linux Containers
|
||||
|
||||
Authors: Stefan Berger (IBM)
|
||||
|
||||
This document describes the virtual Trusted Platform Module (vTPM)
|
||||
proxy device driver for Linux containers.
|
||||
|
||||
INTRODUCTION
|
||||
------------
|
||||
|
||||
The goal of this work is to provide TPM functionality to each Linux
|
||||
container. This allows programs to interact with a TPM in a container
|
||||
the same way they interact with a TPM on the physical system. Each
|
||||
container gets its own unique, emulated, software TPM.
|
||||
|
||||
|
||||
DESIGN
|
||||
------
|
||||
|
||||
To make an emulated software TPM available to each container, the container
|
||||
management stack needs to create a device pair consisting of a client TPM
|
||||
character device /dev/tpmX (with X=0,1,2...) and a 'server side' file
|
||||
descriptor. The former is moved into the container by creating a character
|
||||
device with the appropriate major and minor numbers while the file descriptor
|
||||
is passed to the TPM emulator. Software inside the container can then send
|
||||
TPM commands using the character device and the emulator will receive the
|
||||
commands via the file descriptor and use it for sending back responses.
|
||||
|
||||
To support this, the virtual TPM proxy driver provides a device /dev/vtpmx
|
||||
that is used to create device pairs using an ioctl. The ioctl takes as
|
||||
an input flags for configuring the device. The flags for example indicate
|
||||
whether TPM 1.2 or TPM 2 functionality is supported by the TPM emulator.
|
||||
The result of the ioctl are the file descriptor for the 'server side'
|
||||
as well as the major and minor numbers of the character device that was created.
|
||||
Besides that the number of the TPM character device is return. If for
|
||||
example /dev/tpm10 was created, the number (dev_num) 10 is returned.
|
||||
|
||||
The following is the data structure of the TPM_PROXY_IOC_NEW_DEV ioctl:
|
||||
|
||||
struct vtpm_proxy_new_dev {
|
||||
__u32 flags; /* input */
|
||||
__u32 tpm_num; /* output */
|
||||
__u32 fd; /* output */
|
||||
__u32 major; /* output */
|
||||
__u32 minor; /* output */
|
||||
};
|
||||
|
||||
Note that if unsupported flags are passed to the device driver, the ioctl will
|
||||
fail and errno will be set to EOPNOTSUPP. Similarly, if an unsupported ioctl is
|
||||
called on the device driver, the ioctl will fail and errno will be set to
|
||||
ENOTTY.
|
||||
|
||||
See /usr/include/linux/vtpm_proxy.h for definitions related to the public interface
|
||||
of this vTPM device driver.
|
||||
|
||||
Once the device has been created, the driver will immediately try to talk
|
||||
to the TPM. All commands from the driver can be read from the file descriptor
|
||||
returned by the ioctl. The commands should be responded to immediately.
|
||||
|
||||
Depending on the version of TPM the following commands will be sent by the
|
||||
driver:
|
||||
|
||||
- TPM 1.2:
|
||||
- the driver will send a TPM_Startup command to the TPM emulator
|
||||
- the driver will send commands to read the command durations and
|
||||
interface timeouts from the TPM emulator
|
||||
- TPM 2:
|
||||
- the driver will send a TPM2_Startup command to the TPM emulator
|
||||
|
||||
The TPM device /dev/tpmX will only appear if all of the relevant commands
|
||||
were responded to properly.
|
||||
+2
-2
@@ -2837,7 +2837,7 @@ F: include/uapi/linux/can/error.h
|
||||
F: include/uapi/linux/can/netlink.h
|
||||
|
||||
CAPABILITIES
|
||||
M: Serge Hallyn <serge.hallyn@canonical.com>
|
||||
M: Serge Hallyn <serge@hallyn.com>
|
||||
L: linux-security-module@vger.kernel.org
|
||||
S: Supported
|
||||
F: include/linux/capability.h
|
||||
@@ -10675,7 +10675,7 @@ SMACK SECURITY MODULE
|
||||
M: Casey Schaufler <casey@schaufler-ca.com>
|
||||
L: linux-security-module@vger.kernel.org
|
||||
W: http://schaufler-ca.com
|
||||
T: git git://git.gitorious.org/smack-next/kernel.git
|
||||
T: git git://github.com/cschaufler/smack-next
|
||||
S: Maintained
|
||||
F: Documentation/security/Smack.txt
|
||||
F: security/smack/
|
||||
|
||||
@@ -932,18 +932,19 @@ asmlinkage int syscall_trace_enter(struct pt_regs *regs, int scno)
|
||||
{
|
||||
current_thread_info()->syscall = scno;
|
||||
|
||||
/* Do the secure computing check first; failures should be fast. */
|
||||
#ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER
|
||||
if (secure_computing() == -1)
|
||||
return -1;
|
||||
#else
|
||||
/* XXX: remove this once OABI gets fixed */
|
||||
secure_computing_strict(scno);
|
||||
#endif
|
||||
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACE))
|
||||
tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER);
|
||||
|
||||
/* Do seccomp after ptrace; syscall may have changed. */
|
||||
#ifdef CONFIG_HAVE_ARCH_SECCOMP_FILTER
|
||||
if (secure_computing(NULL) == -1)
|
||||
return -1;
|
||||
#else
|
||||
/* XXX: remove this once OABI gets fixed */
|
||||
secure_computing_strict(current_thread_info()->syscall);
|
||||
#endif
|
||||
|
||||
/* Tracer or seccomp may have changed syscall. */
|
||||
scno = current_thread_info()->syscall;
|
||||
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
|
||||
|
||||
@@ -1347,13 +1347,13 @@ static void tracehook_report_syscall(struct pt_regs *regs,
|
||||
|
||||
asmlinkage int syscall_trace_enter(struct pt_regs *regs)
|
||||
{
|
||||
/* Do the secure computing check first; failures should be fast. */
|
||||
if (secure_computing() == -1)
|
||||
return -1;
|
||||
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACE))
|
||||
tracehook_report_syscall(regs, PTRACE_SYSCALL_ENTER);
|
||||
|
||||
/* Do the secure computing after ptrace; failures should be fast. */
|
||||
if (secure_computing(NULL) == -1)
|
||||
return -1;
|
||||
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACEPOINT))
|
||||
trace_sys_enter(regs, regs->syscallno);
|
||||
|
||||
|
||||
@@ -888,17 +888,16 @@ long arch_ptrace(struct task_struct *child, long request,
|
||||
*/
|
||||
asmlinkage long syscall_trace_enter(struct pt_regs *regs, long syscall)
|
||||
{
|
||||
long ret = 0;
|
||||
user_exit();
|
||||
|
||||
current_thread_info()->syscall = syscall;
|
||||
|
||||
if (secure_computing() == -1)
|
||||
return -1;
|
||||
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACE) &&
|
||||
tracehook_report_syscall_entry(regs))
|
||||
ret = -1;
|
||||
return -1;
|
||||
|
||||
if (secure_computing(NULL) == -1)
|
||||
return -1;
|
||||
|
||||
if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
|
||||
trace_sys_enter(regs, regs->regs[2]);
|
||||
|
||||
@@ -311,10 +311,6 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
|
||||
|
||||
long do_syscall_trace_enter(struct pt_regs *regs)
|
||||
{
|
||||
/* Do the secure computing check first. */
|
||||
if (secure_computing() == -1)
|
||||
return -1;
|
||||
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACE) &&
|
||||
tracehook_report_syscall_entry(regs)) {
|
||||
/*
|
||||
@@ -325,6 +321,11 @@ long do_syscall_trace_enter(struct pt_regs *regs)
|
||||
regs->gr[20] = -1UL;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/* Do the secure computing check after ptrace. */
|
||||
if (secure_computing(NULL) == -1)
|
||||
return -1;
|
||||
|
||||
#ifdef CONFIG_HAVE_SYSCALL_TRACEPOINTS
|
||||
if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
|
||||
trace_sys_enter(regs, regs->gr[20]);
|
||||
|
||||
@@ -1783,12 +1783,12 @@ static int do_seccomp(struct pt_regs *regs)
|
||||
* have already loaded -ENOSYS into r3, or seccomp has put
|
||||
* something else in r3 (via SECCOMP_RET_ERRNO/TRACE).
|
||||
*/
|
||||
if (__secure_computing())
|
||||
if (__secure_computing(NULL))
|
||||
return -1;
|
||||
|
||||
/*
|
||||
* The syscall was allowed by seccomp, restore the register
|
||||
* state to what ptrace and audit expect.
|
||||
* state to what audit expects.
|
||||
* Note that we use orig_gpr3, which means a seccomp tracer can
|
||||
* modify the first syscall parameter (in orig_gpr3) and also
|
||||
* allow the syscall to proceed.
|
||||
@@ -1822,22 +1822,25 @@ static inline int do_seccomp(struct pt_regs *regs) { return 0; }
|
||||
*/
|
||||
long do_syscall_trace_enter(struct pt_regs *regs)
|
||||
{
|
||||
bool abort = false;
|
||||
|
||||
user_exit();
|
||||
|
||||
/*
|
||||
* The tracer may decide to abort the syscall, if so tracehook
|
||||
* will return !0. Note that the tracer may also just change
|
||||
* regs->gpr[0] to an invalid syscall number, that is handled
|
||||
* below on the exit path.
|
||||
*/
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACE) &&
|
||||
tracehook_report_syscall_entry(regs))
|
||||
goto skip;
|
||||
|
||||
/* Run seccomp after ptrace; allow it to set gpr[3]. */
|
||||
if (do_seccomp(regs))
|
||||
return -1;
|
||||
|
||||
if (test_thread_flag(TIF_SYSCALL_TRACE)) {
|
||||
/*
|
||||
* The tracer may decide to abort the syscall, if so tracehook
|
||||
* will return !0. Note that the tracer may also just change
|
||||
* regs->gpr[0] to an invalid syscall number, that is handled
|
||||
* below on the exit path.
|
||||
*/
|
||||
abort = tracehook_report_syscall_entry(regs) != 0;
|
||||
}
|
||||
/* Avoid trace and audit when syscall is invalid. */
|
||||
if (regs->gpr[0] >= NR_syscalls)
|
||||
goto skip;
|
||||
|
||||
if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
|
||||
trace_sys_enter(regs, regs->gpr[0]);
|
||||
@@ -1854,17 +1857,16 @@ long do_syscall_trace_enter(struct pt_regs *regs)
|
||||
regs->gpr[5] & 0xffffffff,
|
||||
regs->gpr[6] & 0xffffffff);
|
||||
|
||||
if (abort || regs->gpr[0] >= NR_syscalls) {
|
||||
/*
|
||||
* If we are aborting explicitly, or if the syscall number is
|
||||
* now invalid, set the return value to -ENOSYS.
|
||||
*/
|
||||
regs->gpr[3] = -ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Return the possibly modified but valid syscall number */
|
||||
return regs->gpr[0];
|
||||
|
||||
skip:
|
||||
/*
|
||||
* If we are aborting explicitly, or if the syscall number is
|
||||
* now invalid, set the return value to -ENOSYS.
|
||||
*/
|
||||
regs->gpr[3] = -ENOSYS;
|
||||
return -1;
|
||||
}
|
||||
|
||||
void do_syscall_trace_leave(struct pt_regs *regs)
|
||||
|
||||
@@ -821,15 +821,6 @@ long compat_arch_ptrace(struct task_struct *child, compat_long_t request,
|
||||
|
||||
asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)
|
||||
{
|
||||
long ret = 0;
|
||||
|
||||
/* Do the secure computing check first. */
|
||||
if (secure_computing()) {
|
||||
/* seccomp failures shouldn't expose any additional code. */
|
||||
ret = -1;
|
||||
goto out;
|
||||
}
|
||||
|
||||
/*
|
||||
* The sysc_tracesys code in entry.S stored the system
|
||||
* call number to gprs[2].
|
||||
@@ -843,7 +834,13 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)
|
||||
* the system call and the system call restart handling.
|
||||
*/
|
||||
clear_pt_regs_flag(regs, PIF_SYSCALL);
|
||||
ret = -1;
|
||||
return -1;
|
||||
}
|
||||
|
||||
/* Do the secure computing check after ptrace. */
|
||||
if (secure_computing(NULL)) {
|
||||
/* seccomp failures shouldn't expose any additional code. */
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
|
||||
@@ -852,8 +849,8 @@ asmlinkage long do_syscall_trace_enter(struct pt_regs *regs)
|
||||
audit_syscall_entry(regs->gprs[2], regs->orig_gpr2,
|
||||
regs->gprs[3], regs->gprs[4],
|
||||
regs->gprs[5]);
|
||||
out:
|
||||
return ret ?: regs->gprs[2];
|
||||
|
||||
return regs->gprs[2];
|
||||
}
|
||||
|
||||
asmlinkage void do_syscall_trace_exit(struct pt_regs *regs)
|
||||
|
||||
@@ -255,14 +255,15 @@ int do_syscall_trace_enter(struct pt_regs *regs)
|
||||
{
|
||||
u32 work = ACCESS_ONCE(current_thread_info()->flags);
|
||||
|
||||
if (secure_computing() == -1)
|
||||
if ((work & _TIF_SYSCALL_TRACE) &&
|
||||
tracehook_report_syscall_entry(regs)) {
|
||||
regs->regs[TREG_SYSCALL_NR] = -1;
|
||||
return -1;
|
||||
|
||||
if (work & _TIF_SYSCALL_TRACE) {
|
||||
if (tracehook_report_syscall_entry(regs))
|
||||
regs->regs[TREG_SYSCALL_NR] = -1;
|
||||
}
|
||||
|
||||
if (secure_computing(NULL) == -1)
|
||||
return -1;
|
||||
|
||||
if (work & _TIF_SYSCALL_TRACEPOINT)
|
||||
trace_sys_enter(regs, regs->regs[TREG_SYSCALL_NR]);
|
||||
|
||||
|
||||
@@ -20,12 +20,12 @@ void handle_syscall(struct uml_pt_regs *r)
|
||||
UPT_SYSCALL_NR(r) = PT_SYSCALL_NR(r->gp);
|
||||
PT_REGS_SET_SYSCALL_RETURN(regs, -ENOSYS);
|
||||
|
||||
/* Do the secure computing check first; failures should be fast. */
|
||||
if (secure_computing() == -1)
|
||||
if (syscall_trace_enter(regs))
|
||||
return;
|
||||
|
||||
if (syscall_trace_enter(regs))
|
||||
goto out;
|
||||
/* Do the seccomp check after ptrace; failures should be fast. */
|
||||
if (secure_computing(NULL) == -1)
|
||||
return;
|
||||
|
||||
/* Update the syscall number after orig_ax has potentially been updated
|
||||
* with ptrace.
|
||||
@@ -37,6 +37,5 @@ void handle_syscall(struct uml_pt_regs *r)
|
||||
PT_REGS_SET_SYSCALL_RETURN(regs,
|
||||
EXECUTE_SYSCALL(syscall, regs));
|
||||
|
||||
out:
|
||||
syscall_trace_leave(regs);
|
||||
}
|
||||
|
||||
+20
-86
@@ -64,22 +64,16 @@ static void do_audit_syscall_entry(struct pt_regs *regs, u32 arch)
|
||||
}
|
||||
|
||||
/*
|
||||
* We can return 0 to resume the syscall or anything else to go to phase
|
||||
* 2. If we resume the syscall, we need to put something appropriate in
|
||||
* regs->orig_ax.
|
||||
*
|
||||
* NB: We don't have full pt_regs here, but regs->orig_ax and regs->ax
|
||||
* are fully functional.
|
||||
*
|
||||
* For phase 2's benefit, our return value is:
|
||||
* 0: resume the syscall
|
||||
* 1: go to phase 2; no seccomp phase 2 needed
|
||||
* anything else: go to phase 2; pass return value to seccomp
|
||||
* Returns the syscall nr to run (which should match regs->orig_ax) or -1
|
||||
* to skip the syscall.
|
||||
*/
|
||||
unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch)
|
||||
static long syscall_trace_enter(struct pt_regs *regs)
|
||||
{
|
||||
u32 arch = in_ia32_syscall() ? AUDIT_ARCH_I386 : AUDIT_ARCH_X86_64;
|
||||
|
||||
struct thread_info *ti = pt_regs_to_thread_info(regs);
|
||||
unsigned long ret = 0;
|
||||
bool emulated = false;
|
||||
u32 work;
|
||||
|
||||
if (IS_ENABLED(CONFIG_DEBUG_ENTRY))
|
||||
@@ -87,11 +81,19 @@ unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch)
|
||||
|
||||
work = ACCESS_ONCE(ti->flags) & _TIF_WORK_SYSCALL_ENTRY;
|
||||
|
||||
if (unlikely(work & _TIF_SYSCALL_EMU))
|
||||
emulated = true;
|
||||
|
||||
if ((emulated || (work & _TIF_SYSCALL_TRACE)) &&
|
||||
tracehook_report_syscall_entry(regs))
|
||||
return -1L;
|
||||
|
||||
if (emulated)
|
||||
return -1L;
|
||||
|
||||
#ifdef CONFIG_SECCOMP
|
||||
/*
|
||||
* Do seccomp first -- it should minimize exposure of other
|
||||
* code, and keeping seccomp fast is probably more valuable
|
||||
* than the rest of this.
|
||||
* Do seccomp after ptrace, to catch any tracer changes.
|
||||
*/
|
||||
if (work & _TIF_SECCOMP) {
|
||||
struct seccomp_data sd;
|
||||
@@ -118,69 +120,12 @@ unsigned long syscall_trace_enter_phase1(struct pt_regs *regs, u32 arch)
|
||||
sd.args[5] = regs->bp;
|
||||
}
|
||||
|
||||
BUILD_BUG_ON(SECCOMP_PHASE1_OK != 0);
|
||||
BUILD_BUG_ON(SECCOMP_PHASE1_SKIP != 1);
|
||||
|
||||
ret = seccomp_phase1(&sd);
|
||||
if (ret == SECCOMP_PHASE1_SKIP) {
|
||||
regs->orig_ax = -1;
|
||||
ret = 0;
|
||||
} else if (ret != SECCOMP_PHASE1_OK) {
|
||||
return ret; /* Go directly to phase 2 */
|
||||
}
|
||||
|
||||
work &= ~_TIF_SECCOMP;
|
||||
ret = __secure_computing(&sd);
|
||||
if (ret == -1)
|
||||
return ret;
|
||||
}
|
||||
#endif
|
||||
|
||||
/* Do our best to finish without phase 2. */
|
||||
if (work == 0)
|
||||
return ret; /* seccomp and/or nohz only (ret == 0 here) */
|
||||
|
||||
#ifdef CONFIG_AUDITSYSCALL
|
||||
if (work == _TIF_SYSCALL_AUDIT) {
|
||||
/*
|
||||
* If there is no more work to be done except auditing,
|
||||
* then audit in phase 1. Phase 2 always audits, so, if
|
||||
* we audit here, then we can't go on to phase 2.
|
||||
*/
|
||||
do_audit_syscall_entry(regs, arch);
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
return 1; /* Something is enabled that we can't handle in phase 1 */
|
||||
}
|
||||
|
||||
/* Returns the syscall nr to run (which should match regs->orig_ax). */
|
||||
long syscall_trace_enter_phase2(struct pt_regs *regs, u32 arch,
|
||||
unsigned long phase1_result)
|
||||
{
|
||||
struct thread_info *ti = pt_regs_to_thread_info(regs);
|
||||
long ret = 0;
|
||||
u32 work = ACCESS_ONCE(ti->flags) & _TIF_WORK_SYSCALL_ENTRY;
|
||||
|
||||
if (IS_ENABLED(CONFIG_DEBUG_ENTRY))
|
||||
BUG_ON(regs != task_pt_regs(current));
|
||||
|
||||
#ifdef CONFIG_SECCOMP
|
||||
/*
|
||||
* Call seccomp_phase2 before running the other hooks so that
|
||||
* they can see any changes made by a seccomp tracer.
|
||||
*/
|
||||
if (phase1_result > 1 && seccomp_phase2(phase1_result)) {
|
||||
/* seccomp failures shouldn't expose any additional code. */
|
||||
return -1;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (unlikely(work & _TIF_SYSCALL_EMU))
|
||||
ret = -1L;
|
||||
|
||||
if ((ret || test_thread_flag(TIF_SYSCALL_TRACE)) &&
|
||||
tracehook_report_syscall_entry(regs))
|
||||
ret = -1L;
|
||||
|
||||
if (unlikely(test_thread_flag(TIF_SYSCALL_TRACEPOINT)))
|
||||
trace_sys_enter(regs, regs->orig_ax);
|
||||
|
||||
@@ -189,17 +134,6 @@ long syscall_trace_enter_phase2(struct pt_regs *regs, u32 arch,
|
||||
return ret ?: regs->orig_ax;
|
||||
}
|
||||
|
||||
long syscall_trace_enter(struct pt_regs *regs)
|
||||
{
|
||||
u32 arch = in_ia32_syscall() ? AUDIT_ARCH_I386 : AUDIT_ARCH_X86_64;
|
||||
unsigned long phase1_result = syscall_trace_enter_phase1(regs, arch);
|
||||
|
||||
if (phase1_result == 0)
|
||||
return regs->orig_ax;
|
||||
else
|
||||
return syscall_trace_enter_phase2(regs, arch, phase1_result);
|
||||
}
|
||||
|
||||
#define EXIT_TO_USERMODE_LOOP_FLAGS \
|
||||
(_TIF_SIGPENDING | _TIF_NOTIFY_RESUME | _TIF_UPROBE | \
|
||||
_TIF_NEED_RESCHED | _TIF_USER_RETURN_NOTIFY)
|
||||
|
||||
@@ -207,7 +207,7 @@ bool emulate_vsyscall(struct pt_regs *regs, unsigned long address)
|
||||
*/
|
||||
regs->orig_ax = syscall_nr;
|
||||
regs->ax = -ENOSYS;
|
||||
tmp = secure_computing();
|
||||
tmp = secure_computing(NULL);
|
||||
if ((!tmp && regs->orig_ax != syscall_nr) || regs->ip != address) {
|
||||
warn_bad_vsyscall(KERN_DEBUG, regs,
|
||||
"seccomp tried to change syscall nr or ip");
|
||||
|
||||
@@ -83,12 +83,6 @@ extern void send_sigtrap(struct task_struct *tsk, struct pt_regs *regs,
|
||||
int error_code, int si_code);
|
||||
|
||||
|
||||
extern unsigned long syscall_trace_enter_phase1(struct pt_regs *, u32 arch);
|
||||
extern long syscall_trace_enter_phase2(struct pt_regs *, u32 arch,
|
||||
unsigned long phase1_result);
|
||||
|
||||
extern long syscall_trace_enter(struct pt_regs *);
|
||||
|
||||
static inline unsigned long regs_return_value(struct pt_regs *regs)
|
||||
{
|
||||
return regs->ax;
|
||||
|
||||
@@ -24,9 +24,16 @@ menuconfig TCG_TPM
|
||||
|
||||
if TCG_TPM
|
||||
|
||||
config TCG_TIS_CORE
|
||||
tristate
|
||||
---help---
|
||||
TCG TIS TPM core driver. It implements the TPM TCG TIS logic and hooks
|
||||
into the TPM kernel APIs. Physical layers will register against it.
|
||||
|
||||
config TCG_TIS
|
||||
tristate "TPM Interface Specification 1.2 Interface / TPM 2.0 FIFO Interface"
|
||||
depends on X86
|
||||
select TCG_TIS_CORE
|
||||
---help---
|
||||
If you have a TPM security chip that is compliant with the
|
||||
TCG TIS 1.2 TPM specification (TPM1.2) or the TCG PTP FIFO
|
||||
@@ -34,6 +41,18 @@ config TCG_TIS
|
||||
within Linux. To compile this driver as a module, choose M here;
|
||||
the module will be called tpm_tis.
|
||||
|
||||
config TCG_TIS_SPI
|
||||
tristate "TPM Interface Specification 1.3 Interface / TPM 2.0 FIFO Interface - (SPI)"
|
||||
depends on SPI
|
||||
select TCG_TIS_CORE
|
||||
---help---
|
||||
If you have a TPM security chip which is connected to a regular,
|
||||
non-tcg SPI master (i.e. most embedded platforms) that is compliant with the
|
||||
TCG TIS 1.3 TPM specification (TPM1.2) or the TCG PTP FIFO
|
||||
specification (TPM2.0) say Yes and it will be accessible from
|
||||
within Linux. To compile this driver as a module, choose M here;
|
||||
the module will be called tpm_tis_spi.
|
||||
|
||||
config TCG_TIS_I2C_ATMEL
|
||||
tristate "TPM Interface Specification 1.2 Interface (I2C - Atmel)"
|
||||
depends on I2C
|
||||
@@ -122,5 +141,16 @@ config TCG_CRB
|
||||
from within Linux. To compile this driver as a module, choose
|
||||
M here; the module will be called tpm_crb.
|
||||
|
||||
config TCG_VTPM_PROXY
|
||||
tristate "VTPM Proxy Interface"
|
||||
depends on TCG_TPM
|
||||
select ANON_INODES
|
||||
---help---
|
||||
This driver proxies for an emulated TPM (vTPM) running in userspace.
|
||||
A device /dev/vtpmx is provided that creates a device pair
|
||||
/dev/vtpmX and a server-side file descriptor on which the vTPM
|
||||
can receive commands.
|
||||
|
||||
|
||||
source "drivers/char/tpm/st33zp24/Kconfig"
|
||||
endif # TCG_TPM
|
||||
|
||||
@@ -12,7 +12,9 @@ ifdef CONFIG_TCG_IBMVTPM
|
||||
tpm-y += tpm_eventlog.o tpm_of.o
|
||||
endif
|
||||
endif
|
||||
obj-$(CONFIG_TCG_TIS_CORE) += tpm_tis_core.o
|
||||
obj-$(CONFIG_TCG_TIS) += tpm_tis.o
|
||||
obj-$(CONFIG_TCG_TIS_SPI) += tpm_tis_spi.o
|
||||
obj-$(CONFIG_TCG_TIS_I2C_ATMEL) += tpm_i2c_atmel.o
|
||||
obj-$(CONFIG_TCG_TIS_I2C_INFINEON) += tpm_i2c_infineon.o
|
||||
obj-$(CONFIG_TCG_TIS_I2C_NUVOTON) += tpm_i2c_nuvoton.o
|
||||
@@ -23,3 +25,4 @@ obj-$(CONFIG_TCG_IBMVTPM) += tpm_ibmvtpm.o
|
||||
obj-$(CONFIG_TCG_TIS_ST33ZP24) += st33zp24/
|
||||
obj-$(CONFIG_TCG_XEN) += xen-tpmfront.o
|
||||
obj-$(CONFIG_TCG_CRB) += tpm_crb.o
|
||||
obj-$(CONFIG_TCG_VTPM_PROXY) += tpm_vtpm_proxy.o
|
||||
|
||||
@@ -1,6 +1,5 @@
|
||||
config TCG_TIS_ST33ZP24
|
||||
tristate "STMicroelectronics TPM Interface Specification 1.2 Interface"
|
||||
depends on GPIOLIB || COMPILE_TEST
|
||||
tristate
|
||||
---help---
|
||||
STMicroelectronics ST33ZP24 core driver. It implements the core
|
||||
TPM1.2 logic and hooks into the TPM kernel APIs. Physical layers will
|
||||
@@ -10,9 +9,9 @@ config TCG_TIS_ST33ZP24
|
||||
tpm_st33zp24.
|
||||
|
||||
config TCG_TIS_ST33ZP24_I2C
|
||||
tristate "TPM 1.2 ST33ZP24 I2C support"
|
||||
depends on TCG_TIS_ST33ZP24
|
||||
tristate "STMicroelectronics TPM Interface Specification 1.2 Interface (I2C)"
|
||||
depends on I2C
|
||||
select TCG_TIS_ST33ZP24
|
||||
---help---
|
||||
This module adds support for the STMicroelectronics TPM security chip
|
||||
ST33ZP24 with i2c interface.
|
||||
@@ -20,9 +19,9 @@ config TCG_TIS_ST33ZP24_I2C
|
||||
called tpm_st33zp24_i2c.
|
||||
|
||||
config TCG_TIS_ST33ZP24_SPI
|
||||
tristate "TPM 1.2 ST33ZP24 SPI support"
|
||||
depends on TCG_TIS_ST33ZP24
|
||||
tristate "STMicroelectronics TPM Interface Specification 1.2 Interface (SPI)"
|
||||
depends on SPI
|
||||
select TCG_TIS_ST33ZP24
|
||||
---help---
|
||||
This module adds support for the STMicroelectronics TPM security chip
|
||||
ST33ZP24 with spi interface.
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user