Add SA-17:01.
This commit is contained in:
parent
58cdf5b430
commit
094740a05f
Notes:
svn2git
2020-12-08 03:00:23 +00:00
svn path=/head/; revision=49830
4 changed files with 361 additions and 0 deletions
158
share/security/advisories/FreeBSD-SA-17:01.openssh.asc
Normal file
158
share/security/advisories/FreeBSD-SA-17:01.openssh.asc
Normal file
|
@ -0,0 +1,158 @@
|
||||||
|
-----BEGIN PGP SIGNED MESSAGE-----
|
||||||
|
Hash: SHA512
|
||||||
|
|
||||||
|
=============================================================================
|
||||||
|
FreeBSD-SA-17:01.openssh Security Advisory
|
||||||
|
The FreeBSD Project
|
||||||
|
|
||||||
|
Topic: OpenSSH multiple vulnerabilities
|
||||||
|
|
||||||
|
Category: contrib
|
||||||
|
Module: OpenSSH
|
||||||
|
Announced: 2017-01-11
|
||||||
|
Affects: All supported versions of FreeBSD.
|
||||||
|
Corrected: 2017-01-11 05:56:40 UTC (stable/11, 11.0-STABLE)
|
||||||
|
2017-01-11 06:01:23 UTC (releng/11.0, 11.0-RELEASE-p7)
|
||||||
|
2017-01-11 05:56:40 UTC (stable/10, 10.3-STABLE)
|
||||||
|
2017-01-11 06:01:23 UTC (releng/10.3, 10.3-RELEASE-p16)
|
||||||
|
CVE Name: CVE-2016-10009, CVE-2016-10010
|
||||||
|
|
||||||
|
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
|
||||||
|
|
||||||
|
OpenSSH is an implementation of the SSH protocol suite, providing an
|
||||||
|
encrypted and authenticated transport for a variety of services,
|
||||||
|
including remote shell access.
|
||||||
|
|
||||||
|
OpenSSH supports accessing keys provided by a PKCS#11 token.
|
||||||
|
|
||||||
|
II. Problem Description
|
||||||
|
|
||||||
|
The ssh-agent(1) agent supports loading a PKCS#11 module from outside a
|
||||||
|
trusted whitelist. An attacker can request loading of a PKCS#11 module
|
||||||
|
across forwarded agent-socket. [CVE-2016-10009]
|
||||||
|
|
||||||
|
When privilege separation is disabled, forwarded Unix domain sockets
|
||||||
|
would be created by sshd(8) with the privileges of 'root' instead of
|
||||||
|
the authenticated user. [CVE-2016-10010]
|
||||||
|
|
||||||
|
III. Impact
|
||||||
|
|
||||||
|
A remote attacker who have control of a forwarded agent-socket on a
|
||||||
|
remote system and have the ability to write files on the system
|
||||||
|
running ssh-agent(1) agent can run arbitrary code under the same user
|
||||||
|
credential. Because the attacker must already have some control on
|
||||||
|
both systems, it is relatively hard to exploit this vulnerability in
|
||||||
|
a practical attack. [CVE-2016-10009]
|
||||||
|
|
||||||
|
When privilege separation is disabled (on FreeBSD, privilege separation
|
||||||
|
is enabled by default and has to be explicitly disabled), an authenticated
|
||||||
|
attacker can potentially gain root privileges on systems running OpenSSH
|
||||||
|
server. [CVE-2016-10010]
|
||||||
|
|
||||||
|
IV. Workaround
|
||||||
|
|
||||||
|
Systems not running ssh-agent(1) and sshd(8) services are not affected.
|
||||||
|
|
||||||
|
System administrators may remove ssh-agent(1) to mitigate CVE-2016-10009.
|
||||||
|
|
||||||
|
System administrators should enable privilege separation when running
|
||||||
|
OpenSSH server, which is the FreeBSD default, to mitigate CVE-2016-10010.
|
||||||
|
|
||||||
|
V. Solution
|
||||||
|
|
||||||
|
Perform one of the following:
|
||||||
|
|
||||||
|
1) Upgrade your vulnerable system to a supported FreeBSD stable or
|
||||||
|
release / security branch (releng) dated after the correction date.
|
||||||
|
|
||||||
|
Kill all running ssh-agent(1) process and restart sshd(8) service.
|
||||||
|
A reboot is recommended but not required.
|
||||||
|
|
||||||
|
2) 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
|
||||||
|
|
||||||
|
Kill all running ssh-agent(1) process and restart sshd(8) service.
|
||||||
|
A reboot is recommended but not required.
|
||||||
|
|
||||||
|
3) 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-17:01/openssh.patch
|
||||||
|
# fetch https://security.FreeBSD.org/patches/SA-17:01/openssh.patch.asc
|
||||||
|
# gpg --verify openssh.patch.asc
|
||||||
|
|
||||||
|
b) Apply the patch. Execute the following commands as root:
|
||||||
|
|
||||||
|
# cd /usr/src
|
||||||
|
# patch < /path/to/patch
|
||||||
|
|
||||||
|
c) Recompile the operating system using buildworld and installworld as
|
||||||
|
described in <URL:https://www.FreeBSD.org/handbook/makeworld.html>.
|
||||||
|
|
||||||
|
Kill all running ssh-agent(1) process and restart sshd(8) service.
|
||||||
|
A reboot is recommended but not required.
|
||||||
|
|
||||||
|
VI. Correction details
|
||||||
|
|
||||||
|
The following list contains the correction revision numbers for each
|
||||||
|
affected branch.
|
||||||
|
|
||||||
|
Branch/path Revision
|
||||||
|
- -------------------------------------------------------------------------
|
||||||
|
stable/10/ r311915
|
||||||
|
releng/10.3/ r311916
|
||||||
|
stable/11/ r311915
|
||||||
|
releng/11.0/ r311916
|
||||||
|
- -------------------------------------------------------------------------
|
||||||
|
|
||||||
|
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://www.openssh.com/txt/release-7.4>
|
||||||
|
|
||||||
|
<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10009>
|
||||||
|
|
||||||
|
<URL:https://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2016-10010>
|
||||||
|
|
||||||
|
The latest revision of this advisory is available at
|
||||||
|
<URL:https://security.FreeBSD.org/advisories/FreeBSD-SA-17:01.openssh.asc>
|
||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
Version: GnuPG v2.1.16 (FreeBSD)
|
||||||
|
|
||||||
|
iQIzBAEBCgAdFiEEHPf/b631yp++G4yy7Wfs1l3PaucFAlh1yuAACgkQ7Wfs1l3P
|
||||||
|
auebFA//TGtwrub7JNTgKdc5qnpw+s8W1j0AnQ4wTaJ6v7zNyUB0DG+LHW4uXCwR
|
||||||
|
xc9Etd2mhY26wJIUxx0Z3oArcqVBGpCGbozuIOU6AdgmHdOL3ddj8aq4SuC0PyMA
|
||||||
|
0OvNgZIRPZxEm81MP+6/GES4JLmOumiNeAG/MrtITGJDP/K5vVPIst/+F7OJ4P2+
|
||||||
|
OGrjqBWmAz2EMG62QUJI8oSwB+FJpXtWHKOC4fPGibAQe3vF1WequbcDkLsYl1pX
|
||||||
|
Ktlk/qh9ivaQreM9rHkUDF0PYwFdsXzveze/TLNbEo+w43v/PAlyR+xw2+22VjGK
|
||||||
|
fxTL8Gk2tMQfahGZwFmmQFPLcwNRcdjgnZcRRHA3z8vKgM831A53gV3KskUwZl4V
|
||||||
|
DyKdXtl44zrZ7PtPJ1gJkPK6B8zzfjnSwzPC51pDjh30ps28Rgfc6JOyjxhX5BJ4
|
||||||
|
sXvQ3meiEfVgVq3DpTqQ3mZVQ1pRF+yhPf1Ptts9fQzAD95JsFF0WT0nzbYoB2VY
|
||||||
|
KrU4V7d/Ys+HIeQWgDwZlFuLOULlVZDW/H55PT5Tx9JvP5vRlZS/w2HHN7wwy8n5
|
||||||
|
tNX9mcH8DuG7X/jWDR9ompbJp5uZqcKWVMHPQY7fnaLSJoQMqrpPgZ9tsw6wq347
|
||||||
|
Vslm3qQwUTSGRagH0rBuHiVJmY/AeqY3lvsaZklWGIYMRjmUeA0=
|
||||||
|
=3z/p
|
||||||
|
-----END PGP SIGNATURE-----
|
170
share/security/patches/SA-17:01/openssh.patch
Normal file
170
share/security/patches/SA-17:01/openssh.patch
Normal file
|
@ -0,0 +1,170 @@
|
||||||
|
--- crypto/openssh/serverloop.c.orig
|
||||||
|
+++ crypto/openssh/serverloop.c
|
||||||
|
@@ -995,7 +995,7 @@
|
||||||
|
|
||||||
|
/* XXX fine grained permissions */
|
||||||
|
if ((options.allow_streamlocal_forwarding & FORWARD_LOCAL) != 0 &&
|
||||||
|
- !no_port_forwarding_flag) {
|
||||||
|
+ !no_port_forwarding_flag && use_privsep) {
|
||||||
|
c = channel_connect_to_path(target,
|
||||||
|
"direct-streamlocal@openssh.com", "direct-streamlocal");
|
||||||
|
} else {
|
||||||
|
@@ -1279,7 +1279,7 @@
|
||||||
|
|
||||||
|
/* check permissions */
|
||||||
|
if ((options.allow_streamlocal_forwarding & FORWARD_REMOTE) == 0
|
||||||
|
- || no_port_forwarding_flag) {
|
||||||
|
+ || no_port_forwarding_flag || !use_privsep) {
|
||||||
|
success = 0;
|
||||||
|
packet_send_debug("Server has disabled port forwarding.");
|
||||||
|
} else {
|
||||||
|
--- crypto/openssh/ssh-agent.1.orig
|
||||||
|
+++ crypto/openssh/ssh-agent.1
|
||||||
|
@@ -48,6 +48,7 @@
|
||||||
|
.Op Fl a Ar bind_address
|
||||||
|
.Op Fl E Ar fingerprint_hash
|
||||||
|
.Op Fl t Ar life
|
||||||
|
+.Op Fl P Ar pkcs11_whitelist
|
||||||
|
.Op Ar command Op Ar arg ...
|
||||||
|
.Nm ssh-agent
|
||||||
|
.Op Fl c | s
|
||||||
|
@@ -122,6 +123,18 @@
|
||||||
|
Kill the current agent (given by the
|
||||||
|
.Ev SSH_AGENT_PID
|
||||||
|
environment variable).
|
||||||
|
+.It Fl P
|
||||||
|
+Specify a pattern-list of acceptable paths for PKCS#11 shared libraries
|
||||||
|
+that may be added using the
|
||||||
|
+.Fl s
|
||||||
|
+option to
|
||||||
|
+.Xr ssh-add 1 .
|
||||||
|
+The default is to allow loading PKCS#11 libraries from
|
||||||
|
+.Dq /usr/lib/*,/usr/local/lib/* .
|
||||||
|
+PKCS#11 libraries that do not match the whitelist will be refused.
|
||||||
|
+See PATTERNS in
|
||||||
|
+.Xr ssh_config 5
|
||||||
|
+for a description of pattern-list syntax.
|
||||||
|
.It Fl s
|
||||||
|
Generate Bourne shell commands on
|
||||||
|
.Dv stdout .
|
||||||
|
--- crypto/openssh/ssh-agent.c.orig
|
||||||
|
+++ crypto/openssh/ssh-agent.c
|
||||||
|
@@ -84,11 +84,16 @@
|
||||||
|
#include "misc.h"
|
||||||
|
#include "digest.h"
|
||||||
|
#include "ssherr.h"
|
||||||
|
+#include "match.h"
|
||||||
|
|
||||||
|
#ifdef ENABLE_PKCS11
|
||||||
|
#include "ssh-pkcs11.h"
|
||||||
|
#endif
|
||||||
|
|
||||||
|
+#ifndef DEFAULT_PKCS11_WHITELIST
|
||||||
|
+# define DEFAULT_PKCS11_WHITELIST "/usr/lib/*,/usr/local/lib/*"
|
||||||
|
+#endif
|
||||||
|
+
|
||||||
|
#if defined(HAVE_SYS_PRCTL_H)
|
||||||
|
#include <sys/prctl.h> /* For prctl() and PR_SET_DUMPABLE */
|
||||||
|
#endif
|
||||||
|
@@ -140,6 +145,9 @@
|
||||||
|
char socket_name[PATH_MAX];
|
||||||
|
char socket_dir[PATH_MAX];
|
||||||
|
|
||||||
|
+/* PKCS#11 path whitelist */
|
||||||
|
+static char *pkcs11_whitelist;
|
||||||
|
+
|
||||||
|
/* locking */
|
||||||
|
#define LOCK_SIZE 32
|
||||||
|
#define LOCK_SALT_SIZE 16
|
||||||
|
@@ -761,7 +769,7 @@
|
||||||
|
static void
|
||||||
|
process_add_smartcard_key(SocketEntry *e)
|
||||||
|
{
|
||||||
|
- char *provider = NULL, *pin;
|
||||||
|
+ char *provider = NULL, *pin, canonical_provider[PATH_MAX];
|
||||||
|
int r, i, version, count = 0, success = 0, confirm = 0;
|
||||||
|
u_int seconds;
|
||||||
|
time_t death = 0;
|
||||||
|
@@ -793,10 +801,21 @@
|
||||||
|
goto send;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
+ if (realpath(provider, canonical_provider) == NULL) {
|
||||||
|
+ verbose("failed PKCS#11 add of \"%.100s\": realpath: %s",
|
||||||
|
+ provider, strerror(errno));
|
||||||
|
+ goto send;
|
||||||
|
+ }
|
||||||
|
+ if (match_pattern_list(canonical_provider, pkcs11_whitelist, 0) != 1) {
|
||||||
|
+ verbose("refusing PKCS#11 add of \"%.100s\": "
|
||||||
|
+ "provider not whitelisted", canonical_provider);
|
||||||
|
+ goto send;
|
||||||
|
+ }
|
||||||
|
+ debug("%s: add %.100s", __func__, canonical_provider);
|
||||||
|
if (lifetime && !death)
|
||||||
|
death = monotime() + lifetime;
|
||||||
|
|
||||||
|
- count = pkcs11_add_provider(provider, pin, &keys);
|
||||||
|
+ count = pkcs11_add_provider(canonical_provider, pin, &keys);
|
||||||
|
for (i = 0; i < count; i++) {
|
||||||
|
k = keys[i];
|
||||||
|
version = k->type == KEY_RSA1 ? 1 : 2;
|
||||||
|
@@ -804,8 +823,8 @@
|
||||||
|
if (lookup_identity(k, version) == NULL) {
|
||||||
|
id = xcalloc(1, sizeof(Identity));
|
||||||
|
id->key = k;
|
||||||
|
- id->provider = xstrdup(provider);
|
||||||
|
- id->comment = xstrdup(provider); /* XXX */
|
||||||
|
+ id->provider = xstrdup(canonical_provider);
|
||||||
|
+ id->comment = xstrdup(canonical_provider); /* XXX */
|
||||||
|
id->death = death;
|
||||||
|
id->confirm = confirm;
|
||||||
|
TAILQ_INSERT_TAIL(&tab->idlist, id, next);
|
||||||
|
@@ -1200,7 +1219,7 @@
|
||||||
|
{
|
||||||
|
fprintf(stderr,
|
||||||
|
"usage: ssh-agent [-c | -s] [-Dd] [-a bind_address] [-E fingerprint_hash]\n"
|
||||||
|
- " [-t life] [command [arg ...]]\n"
|
||||||
|
+ " [-P pkcs11_whitelist] [-t life] [command [arg ...]]\n"
|
||||||
|
" ssh-agent [-c | -s] -k\n");
|
||||||
|
fprintf(stderr, " -x Exit when the last client disconnects.\n");
|
||||||
|
exit(1);
|
||||||
|
@@ -1246,7 +1265,7 @@
|
||||||
|
__progname = ssh_get_progname(av[0]);
|
||||||
|
seed_rng();
|
||||||
|
|
||||||
|
- while ((ch = getopt(ac, av, "cDdksE:a:t:x")) != -1) {
|
||||||
|
+ while ((ch = getopt(ac, av, "cDdksE:a:P:t:x")) != -1) {
|
||||||
|
switch (ch) {
|
||||||
|
case 'E':
|
||||||
|
fingerprint_hash = ssh_digest_alg_by_name(optarg);
|
||||||
|
@@ -1261,6 +1280,11 @@
|
||||||
|
case 'k':
|
||||||
|
k_flag++;
|
||||||
|
break;
|
||||||
|
+ case 'P':
|
||||||
|
+ if (pkcs11_whitelist != NULL)
|
||||||
|
+ fatal("-P option already specified");
|
||||||
|
+ pkcs11_whitelist = xstrdup(optarg);
|
||||||
|
+ break;
|
||||||
|
case 's':
|
||||||
|
if (c_flag)
|
||||||
|
usage();
|
||||||
|
@@ -1298,6 +1322,9 @@
|
||||||
|
if (ac > 0 && (c_flag || k_flag || s_flag || d_flag || D_flag))
|
||||||
|
usage();
|
||||||
|
|
||||||
|
+ if (pkcs11_whitelist == NULL)
|
||||||
|
+ pkcs11_whitelist = xstrdup(DEFAULT_PKCS11_WHITELIST);
|
||||||
|
+
|
||||||
|
if (ac == 0 && !c_flag && !s_flag) {
|
||||||
|
shell = getenv("SHELL");
|
||||||
|
if (shell != NULL && (len = strlen(shell)) > 2 &&
|
||||||
|
@@ -1445,7 +1472,7 @@
|
||||||
|
signal(SIGTERM, cleanup_handler);
|
||||||
|
nalloc = 0;
|
||||||
|
|
||||||
|
- if (pledge("stdio cpath unix id proc exec", NULL) == -1)
|
||||||
|
+ if (pledge("stdio rpath cpath unix id proc exec", NULL) == -1)
|
||||||
|
fatal("%s: pledge: %s", __progname, strerror(errno));
|
||||||
|
platform_pledge_agent();
|
||||||
|
|
17
share/security/patches/SA-17:01/openssh.patch.asc
Normal file
17
share/security/patches/SA-17:01/openssh.patch.asc
Normal file
|
@ -0,0 +1,17 @@
|
||||||
|
-----BEGIN PGP SIGNATURE-----
|
||||||
|
Version: GnuPG v2.1.16 (FreeBSD)
|
||||||
|
|
||||||
|
iQIzBAABCgAdFiEEHPf/b631yp++G4yy7Wfs1l3PaucFAlh1yvIACgkQ7Wfs1l3P
|
||||||
|
aueENxAA2X3idqTkyums/ZHD7VJm1XKo+Nyoa1iGHjxcBpipjKfzvx7fSzHdNWLu
|
||||||
|
wFVAr7XAqtpQF8EzkhzdrN/tGVOpc+qqQv4MwGPmG8SgOnRHIgbscOwIdeDixp40
|
||||||
|
wMtLoP8QGxoYZlT7mPmkLqumtz+f22nO7BZCXOtY/f1e7weGBhoau1+s4ozHLpoA
|
||||||
|
10dCHTmofGoWjSBVK/m25GZQ+dE4NjvLxTpysYq+ehDSfwRSn8fhYjqc98gEwz2q
|
||||||
|
/FCtxT8wkrnRrCyIs7Wh4it76XhTZL/tXrTgtpZPBbyNkoNn40YJM9fs9EOZ2X+/
|
||||||
|
N5f996ApeX6QHkALMjOwTpmPT9QfkJcqv3Q52ie9CaNQW2Eh/aHUWZywgUnoZcr1
|
||||||
|
TfUm3uUTj9HQYS/IzdJHEuVZ/S4X2SEnVG/MtcVGWaKACL5ePRzo/wngV/IoM9x/
|
||||||
|
yiW0MuzLRXEZPcO/oEcSLCsVzAv8FT4UBVEteIDyWKJAkLX0jAFMniiITAxxIMAa
|
||||||
|
SHHHQPms7udVbBTXdbRbaWuMQFxVfeahTT0os0zLxBsGteKzFF1L69RvNx0dh8oY
|
||||||
|
kJaFU93N5T1yoen2QEkoDqfYskIVsDzQpyNT9pS6pdZKXDwK2/y73XXmOD5jblp2
|
||||||
|
5z3BNFdxoN647AAXr9+0TYm1Ax4TDoAmJlPOZroWPqJ0Bpoc4XI=
|
||||||
|
=avDp
|
||||||
|
-----END PGP SIGNATURE-----
|
|
@ -4,6 +4,22 @@
|
||||||
$FreeBSD$
|
$FreeBSD$
|
||||||
</cvs:keyword>
|
</cvs:keyword>
|
||||||
|
|
||||||
|
<year>
|
||||||
|
<name>2017</name>
|
||||||
|
|
||||||
|
<month>
|
||||||
|
<name>1</name>
|
||||||
|
|
||||||
|
<day>
|
||||||
|
<name>11</name>
|
||||||
|
|
||||||
|
<advisory>
|
||||||
|
<name>FreeBSD-SA-17:01.openssh</name>
|
||||||
|
</advisory>
|
||||||
|
</day>
|
||||||
|
</month>
|
||||||
|
</year>
|
||||||
|
|
||||||
<year>
|
<year>
|
||||||
<name>2016</name>
|
<name>2016</name>
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue