Lucene search

K
securityvulnsSecurityvulnsSECURITYVULNS:DOC:19442
HistoryMar 19, 2008 - 12:00 a.m.

MITKRB5-SA-2008-002: array overrun in RPC library used by kadmin

2008-03-1900:00:00
vulners.com
25

-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1

MITKRB5-SA-2008-002

MIT krb5 Security Advisory 2008-002
Original release: 2008-03-18
Last update: 2008-03-18

Topic: array overrun in RPC library used by kadmind

CVE-2008-0947, CVE-2008-0948
VU#374121
Use of high-numbered file descriptors in the RPC library, used by
kadmind, can cause references past the end of an array.

CVSSv2 Vector: AV:N/AC:L/Au:N/C:C/I:C/A:C/E:P/RL:T/RC:C

CVSSv2 Base Score: 10

Access Vector: Network
Access Complexity: Low
Authentication: None
Confidentiality Impact: Complete
Integrity Impact: Complete
Availability Impact: Complete

CVSSv2 Temporal Score: 7.8

Exploitability: Proof-of-Concept
Remediation Level: Official fix
Report Confidence: Confirmed

SUMMARY

Two bugs in the RPC library server code, used in the kadmin server,
causes an array overrun if too many file descriptors are opened.
Memory corruption can result.

IMPACT

An unauthenticated remote attacker can cause memory corruption in the
kadmind process, which is likely to cause kadmind to crash, resulting
in a denial of service. It is at least theoretically possible for
such corruption to result in database corruption or arbitrary code
execution, though we have no such exploit and are not aware of any
such exploits in use in the wild.

CVE-2008-0947: In 1.4 and later, this bug can only be triggered in
configurations that allow large numbers of open file descriptors in a
process.

CVE-2008-0948: In versions before 1.3, this bug can be triggered in
similar circumstances, but is further limited to platforms not
defining certain macros in certain C system header files. Solaris 10
and Mac OS X 10.4 appear to be unaffected, while GNU libc systems
(e.g., many GNU/Linux distributions) are. It appears that in at least
some cases kadmind will simply exit after getting a "bad file
descriptor" error, but this cannot be guaranteed.

AFFECTED SOFTWARE

CVE-2008-0947: libgssrpc and kadmind, from krb5-1.4 through krb5-1.6.3

CVE-2008-0948: libgssrpc and kadmind, in krb5-1.2.2 and probably most
other versions before 1.3, on systems where <unistd.h> does not define
FD_SETSIZE.

FIXES

  • Workaround: Check the system header files for the value of
    FD_SETSIZE. Use "ulimit -n" or "limit descriptors" in the shell
    invoking kadmind to limit the number of open file descriptors to
    FD_SETSIZE or less, before starting kadmind. Then the operating
    system will prevent the use of file descriptors large enough to
    exploit this bug.

  • Apply the following patch for krb5-1.4 and later:

=== src/lib/rpc/svc.c

  • — src/lib/rpc/svc.c (revision 1666)
    +++ src/lib/rpc/svc.c (local)
    @@ -109,15 +109,17 @@
    if (sock < FD_SETSIZE) {
    xports[sock] = xprt;
    FD_SET(sock, &svc_fdset);
  •           if &#40;sock &gt; svc_maxfd&#41;
    
  •                   svc_maxfd = sock;
      }
    

#else
if (sock < NOFILE) {
xports[sock] = xprt;
svc_fds |= (1 << sock);

  •           if &#40;sock &gt; svc_maxfd&#41;
    
  •                   svc_maxfd = sock;
      }
    

#endif /* def FD_SETSIZE */

    • if &#40;sock &gt; svc_maxfd&#41;
      
    •         svc_maxfd = sock;
      

}

/*
=== src/lib/rpc/svc_tcp.c

  • — src/lib/rpc/svc_tcp.c (revision 1666)
    +++ src/lib/rpc/svc_tcp.c (local)
    @@ -54,6 +54,14 @@
    extern errno;
    */

+#ifndef FD_SETSIZE
+#ifdef NBBY
+#define NOFILE (sizeof(int) * NBBY)
+#else
+#define NOFILE (sizeof(int) * 8)
+#endif
+#endif
+
/*

  • Ops vector for TCP/IP based rpc service handle
    */
    @@ -215,6 +223,19 @@
    register SVCXPRT *xprt;
    register struct tcp_conn *cd;

+#ifdef FD_SETSIZE

  •   if &#40;fd &gt;= FD_SETSIZE&#41; {
    
  •           &#40;void&#41; fprintf&#40;stderr, &quot;svc_tcp: makefd_xprt: fd too high&#92;n&quot;&#41;;
    
  •           xprt = NULL;
    
  •           goto done;
    
  •   }
    

+#else

  •   if &#40;fd &gt;= NOFILE&#41; {
    
  •           &#40;void&#41; fprintf&#40;stderr, &quot;svc_tcp: makefd_xprt: fd too high&#92;n&quot;&#41;;
    
  •           xprt = NULL;
    
  •           goto done;
    
  •   }
    

+#endif
xprt = (SVCXPRT *)mem_alloc(sizeof(SVCXPRT));
if (xprt == (SVCXPRT *)NULL) {
(void) fprintf(stderr, "svc_tcp: makefd_xprt: out of memory\n");
@@ -271,6 +292,10 @@
* make a new transporter (re-uses xprt)
*/
xprt = makefd_xprt(sock, r->sendsize, r->recvsize);

  •   if &#40;xprt == NULL&#41; {
    
  •           close&#40;sock&#41;;
    
  •           return &#40;FALSE&#41;;
    
  •   }
      xprt-&gt;xp_raddr = addr;
      xprt-&gt;xp_addrlen = len;
      xprt-&gt;xp_laddr = laddr;
    

    This patch will result in too-high-numbered file descriptors being
    immediately closed after the connection comes in. Clients will see
    connections established, and then closed; a "GSS-API (or Kerberos)
    error while initializing kadmin interface" will eventually result.
    Once some of the lower-numbered file descriptors are closed, clients
    will be able to get useful connections again.

  • Apply the following patch for krb5-1.2.2 and probably other pre-1.3
    versions:

Index: src/lib/rpc/rpc_dtablesize.c

  • — src/lib/rpc/rpc_dtablesize.c (revision 20237)
    +++ src/lib/rpc/rpc_dtablesize.c (working copy)
    @@ -32,6 +32,7 @@
    #endif

#include <unistd.h>
+#include <gssrpc/rpc.h>

/*

  • Cache the result of getdtablesize(), so we don't have to do an

  • The next release from MIT (1.6.4) will include a fix.

REFERENCES

This announcement is posted at:

http://web.mit.edu/kerberos/advisories/MITKRB5-SA-2008-002.txt

This announcement and related security advisories may be found on the
MIT Kerberos security advisory page at:

    http://web.mit.edu/kerberos/advisories/index.html

The main MIT Kerberos web page is at:

    http://web.mit.edu/kerberos/index.html

CVSSv2:

http://www.first.org/cvss/cvss-guide.html
http://nvd.nist.gov/cvss.cfm?calculator&amp;adv&amp;version=2

CVE: CVE-2008-0947
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-0947

CVE: CVE-2008-0948
http://cve.mitre.org/cgi-bin/cvename.cgi?name=CVE-2008-0948

CERT: VU#374121
http://www.kb.cert.org/vuls/id/374121

ACKNOWLEDGMENTS

Thanks to Jeff Altman of Secure Endpoints for discovering and
reporting this problem in 1.6.3.

Thanks to the Red Hat Security Response Team for noting that 1.2.2 was
also affected by the same problem, for different reasons.

CONTACT

The MIT Kerberos Team security contact address is
<[email protected]>. When sending sensitive information,
please PGP-encrypt it using the following key:

pub 1024D/2915318C 2008-01-18 [expires: 2009-02-01]
uid MIT Kerberos Team Security Contact <[email protected]>
sub 2048g/3A91A276 2008-01-18 [expires: 2009-02-01]

DETAILS

The variable svc_maxfd tracks the highest-numbered file descriptor
registered with the RPC library as a transport handle. While the
registration function does check that the file descriptor number is
less than FD_SETSIZE for array references, the code for updating
svc_maxfd is not so protected. Elsewhere, svc_maxfd is used as an
upper bound for array indexing, and as the maximum file descriptor
number to pass to select().

In 1.2.2, the variable is called max_xport, and is checked against the
value returned by _gssrpc_rpc_dtablesize(), but while that function
checks FD_SETSIZE if it's defined, the source file containing it only
includes unistd.h, which doesn't define FD_SETSIZE on all platforms.
In kadmind, the value from _gssrpc_rpc_dtablesize() is also passed to
select() as the maximum file descriptor number.

REVISION HISTORY

2008-03-18 original release

Copyright (C) 2008 Massachusetts Institute of Technology
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v1.4.7 (Darwin)

iD8DBQFH3/21UqOaDMQ+e5gRAj38AJ97qJdFUkcnvPwI19DMKTnDsuXYMgCeMmdw
ZbfG/YXurbX8hTe4+cJiZBM=
=1O1O
-----END PGP SIGNATURE-----