-----BEGIN PGP SIGNED MESSAGE-----

===========================================================================
              AUSCERT External Security Bulletin Redistribution

                             
                  ESB-97.120 -- OpenBSD Security Advisory
		    Vulnerability in I/O Signal Handling
                            16 September 1997

===========================================================================

OpenBSD has released the following advisory concerning a vulnerability in
the 4.4BSD kernel.  Systems known to be vulnerable include BSDI, NetBSD,
OpenBSD, FreeBSD and SGI IRIX.  It may also affect other operating systems.
This vulnerability may allow local users to send certain signals to
arbitrary processes on the system which could kill processes or disrupt
the operation of certain programs.

The patch in this advisory may not apply cleanly due to modifications
caused by digital signature or mailer software.  To enable readers to
cleanly apply this patch, we have appended a uuencoded compressed version
of the patch after the advisory.

The following security bulletin is provided as a service to AUSCERT's
members.  As AUSCERT did not write this document, AUSCERT has had no
control over its content.  As such, the decision to use any or all of this
information is the responsibility of each user or organisation, and should
be done so in accordance with site policies and procedures.

Contact information for OpenBSD is included in the Security Bulletin
below.  If you have any questions or need further information, please
contact them directly.

Previous advisories and external security bulletins can be retrieved from:

	http://www.auscert.org.au/information/advisories.html

If you believe that your system has been compromised, contact AUSCERT or your
representative in FIRST (Forum of Incident Response and Security Teams).

Internet Email: auscert@auscert.org.au
Facsimile:      (07) 3365 4477
Telephone:      (07) 3365 4417 (International: +61 7 3365 4417)
	AUSCERT personnel answer during Queensland business hours
	which are GMT+10:00 (AEST).
	On call after hours for emergencies.


- --------------------------BEGIN INCLUDED TEXT--------------------

- ----------------------------------------------------------------------------

                        OpenBSD Security Advisory

                            September 15, 1997

                  Vulnerability in I/O Signal Handling

- ----------------------------------------------------------------------------

SYNOPSIS

A vulnerability discovered in the 4.4BSD kernel allows unprivileged users
to send certain signals to arbitrary processes on the system. Depending on
the operating system and targeted program, this may allow users to kill
off processes or disrupt the operation of certain programs.

- ----------------------------------------------------------------------------

AFFECTED SYSTEMS

This vulnerability has been tested on all available 4.4BSD-based operating
systems, including BSDI, NetBSD, OpenBSD, and FreeBSD, in their most
recent release revisions. Additionally, this problem is known to affect
SGI IRIX, and may affect other operating systems as well.

- ----------------------------------------------------------------------------

DETAILS

Certain programs implemented in Unix operating systems make use of a
facility called "asynchronous I/O" to handle multiple tasks
simultaneously. Asynchronous I/O allows a process to be notified whenever
it has data that needs to be read from an input source; the kernel
notifies the process using a signal.

Asynchronous I/O is enabled on a descriptor using the fcntl() system call;
a descriptor with the O_ASYNC flag set will cause a signal to be sent
whenever there is data available to be read from it. Additionally, using
the FIOASYNC ioctl(), asynchronous notification can be enabled on a
descriptor.

In cases where multiple processes are used in an application, it becomes
useful to allow a descriptor to notify other processes as well. This is
accomplished by use of another fcntl() operation, F_SETOWN, as well as an
ioctl, FIOSETOWN (certain devices also provide an interface to this
facility with the TIOCSPGRP ioctl). These operations allow a program to
set the process or process group that will receive signal notification of
pending I/O.

A lack of checking in the code that handles these operations allows a
program to specify an arbitrary process ID when using a socket or device
file descriptor. By setting the recipient of signal notification to a
process that is not owned by the program, the kernel can be tricked into
signalling arbitrary programs.

Additionally, vulnerable kernels do not keep track of the credentials
associated with a process when determining whether to send I/O signals;
because of this, it is possible to specify the PID of a process that is
owned by an attacker, and then destroy that process and wait for it's PID
to be re-used. The new process occupying that PID can then be signalled by
the attacker, regardless of it's owner.

It's important to note that operating systems that check credentials when
a program attempts to set the PID for I/O notification (thus evading part
of this vulnerability) may still be vulnerable to the latter problem
(process ID re-use), if credentials aren't checked at signal delivery
time. We recommend that concerned parties contact their operating system
vendors or support channels to verify their vulnerability status.

- ----------------------------------------------------------------------------

TECHNICAL DETAILS

This vulnerability exists due to a lack of credential checking in the
kernel when setting the recipient of I/O notification. BSD-based
kernels maintain this information in descriptor-specific data structures
unrelated to the process table; the vulnerability discussed here involves
sockets, which maintain the signal recipient in the per-descriptor
"socket" structure, although certain devices provide similar facilities
and vulnerabilities.

On 4.4BSD systems, the signal normally sent to inform a process of pending
I/O is SIGIO. The default disposition of the SIGIO signal is "ignore" -
thus, most processes are unaffected by this vulnerability. However,
certain programs explicitly catch SIGIO in order to use asynchronous I/O;
these programs can be disrupted by sending stray SIGIO's.

The process notification information is also used to determine the process
that receives notification of out-of-band data on a socket. The same
vulnerability applies, this time by setting the process to notify and then
sending a message with the MSG_OOB flag set; the targetted process will
receive a SIGURG signal. Certain network daemons (ftpd, for instance) can
be disrupted by being sent a stray SIGURG signal when no data is available
for reading.

The problem is more serious on vulnerable System V operating systems; in
many cases, SIGIO is the equivalent of SIGPOLL, and the default
disposition of that signal is "terminate process". On SGI's IRIX operating
system, exploitation of this vulnerability can kill any process on the
system.

In addition to being an extremely potent denial of service attack,
surgical application of this vulnerability can be used to compromise the
system - for example, a process holding a bound address (NFS port 2049,
for instance) can be killed off and it's port stolen; this can be used to
steal NFS file handles.

In addition to sockets, some devices also provide facilities for
notification of pending I/O; examples include the "log", "tun", and "bpf".
The BPF and tunnel devices are of minimal concern, as they are not
typically accessible by arbitrary users (although BPF is interesting in
that it will allow the owner of a bpf-associated descriptor to choose an
arbitrary signal to send, including SIGSTOP).

Unfortunately, the log device is normally accessible by users, and can be
used to perform the same attack as sockets allow. It's also worth noting
that the interface that allows programs to set the process to receive
notification of I/O on the log device renders the legitimate purpose of
this facility totally unreliable; unrelated programs can seize control of
the asynchronous I/O notification on the log device, causing programs that
rely on it to fail. The provided patches do not attempt to resolve this
problem.

- ----------------------------------------------------------------------------

RESOLUTION

This is a kernel problem that can only be fixed by patching the
problematic system code. Patches for the OpenBSD operating system are
provided in this advisory; FreeBSD is known to be working on a similar
resolution.

The provided OpenBSD patch causes the kernel to keep track of the
credentials of the process associated with an I/O object; the credentials
are checked whenever I/O notification will occur, and therefore resolve
both the F_SETOWN and PID-reuse problems. Device drivers that present an
interface to I/O notification must be modified to check credentials when
the TIOCSPGRP (or equivalent) ioctl() is used to set notificatio PID; the
OpenBSD patch resolves all currently known occurances of this in that
operating system.

- ----------------------------------------------------------------------------

CREDITS

This vulnerability is believed to have been discovered originally by Alan
Peakall. Documentation and testing of this problem was conducted by Theo
de Raadt and the OpenBSD development team; SGI information was obtained
from Timothy Newsham.

The OpenBSD patch for this vulnerability was written in a caffeinated haze
by Theo de Raadt of the OpenBSD project.

The developers at OpenBSD would like to thank Perry Metzger for his
continuous support of their work.

- ----------------------------------------------------------------------------

OPENBSD PATCH

Index: sys/signalvar.h
===================================================================
RCS file: /cvs/src/sys/sys/signalvar.h,v
retrieving revision 1.6
retrieving revision 1.7
diff -u -r1.6 -r1.7
- --- signalvar.h 1997/02/01 21:49:36     1.6
+++ signalvar.h 1997/08/31 20:42:01     1.7
@@ -156,6 +156,7 @@
 int    coredump __P((struct proc *p));
 void   execsigs __P((struct proc *p));
 void   gsignal __P((int pgid, int sig));
+void   csignal __P((pid_t pgid, int signum, uid_t uid, uid_t euid));
 int    issignal __P((struct proc *p));
 void   pgsignal __P((struct pgrp *pgrp, int sig, int checkctty));
 void   postsig __P((int sig));
Index: sys/socketvar.h
===================================================================
RCS file: /cvs/src/sys/sys/socketvar.h,v
retrieving revision 1.10
retrieving revision 1.11
diff -u -r1.10 -r1.11
- --- socketvar.h 1997/02/28 04:04:13     1.10
+++ socketvar.h 1997/08/31 20:42:02     1.11
@@ -71,6 +71,8 @@
        short   so_timeo;               /* connection timeout */
        u_short so_error;               /* error affecting connection */
        pid_t   so_pgid;                /* pgid for signals */
+       uid_t   so_siguid;              /* uid of process who set so_pgid */
+       uid_t   so_sigeuid;             /* euid of process who set so_pgid */
        u_long  so_oobmark;             /* chars to oob mark */
 /*
  * Variables for socket buffering.
Index: kern/kern_descrip.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_descrip.c,v
retrieving revision 1.13
retrieving revision 1.14
diff -u -r1.13 -r1.14
- --- kern_descrip.c      1997/08/21 05:17:37     1.13
+++ kern_descrip.c      1997/08/31 20:42:15     1.14
@@ -55,6 +55,7 @@
 #include <sys/fcntl.h>
 #include <sys/malloc.h>
 #include <sys/syslog.h>
+#include <sys/ucred.h>
 #include <sys/unistd.h>
 #include <sys/resourcevar.h>
 #include <sys/conf.h>
@@ -251,8 +252,11 @@

        case F_SETOWN:
                if (fp->f_type == DTYPE_SOCKET) {
- -                       ((struct socket *)fp->f_data)->so_pgid =
- -                           (long)SCARG(uap, arg);
+                       struct socket *so = (struct socket *)fp->f_data;
+
+                       so->so_pgid = (long)SCARG(uap, arg);
+                       so->so_siguid = p->p_cred->p_ruid;
+                       so->so_sigeuid = p->p_ucred->cr_uid;
                        return (0);
                }
                if ((long)SCARG(uap, arg) <= 0) {
Index: kern/kern_sig.c
===================================================================
RCS file: /cvs/src/sys/kern/kern_sig.c,v
retrieving revision 1.16
retrieving revision 1.17
diff -u -r1.16 -r1.17
- --- kern_sig.c  1997/02/01 21:49:41     1.16
+++ kern_sig.c  1997/08/31 20:42:18     1.17
@@ -481,6 +481,46 @@
                }
        }
        return (nfound ? 0 : ESRCH);
+}
+
+#define CANDELIVER(uid, euid, p) 
+       (euid == 0 || 
+       (uid) == (p)->p_cred->p_ruid || 
+       (uid) == (p)->p_cred->p_svuid || 
+       (uid) == (p)->p_ucred->cr_uid || 
+       (euid) == (p)->p_cred->p_ruid || 
+       (euid) == (p)->p_cred->p_svuid || 
+       (euid) == (p)->p_ucred->cr_uid)
+
+/*
+ * Deliver signum to pgid, but first check uid/euid against each
+ * process and see if it is permitted.
+ */
+void
+csignal(pgid, signum, uid, euid)
+       pid_t pgid;
+       int signum;
+       uid_t uid, euid;
+{
+       struct pgrp *pgrp;
+       struct proc *p;
+
+       if (pgid == 0)
+               return;
+       if (pgid < 0) {
+               pgid = -pgid;
+               if ((pgrp = pgfind(pgid)) == NULL)
+                       return;
+               for (p = pgrp->pg_members.lh_first; p;
+                   p = p->p_pglist.le_next)
+                       if (CANDELIVER(uid, euid, p))
+                               psignal(p, signum);
+       } else {
+               if ((p = pfind(pgid)) == NULL)
+                       return;
+               if (CANDELIVER(uid, euid, p))
+                       psignal(p, signum);
+       }
 }

 /*
Index: kern/subr_log.c
===================================================================
RCS file: /cvs/src/sys/kern/subr_log.c,v
retrieving revision 1.3
retrieving revision 1.4
diff -u -r1.3 -r1.4
- --- subr_log.c  1996/04/21 22:27:17     1.3
+++ subr_log.c  1997/08/31 20:42:20     1.4
@@ -60,6 +60,8 @@
        int     sc_state;               /* see above for possibilities */
        struct  selinfo sc_selp;        /* process waiting on select call */
        int     sc_pgid;                /* process/group for async I/O */
+       uid_t   sc_siguid;              /* uid for process that set sc_pgid */
+       uid_t   sc_sigeuid;             /* euid for process that set sc_pgid */
 } logsoftc;

 int    log_open;                       /* also used in log() */
@@ -179,17 +181,12 @@
 void
 logwakeup()
 {
- -       struct proc *p;
- -
        if (!log_open)
                return;
        selwakeup(&logsoftc.sc_selp);
- -       if (logsoftc.sc_state & LOG_ASYNC) {
- -               if (logsoftc.sc_pgid < 0)
- -                       gsignal(-logsoftc.sc_pgid, SIGIO);
- -               else if ((p = pfind(logsoftc.sc_pgid)) != NULL)
- -                       psignal(p, SIGIO);
- -       }
+       if (logsoftc.sc_state & LOG_ASYNC)
+               csignal(logsoftc.sc_pgid, SIGIO,
+                   logsoftc.sc_siguid, logsoftc.sc_sigeuid);
        if (logsoftc.sc_state & LOG_RDWAIT) {
                wakeup((caddr_t)msgbufp);
                logsoftc.sc_state &= ~LOG_RDWAIT;
@@ -232,6 +229,8 @@

        case TIOCSPGRP:
                logsoftc.sc_pgid = *(int *)data;
+               logsoftc.sc_siguid = p->p_cred->p_ruid;
+               logsoftc.sc_sigeuid = p->p_ucred->cr_uid;
                break;

        case TIOCGPGRP:
Index: kern/sys_generic.c
===================================================================
RCS file: /cvs/src/sys/kern/sys_generic.c,v
retrieving revision 1.7
retrieving revision 1.8
diff -u -r1.7 -r1.8
- --- sys_generic.c       1997/01/27 23:21:13     1.7
+++ sys_generic.c       1997/08/31 20:42:21     1.8
@@ -480,7 +480,11 @@
        case FIOSETOWN:
                tmp = *(int *)data;
                if (fp->f_type == DTYPE_SOCKET) {
- -                       ((struct socket *)fp->f_data)->so_pgid = tmp;
+                       struct socket *so = (struct socket *)fp->f_data;
+
+                       so->so_pgid = tmp;
+                       so->so_siguid = p->p_cred->p_ruid;
+                       so->so_sigeuid = p->p_ucred->cr_uid;
                        error = 0;
                        break;
                }
Index: kern/sys_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/sys_socket.c,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
- --- sys_socket.c        1997/02/24 14:19:59     1.2
+++ sys_socket.c        1997/08/31 20:42:23     1.3
@@ -39,6 +39,7 @@
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/file.h>
+#include <sys/proc.h>
 #include <sys/mbuf.h>
 #include <sys/protosw.h>
 #include <sys/socket.h>
@@ -112,6 +113,8 @@

        case SIOCSPGRP:
                so->so_pgid = *(int *)data;
+               so->so_siguid = p->p_cred->p_ruid;
+               so->so_sigeuid = p->p_ucred->cr_uid;
                return (0);

        case SIOCGPGRP:
Index: kern/uipc_socket.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket.c,v
retrieving revision 1.15
retrieving revision 1.17
diff -u -r1.15 -r1.17
- --- uipc_socket.c       1997/06/29 18:14:35     1.15
+++ uipc_socket.c       1997/08/31 20:42:24     1.17
@@ -1058,11 +1060,6 @@
 sohasoutofband(so)
        register struct socket *so;
 {
- -       struct proc *p;
- -
- -       if (so->so_pgid < 0)
- -               gsignal(-so->so_pgid, SIGURG);
- -       else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0)
- -               psignal(p, SIGURG);
+       csignal(so->so_pgid, SIGURG, so->so_siguid, so->so_sigeuid);
        selwakeup(&so->so_rcv.sb_sel);
 }
Index: kern/uipc_socket2.c
===================================================================
RCS file: /cvs/src/sys/kern/uipc_socket2.c,v
retrieving revision 1.5
retrieving revision 1.6
diff -u -r1.5 -r1.6
- --- uipc_socket2.c      1997/02/21 08:45:00     1.5
+++ uipc_socket2.c      1997/08/31 20:42:26     1.6
@@ -315,20 +315,14 @@
        register struct socket *so;
        register struct sockbuf *sb;
 {
- -       struct proc *p;
- -
        selwakeup(&sb->sb_sel);
        sb->sb_flags &= ~SB_SEL;
        if (sb->sb_flags & SB_WAIT) {
                sb->sb_flags &= ~SB_WAIT;
                wakeup((caddr_t)&sb->sb_cc);
        }
- -       if (so->so_state & SS_ASYNC) {
- -               if (so->so_pgid < 0)
- -                       gsignal(-so->so_pgid, SIGIO);
- -               else if (so->so_pgid > 0 && (p = pfind(so->so_pgid)) != 0)
- -                       psignal(p, SIGIO);
- -       }
+       if (so->so_state & SS_ASYNC)
+               csignal(so->so_pgid, SIGIO, so->so_siguid, so->so_sigeuid);
 }

 /*
Index: net/bpf.c
===================================================================
RCS file: /cvs/src/sys/net/bpf.c,v
retrieving revision 1.9
retrieving revision 1.10
diff -u -r1.9 -r1.10
- --- bpf.c       1997/03/17 16:29:37     1.9
+++ bpf.c       1997/08/31 20:42:29     1.10
@@ -522,14 +522,10 @@
 bpf_wakeup(d)
        register struct bpf_d *d;
 {
- -       struct proc *p;
- -
        wakeup((caddr_t)d);
        if (d->bd_async && d->bd_sig)
- -               if (d->bd_pgid > 0)
- -                       gsignal (d->bd_pgid, d->bd_sig);
- -               else if ((p = pfind (-d->bd_pgid)) != NULL)
- -                       psignal (p, d->bd_sig);
+               csignal(d->bd_pgid, d->bd_sig,
+                   d->bd_siguid, d->bd_sigeuid);

 #if BSD >= 199103
        selwakeup(&d->bd_sel);
@@ -822,6 +818,8 @@
         */
        case TIOCSPGRP:         /* Process or group to send signals to */
                d->bd_pgid = *(int *)addr;
+               d->bd_siguid = p->p_cred->p_ruid;
+               d->bd_sigeuid = p->p_ucred->cr_uid;
                break;

        case TIOCGPGRP:
Index: net/bpfdesc.h
===================================================================
RCS file: /cvs/src/sys/net/bpfdesc.h,v
retrieving revision 1.2
retrieving revision 1.3
diff -u -r1.2 -r1.3
- --- bpfdesc.h   1997/02/24 13:33:56     1.2
+++ bpfdesc.h   1997/08/31 20:42:30     1.3
@@ -77,6 +77,8 @@
        int             bd_async;       /* non-zero if packet reception should generate signal */
        int             bd_sig;         /* signal to send upon packet reception */
        pid_t           bd_pgid;        /* process or group id for signal */
+       uid_t           bd_siguid;      /* uid for process that set pgid */
+       uid_t           bd_sigeuid;     /* euid for process that set pgid */
 #if BSD < 199103
        u_char          bd_selcoll;     /* true if selects collide */
        int             bd_timedout;
Index: net/if_tun.c
===================================================================
RCS file: /cvs/src/sys/net/if_tun.c,v
retrieving revision 1.19
retrieving revision 1.20
diff -u -r1.19 -r1.20
- --- if_tun.c    1997/07/29 07:18:20     1.19
+++ if_tun.c    1997/08/31 20:42:32     1.20
@@ -84,7 +84,9 @@
 struct tun_softc {
        u_short tun_flags;              /* misc flags */
        struct  ifnet tun_if;           /* the interface */
- -       int     tun_pgrp;               /* the process group - if any */
+       pid_t   tun_pgid;               /* the process group - if any */
+       uid_t   tun_siguid;             /* uid for process that set tun_pgid */
+       uid_t   tun_sigeuid;            /* euid for process that set tun_pgid */
        struct  selinfo tun_rsel;       /* read select */
        struct  selinfo tun_wsel;       /* write select (not used) */
 };
@@ -228,7 +230,7 @@
                }
                splx(s);
        }
- -       tp->tun_pgrp = 0;
+       tp->tun_pgid = 0;
        selwakeup(&tp->tun_rsel);

        TUNDEBUG(("%s: closed
", ifp->if_xname));
@@ -331,7 +333,6 @@
 {
        struct tun_softc *tp = ifp->if_softc;
        struct tunnel_header *th;
- -       struct proc     *p;
        int             s;

        TUNDEBUG(("%s: tun_output
", ifp->if_xname));
@@ -371,12 +372,9 @@
                tp->tun_flags &= ~TUN_RWAIT;
                wakeup((caddr_t)tp);
        }
- -       if (tp->tun_flags & TUN_ASYNC && tp->tun_pgrp) {
- -               if (tp->tun_pgrp > 0)
- -                       gsignal(tp->tun_pgrp, SIGIO);
- -               else if ((p = pfind(-tp->tun_pgrp)) != NULL)
- -                       psignal(p, SIGIO);
- -       }
+       if (tp->tun_flags & TUN_ASYNC && tp->tun_pgid)
+               csignal(tp->tun_pgid, SIGIO,
+                   tp->tun_siguid, tp->tun_sigeuid);
        selwakeup(&tp->tun_rsel);
        return 0;
 }
@@ -446,10 +444,12 @@
                splx(s);
                break;
        case TIOCSPGRP:
- -               tp->tun_pgrp = *(int *)data;
+               tp->tun_pgid = *(int *)data;
+               tp->tun_siguid = p->p_cred->p_ruid;
+               tp->tun_sigeuid = p->p_ucred->cr_uid;
                break;
        case TIOCGPGRP:
- -               *(int *)data = tp->tun_pgrp;
+               *(int *)data = tp->tun_pgid;
                break;
        default:
                splx(s);

- --------------------------END INCLUDED TEXT--------------------

- -----------------------------BEGIN PATCH-----------------------
begin 600 OpenBSD-signal-patch.Z
M'YV0"IY`*>)$R!0B(*`$H3($B0(%2=R0*8-'!X@Y>>:F)/FC)LP;.R$D>,"
MC8(>*%.J7,FRI<N7,&/V4"!ER!009M*P*6/QQ1@[&N?(&;,Q8]&@'3^&'%F2
MA1T%<LK0D9.FC)TT;LZ`B'J5XQLW(&*XL`%5*E6K6+5R3>,5K-@;"LBD,6,&
M1(LZ=N6(M9'WK8(6@"F!2F2))JP.7+<>`%#!N,8(&3$T$$CAXX9?$%H#CM6
MP8K/@CT29GHX1N+%,'"F`%9!@S*,G3`@+R9,UP@0.S&J&&#!=5NWO?`(%;
M`0BL=&J/>1.53)TV<$!^0(%!8HY4^N,20Y'SILQ(%3`29%BAW$[;]*0V4RQ
MS!B.9^9(IVX=NQSMW+V#%T_>/`CTZFT6WV!LS%<="LB!`,<9ZK%PG!O)P=>?
M9P"NI]E[!!IH'1SJ?<$=@V0XF"!;CSG8!T=)H=BB""LZ"$(9:PXX8/);<86
MB2!I>%UVVRFH7WCCE7=>>A8J.*!H!4YWH'WX&2E'=.*=:2($(9&97)CH.'>
M&MO1D<>,%6X&QQO8P:?CB!U-&-%$%5UDU!S?K2%5826=)-.=>.8I$TTVX:03
M3R#X!-1&0QUE*)QCR$D'G6@X5=9455V5U59HM<59##`>I:D:E6:QE>7QA#7
M7'7=U9<+F)X:@ZB`M7!1G'.2AIABC#DF`PX@P$"#;+O&,$-MEV;ZV0JO)AJK
M8;.BIAIKD;U&0VR-`2O6J@K@9M<-,?@&P@K8LH!K<<!N-@<:S-7XJH=IM%'&
M&SN$ZZYF+Z@`PG)NN.$>'9^"A:^Z;]21G`HO&.=N'5^,6^ZY9<CAG1SMOAMN
MO#`JS!P(8=!U;UKS?F7O=OF&%_"[')+QHF9P?K&@>@T[#"S$)Z]GQL0XLB$?
MP)X-G**X;Q3<T8HIJQRHO"N"$9=W7U7QASRW4'N15*=V[+'-8?KHKDEPQ<C
MRC[#*^_5ZPWMH]%(@Z#T&TQ'F//3-+]+,!M?:77N&V^(T<9(:_3L,,19CB0?
M'63#+08(<NQ!M0_"RRO%2.E$888.GWLAS%*@J"&'583%56+D`D$446R2F'
M&R]X[L87$TQ!E5PN#"&G7JV[CJ>?-Z4TTX]_114H1AI)'KH"8]>^NEII#Z&
MHU%!BM:D:UDZ[0R:1HIQAU/2.H=-F%5PMZH?HK]M+_%9CHI!-O/#AFD9K
M:B](EFL-.L1PPV7#U;:9Z"!_SOJJI=_&F/+MN9L;+N1%JJF9ZT6U*`&VEK!
M`5DP''"-`"MC8$,=)@("'N3N!688`X384!(?&.>!;HC@!,M0P0O.C0UL&T,'
M/PA!"5+0@F_*"-O.L,(5@%"$+[R@=IJS0A#<T(4DA*%&ZN`&MM"!##WX0A+
M:)2HP*D.0[$*:3SHPQ8N48@^^8H95EA`&=0@6[A:@1=EP()5$0<(#WG7&,(P
M!Q(:X0M3*`(5GG`%)^A`8%G3S%Q`@`(SP*$%/C"#A_(`!Q*B!`1$H$(6!@+'
M)PQA"7),`0CV)<JJP^/#*;L?Z5`C"4I!D"`,=PI`"0);L:3-QE26SA@*V
M924%4QA"$*1P!!34(0QP<-!(SB`D8JW274SJ$:(DIP(X@:`'?`RF)HG9R3&
MDG2B#(-Y5A"U7P(+3J8&XB.R4=7C*6LZSE+7-),3GP<IK6#!<V?5"UG04(
MF<Z$PQ=.5P8R`%*>]T%9-=-)LC=D4V=GX!HWX_F%'=83D*<KJ#[Y":SB01$L
M*("!D'[9!SSF<8_628L94E+6^)2E^:4)`^0*=%):HY-G>L=[SX'4-6Q[G4P
MC:E*8N<GV@7*=H0BR@5W!S[XJ(YX9G$>CP%JFF1I7B;>AY1W8(JN,BE>J;B
M'JKX(E7W><]5/>U(_I)5J=$9C*5H0QM-F-4^A$KJS0$#U?1QRS7P*9]N))?
M4ZN5FQ;0``?9^LU=LT4#OH!KE15]5V#=Y=#/=$-+R/B>GZ0*Q!8I`A3J`D2
M>EE1:MIP(CFQ%PADZ00B%($)2;!"$:1@RP;!:$4.&@(N+#/S:!`H(>$`0CX
MP(?5ME8SI26#)`^)@O'<<Y[-^6T^UT-;V_H26+G=+3)[6TH?R).>]G1NP>P0
MM.*R]KBU2>XQE^M;Z1HTN@FM;FVOZZ[7RFB[?.SN<X,KW>'.=KRWY2/7E)O>
MYJ[WH-*=`W4#9-WXFE<]]&7N;[^+4#DH5+>>4R:B8O(I2!#6FP0)"4Z(V
M@(!O1C(MY9*3$SE@9UY:2E2+U/,"@8;A#&'`RH?+$(8L,?AK8SB:?,(@$::1
M<(]I2`Y;%)2P-N28#O7,'+%HMH(*>09#2.HMB!Q$(A.-F$7SC6_(7M0R=(8+
M31YYCI6!-;4G.XAKTZ0D=L6522=!:4%/VG)ME`EC($TSOAA%)4E3$-]W%=8-
M:K91790<(![D2I)B7B4J[5+E.KL+HTI^TD#/D%DR\%FW]'5"%9C`!#J/.9UW
MSK/*'I?>13_IGF?X@KK:((:$S<$%;$##%SJ,G7;!0=-YC`X?[L@"&,'U67X
M@KWP0`=+,U3/?.2L9T$K6M*B]K2F#9*A?ZV@F/66R4EY3B_=U0<8R8R$@;8D
MHF6MH$8_FCSHE32E?<WL3";6!@5]F=#.]K<?OG8RKZT->'@;'(VN0W3#E=@
M*VJ<!:^)<R#8W1SJ(`8#S]"E,DVX3&DZ.T`)ZG8Z-8K`"6[P-Z05J,;C%*6Z
M$CT7,`^I0NT4QXOJ@ND]M537R][VLC>]5EV$XEXN%K-9P/&T"!]K8F-#-[G
M/@$R;U@O+WC,+;Y5REK-?Y[JVL$2,"ZV@`&"7RZMYHT=HD:,UC*-@H@6PW
ME4&LC21<W!LDC).)C0EI:1"#3G)<E9E]#)AE9AJ$$4LVTQ7LP:]^%OT(V.Q
MI1A?DP)5&W?2HS6BD'"'KA+630:BKGM=7D6+,=)>(*5^18?3;,Q#"$&0A!<
M`6KR[C+)L@X?GED28D'C=.3[3@<TB+)L%DZV@(6^IN-'J!@SB/$!*IZOH>M
M]:]O8X1DOVT57N&<#(#'<9@'N-<73,S_,(;"HEG9O^,8C(C6QW:N!ZL@&"&
M*)`DS0KHOAR4<3C`P6L994#U_Q#).#.QCD5`<XA-XE%3E-<L<>3?_I>K`
MA@(A$'W35P9N0&>_9&[O,GCR1W_V9P+(-S3+YP)V-WCC81[Z9W5[%H'*IT(5
MN'4D9`(@P`1/<`1?$`13D`5.,`2`5DG:MH$6EWP3:'=/XV<2Y8*_=B1*@0(M
MP($S2'RF-05)<`1)`1"DH$^V!M=!Q[UEL#Y6T^Z(%`"&D@$`+()&Z5AH,,
M16$FP@((1$:(082&UP!H/Q(8%2J'6B%((C6((GF((K2&YYA&0[&(44.(4.
M`H9%R`+G]BYV6('NQ")_2'H=,5_^<6AF*(-IB!UK"`(B2((F*`5$<`5!D`14
MT(*_U(`Q8GHL$9D0`8&UFMM,`=G0#E^-%&K-(AJ"&2.B$Q^`(E?((F4:(GF
MT44S0$:_(0,R8'[?@D8`>"%L1$)44(0V`05'(`50<$>_I(J#I@((4B4JD`*A
M-$JPYH<QB(9W"%!!,VO2!5W"Q3-]N!FJ:#7;J"`#YHT^$%X+M4H%QV)UDT;N
MLD9+.(R.=`3&B(QW]&]M(G`94!92]4H4*KHW`$Z3H,]R>U,RA"$7&ZHU*Y
MXX&F#!I()`8EU1#-7),!1<@=SPBQQ8=AP/4@W*G,AQ2!9(N]Y#_*)$"Z2Y&
M]QCI,QPR,`,Z(!GMRMR!1=`AY(1&9!;)2W[PU9)]RPS.5::(18@64!W!77H
MEY1E!!E_%2[RZ$9%&$=S5$?*N$IT`!W<Y(P)$HW3*$V_Z#`8Y4G/Y"6%A%Z)
MM$A%T$B/%$DFA83IA$GW(4RPPDED"4K1U%RGM$W(E)6O%HXJPV;#U#3%1#;+
M)9AU&1[-]$G01(T))F^_M$Y[^4X7!AW5N$J2F3.E1YD$A8[X!(Z0B9G^Q$Z:
M68CE2%`$EHX&!H[6%S$+PTTP<(C,UH[S)YMY5%'ZF%*?<Q0%4Y<(5Y#`>2<'
M:5,/EU.&PH]ST)N;]%-/L9$:!STD)P/-PY$;YY$DQSPG9SVGPGY2Q3PGV8^#
M20<]Z9/G8RLT$!:]8ADUD`,"))TY"9Z^J5;Z<S[]TRQ*9Y-DY7%T91<S8'Z_
MT9,U'Y*E$-&`0<C$09MD$161*!!D1%9J:`A!$1,I!$-5T,#&D07%'D0BD,8
M:A2D5CD;*J%85#1,P=W$*)7=$'AR45UM2JXN"VK,@-35QQA&95?2(Q3<(_)
M&)8+.)J3N1[(Q)70*(W1=)GJY*.E>0:G^5N>^07#9:37A*2XMZ3>A8[J2`:V
MF35WQD<2U7QJ%(PW6HFH^;LXJA2)P0'KQ^5+!V:8L,9P.AU,+>9QG&CQJ
MNIS#TYQ!19W0R52[,9W/N527XE2DHIU550.J`A<NAZ9WJBCC258_67.[&!8X
MT#Z[,@.(*E=_"G2,JIR.*I_RY/UZ59"*0/GJ:FWT:(P4`,XT)0P"@-2YU=H
M]"JN]T18P9B0&..!B<(2%AEP"#8,6&(N4GA`2?^D7]P-Y?Y1W^UP):&("9
MR7A]]F?/JC(Z"!(&*TMDX=#6`6T=(3NHH0WMF?:NDT^T%@F(()."$_>5JX`
M)DE62*UPZ3!<F&3D!(;>>@3Y!BQTB*WNRB+X2DM,)J6;R2+12HX`EJ7BF":
M6'H8`+1.A1V0(%B<'=L,%&X6::Z"3J=&IXR)MN&K(S51.R@Y`WI9"X(W%U
MFJ:>*A4?FZ>`JE08R1DU$+,7:9U,11;9&579@ZA211:+:J<M2P<O.Y^H82N0
MD1J4P3XP(%MR5;.<*K0>^ZAK-:K_,Y.9D9]D44"L@4!+MP)=6T;G^90-]:M&
M)*QE%I[%RBYA&17`"F20,ZQK8(K%*@;'6JT7P7\_(AX8&)8,.'^;^+!S(`:F
M5+&#AXKJ1+CL5+%FP`8G)AFX(I3(`1P]%D*JT?DJKB#NVJ.&Q^.^(64.XN7
M:%*1J;F,V[F0*[FA6XE4<+D.T["<Z(F@Z"$I`+&F.T]C@+C`4E'SBE$'"X*?
M.P53(8JR()ON4J^*Z4U**_6=ZULD*W*NV0W&H;@:DGBRH3)%+T!<JZRE:Z=
MQJY8L:O:2X7Q>H/S^DOUNH/W.H1%6+V[6X;9^T^,R(HB*+S$&X>`.2_.]J_<
M&H8#*[^!^+^D.:4):QS5CBY"0+V0@<O(`9PL$4#*;(2/!,D6U-QBK(,^0(+
MW,`/S)PVVY'*XP(Y,'5&<*8$I*&FCWL6569XG(.#,$L^9,S`(]%P,V,).6
M,0/QDYC#'0O3+55BW3V6:KLJ:F94D`UH(MBNRU)3$:I`BXO_`6PBP((9F=F
M&ZQQ6V91O!XJ@*7XA[=LUG]^W_O,L6=&`:?&(K2J+L:R$?1)08BDWF;Y[UO
M+#(2@K?O@E%U+*WKP;UT=KZKY+QN#$APS,<.LL<2,H;6>VW8NR%/&+YU`)[
MW#+@%J]8^,?6E[XYXH6(G"90JAS.-LG2VEGP(>AJ3*D?&RD;(AI]$!U81`(
MX0/(9#Z8PCP+R+"`Z[`F@,@/)B0%A`-*_!MXU:J]R*-I$X]@2H_%>(S)>#?R
M`@6^)Q34WGU=V%U9X#K$3-[0S;';$FB3)E"RDEH#(J?O!FIS)E,REZ?J4^G
M#"RK3*7RE)I7ZKKO0IOO6*/)3(SVR,QDBE(*+!4<;`:_4R<3+,%PFI`09R@;
M_,(#W2AZFG$RB[.<(9W.&=$AC)V%RK-BP9TJ=U63\`-#:GEF3[GZ2N7(9.
MT9YF]=$"+3XE(=)'UU97.P-.FY_,4T`W<`,)E-,S.JN)9RXJ4ARS'SN`C%N
M!4MH`<)0S9[9*#$&A4Q!@?X(GCD4@=LL!XI*0>-&#.(=V6*YS.%#!^.IS44
MEB,8UD8U5G^@XM22`]5E(-4=TW`,F5`[2Z%7&5Z!WG1+#200W1$2"<QM5$
M9C,B4]?A$M:!V'6H!]AFM]?`%R%-,WOQ)7H.@]@!97JUL7NIU]A@LS>N!]D?
M$B!IXH@`,L5-"NU')8$DS>04]EV_&#+@4)V`S'9,:YR=R_R$=L01D%R;75?
M'=2%G2[UU"]T8!X)O,%SX2%$!+(%W:8'?;()?4'(+4ATL-PP6]$W:(CC-T@
MW'&N@<(:C2HKG#W?[7+)7=UN,)XM"0.+,:GL#5<S6=-%*=XK?=[6':KT*<2D
M&ANWV)Y'7%<X0`,!N@(!S@+L"2YLAMZ]V8&D.S`%0RYRD!P*WKB/.]8/(R^
M9CHX@;I=O7_*BKD+?&%$]`5S8>%DW7HW!B$)8P8M1D(TT[N_+>*C@V9Y=WKR
M@N(PUG=^;1?82V-Y`'KN0M>;H>!X;>,7IB4Y'C8[[BI[Y.-`+C6V)^/:B#59
ML]@NP]F2Y]G!US1$7GRT1]@C(^4(BZ55OC6;#3FK]WN?#7M=+MIOITYQ-WA8
M3)2[F$/YG@0$Q5H?-L]TMMD]N%R-^=DH^!W,'AX+B]W0!6L.'CW<EAOH"+<
M)WX?TP>U6%>ZV*KH%Y-*V7Z`Q:/`!`=L@`?7P<:;P;ON0@?.U.6*1E*PANJ`
MU.9`FBNN^[<.^+"N[@,*;N<7ZZ7N0@55T%E%(`154$LH(`(E,`<6$4%D4D]<
MX`8B(")DF=QX!'J,B%<RQH#/@/:KBW@0DD+6&8*KHCA@>K<-!?.E-R*..O@
M3D3VP@9?H"5H/&$JT'J*[.%-TG^U,<9Y'.,+R.OAXNO`+NS$;NS(+N7$#0?^
MTNS/SH3G+DC3CJ!E8.UUI</9$@/L![8W0$8'[M.6=.L3SN&1"P)^`/"Q*+KT
M["YF++MJC.JDKAFF?F5[YO$C3N&>*X(DCX+%ZX@B*/,S+B6JA:POR$<SWB*
MYL=X',C.-O0TWK_M6^]9<[W;]L@2P8-*[_.5?(63EH6`;$F:_+SK2[U.7^KP
MBP)#3_.0"P(W#X=#H/,7ENHC3LGYVZ_/6_5!R+Y/8,K-/0%ZR!Z;YH%?,ML
M,,4F,/2ZWO*44MV&%9L&O)]VU5=E)%LK0`.2OWZ<;DES`.JB/@>&7]Z_HY?
M.HX.J9''RY5O^KA8R<])7EK!ET'^OAK)BJG[]]KZ3HW(WJ[*2@B95N/SIC
M/E#GR%[S[.F'W?FN:Z/*O,_X./K`OI>&4W<5/I_V<[YCOJP[_Q]N?M?/+#
1[XZNBUEA8-5T<)66C_FC;A[X
`
end

- ------------------------------END PATCH------------------------


-----BEGIN PGP SIGNATURE-----
Version: 2.6.3i
Charset: noconv
Comment: ftp://ftp.auscert.org.au/pub/auscert/AUSCERT_PGP.key

iQCVAwUBNB50Fih9+71yA2DNAQFHIQP/ZwOwaU9B/WyfncLiyvnhdBLCKyFyw75o
xxh1RMdA8rVgJhzyz71hhBya5Pz91X8rfu/Y72kg/eFghIV63eJQtb9PlMwKP5Jx
kltyFUwtAbRbSYA4qjHjB5x30QxRe/tpVJUrwcCbp+yyp7Dp+HP3uCnCkDl7Snqo
yYuN1lZimz4=
=mNGB
-----END PGP SIGNATURE-----