COMMAND
vpopmail
SYSTEMS AFFECTED
vpopmail-3.4.11
PROBLEM
H.D. Moore found following. The vpopmail package is an extension
for Qmail that allows easy management of virtual domains and can
use a SQL backend for storing user accounts. The program vchkpw
in that package contains a vulnerability in its logging routines.
The vchkpw program handles the username/password/domain
authorization for Qmail's services, including the pop3 daemon. By
passing formatting strings as a username/password when
authenticating against the server, an attacker can run arbitrary
code on the system with the privileges of the calling process.
Vulnerable versions include all releases prior to 4.8 that have
been compiled with the --enable-logging=y option. Your system is
remotely exploitable if you use vchkpw to authorize users in
conjunction with a network service (qmail-popup).
The following demonstrates the bug using the Qmail pop3 daemon
(qmail-popup):
hdm@atrophy:~ > telnet mail.myhost.com 110
Trying A.B.C.D...
Connected to mail.myhost.com.
Escape character is '^]'.
+OK <2334.961909661@mail.myhost.com>
user %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s
+OK
pass %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s
-ERR aack, child crashed
Connection closed by foreign host.
hdm@atrophy:~ >
The problem lies in the fact the syslog function is passed only
two arguments, with the second argument containing user supplied
data. The syslog function then passes its second argument as the
format string and each argument after that as parameters to
vsprintf(). So what happens when you call vsprintf() with a fmt
string containing printf formatting sequences and no arguments to
supply the data for those sequences? Bad things. The system
expands those sequences with the next thing off the stack,
allowing all sorts of nasty tricks ranging from changing the
values of internal variables to executing a shell. The offending
code follows:
<----[ log_exit() in vchkpw.c ]---->
<---------------------------------->
void log_exit( int syslog_level, int exit_code, char *fmt, ... )
{
char tmpbuf[300];
va_list ap;
if ( ENABLE_LOGGING > 0 ) {
va_start(ap,fmt);
vsprintf(tmpbuf, fmt, ap );
syslog(syslog_level, tmpbuf );
}
#ifdef DEBUG
vfprintf(stderr, fmt, ap);
fprintf(stderr, "\n");
#endif
if ( ENABLE_LOGGING > 0 ) {
va_end(ap);
}
exit(exit_code);
}
Please keep in mind that the parameters passed to this function
are global 100-byte character arrays, containing the username,
domain, password and IP address. What actually happens is that
the formatting strings aren't expanded until they are parsed by
vsprintf() inside the syslog() function, instead of the vsprintf()
before the syslog().
SOLUTION
The latest release of vpopmail (4.8 - June/27/2000) can be
downloaded from
http://www.inter7.com/vpopmail/
All earlier versions were removed from the site to prevent the
spread of vulnerable releases.