untrusted comment: signature from openbsd 6.0 base secret key RWSho3oKSqgLQ/9ZByBSf/YnpAx05RoMZegxjmiw3ozzj91vJbpq/ngp+Dftj/BQiVpa46OAhM+NeFyR1qop2/5ykksQq4shNQ0= OpenBSD 6.0 errata 043, September 27, 2017: Out of bounds TCB settings may result in a kernel panic. Apply by doing: signify -Vep /etc/signify/openbsd-60-base.pub -x 043_tcb.patch.sig \ -m - | (cd /usr/src && patch -p0) And then rebuild and install a new kernel: cd /usr/src/sys/arch/`machine`/conf KK=`sysctl -n kern.osversion | cut -d# -f1` config $KK cd ../compile/$KK make make install Index: sys/arch/amd64/amd64/sys_machdep.c =================================================================== RCS file: /cvs/src/sys/arch/amd64/amd64/sys_machdep.c,v --- sys/arch/amd64/amd64/sys_machdep.c 18 May 2015 19:59:27 -0000 1.16 +++ sys/arch/amd64/amd64/sys_machdep.c 27 Sep 2017 06:32:39 -0000 @@ -111,6 +111,8 @@ amd64_set_fsbase(struct proc *p, void *a if ((error = copyin(args, &base, sizeof(base))) != 0) return (error); + if (TCB_INVALID(base)) + return EINVAL; tcb_set(p, base); return 0; } Index: sys/arch/amd64/include/tcb.h =================================================================== RCS file: /cvs/src/sys/arch/amd64/include/tcb.h,v --- sys/arch/amd64/include/tcb.h 18 May 2015 19:59:27 -0000 1.3 +++ sys/arch/amd64/include/tcb.h 27 Sep 2017 06:33:15 -0000 @@ -27,6 +27,9 @@ void tcb_set(struct proc *_p, void *_new #define TCB_GET(p) tcb_get(p) #define TCB_SET(p, addr) tcb_set(p, addr) +/* address must be in canonical form; requiring lower-half is okay */ +#define TCB_INVALID(addr) ((u_long)(addr) > 0x0000ffffffffffff) + #else /* _KERNEL */ #include /* for offsetof */ Index: sys/kern/kern_fork.c =================================================================== RCS file: /cvs/src/sys/kern/kern_fork.c,v --- sys/kern/kern_fork.c 25 Apr 2016 20:18:31 -0000 1.187 +++ sys/kern/kern_fork.c 27 Sep 2017 06:32:07 -0000 @@ -129,6 +129,10 @@ sys___tfork(struct proc *p, void *v, reg if (KTRPOINT(p, KTR_STRUCT)) ktrstruct(p, "tfork", ¶m, sizeof(param)); #endif +#ifdef TCB_INVALID + if (TCB_INVALID(param.tf_tcb)) + return EINVAL; +#endif /* TCB_INVALID */ flags = FORK_TFORK | FORK_THREAD | FORK_SIGHAND | FORK_SHAREVM | FORK_SHAREFILES; Index: sys/kern/kern_prot.c =================================================================== RCS file: /cvs/src/sys/kern/kern_prot.c,v --- sys/kern/kern_prot.c 30 Mar 2016 07:49:11 -0000 1.65 +++ sys/kern/kern_prot.c 27 Sep 2017 06:32:01 -0000 @@ -1094,6 +1094,10 @@ sys___set_tcb(struct proc *p, void *v, r syscallarg(void *) tcb; } */ *uap = v; +#ifdef TCB_INVALID + if (TCB_INVALID(SCARG(uap, tcb))) + return EINVAL; +#endif /* TCB_INVALID */ TCB_SET(p, SCARG(uap, tcb)); return (0); }