Add SA-18:12, EN-18:08.
Approved by: so
This commit is contained in:
parent
3f3c94845a
commit
4dff4ff1a6
Notes:
svn2git
2020-12-08 03:00:23 +00:00
svn path=/head/; revision=52250
8 changed files with 637 additions and 0 deletions
140
share/security/advisories/FreeBSD-EN-18:08.lazyfpu.asc
Normal file
140
share/security/advisories/FreeBSD-EN-18:08.lazyfpu.asc
Normal file
|
@ -0,0 +1,140 @@
|
||||||
|
-----BEGIN PGP SIGNED MESSAGE-----
|
||||||
|
Hash: SHA512
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
FreeBSD-EN-18:08.lazyfpu Errata Notice
|
||||||
|
The FreeBSD Project
|
||||||
|
|
||||||
|
Topic: LazyFPU remediation causes potential data corruption
|
||||||
|
|
||||||
|
Category: core
|
||||||
|
Module: kernel
|
||||||
|
Announced: 2018-09-12
|
||||||
|
Credits: Gleb Kurtsou
|
||||||
|
Affects: FreeBSD 10.4-STABLE, 11.1 and later.
|
||||||
|
Corrected: 2018-07-31 10:18:30 UTC (stable/11, 11.1-STABLE)
|
||||||
|
2018-09-12 05:08:49 UTC (releng/11.2, 11.2-RELEASE-p3)
|
||||||
|
2018-09-12 05:08:49 UTC (releng/11.1, 11.1-RELEASE-p14)
|
||||||
|
2018-08-03 14:12:37 UTC (stable/10, 10.4-STABLE)
|
||||||
|
|
||||||
|
For general information regarding FreeBSD Errata Notices and Security
|
||||||
|
Advisories, including descriptions of the fields above, security
|
||||||
|
branches, and the following sections, please visit
|
||||||
|
<URL:https://security.FreeBSD.org/>.
|
||||||
|
|
||||||
|
Special Note: While SA-18:07.lazyfpu has been fixed in 10.4-STABLE, it has
|
||||||
|
yet to be released for 10.4-RELEASE. As such, this EN does not apply for
|
||||||
|
that release. Once SA-18:07.lazyfpu has been updated for 10.4-RELEASE,
|
||||||
|
this EN will be incorporated at that time.
|
||||||
|
|
||||||
|
I. Background
|
||||||
|
|
||||||
|
The recent security advisory titled SA-18:07.lazyfpu resolved an issue in the
|
||||||
|
floating point unit (FPU) state handling.
|
||||||
|
|
||||||
|
II. Problem Description
|
||||||
|
|
||||||
|
As a result of fixing the issue described in SA-18:07.lazyfpu, a regression
|
||||||
|
was introduced. FPU state manipulation did not sufficiently prevent context
|
||||||
|
switches potentially allowing partially modified FPU context to be switched
|
||||||
|
out. Upon returning the thread to a running state, stale FPU context could
|
||||||
|
be reloaded.
|
||||||
|
|
||||||
|
III. Impact
|
||||||
|
|
||||||
|
The regression could potentially cause an inconsistent FPU state, leading to
|
||||||
|
data corruption.
|
||||||
|
|
||||||
|
IV. Workaround
|
||||||
|
|
||||||
|
No workaround is available.
|
||||||
|
|
||||||
|
V. Solution
|
||||||
|
|
||||||
|
Perform one of the following:
|
||||||
|
|
||||||
|
1) Upgrade your system to a supported FreeBSD stable or release / security
|
||||||
|
branch (releng) dated after the correction date.
|
||||||
|
|
||||||
|
Afterward, reboot the system.
|
||||||
|
|
||||||
|
2) To update your system via a binary patch:
|
||||||
|
|
||||||
|
Systems running a RELEASE version of FreeBSD on the i386 or amd64
|
||||||
|
platforms can be updated via the freebsd-update(8) utility:
|
||||||
|
|
||||||
|
# freebsd-update fetch
|
||||||
|
# freebsd-update install
|
||||||
|
|
||||||
|
Afterward, reboot the system.
|
||||||
|
|
||||||
|
3) To update your system via a source code patch:
|
||||||
|
|
||||||
|
The following patches have been verified to apply to the applicable
|
||||||
|
FreeBSD release branches.
|
||||||
|
|
||||||
|
a) Download the relevant patch from the location below, and verify the
|
||||||
|
detached PGP signature using your PGP utility.
|
||||||
|
|
||||||
|
[FreeBSD 11.x]
|
||||||
|
# fetch https://security.FreeBSD.org/patches/EN-18:08/lazyfpu-11.patch
|
||||||
|
# fetch https://security.FreeBSD.org/patches/EN-18:08/lazyfpu-11.patch.asc
|
||||||
|
# gpg --verify lazyfpu-11.patch.asc
|
||||||
|
|
||||||
|
b) Apply the patch. Execute the following commands as root:
|
||||||
|
|
||||||
|
# cd /usr/src
|
||||||
|
# patch < /path/to/patch
|
||||||
|
|
||||||
|
c) Recompile your kernel as described in
|
||||||
|
<URL:https://www.FreeBSD.org/handbook/kernelconfig.html> and reboot the
|
||||||
|
system.
|
||||||
|
|
||||||
|
VI. Correction details
|
||||||
|
|
||||||
|
The following list contains the correction revision numbers for each
|
||||||
|
affected branch.
|
||||||
|
|
||||||
|
Branch/path Revision
|
||||||
|
- -------------------------------------------------------------------------
|
||||||
|
stable/10/ r337254
|
||||||
|
stable/11/ r336963
|
||||||
|
releng/11.1/ r338607
|
||||||
|
releng/11.2/ r338607
|
||||||
|
- -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
To see which files were modified by a particular revision, run the
|
||||||
|
following command, replacing NNNNNN with the revision number, on a
|
||||||
|
machine with Subversion installed:
|
||||||
|
|
||||||
|
# svn diff -cNNNNNN --summarize svn://svn.freebsd.org/base
|
||||||
|
|
||||||
|
Or visit the following URL, replacing NNNNNN with the revision number:
|
||||||
|
|
||||||
|
<URL:https://svnweb.freebsd.org/base?view=revision&revision=NNNNNN>
|
||||||
|
|
||||||
|
VII. References
|
||||||
|
|
||||||
|
The security advisory that introduced the regression is available at
|
||||||
|
<URL:https://security.FreeBSD.org/advisories/FreeBSD-SA-18:07.lazyfpu.asc>
|
||||||
|
|
||||||
|
The latest revision of this advisory is available at
|
||||||
|
<URL:https://security.FreeBSD.org/advisories/FreeBSD-EN-18:08.lazyfpu.asc>
|
||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iQKTBAEBCgB9FiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAluYoL5fFIAAAAAALgAo
|
||||||
|
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEZD
|
||||||
|
MEU4NzhBRTVBRkU3ODgwMjhENjM1NUQzOTc5MkY0OUVBN0U1QzIACgkQ05eS9J6n
|
||||||
|
5cJovBAAl+BCwCwWy57TzqtYmYYaJlsKi461suiv2KjQWOAddFFPMgmEgRzLtmdu
|
||||||
|
hj4Ix5xMMH1efyWGZCk0zs9bN/2bL59P5NMFTC38Fg18fVUHC3u9SYYILvh+eTeH
|
||||||
|
s9/mkTO5nJ0LXZi3RrS4fi12Zqkiu3JuT9lcADdg8dtqRK4L0l77NZ7HD9p/mPX0
|
||||||
|
LkLtZNTQz3Fv0LsFxwtdlljGOuJF+YYTKsC87ZHuwATDq7wTHOAmA46LVambxvxM
|
||||||
|
JQZrzUE3kDblz1sOIbMD8uW/tQ0gG4mvA3mVkuBX0yokhl7SJ4gFltjLiOEJ+n3y
|
||||||
|
7VkIcSN/5uZdjk2yWOoZuZojLLWmF0TnNrLYjIw5vacWvX25iIu+f6s9mavjZXTZ
|
||||||
|
TdtHKv+IFZfaDcaZ+mzYN87e/J7nTbe6mFwUXqG1D7ptQ3m4BP68PhtzfGrbFn/z
|
||||||
|
KXBDhaFP6MDPIMIfnP0r2HufBBlox9kcH8CKAektxVoiGAWD93+AoKVWbaR1nguQ
|
||||||
|
9k9Feo3EeS4gFQ+Jz3MQIl57nhI2FZO2SxcFowHvIqk/diXlhNhjHOy+pwSWlVH+
|
||||||
|
8vtVlxcmFyjJBa+59QCix6PzHUn74YxRvP0NDA0zZ5WV1MwEi8J+SWaEbZMVKwJo
|
||||||
|
eJxWp1KTylk86vhaxzbRCrCzreHr6jf+Ljzn2HQPQ7rC3mRUdw0=
|
||||||
|
=+nM+
|
||||||
|
-----END PGP SIGNATURE-----
|
128
share/security/advisories/FreeBSD-SA-18:12.elf.asc
Normal file
128
share/security/advisories/FreeBSD-SA-18:12.elf.asc
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
-----BEGIN PGP SIGNED MESSAGE-----
|
||||||
|
Hash: SHA512
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
FreeBSD-SA-18:12.elf Security Advisory
|
||||||
|
The FreeBSD Project
|
||||||
|
|
||||||
|
Topic: Improper ELF header parsing
|
||||||
|
|
||||||
|
Category: core
|
||||||
|
Module: kernel
|
||||||
|
Announced: 2018-09-12
|
||||||
|
Credits: Thomas Barabosch, Fraunhofer FKIE; Mark Johnston
|
||||||
|
Affects: All supported versions of FreeBSD.
|
||||||
|
Corrected: 2018-09-12 05:02:11 UTC (stable/11, 11.1-STABLE)
|
||||||
|
2018-09-12 05:07:35 UTC (releng/11.2, 11.2-RELEASE-p3)
|
||||||
|
2018-09-12 05:07:35 UTC (releng/11.1, 11.1-RELEASE-p14)
|
||||||
|
2018-09-12 05:03:30 UTC (stable/10, 10.4-STABLE)
|
||||||
|
2018-09-12 05:07:35 UTC (releng/10.4, 10.4-RELEASE-p12)
|
||||||
|
CVE Name: CVE-2018-6924
|
||||||
|
|
||||||
|
For general information regarding FreeBSD Security Advisories,
|
||||||
|
including descriptions of the fields above, security branches, and the
|
||||||
|
following sections, please visit <URL:https://security.FreeBSD.org/>.
|
||||||
|
|
||||||
|
I. Background
|
||||||
|
|
||||||
|
To execute a binary the kernel must parse the ELF header to determine the
|
||||||
|
entry point address, the program interpreter, and other parameters.
|
||||||
|
|
||||||
|
II. Problem Description
|
||||||
|
|
||||||
|
Insufficient validation was performed in the ELF header parser, and malformed
|
||||||
|
or otherwise invalid ELF binaries were not rejected as they should be.
|
||||||
|
|
||||||
|
III. Impact
|
||||||
|
|
||||||
|
Execution of a malicious ELF binary may result in a kernel crash or may
|
||||||
|
disclose kernel memory.
|
||||||
|
|
||||||
|
IV. Workaround
|
||||||
|
|
||||||
|
No workaround is available.
|
||||||
|
|
||||||
|
V. Solution
|
||||||
|
|
||||||
|
Upgrade your vulnerable system to a supported FreeBSD stable or
|
||||||
|
release / security branch (releng) dated after the correction date, and
|
||||||
|
reboot.
|
||||||
|
|
||||||
|
1) To update your vulnerable system via a binary patch:
|
||||||
|
|
||||||
|
Systems running a RELEASE version of FreeBSD on the i386 or amd64
|
||||||
|
platforms can be updated via the freebsd-update(8) utility:
|
||||||
|
|
||||||
|
# freebsd-update fetch
|
||||||
|
# freebsd-update install
|
||||||
|
# shutdown -r +30 "Rebooting for security update"
|
||||||
|
|
||||||
|
2) To update your vulnerable system via a source code patch:
|
||||||
|
|
||||||
|
The following patches have been verified to apply to the applicable
|
||||||
|
FreeBSD release branches.
|
||||||
|
|
||||||
|
a) Download the relevant patch from the location below, and verify the
|
||||||
|
detached PGP signature using your PGP utility.
|
||||||
|
|
||||||
|
# fetch https://security.FreeBSD.org/patches/SA-18:12/elf.patch
|
||||||
|
# fetch https://security.FreeBSD.org/patches/SA-18:12/elf.patch.asc
|
||||||
|
# gpg --verify elf.patch.asc
|
||||||
|
|
||||||
|
b) Apply the patch. Execute the following commands as root:
|
||||||
|
|
||||||
|
# cd /usr/src
|
||||||
|
# patch < /path/to/patch
|
||||||
|
|
||||||
|
c) Recompile your kernel as described in
|
||||||
|
<URL:https://www.FreeBSD.org/handbook/kernelconfig.html> and reboot the
|
||||||
|
system.
|
||||||
|
|
||||||
|
VI. Correction details
|
||||||
|
|
||||||
|
The following list contains the correction revision numbers for each
|
||||||
|
affected branch.
|
||||||
|
|
||||||
|
Branch/path Revision
|
||||||
|
- -------------------------------------------------------------------------
|
||||||
|
stable/10/ r338605
|
||||||
|
releng/10.4/ r338606
|
||||||
|
stable/11/ r338604
|
||||||
|
releng/11.1/ r338606
|
||||||
|
releng/11.2/ r338606
|
||||||
|
- -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
To see which files were modified by a particular revision, run the
|
||||||
|
following command, replacing NNNNNN with the revision number, on a
|
||||||
|
machine with Subversion installed:
|
||||||
|
|
||||||
|
# svn diff -cNNNNNN --summarize svn://svn.freebsd.org/base
|
||||||
|
|
||||||
|
Or visit the following URL, replacing NNNNNN with the revision number:
|
||||||
|
|
||||||
|
<URL:https://svnweb.freebsd.org/base?view=revision&revision=NNNNNN>
|
||||||
|
|
||||||
|
VII. References
|
||||||
|
|
||||||
|
<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2018-6924>
|
||||||
|
|
||||||
|
The latest revision of this advisory is available at
|
||||||
|
<URL:https://security.FreeBSD.org/advisories/FreeBSD-SA-18:12.elf.asc>
|
||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iQKTBAEBCgB9FiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAluYoK9fFIAAAAAALgAo
|
||||||
|
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEZD
|
||||||
|
MEU4NzhBRTVBRkU3ODgwMjhENjM1NUQzOTc5MkY0OUVBN0U1QzIACgkQ05eS9J6n
|
||||||
|
5cKA+BAApeUtPHpy5mEHC8ftJ+3NZpfI8gcfuPE0dlJi6CpXq8/ruXN5Yt5X0E0l
|
||||||
|
hlbNGqEMckfe3F81rCXLbtu0zeAnSBfAFcm9xSBa6aSRfP4GAZtKDKwilPqqT9F8
|
||||||
|
sOrPR/mAfxWmWcfDt8ggAx6akr2Tt48t7TiBP/kA14+CzVmp/pMU/ceFDLk8JYjY
|
||||||
|
PQzVM4fHC5xeBWtA2JjMNHnhR6XMeiDOLkgeRiRW1LhB/OwWwcb0uzVixxR34mCT
|
||||||
|
vFm1eJteAitoVclgnI//GkzZZ6b7SZkqyqODWKVLWXaYgb8/Z6SaKAQm2TWuHPEh
|
||||||
|
nzIpPGhnXZc+36Nn9/HYDKVn3skD1sYAnTMgPcUYZH3KfkohvFdHlnoGqkcnMwTy
|
||||||
|
mSKkQx9ojuLfwot7tyJCbgU/6e82ed1g9EiFZXwW8x4ePClaAvrDozz0QGwlXgyY
|
||||||
|
1jBbFp/gYznhxTetVRHo5ug5SHZgD2Ye46TCoglHX0CprhkWwpKenoCEyfyjlHXH
|
||||||
|
uI+RPd46TlQfuK4bqURRpWvNWprXGqQ0ypFVW2JJgqLPBX0QS79gzqO++C8tRqQv
|
||||||
|
e16mqzBGNIre/8FOCBpV/Z61NgxqeYo2ndHxc9VTMiFXK/2v3TDK9AvYZ1/xEvwC
|
||||||
|
IRpC+qo870B5XT/ihC/KpYI4jgM2/pK/Mdez6Q4s5M6eeCBHAgw=
|
||||||
|
=J/a5
|
||||||
|
-----END PGP SIGNATURE-----
|
272
share/security/patches/EN-18:08/lazyfpu-11.patch
Normal file
272
share/security/patches/EN-18:08/lazyfpu-11.patch
Normal file
|
@ -0,0 +1,272 @@
|
||||||
|
--- sys/amd64/amd64/fpu.c.orig
|
||||||
|
+++ sys/amd64/amd64/fpu.c
|
||||||
|
@@ -744,6 +744,7 @@
|
||||||
|
int max_ext_n, i, owned;
|
||||||
|
|
||||||
|
pcb = td->td_pcb;
|
||||||
|
+ critical_enter();
|
||||||
|
if ((pcb->pcb_flags & PCB_USERFPUINITDONE) == 0) {
|
||||||
|
bcopy(fpu_initialstate, get_pcb_user_save_pcb(pcb),
|
||||||
|
cpu_max_ext_state_size);
|
||||||
|
@@ -750,9 +751,9 @@
|
||||||
|
get_pcb_user_save_pcb(pcb)->sv_env.en_cw =
|
||||||
|
pcb->pcb_initial_fpucw;
|
||||||
|
fpuuserinited(td);
|
||||||
|
+ critical_exit();
|
||||||
|
return (_MC_FPOWNED_PCB);
|
||||||
|
}
|
||||||
|
- critical_enter();
|
||||||
|
if (td == PCPU_GET(fpcurthread) && PCB_USER_FPU(pcb)) {
|
||||||
|
fpusave(get_pcb_user_save_pcb(pcb));
|
||||||
|
owned = _MC_FPOWNED_FPU;
|
||||||
|
@@ -759,7 +760,6 @@
|
||||||
|
} else {
|
||||||
|
owned = _MC_FPOWNED_PCB;
|
||||||
|
}
|
||||||
|
- critical_exit();
|
||||||
|
if (use_xsave) {
|
||||||
|
/*
|
||||||
|
* Handle partially saved state.
|
||||||
|
@@ -779,6 +779,7 @@
|
||||||
|
*xstate_bv |= bit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ critical_exit();
|
||||||
|
return (owned);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -787,6 +788,7 @@
|
||||||
|
{
|
||||||
|
struct pcb *pcb;
|
||||||
|
|
||||||
|
+ CRITICAL_ASSERT(td);
|
||||||
|
pcb = td->td_pcb;
|
||||||
|
if (PCB_USER_FPU(pcb))
|
||||||
|
set_pcb_flags(pcb,
|
||||||
|
@@ -845,26 +847,25 @@
|
||||||
|
|
||||||
|
addr->sv_env.en_mxcsr &= cpu_mxcsr_mask;
|
||||||
|
pcb = td->td_pcb;
|
||||||
|
+ error = 0;
|
||||||
|
critical_enter();
|
||||||
|
if (td == PCPU_GET(fpcurthread) && PCB_USER_FPU(pcb)) {
|
||||||
|
error = fpusetxstate(td, xfpustate, xfpustate_size);
|
||||||
|
- if (error != 0) {
|
||||||
|
- critical_exit();
|
||||||
|
- return (error);
|
||||||
|
+ if (error == 0) {
|
||||||
|
+ bcopy(addr, get_pcb_user_save_td(td), sizeof(*addr));
|
||||||
|
+ fpurestore(get_pcb_user_save_td(td));
|
||||||
|
+ set_pcb_flags(pcb, PCB_FPUINITDONE |
|
||||||
|
+ PCB_USERFPUINITDONE);
|
||||||
|
}
|
||||||
|
- bcopy(addr, get_pcb_user_save_td(td), sizeof(*addr));
|
||||||
|
- fpurestore(get_pcb_user_save_td(td));
|
||||||
|
- critical_exit();
|
||||||
|
- set_pcb_flags(pcb, PCB_FPUINITDONE | PCB_USERFPUINITDONE);
|
||||||
|
} else {
|
||||||
|
- critical_exit();
|
||||||
|
error = fpusetxstate(td, xfpustate, xfpustate_size);
|
||||||
|
- if (error != 0)
|
||||||
|
- return (error);
|
||||||
|
- bcopy(addr, get_pcb_user_save_td(td), sizeof(*addr));
|
||||||
|
- fpuuserinited(td);
|
||||||
|
+ if (error == 0) {
|
||||||
|
+ bcopy(addr, get_pcb_user_save_td(td), sizeof(*addr));
|
||||||
|
+ fpuuserinited(td);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
- return (0);
|
||||||
|
+ critical_exit();
|
||||||
|
+ return (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
@@ -1037,6 +1038,7 @@
|
||||||
|
ctx->flags = FPU_KERN_CTX_DUMMY | FPU_KERN_CTX_INUSE;
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
+ critical_enter();
|
||||||
|
KASSERT(!PCB_USER_FPU(pcb) || pcb->pcb_save ==
|
||||||
|
get_pcb_user_save_pcb(pcb), ("mangled pcb_save"));
|
||||||
|
ctx->flags = FPU_KERN_CTX_INUSE;
|
||||||
|
@@ -1047,6 +1049,7 @@
|
||||||
|
pcb->pcb_save = fpu_kern_ctx_savefpu(ctx);
|
||||||
|
set_pcb_flags(pcb, PCB_KERNFPU);
|
||||||
|
clear_pcb_flags(pcb, PCB_FPUINITDONE);
|
||||||
|
+ critical_exit();
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1065,7 +1068,6 @@
|
||||||
|
|
||||||
|
clear_pcb_flags(pcb, PCB_FPUNOSAVE | PCB_FPUINITDONE);
|
||||||
|
start_emulating();
|
||||||
|
- critical_exit();
|
||||||
|
} else {
|
||||||
|
KASSERT((ctx->flags & FPU_KERN_CTX_INUSE) != 0,
|
||||||
|
("leaving not inuse ctx"));
|
||||||
|
@@ -1079,7 +1081,6 @@
|
||||||
|
critical_enter();
|
||||||
|
if (curthread == PCPU_GET(fpcurthread))
|
||||||
|
fpudrop();
|
||||||
|
- critical_exit();
|
||||||
|
pcb->pcb_save = ctx->prev;
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1096,6 +1097,7 @@
|
||||||
|
clear_pcb_flags(pcb, PCB_FPUINITDONE);
|
||||||
|
KASSERT(!PCB_USER_FPU(pcb), ("unpaired fpu_kern_leave"));
|
||||||
|
}
|
||||||
|
+ critical_exit();
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
--- sys/amd64/amd64/machdep.c.orig
|
||||||
|
+++ sys/amd64/amd64/machdep.c
|
||||||
|
@@ -2158,8 +2158,10 @@
|
||||||
|
set_fpregs(struct thread *td, struct fpreg *fpregs)
|
||||||
|
{
|
||||||
|
|
||||||
|
+ critical_enter();
|
||||||
|
set_fpregs_xmm(fpregs, get_pcb_user_save_td(td));
|
||||||
|
fpuuserinited(td);
|
||||||
|
+ critical_exit();
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
--- sys/i386/i386/machdep.c.orig
|
||||||
|
+++ sys/i386/i386/machdep.c
|
||||||
|
@@ -3004,6 +3004,7 @@
|
||||||
|
set_fpregs(struct thread *td, struct fpreg *fpregs)
|
||||||
|
{
|
||||||
|
|
||||||
|
+ critical_enter();
|
||||||
|
if (cpu_fxsr)
|
||||||
|
npx_set_fpregs_xmm((struct save87 *)fpregs,
|
||||||
|
&get_pcb_user_save_td(td)->sv_xmm);
|
||||||
|
@@ -3011,6 +3012,7 @@
|
||||||
|
bcopy(fpregs, &get_pcb_user_save_td(td)->sv_87,
|
||||||
|
sizeof(*fpregs));
|
||||||
|
npxuserinited(td);
|
||||||
|
+ critical_exit();
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
--- sys/i386/isa/npx.c.orig
|
||||||
|
+++ sys/i386/isa/npx.c
|
||||||
|
@@ -974,14 +974,15 @@
|
||||||
|
return (_MC_FPOWNED_NONE);
|
||||||
|
|
||||||
|
pcb = td->td_pcb;
|
||||||
|
+ critical_enter();
|
||||||
|
if ((pcb->pcb_flags & PCB_NPXINITDONE) == 0) {
|
||||||
|
bcopy(npx_initialstate, get_pcb_user_save_pcb(pcb),
|
||||||
|
cpu_max_ext_state_size);
|
||||||
|
SET_FPU_CW(get_pcb_user_save_pcb(pcb), pcb->pcb_initial_npxcw);
|
||||||
|
npxuserinited(td);
|
||||||
|
+ critical_exit();
|
||||||
|
return (_MC_FPOWNED_PCB);
|
||||||
|
}
|
||||||
|
- critical_enter();
|
||||||
|
if (td == PCPU_GET(fpcurthread)) {
|
||||||
|
fpusave(get_pcb_user_save_pcb(pcb));
|
||||||
|
if (!cpu_fxsr)
|
||||||
|
@@ -995,7 +996,6 @@
|
||||||
|
} else {
|
||||||
|
owned = _MC_FPOWNED_PCB;
|
||||||
|
}
|
||||||
|
- critical_exit();
|
||||||
|
if (use_xsave) {
|
||||||
|
/*
|
||||||
|
* Handle partially saved state.
|
||||||
|
@@ -1018,6 +1018,7 @@
|
||||||
|
*xstate_bv |= bit;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ critical_exit();
|
||||||
|
return (owned);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1026,6 +1027,7 @@
|
||||||
|
{
|
||||||
|
struct pcb *pcb;
|
||||||
|
|
||||||
|
+ CRITICAL_ASSERT(td);
|
||||||
|
pcb = td->td_pcb;
|
||||||
|
if (PCB_USER_FPU(pcb))
|
||||||
|
pcb->pcb_flags |= PCB_NPXINITDONE;
|
||||||
|
@@ -1083,28 +1085,26 @@
|
||||||
|
if (cpu_fxsr)
|
||||||
|
addr->sv_xmm.sv_env.en_mxcsr &= cpu_mxcsr_mask;
|
||||||
|
pcb = td->td_pcb;
|
||||||
|
+ error = 0;
|
||||||
|
critical_enter();
|
||||||
|
if (td == PCPU_GET(fpcurthread) && PCB_USER_FPU(pcb)) {
|
||||||
|
error = npxsetxstate(td, xfpustate, xfpustate_size);
|
||||||
|
- if (error != 0) {
|
||||||
|
- critical_exit();
|
||||||
|
- return (error);
|
||||||
|
+ if (error == 0) {
|
||||||
|
+ if (!cpu_fxsr)
|
||||||
|
+ fnclex(); /* As in npxdrop(). */
|
||||||
|
+ bcopy(addr, get_pcb_user_save_td(td), sizeof(*addr));
|
||||||
|
+ fpurstor(get_pcb_user_save_td(td));
|
||||||
|
+ pcb->pcb_flags |= PCB_NPXUSERINITDONE | PCB_NPXINITDONE;
|
||||||
|
}
|
||||||
|
- if (!cpu_fxsr)
|
||||||
|
- fnclex(); /* As in npxdrop(). */
|
||||||
|
- bcopy(addr, get_pcb_user_save_td(td), sizeof(*addr));
|
||||||
|
- fpurstor(get_pcb_user_save_td(td));
|
||||||
|
- critical_exit();
|
||||||
|
- pcb->pcb_flags |= PCB_NPXUSERINITDONE | PCB_NPXINITDONE;
|
||||||
|
} else {
|
||||||
|
- critical_exit();
|
||||||
|
error = npxsetxstate(td, xfpustate, xfpustate_size);
|
||||||
|
- if (error != 0)
|
||||||
|
- return (error);
|
||||||
|
- bcopy(addr, get_pcb_user_save_td(td), sizeof(*addr));
|
||||||
|
- npxuserinited(td);
|
||||||
|
+ if (error == 0) {
|
||||||
|
+ bcopy(addr, get_pcb_user_save_td(td), sizeof(*addr));
|
||||||
|
+ npxuserinited(td);
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
- return (0);
|
||||||
|
+ critical_exit();
|
||||||
|
+ return (error);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
@@ -1373,6 +1373,7 @@
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
pcb = td->td_pcb;
|
||||||
|
+ critical_enter();
|
||||||
|
KASSERT(!PCB_USER_FPU(pcb) || pcb->pcb_save ==
|
||||||
|
get_pcb_user_save_pcb(pcb), ("mangled pcb_save"));
|
||||||
|
ctx->flags = FPU_KERN_CTX_INUSE;
|
||||||
|
@@ -1383,6 +1384,7 @@
|
||||||
|
pcb->pcb_save = fpu_kern_ctx_savefpu(ctx);
|
||||||
|
pcb->pcb_flags |= PCB_KERNNPX;
|
||||||
|
pcb->pcb_flags &= ~PCB_NPXINITDONE;
|
||||||
|
+ critical_exit();
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
||||||
|
@@ -1401,7 +1403,6 @@
|
||||||
|
critical_enter();
|
||||||
|
if (curthread == PCPU_GET(fpcurthread))
|
||||||
|
npxdrop();
|
||||||
|
- critical_exit();
|
||||||
|
pcb->pcb_save = ctx->prev;
|
||||||
|
if (pcb->pcb_save == get_pcb_user_save_pcb(pcb)) {
|
||||||
|
if ((pcb->pcb_flags & PCB_NPXUSERINITDONE) != 0)
|
||||||
|
@@ -1416,6 +1417,7 @@
|
||||||
|
pcb->pcb_flags &= ~PCB_NPXINITDONE;
|
||||||
|
KASSERT(!PCB_USER_FPU(pcb), ("unpaired fpu_kern_leave"));
|
||||||
|
}
|
||||||
|
+ critical_exit();
|
||||||
|
return (0);
|
||||||
|
}
|
||||||
|
|
18
share/security/patches/EN-18:08/lazyfpu-11.patch.asc
Normal file
18
share/security/patches/EN-18:08/lazyfpu-11.patch.asc
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iQKTBAABCgB9FiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAluYoMlfFIAAAAAALgAo
|
||||||
|
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEZD
|
||||||
|
MEU4NzhBRTVBRkU3ODgwMjhENjM1NUQzOTc5MkY0OUVBN0U1QzIACgkQ05eS9J6n
|
||||||
|
5cJigg/+OvQriZe3uQx6A8cjJExzxVTmctmIcAfIxX992E3gKYW8PpomMsIoXnqm
|
||||||
|
HCBB7QPKg6k1agIegg38j1zGeLY7LU1pbLQbzJAXx1vtacILx03XpgdPutiHTUty
|
||||||
|
NhNl3S71Pk2nFik4pVC2Zqf3qQ3jsauhfItH9Z3Dgasp50/6353upvRAmALUQ/J4
|
||||||
|
ffa/xXqcHjL3ZnNyH5oU56s9f287I89iqxz83Q2aw3jhOqoQoseeeRtg78ysWkgx
|
||||||
|
KLgvRa2FApxq3LBrjDKmEbV9ph5qHvXzLGP5/FZUN/X0RzLmGD+J6458BHpw1tJW
|
||||||
|
ZOu2NHNl79KLl5qsPtp44vwQwLYe33xKHRFBXbT83MmnDnN0qwxhzkKN/txZcbWB
|
||||||
|
KEaOo/6MnpHO3YOaw9TWJdmaV/ETT3MS276rzxEXpiJYB50exlgelfTDrKW8wiMX
|
||||||
|
WRGUgc1Mmfex0UWEQ48l0d67XpWmoQPUCLDwNks9P6qkMehlhFQZWiv4l9ZGRJp4
|
||||||
|
6BkliNGaBBP2raMU9neMJhmd0/24AZ2vPlH2SuRvjLBCRoNA70GfvL5/9h21cQIh
|
||||||
|
7UEs5p5spDEle7B3EzJrovMs7eTl89bHKhOx76+WHpmiXpFbFKL3eiEpVYlJYrrU
|
||||||
|
zT2hI4B/mOAlHqqfgt9ygFJ4Zlbwh2rrQdioeCZTMEM4VpXLFz8=
|
||||||
|
=EN9Q
|
||||||
|
-----END PGP SIGNATURE-----
|
35
share/security/patches/SA-18:12/elf.patch
Normal file
35
share/security/patches/SA-18:12/elf.patch
Normal file
|
@ -0,0 +1,35 @@
|
||||||
|
--- sys/kern/imgact_elf.c.orig
|
||||||
|
+++ sys/kern/imgact_elf.c
|
||||||
|
@@ -839,7 +839,8 @@
|
||||||
|
break;
|
||||||
|
case PT_INTERP:
|
||||||
|
/* Path to interpreter */
|
||||||
|
- if (phdr[i].p_filesz > MAXPATHLEN) {
|
||||||
|
+ if (phdr[i].p_filesz < 2 ||
|
||||||
|
+ phdr[i].p_filesz > MAXPATHLEN) {
|
||||||
|
uprintf("Invalid PT_INTERP\n");
|
||||||
|
error = ENOEXEC;
|
||||||
|
goto ret;
|
||||||
|
@@ -870,6 +871,11 @@
|
||||||
|
} else {
|
||||||
|
interp = __DECONST(char *, imgp->image_header) +
|
||||||
|
phdr[i].p_offset;
|
||||||
|
+ if (interp[interp_name_len - 1] != '\0') {
|
||||||
|
+ uprintf("Invalid PT_INTERP\n");
|
||||||
|
+ error = ENOEXEC;
|
||||||
|
+ goto ret;
|
||||||
|
+ }
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case PT_GNU_STACK:
|
||||||
|
--- sys/kern/vfs_vnops.c.orig
|
||||||
|
+++ sys/kern/vfs_vnops.c
|
||||||
|
@@ -528,6 +528,8 @@
|
||||||
|
struct vn_io_fault_args args;
|
||||||
|
int error, lock_flags;
|
||||||
|
|
||||||
|
+ if (offset < 0 && vp->v_type != VCHR)
|
||||||
|
+ return (EINVAL);
|
||||||
|
auio.uio_iov = &aiov;
|
||||||
|
auio.uio_iovcnt = 1;
|
||||||
|
aiov.iov_base = base;
|
18
share/security/patches/SA-18:12/elf.patch.asc
Normal file
18
share/security/patches/SA-18:12/elf.patch.asc
Normal file
|
@ -0,0 +1,18 @@
|
||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
|
||||||
|
iQKTBAABCgB9FiEE/A6HiuWv54gCjWNV05eS9J6n5cIFAluYoM1fFIAAAAAALgAo
|
||||||
|
aXNzdWVyLWZwckBub3RhdGlvbnMub3BlbnBncC5maWZ0aGhvcnNlbWFuLm5ldEZD
|
||||||
|
MEU4NzhBRTVBRkU3ODgwMjhENjM1NUQzOTc5MkY0OUVBN0U1QzIACgkQ05eS9J6n
|
||||||
|
5cL1Yw//VW6p5rRPB6mCxSZP+svZcvOlkz6pBBoMn+Ym2t7SFNYbNuVcD8GFr7F2
|
||||||
|
a55U0LaQ9XoePdgwC7XFTfNv4Qeya1gmHvH6el93+MFFWLJV1zryN8mS4ny6oOwP
|
||||||
|
PGPINqsS1eOmbs52n1U0ANujj8KvyghgojsqbhhpQtsa6W40/klMmvKGmnq1So5B
|
||||||
|
YV8X9uOp6tB8ahkG0S+EbfH7X3o8MC/Q5hlQavmh/biQP44EU/QwqC47DudSpG3m
|
||||||
|
S5wZtz6QNwwrtRdbJeBf+HMjfxZaMO/Lw2wC3FjwfysXL14zrCEuZROGT5Qtjd+p
|
||||||
|
LQHNrzbK4qDT5c//Tuw7KBVAeOBj2a7Sl6SCt+6wu+WZe4QCbvuE5iC/vmXzQY/7
|
||||||
|
2oGvxDLl9yOtu49vf/EQHpo3Als6ILnpz+o2FQ3s3PsDSpjmU8YK2ADRJ2lKuAcE
|
||||||
|
+i5UAcehcC2wlVI7w7dKJicDz5+4trTpRvfBh1bEjgvk1UY/uYvkwXapUo58CFUZ
|
||||||
|
xZyBOaSprjaSyzRCuTlgE7s36mJkNV0QkRCRHutb/qCm0CY2UKcWmG4hf/Wld99m
|
||||||
|
Qpr7wdydVdObQhDISqvBi1EPJ0ZSHwdvg2Pbvm10leal0azEEhVm/tGm8ENgLIh3
|
||||||
|
5795BkrH+49PoCvUCATlsZOr1qWEtTYdK2DWjj+6rWZL7BYSMdY=
|
||||||
|
=KOL2
|
||||||
|
-----END PGP SIGNATURE-----
|
|
@ -7,6 +7,19 @@
|
||||||
<year>
|
<year>
|
||||||
<name>2018</name>
|
<name>2018</name>
|
||||||
|
|
||||||
|
<month>
|
||||||
|
<name>9</name>
|
||||||
|
|
||||||
|
<day>
|
||||||
|
<name>12</name>
|
||||||
|
|
||||||
|
<advisory>
|
||||||
|
<name>FreeBSD-SA-18:12.elf</name>
|
||||||
|
</advisory>
|
||||||
|
|
||||||
|
</day>
|
||||||
|
</month>
|
||||||
|
|
||||||
<month>
|
<month>
|
||||||
<name>8</name>
|
<name>8</name>
|
||||||
|
|
||||||
|
|
|
@ -7,6 +7,19 @@
|
||||||
<year>
|
<year>
|
||||||
<name>2018</name>
|
<name>2018</name>
|
||||||
|
|
||||||
|
<month>
|
||||||
|
<name>9</name>
|
||||||
|
|
||||||
|
<day>
|
||||||
|
<name>12</name>
|
||||||
|
|
||||||
|
<notice>
|
||||||
|
<name>FreeBSD-EN-18:08.lazyfpu</name>
|
||||||
|
</notice>
|
||||||
|
|
||||||
|
</day>
|
||||||
|
</month>
|
||||||
|
|
||||||
<month>
|
<month>
|
||||||
<name>6</name>
|
<name>6</name>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue