Author: simon
Date: Wed Jan  7 20:17:55 2009
New Revision: 186872
URL: http://svn.freebsd.org/changeset/base/186872

Log:
  Prevent cross-site forgery attacks on lukemftpd(8) due to splitting
  long commands into multiple requests. [09:01]
  
  Fix incorrect OpenSSL checks for malformed signatures due to invalid
  check of return value from EVP_VerifyFinal(), DSA_verify, and
  DSA_do_verify. [09:02]
  
  Security:     FreeBSD-SA-09:01.lukemftpd
  Security:     FreeBSD-SA-09:02.openssl
  Obtained from:        NetBSD [SA-09:01]
  Obtained from:        OpenSSL Project [SA-09:02]
  Approved by:  so (simon)

Modified:
  releng/6.3/UPDATING
  releng/6.3/contrib/lukemftpd/src/extern.h
  releng/6.3/contrib/lukemftpd/src/ftpcmd.y
  releng/6.3/contrib/lukemftpd/src/ftpd.c
  releng/6.3/crypto/openssl/apps/speed.c
  releng/6.3/crypto/openssl/apps/spkac.c
  releng/6.3/crypto/openssl/apps/verify.c
  releng/6.3/crypto/openssl/apps/x509.c
  releng/6.3/crypto/openssl/ssl/s2_clnt.c
  releng/6.3/crypto/openssl/ssl/s2_srvr.c
  releng/6.3/crypto/openssl/ssl/s3_clnt.c
  releng/6.3/crypto/openssl/ssl/s3_srvr.c
  releng/6.3/sys/conf/newvers.sh
  releng/6.4/UPDATING
  releng/6.4/contrib/lukemftpd/src/extern.h
  releng/6.4/contrib/lukemftpd/src/ftpcmd.y
  releng/6.4/contrib/lukemftpd/src/ftpd.c
  releng/6.4/crypto/openssl/apps/speed.c
  releng/6.4/crypto/openssl/apps/spkac.c
  releng/6.4/crypto/openssl/apps/verify.c
  releng/6.4/crypto/openssl/apps/x509.c
  releng/6.4/crypto/openssl/ssl/s2_clnt.c
  releng/6.4/crypto/openssl/ssl/s2_srvr.c
  releng/6.4/crypto/openssl/ssl/s3_clnt.c
  releng/6.4/crypto/openssl/ssl/s3_srvr.c
  releng/6.4/sys/conf/newvers.sh
  releng/7.0/UPDATING
  releng/7.0/contrib/lukemftpd/src/extern.h
  releng/7.0/contrib/lukemftpd/src/ftpcmd.y
  releng/7.0/contrib/lukemftpd/src/ftpd.c
  releng/7.0/crypto/openssl/apps/speed.c
  releng/7.0/crypto/openssl/apps/spkac.c
  releng/7.0/crypto/openssl/apps/verify.c
  releng/7.0/crypto/openssl/apps/x509.c
  releng/7.0/crypto/openssl/ssl/s2_clnt.c
  releng/7.0/crypto/openssl/ssl/s2_srvr.c
  releng/7.0/crypto/openssl/ssl/s3_clnt.c
  releng/7.0/crypto/openssl/ssl/s3_srvr.c
  releng/7.0/crypto/openssl/ssl/ssltest.c
  releng/7.0/sys/conf/newvers.sh
  releng/7.1/UPDATING
  releng/7.1/contrib/lukemftpd/src/extern.h
  releng/7.1/contrib/lukemftpd/src/ftpcmd.y
  releng/7.1/contrib/lukemftpd/src/ftpd.c
  releng/7.1/crypto/openssl/apps/speed.c
  releng/7.1/crypto/openssl/apps/spkac.c
  releng/7.1/crypto/openssl/apps/verify.c
  releng/7.1/crypto/openssl/apps/x509.c
  releng/7.1/crypto/openssl/ssl/s2_clnt.c
  releng/7.1/crypto/openssl/ssl/s2_srvr.c
  releng/7.1/crypto/openssl/ssl/s3_clnt.c
  releng/7.1/crypto/openssl/ssl/s3_srvr.c
  releng/7.1/crypto/openssl/ssl/ssltest.c
  releng/7.1/sys/conf/newvers.sh

Changes in other areas also in this revision:
Modified:
  head/contrib/lukemftpd/src/extern.h
  head/contrib/lukemftpd/src/ftpcmd.y
  head/contrib/lukemftpd/src/ftpd.c
  head/crypto/openssl/apps/speed.c
  head/crypto/openssl/apps/spkac.c
  head/crypto/openssl/apps/verify.c
  head/crypto/openssl/apps/x509.c
  head/crypto/openssl/ssl/s2_clnt.c
  head/crypto/openssl/ssl/s2_srvr.c
  head/crypto/openssl/ssl/s3_clnt.c
  head/crypto/openssl/ssl/s3_srvr.c
  head/crypto/openssl/ssl/ssltest.c
  stable/6/contrib/lukemftpd/src/extern.h
  stable/6/contrib/lukemftpd/src/ftpcmd.y
  stable/6/contrib/lukemftpd/src/ftpd.c
  stable/7/contrib/lukemftpd/src/extern.h
  stable/7/contrib/lukemftpd/src/ftpcmd.y
  stable/7/contrib/lukemftpd/src/ftpd.c
  stable/7/crypto/openssl/apps/speed.c
  stable/7/crypto/openssl/apps/spkac.c
  stable/7/crypto/openssl/apps/verify.c
  stable/7/crypto/openssl/apps/x509.c
  stable/7/crypto/openssl/ssl/s2_clnt.c
  stable/7/crypto/openssl/ssl/s2_srvr.c
  stable/7/crypto/openssl/ssl/s3_clnt.c
  stable/7/crypto/openssl/ssl/s3_srvr.c
  stable/7/crypto/openssl/ssl/ssltest.c

Modified: releng/6.3/UPDATING
==============================================================================
--- releng/6.3/UPDATING Wed Jan  7 18:37:07 2009        (r186871)
+++ releng/6.3/UPDATING Wed Jan  7 20:17:55 2009        (r186872)
@@ -8,6 +8,12 @@ Items affecting the ports and packages s
 /usr/ports/UPDATING.  Please read that file before running
 portupgrade.
 
+20090107:      p8      FreeBSD-SA-09:01.lukemftpd, FreeBSD-SA-09:02.openssl
+       Prevent cross-site forgery attacks on lukemftpd(8) due to splitting
+       long commands into multiple requests. [09:01]
+
+       Fix incorrect OpenSSL checks for malformed signatures. [09:02]
+
 20081223:      p7      FreeBSD-SA-08:12.ftpd, FreeBSD-SA-08:13.protosw
        Prevent cross-site forgery attacks on ftpd(8) due to splitting
        long commands into multiple requests. [08:12]

Modified: releng/6.3/contrib/lukemftpd/src/extern.h
==============================================================================
--- releng/6.3/contrib/lukemftpd/src/extern.h   Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/contrib/lukemftpd/src/extern.h   Wed Jan  7 20:17:55 2009        
(r186872)
@@ -139,7 +139,7 @@ void        feat(void);
 void   format_path(char *, const char *);
 int    ftpd_pclose(FILE *);
 FILE   *ftpd_popen(char *[], const char *, int);
-char   *getline(char *, int, FILE *);
+int    getline(char *, int, FILE *);
 void   init_curclass(void);
 void   logxfer(const char *, off_t, const char *, const char *,
            const struct timeval *, const char *);

Modified: releng/6.3/contrib/lukemftpd/src/ftpcmd.y
==============================================================================
--- releng/6.3/contrib/lukemftpd/src/ftpcmd.y   Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/contrib/lukemftpd/src/ftpcmd.y   Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1363,8 +1363,12 @@ lookup(struct tab *p, const char *cmd)
 
 /*
  * getline - a hacked up version of fgets to ignore TELNET escape codes.
+ *     `s' is the buffer to read into.
+ *     `n' is the 1 less than the size of the buffer, to allow trailing NUL
+ *     `iop' is the FILE to read from.
+ *     Returns 0 on success, -1 on EOF, -2 if the command was too long.
  */
-char *
+int
 getline(char *s, int n, FILE *iop)
 {
        int c;
@@ -1379,7 +1383,7 @@ getline(char *s, int n, FILE *iop)
                        if (ftpd_debug)
                                syslog(LOG_DEBUG, "command: %s", s);
                        tmpline[0] = '\0';
-                       return(s);
+                       return(0);
                }
                if (c == 0)
                        tmpline[0] = '\0';
@@ -1418,11 +1422,25 @@ getline(char *s, int n, FILE *iop)
                    }
                }
                *cs++ = c;
-               if (--n <= 0 || c == '\n')
+               if (--n <= 0) {
+                       /*
+                        * If command doesn't fit into buffer, discard the
+                        * rest of the command and indicate truncation.
+                        * This prevents the command to be split up into
+                        * multiple commands.
+                        */
+                       if (ftpd_debug)
+                               syslog(LOG_DEBUG,
+                                   "command too long, last char: %d", c);
+                       while (c != '\n' && (c = getc(iop)) != EOF)
+                               continue;
+                       return (-2);
+               }
+               if (c == '\n')
                        break;
        }
        if (c == EOF && cs == s)
-               return (NULL);
+               return (-1);
        *cs++ = '\0';
        if (ftpd_debug) {
                if ((curclass.type != CLASS_GUEST &&
@@ -1444,7 +1462,7 @@ getline(char *s, int n, FILE *iop)
                        syslog(LOG_DEBUG, "command: %.*s", len, s);
                }
        }
-       return (s);
+       return (0);
 }
 
 void
@@ -1458,15 +1476,20 @@ ftp_handle_line(char *cp)
 void
 ftp_loop(void)
 {
+       int ret;
 
        while (1) {
                (void) alarm(curclass.timeout);
-               if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
+               ret = getline(cbuf, sizeof(cbuf)-1, stdin);
+               (void) alarm(0);
+               if (ret == -1) {
                        reply(221, "You could at least say goodbye.");
                        dologout(0);
+               } else if (ret == -2) {
+                       reply(500, "Command too long.");
+               } else {
+                       ftp_handle_line(cbuf);
                }
-               (void) alarm(0);
-               ftp_handle_line(cbuf);
        }
        /*NOTREACHED*/
 }

Modified: releng/6.3/contrib/lukemftpd/src/ftpd.c
==============================================================================
--- releng/6.3/contrib/lukemftpd/src/ftpd.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/contrib/lukemftpd/src/ftpd.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1,4 +1,4 @@
-/*     $NetBSD: ftpd.c,v 1.176 2006/05/09 20:18:06 mrg Exp $   */
+/*     $NetBSD: ftpd.c,v 1.187 2008/09/13 03:30:35 lukem Exp $ */
 
 /*
  * Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
@@ -2896,6 +2896,7 @@ static int
 handleoobcmd()
 {
        char *cp;
+       int ret;
 
        if (!urgflag)
                return (0);
@@ -2904,9 +2905,14 @@ handleoobcmd()
        if (!transflag)
                return (0);
        cp = tmpline;
-       if (getline(cp, sizeof(tmpline), stdin) == NULL) {
+       ret = getline(cp, sizeof(tmpline)-1, stdin);
+       if (ret == -1) {
                reply(221, "You could at least say goodbye.");
                dologout(0);
+       } else if (ret == -2) {
+               /* Ignore truncated command */
+               /* XXX: abort xfer with "500 command too long", & return 1 ? */
+               return 0;
        }
                /*
                 * Manually parse OOB commands, because we can't

Modified: releng/6.3/crypto/openssl/apps/speed.c
==============================================================================
--- releng/6.3/crypto/openssl/apps/speed.c      Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/crypto/openssl/apps/speed.c      Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1486,7 +1486,7 @@ int MAIN(int argc, char **argv)
                                {
                                ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
                                        rsa_num, rsa_key[j]);
-                               if (ret == 0)
+                               if (ret <= 0)
                                        {
                                        BIO_printf(bio_err,
                                                "RSA verify failure\n");

Modified: releng/6.3/crypto/openssl/apps/spkac.c
==============================================================================
--- releng/6.3/crypto/openssl/apps/spkac.c      Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/crypto/openssl/apps/spkac.c      Wed Jan  7 20:17:55 2009        
(r186872)
@@ -284,7 +284,7 @@ bad:
        pkey = NETSCAPE_SPKI_get_pubkey(spki);
        if(verify) {
                i = NETSCAPE_SPKI_verify(spki, pkey);
-               if(i) BIO_printf(bio_err, "Signature OK\n");
+               if (i > 0) BIO_printf(bio_err, "Signature OK\n");
                else {
                        BIO_printf(bio_err, "Signature Failure\n");
                        ERR_print_errors(bio_err);

Modified: releng/6.3/crypto/openssl/apps/verify.c
==============================================================================
--- releng/6.3/crypto/openssl/apps/verify.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/crypto/openssl/apps/verify.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -275,7 +275,7 @@ static int check(X509_STORE *ctx, char *
 
        ret=0;
 end:
-       if (i)
+       if (i > 0)
                {
                fprintf(stdout,"OK\n");
                ret=1;
@@ -365,4 +365,3 @@ static int MS_CALLBACK cb(int ok, X509_S
                ERR_clear_error();
        return(ok);
        }
-

Modified: releng/6.3/crypto/openssl/apps/x509.c
==============================================================================
--- releng/6.3/crypto/openssl/apps/x509.c       Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/crypto/openssl/apps/x509.c       Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1113,7 +1113,7 @@ static int x509_certify(X509_STORE *ctx,
        /* NOTE: this certificate can/should be self signed, unless it was
         * a certificate request in which case it is not. */
        X509_STORE_CTX_set_cert(&xsc,x);
-       if (!reqfile && !X509_verify_cert(&xsc))
+       if (!reqfile && X509_verify_cert(&xsc) <= 0)
                goto end;
 
        if (!X509_check_private_key(xca,pkey))

Modified: releng/6.3/crypto/openssl/ssl/s2_clnt.c
==============================================================================
--- releng/6.3/crypto/openssl/ssl/s2_clnt.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/crypto/openssl/ssl/s2_clnt.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1062,7 +1062,7 @@ int ssl2_set_certificate(SSL *s, int typ
 
        i=ssl_verify_cert_chain(s,sk);
                
-       if ((s->verify_mode != SSL_VERIFY_NONE) && (!i))
+       if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0))
                {
                
SSLerr(SSL_F_SSL2_SET_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
                goto err;

Modified: releng/6.3/crypto/openssl/ssl/s2_srvr.c
==============================================================================
--- releng/6.3/crypto/openssl/ssl/s2_srvr.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/crypto/openssl/ssl/s2_srvr.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1070,7 +1070,7 @@ static int request_certificate(SSL *s)
 
        i=ssl_verify_cert_chain(s,sk);
 
-       if (i)  /* we like the packet, now check the chksum */
+       if (i > 0)      /* we like the packet, now check the chksum */
                {
                EVP_MD_CTX ctx;
                EVP_PKEY *pkey=NULL;
@@ -1099,7 +1099,7 @@ static int request_certificate(SSL *s)
                EVP_PKEY_free(pkey);
                EVP_MD_CTX_cleanup(&ctx);
 
-               if (i) 
+               if (i > 0) 
                        {
                        if (s->session->peer != NULL)
                                X509_free(s->session->peer);

Modified: releng/6.3/crypto/openssl/ssl/s3_clnt.c
==============================================================================
--- releng/6.3/crypto/openssl/ssl/s3_clnt.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/crypto/openssl/ssl/s3_clnt.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -833,7 +833,7 @@ static int ssl3_get_server_certificate(S
                }
 
        i=ssl_verify_cert_chain(s,sk);
-       if ((s->verify_mode != SSL_VERIFY_NONE) && (!i)
+       if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)
 #ifndef OPENSSL_NO_KRB5
                 && (s->s3->tmp.new_cipher->algorithms & 
(SSL_MKEY_MASK|SSL_AUTH_MASK))
                 != (SSL_aKRB5|SSL_kKRB5)
@@ -1206,7 +1206,7 @@ static int ssl3_get_key_exchange(SSL *s)
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
                        EVP_VerifyUpdate(&md_ctx,param,param_len);
-                       if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))
+                       if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)
                                {
                                /* bad signature */
                                al=SSL_AD_DECRYPT_ERROR;

Modified: releng/6.3/crypto/openssl/ssl/s3_srvr.c
==============================================================================
--- releng/6.3/crypto/openssl/ssl/s3_srvr.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/crypto/openssl/ssl/s3_srvr.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -2015,7 +2015,7 @@ static int ssl3_get_client_certificate(S
        else
                {
                i=ssl_verify_cert_chain(s,sk);
-               if (!i)
+               if (i <= 0)
                        {
                        al=ssl_verify_alarm_type(s->verify_result);
                        
SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);

Modified: releng/6.3/sys/conf/newvers.sh
==============================================================================
--- releng/6.3/sys/conf/newvers.sh      Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.3/sys/conf/newvers.sh      Wed Jan  7 20:17:55 2009        
(r186872)
@@ -32,7 +32,7 @@
 
 TYPE="FreeBSD"
 REVISION="6.3"
-BRANCH="RELEASE-p7"
+BRANCH="RELEASE-p8"
 if [ "X${BRANCH_OVERRIDE}" != "X" ]; then
        BRANCH=${BRANCH_OVERRIDE}
 fi

Modified: releng/6.4/UPDATING
==============================================================================
--- releng/6.4/UPDATING Wed Jan  7 18:37:07 2009        (r186871)
+++ releng/6.4/UPDATING Wed Jan  7 20:17:55 2009        (r186872)
@@ -8,6 +8,12 @@ Items affecting the ports and packages s
 /usr/ports/UPDATING.  Please read that file before running
 portupgrade.
 
+20090107:      p2      FreeBSD-SA-09:01.lukemftpd, FreeBSD-SA-09:02.openssl
+       Prevent cross-site forgery attacks on lukemftpd(8) due to splitting
+       long commands into multiple requests. [09:01]
+
+       Fix incorrect OpenSSL checks for malformed signatures. [09:02]
+
 20081223:      p1      FreeBSD-SA-08:12.ftpd, FreeBSD-SA-08:13.protosw
        Prevent cross-site forgery attacks on ftpd(8) due to splitting
        long commands into multiple requests. [08:12]

Modified: releng/6.4/contrib/lukemftpd/src/extern.h
==============================================================================
--- releng/6.4/contrib/lukemftpd/src/extern.h   Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/contrib/lukemftpd/src/extern.h   Wed Jan  7 20:17:55 2009        
(r186872)
@@ -139,7 +139,7 @@ void        feat(void);
 void   format_path(char *, const char *);
 int    ftpd_pclose(FILE *);
 FILE   *ftpd_popen(char *[], const char *, int);
-char   *getline(char *, int, FILE *);
+int    getline(char *, int, FILE *);
 void   init_curclass(void);
 void   logxfer(const char *, off_t, const char *, const char *,
            const struct timeval *, const char *);

Modified: releng/6.4/contrib/lukemftpd/src/ftpcmd.y
==============================================================================
--- releng/6.4/contrib/lukemftpd/src/ftpcmd.y   Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/contrib/lukemftpd/src/ftpcmd.y   Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1363,8 +1363,12 @@ lookup(struct tab *p, const char *cmd)
 
 /*
  * getline - a hacked up version of fgets to ignore TELNET escape codes.
+ *     `s' is the buffer to read into.
+ *     `n' is the 1 less than the size of the buffer, to allow trailing NUL
+ *     `iop' is the FILE to read from.
+ *     Returns 0 on success, -1 on EOF, -2 if the command was too long.
  */
-char *
+int
 getline(char *s, int n, FILE *iop)
 {
        int c;
@@ -1379,7 +1383,7 @@ getline(char *s, int n, FILE *iop)
                        if (ftpd_debug)
                                syslog(LOG_DEBUG, "command: %s", s);
                        tmpline[0] = '\0';
-                       return(s);
+                       return(0);
                }
                if (c == 0)
                        tmpline[0] = '\0';
@@ -1418,11 +1422,25 @@ getline(char *s, int n, FILE *iop)
                    }
                }
                *cs++ = c;
-               if (--n <= 0 || c == '\n')
+               if (--n <= 0) {
+                       /*
+                        * If command doesn't fit into buffer, discard the
+                        * rest of the command and indicate truncation.
+                        * This prevents the command to be split up into
+                        * multiple commands.
+                        */
+                       if (ftpd_debug)
+                               syslog(LOG_DEBUG,
+                                   "command too long, last char: %d", c);
+                       while (c != '\n' && (c = getc(iop)) != EOF)
+                               continue;
+                       return (-2);
+               }
+               if (c == '\n')
                        break;
        }
        if (c == EOF && cs == s)
-               return (NULL);
+               return (-1);
        *cs++ = '\0';
        if (ftpd_debug) {
                if ((curclass.type != CLASS_GUEST &&
@@ -1444,7 +1462,7 @@ getline(char *s, int n, FILE *iop)
                        syslog(LOG_DEBUG, "command: %.*s", len, s);
                }
        }
-       return (s);
+       return (0);
 }
 
 void
@@ -1458,15 +1476,20 @@ ftp_handle_line(char *cp)
 void
 ftp_loop(void)
 {
+       int ret;
 
        while (1) {
                (void) alarm(curclass.timeout);
-               if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
+               ret = getline(cbuf, sizeof(cbuf)-1, stdin);
+               (void) alarm(0);
+               if (ret == -1) {
                        reply(221, "You could at least say goodbye.");
                        dologout(0);
+               } else if (ret == -2) {
+                       reply(500, "Command too long.");
+               } else {
+                       ftp_handle_line(cbuf);
                }
-               (void) alarm(0);
-               ftp_handle_line(cbuf);
        }
        /*NOTREACHED*/
 }

Modified: releng/6.4/contrib/lukemftpd/src/ftpd.c
==============================================================================
--- releng/6.4/contrib/lukemftpd/src/ftpd.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/contrib/lukemftpd/src/ftpd.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1,4 +1,4 @@
-/*     $NetBSD: ftpd.c,v 1.176 2006/05/09 20:18:06 mrg Exp $   */
+/*     $NetBSD: ftpd.c,v 1.187 2008/09/13 03:30:35 lukem Exp $ */
 
 /*
  * Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
@@ -2896,6 +2896,7 @@ static int
 handleoobcmd()
 {
        char *cp;
+       int ret;
 
        if (!urgflag)
                return (0);
@@ -2904,9 +2905,14 @@ handleoobcmd()
        if (!transflag)
                return (0);
        cp = tmpline;
-       if (getline(cp, sizeof(tmpline), stdin) == NULL) {
+       ret = getline(cp, sizeof(tmpline)-1, stdin);
+       if (ret == -1) {
                reply(221, "You could at least say goodbye.");
                dologout(0);
+       } else if (ret == -2) {
+               /* Ignore truncated command */
+               /* XXX: abort xfer with "500 command too long", & return 1 ? */
+               return 0;
        }
                /*
                 * Manually parse OOB commands, because we can't

Modified: releng/6.4/crypto/openssl/apps/speed.c
==============================================================================
--- releng/6.4/crypto/openssl/apps/speed.c      Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/crypto/openssl/apps/speed.c      Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1486,7 +1486,7 @@ int MAIN(int argc, char **argv)
                                {
                                ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
                                        rsa_num, rsa_key[j]);
-                               if (ret == 0)
+                               if (ret <= 0)
                                        {
                                        BIO_printf(bio_err,
                                                "RSA verify failure\n");

Modified: releng/6.4/crypto/openssl/apps/spkac.c
==============================================================================
--- releng/6.4/crypto/openssl/apps/spkac.c      Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/crypto/openssl/apps/spkac.c      Wed Jan  7 20:17:55 2009        
(r186872)
@@ -284,7 +284,7 @@ bad:
        pkey = NETSCAPE_SPKI_get_pubkey(spki);
        if(verify) {
                i = NETSCAPE_SPKI_verify(spki, pkey);
-               if(i) BIO_printf(bio_err, "Signature OK\n");
+               if (i > 0) BIO_printf(bio_err, "Signature OK\n");
                else {
                        BIO_printf(bio_err, "Signature Failure\n");
                        ERR_print_errors(bio_err);

Modified: releng/6.4/crypto/openssl/apps/verify.c
==============================================================================
--- releng/6.4/crypto/openssl/apps/verify.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/crypto/openssl/apps/verify.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -275,7 +275,7 @@ static int check(X509_STORE *ctx, char *
 
        ret=0;
 end:
-       if (i)
+       if (i > 0)
                {
                fprintf(stdout,"OK\n");
                ret=1;
@@ -365,4 +365,3 @@ static int MS_CALLBACK cb(int ok, X509_S
                ERR_clear_error();
        return(ok);
        }
-

Modified: releng/6.4/crypto/openssl/apps/x509.c
==============================================================================
--- releng/6.4/crypto/openssl/apps/x509.c       Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/crypto/openssl/apps/x509.c       Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1113,7 +1113,7 @@ static int x509_certify(X509_STORE *ctx,
        /* NOTE: this certificate can/should be self signed, unless it was
         * a certificate request in which case it is not. */
        X509_STORE_CTX_set_cert(&xsc,x);
-       if (!reqfile && !X509_verify_cert(&xsc))
+       if (!reqfile && X509_verify_cert(&xsc) <= 0)
                goto end;
 
        if (!X509_check_private_key(xca,pkey))

Modified: releng/6.4/crypto/openssl/ssl/s2_clnt.c
==============================================================================
--- releng/6.4/crypto/openssl/ssl/s2_clnt.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/crypto/openssl/ssl/s2_clnt.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1062,7 +1062,7 @@ int ssl2_set_certificate(SSL *s, int typ
 
        i=ssl_verify_cert_chain(s,sk);
                
-       if ((s->verify_mode != SSL_VERIFY_NONE) && (!i))
+       if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0))
                {
                
SSLerr(SSL_F_SSL2_SET_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
                goto err;

Modified: releng/6.4/crypto/openssl/ssl/s2_srvr.c
==============================================================================
--- releng/6.4/crypto/openssl/ssl/s2_srvr.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/crypto/openssl/ssl/s2_srvr.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1070,7 +1070,7 @@ static int request_certificate(SSL *s)
 
        i=ssl_verify_cert_chain(s,sk);
 
-       if (i)  /* we like the packet, now check the chksum */
+       if (i > 0)      /* we like the packet, now check the chksum */
                {
                EVP_MD_CTX ctx;
                EVP_PKEY *pkey=NULL;
@@ -1099,7 +1099,7 @@ static int request_certificate(SSL *s)
                EVP_PKEY_free(pkey);
                EVP_MD_CTX_cleanup(&ctx);
 
-               if (i) 
+               if (i > 0) 
                        {
                        if (s->session->peer != NULL)
                                X509_free(s->session->peer);

Modified: releng/6.4/crypto/openssl/ssl/s3_clnt.c
==============================================================================
--- releng/6.4/crypto/openssl/ssl/s3_clnt.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/crypto/openssl/ssl/s3_clnt.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -833,7 +833,7 @@ static int ssl3_get_server_certificate(S
                }
 
        i=ssl_verify_cert_chain(s,sk);
-       if ((s->verify_mode != SSL_VERIFY_NONE) && (!i)
+       if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)
 #ifndef OPENSSL_NO_KRB5
                 && (s->s3->tmp.new_cipher->algorithms & 
(SSL_MKEY_MASK|SSL_AUTH_MASK))
                 != (SSL_aKRB5|SSL_kKRB5)
@@ -1206,7 +1206,7 @@ static int ssl3_get_key_exchange(SSL *s)
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
                        EVP_VerifyUpdate(&md_ctx,param,param_len);
-                       if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))
+                       if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)
                                {
                                /* bad signature */
                                al=SSL_AD_DECRYPT_ERROR;

Modified: releng/6.4/crypto/openssl/ssl/s3_srvr.c
==============================================================================
--- releng/6.4/crypto/openssl/ssl/s3_srvr.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/crypto/openssl/ssl/s3_srvr.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -2015,7 +2015,7 @@ static int ssl3_get_client_certificate(S
        else
                {
                i=ssl_verify_cert_chain(s,sk);
-               if (!i)
+               if (i <= 0)
                        {
                        al=ssl_verify_alarm_type(s->verify_result);
                        
SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);

Modified: releng/6.4/sys/conf/newvers.sh
==============================================================================
--- releng/6.4/sys/conf/newvers.sh      Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/6.4/sys/conf/newvers.sh      Wed Jan  7 20:17:55 2009        
(r186872)
@@ -32,7 +32,7 @@
 
 TYPE="FreeBSD"
 REVISION="6.4"
-BRANCH="RELEASE-p1"
+BRANCH="RELEASE-p2"
 if [ "X${BRANCH_OVERRIDE}" != "X" ]; then
        BRANCH=${BRANCH_OVERRIDE}
 fi

Modified: releng/7.0/UPDATING
==============================================================================
--- releng/7.0/UPDATING Wed Jan  7 18:37:07 2009        (r186871)
+++ releng/7.0/UPDATING Wed Jan  7 20:17:55 2009        (r186872)
@@ -8,6 +8,12 @@ Items affecting the ports and packages s
 /usr/ports/UPDATING.  Please read that file before running
 portupgrade.
 
+20090107:      p8      FreeBSD-SA-09:01.lukemftpd, FreeBSD-SA-09:02.openssl
+       Prevent cross-site forgery attacks on lukemftpd(8) due to splitting
+       long commands into multiple requests. [09:01]
+
+       Fix incorrect OpenSSL checks for malformed signatures. [09:02]
+
 20081223:      p7      FreeBSD-SA-08:12.ftpd, FreeBSD-SA-08:13.protosw
        Prevent cross-site forgery attacks on ftpd(8) due to splitting
        long commands into multiple requests. [08:12]

Modified: releng/7.0/contrib/lukemftpd/src/extern.h
==============================================================================
--- releng/7.0/contrib/lukemftpd/src/extern.h   Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/contrib/lukemftpd/src/extern.h   Wed Jan  7 20:17:55 2009        
(r186872)
@@ -139,7 +139,7 @@ void        feat(void);
 void   format_path(char *, const char *);
 int    ftpd_pclose(FILE *);
 FILE   *ftpd_popen(char *[], const char *, int);
-char   *getline(char *, int, FILE *);
+int    getline(char *, int, FILE *);
 void   init_curclass(void);
 void   logxfer(const char *, off_t, const char *, const char *,
            const struct timeval *, const char *);

Modified: releng/7.0/contrib/lukemftpd/src/ftpcmd.y
==============================================================================
--- releng/7.0/contrib/lukemftpd/src/ftpcmd.y   Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/contrib/lukemftpd/src/ftpcmd.y   Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1363,8 +1363,12 @@ lookup(struct tab *p, const char *cmd)
 
 /*
  * getline - a hacked up version of fgets to ignore TELNET escape codes.
+ *     `s' is the buffer to read into.
+ *     `n' is the 1 less than the size of the buffer, to allow trailing NUL
+ *     `iop' is the FILE to read from.
+ *     Returns 0 on success, -1 on EOF, -2 if the command was too long.
  */
-char *
+int
 getline(char *s, int n, FILE *iop)
 {
        int c;
@@ -1379,7 +1383,7 @@ getline(char *s, int n, FILE *iop)
                        if (ftpd_debug)
                                syslog(LOG_DEBUG, "command: %s", s);
                        tmpline[0] = '\0';
-                       return(s);
+                       return(0);
                }
                if (c == 0)
                        tmpline[0] = '\0';
@@ -1418,11 +1422,25 @@ getline(char *s, int n, FILE *iop)
                    }
                }
                *cs++ = c;
-               if (--n <= 0 || c == '\n')
+               if (--n <= 0) {
+                       /*
+                        * If command doesn't fit into buffer, discard the
+                        * rest of the command and indicate truncation.
+                        * This prevents the command to be split up into
+                        * multiple commands.
+                        */
+                       if (ftpd_debug)
+                               syslog(LOG_DEBUG,
+                                   "command too long, last char: %d", c);
+                       while (c != '\n' && (c = getc(iop)) != EOF)
+                               continue;
+                       return (-2);
+               }
+               if (c == '\n')
                        break;
        }
        if (c == EOF && cs == s)
-               return (NULL);
+               return (-1);
        *cs++ = '\0';
        if (ftpd_debug) {
                if ((curclass.type != CLASS_GUEST &&
@@ -1444,7 +1462,7 @@ getline(char *s, int n, FILE *iop)
                        syslog(LOG_DEBUG, "command: %.*s", len, s);
                }
        }
-       return (s);
+       return (0);
 }
 
 void
@@ -1458,15 +1476,20 @@ ftp_handle_line(char *cp)
 void
 ftp_loop(void)
 {
+       int ret;
 
        while (1) {
                (void) alarm(curclass.timeout);
-               if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
+               ret = getline(cbuf, sizeof(cbuf)-1, stdin);
+               (void) alarm(0);
+               if (ret == -1) {
                        reply(221, "You could at least say goodbye.");
                        dologout(0);
+               } else if (ret == -2) {
+                       reply(500, "Command too long.");
+               } else {
+                       ftp_handle_line(cbuf);
                }
-               (void) alarm(0);
-               ftp_handle_line(cbuf);
        }
        /*NOTREACHED*/
 }

Modified: releng/7.0/contrib/lukemftpd/src/ftpd.c
==============================================================================
--- releng/7.0/contrib/lukemftpd/src/ftpd.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/contrib/lukemftpd/src/ftpd.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1,4 +1,4 @@
-/*     $NetBSD: ftpd.c,v 1.176 2006/05/09 20:18:06 mrg Exp $   */
+/*     $NetBSD: ftpd.c,v 1.187 2008/09/13 03:30:35 lukem Exp $ */
 
 /*
  * Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
@@ -2896,6 +2896,7 @@ static int
 handleoobcmd()
 {
        char *cp;
+       int ret;
 
        if (!urgflag)
                return (0);
@@ -2904,9 +2905,14 @@ handleoobcmd()
        if (!transflag)
                return (0);
        cp = tmpline;
-       if (getline(cp, sizeof(tmpline), stdin) == NULL) {
+       ret = getline(cp, sizeof(tmpline)-1, stdin);
+       if (ret == -1) {
                reply(221, "You could at least say goodbye.");
                dologout(0);
+       } else if (ret == -2) {
+               /* Ignore truncated command */
+               /* XXX: abort xfer with "500 command too long", & return 1 ? */
+               return 0;
        }
                /*
                 * Manually parse OOB commands, because we can't

Modified: releng/7.0/crypto/openssl/apps/speed.c
==============================================================================
--- releng/7.0/crypto/openssl/apps/speed.c      Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/crypto/openssl/apps/speed.c      Wed Jan  7 20:17:55 2009        
(r186872)
@@ -2038,7 +2038,7 @@ int MAIN(int argc, char **argv)
                                {
                                ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
                                        rsa_num, rsa_key[j]);
-                               if (ret == 0)
+                               if (ret <= 0)
                                        {
                                        BIO_printf(bio_err,
                                                "RSA verify failure\n");

Modified: releng/7.0/crypto/openssl/apps/spkac.c
==============================================================================
--- releng/7.0/crypto/openssl/apps/spkac.c      Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/crypto/openssl/apps/spkac.c      Wed Jan  7 20:17:55 2009        
(r186872)
@@ -285,7 +285,7 @@ bad:
        pkey = NETSCAPE_SPKI_get_pubkey(spki);
        if(verify) {
                i = NETSCAPE_SPKI_verify(spki, pkey);
-               if(i) BIO_printf(bio_err, "Signature OK\n");
+               if (i > 0) BIO_printf(bio_err, "Signature OK\n");
                else {
                        BIO_printf(bio_err, "Signature Failure\n");
                        ERR_print_errors(bio_err);

Modified: releng/7.0/crypto/openssl/apps/verify.c
==============================================================================
--- releng/7.0/crypto/openssl/apps/verify.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/crypto/openssl/apps/verify.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -266,7 +266,7 @@ static int check(X509_STORE *ctx, char *
 
        ret=0;
 end:
-       if (i)
+       if (i > 0)
                {
                fprintf(stdout,"OK\n");
                ret=1;
@@ -367,4 +367,3 @@ static int MS_CALLBACK cb(int ok, X509_S
                ERR_clear_error();
        return(ok);
        }
-

Modified: releng/7.0/crypto/openssl/apps/x509.c
==============================================================================
--- releng/7.0/crypto/openssl/apps/x509.c       Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/crypto/openssl/apps/x509.c       Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1144,7 +1144,7 @@ static int x509_certify(X509_STORE *ctx,
        /* NOTE: this certificate can/should be self signed, unless it was
         * a certificate request in which case it is not. */
        X509_STORE_CTX_set_cert(&xsc,x);
-       if (!reqfile && !X509_verify_cert(&xsc))
+       if (!reqfile && X509_verify_cert(&xsc) <= 0)
                goto end;
 
        if (!X509_check_private_key(xca,pkey))

Modified: releng/7.0/crypto/openssl/ssl/s2_clnt.c
==============================================================================
--- releng/7.0/crypto/openssl/ssl/s2_clnt.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/crypto/openssl/ssl/s2_clnt.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1044,7 +1044,7 @@ int ssl2_set_certificate(SSL *s, int typ
 
        i=ssl_verify_cert_chain(s,sk);
                
-       if ((s->verify_mode != SSL_VERIFY_NONE) && (!i))
+       if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0))
                {
                
SSLerr(SSL_F_SSL2_SET_CERTIFICATE,SSL_R_CERTIFICATE_VERIFY_FAILED);
                goto err;

Modified: releng/7.0/crypto/openssl/ssl/s2_srvr.c
==============================================================================
--- releng/7.0/crypto/openssl/ssl/s2_srvr.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/crypto/openssl/ssl/s2_srvr.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1054,7 +1054,7 @@ static int request_certificate(SSL *s)
 
        i=ssl_verify_cert_chain(s,sk);
 
-       if (i)  /* we like the packet, now check the chksum */
+       if (i > 0)      /* we like the packet, now check the chksum */
                {
                EVP_MD_CTX ctx;
                EVP_PKEY *pkey=NULL;
@@ -1083,7 +1083,7 @@ static int request_certificate(SSL *s)
                EVP_PKEY_free(pkey);
                EVP_MD_CTX_cleanup(&ctx);
 
-               if (i) 
+               if (i > 0) 
                        {
                        if (s->session->peer != NULL)
                                X509_free(s->session->peer);

Modified: releng/7.0/crypto/openssl/ssl/s3_clnt.c
==============================================================================
--- releng/7.0/crypto/openssl/ssl/s3_clnt.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/crypto/openssl/ssl/s3_clnt.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -883,7 +883,7 @@ int ssl3_get_server_certificate(SSL *s)
                }
 
        i=ssl_verify_cert_chain(s,sk);
-       if ((s->verify_mode != SSL_VERIFY_NONE) && (!i)
+       if ((s->verify_mode != SSL_VERIFY_NONE) && (i <= 0)
 #ifndef OPENSSL_NO_KRB5
                && (s->s3->tmp.new_cipher->algorithms & 
(SSL_MKEY_MASK|SSL_AUTH_MASK))
                != (SSL_aKRB5|SSL_kKRB5)
@@ -1368,7 +1368,7 @@ int ssl3_get_key_exchange(SSL *s)
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
                        EVP_VerifyUpdate(&md_ctx,param,param_len);
-                       if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))
+                       if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)
                                {
                                /* bad signature */
                                al=SSL_AD_DECRYPT_ERROR;
@@ -1386,7 +1386,7 @@ int ssl3_get_key_exchange(SSL *s)
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->client_random[0]),SSL3_RANDOM_SIZE);
                        
EVP_VerifyUpdate(&md_ctx,&(s->s3->server_random[0]),SSL3_RANDOM_SIZE);
                        EVP_VerifyUpdate(&md_ctx,param,param_len);
-                       if (!EVP_VerifyFinal(&md_ctx,p,(int)n,pkey))
+                       if (EVP_VerifyFinal(&md_ctx,p,(int)n,pkey) <= 0)
                                {
                                /* bad signature */
                                al=SSL_AD_DECRYPT_ERROR;

Modified: releng/7.0/crypto/openssl/ssl/s3_srvr.c
==============================================================================
--- releng/7.0/crypto/openssl/ssl/s3_srvr.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/crypto/openssl/ssl/s3_srvr.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -2481,7 +2481,7 @@ int ssl3_get_client_certificate(SSL *s)
        else
                {
                i=ssl_verify_cert_chain(s,sk);
-               if (!i)
+               if (i <= 0)
                        {
                        al=ssl_verify_alarm_type(s->verify_result);
                        
SSLerr(SSL_F_SSL3_GET_CLIENT_CERTIFICATE,SSL_R_NO_CERTIFICATE_RETURNED);

Modified: releng/7.0/crypto/openssl/ssl/ssltest.c
==============================================================================
--- releng/7.0/crypto/openssl/ssl/ssltest.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/crypto/openssl/ssl/ssltest.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -2072,7 +2072,7 @@ static int MS_CALLBACK app_verify_callba
 
        if (cb_arg->proxy_auth)
                {
-               if (ok)
+               if (ok > 0)
                        {
                        const char *cond_end = NULL;
 

Modified: releng/7.0/sys/conf/newvers.sh
==============================================================================
--- releng/7.0/sys/conf/newvers.sh      Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.0/sys/conf/newvers.sh      Wed Jan  7 20:17:55 2009        
(r186872)
@@ -32,7 +32,7 @@
 
 TYPE="FreeBSD"
 REVISION="7.0"
-BRANCH="RELEASE-p7"
+BRANCH="RELEASE-p8"
 if [ "X${BRANCH_OVERRIDE}" != "X" ]; then
        BRANCH=${BRANCH_OVERRIDE}
 fi

Modified: releng/7.1/UPDATING
==============================================================================
--- releng/7.1/UPDATING Wed Jan  7 18:37:07 2009        (r186871)
+++ releng/7.1/UPDATING Wed Jan  7 20:17:55 2009        (r186872)
@@ -8,6 +8,12 @@ Items affecting the ports and packages s
 /usr/ports/UPDATING.  Please read that file before running
 portupgrade.
 
+20090107:      p1      FreeBSD-SA-09:01.lukemftpd, FreeBSD-SA-09:02.openssl
+       Prevent cross-site forgery attacks on lukemftpd(8) due to splitting
+       long commands into multiple requests. [09:01]
+
+       Fix incorrect OpenSSL checks for malformed signatures. [09:02]
+
 20090106:
        FreeBSD 7.1-RELEASE
 

Modified: releng/7.1/contrib/lukemftpd/src/extern.h
==============================================================================
--- releng/7.1/contrib/lukemftpd/src/extern.h   Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.1/contrib/lukemftpd/src/extern.h   Wed Jan  7 20:17:55 2009        
(r186872)
@@ -139,7 +139,7 @@ void        feat(void);
 void   format_path(char *, const char *);
 int    ftpd_pclose(FILE *);
 FILE   *ftpd_popen(char *[], const char *, int);
-char   *getline(char *, int, FILE *);
+int    getline(char *, int, FILE *);
 void   init_curclass(void);
 void   logxfer(const char *, off_t, const char *, const char *,
            const struct timeval *, const char *);

Modified: releng/7.1/contrib/lukemftpd/src/ftpcmd.y
==============================================================================
--- releng/7.1/contrib/lukemftpd/src/ftpcmd.y   Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.1/contrib/lukemftpd/src/ftpcmd.y   Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1363,8 +1363,12 @@ lookup(struct tab *p, const char *cmd)
 
 /*
  * getline - a hacked up version of fgets to ignore TELNET escape codes.
+ *     `s' is the buffer to read into.
+ *     `n' is the 1 less than the size of the buffer, to allow trailing NUL
+ *     `iop' is the FILE to read from.
+ *     Returns 0 on success, -1 on EOF, -2 if the command was too long.
  */
-char *
+int
 getline(char *s, int n, FILE *iop)
 {
        int c;
@@ -1379,7 +1383,7 @@ getline(char *s, int n, FILE *iop)
                        if (ftpd_debug)
                                syslog(LOG_DEBUG, "command: %s", s);
                        tmpline[0] = '\0';
-                       return(s);
+                       return(0);
                }
                if (c == 0)
                        tmpline[0] = '\0';
@@ -1418,11 +1422,25 @@ getline(char *s, int n, FILE *iop)
                    }
                }
                *cs++ = c;
-               if (--n <= 0 || c == '\n')
+               if (--n <= 0) {
+                       /*
+                        * If command doesn't fit into buffer, discard the
+                        * rest of the command and indicate truncation.
+                        * This prevents the command to be split up into
+                        * multiple commands.
+                        */
+                       if (ftpd_debug)
+                               syslog(LOG_DEBUG,
+                                   "command too long, last char: %d", c);
+                       while (c != '\n' && (c = getc(iop)) != EOF)
+                               continue;
+                       return (-2);
+               }
+               if (c == '\n')
                        break;
        }
        if (c == EOF && cs == s)
-               return (NULL);
+               return (-1);
        *cs++ = '\0';
        if (ftpd_debug) {
                if ((curclass.type != CLASS_GUEST &&
@@ -1444,7 +1462,7 @@ getline(char *s, int n, FILE *iop)
                        syslog(LOG_DEBUG, "command: %.*s", len, s);
                }
        }
-       return (s);
+       return (0);
 }
 
 void
@@ -1458,15 +1476,20 @@ ftp_handle_line(char *cp)
 void
 ftp_loop(void)
 {
+       int ret;
 
        while (1) {
                (void) alarm(curclass.timeout);
-               if (getline(cbuf, sizeof(cbuf)-1, stdin) == NULL) {
+               ret = getline(cbuf, sizeof(cbuf)-1, stdin);
+               (void) alarm(0);
+               if (ret == -1) {
                        reply(221, "You could at least say goodbye.");
                        dologout(0);
+               } else if (ret == -2) {
+                       reply(500, "Command too long.");
+               } else {
+                       ftp_handle_line(cbuf);
                }
-               (void) alarm(0);
-               ftp_handle_line(cbuf);
        }
        /*NOTREACHED*/
 }

Modified: releng/7.1/contrib/lukemftpd/src/ftpd.c
==============================================================================
--- releng/7.1/contrib/lukemftpd/src/ftpd.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.1/contrib/lukemftpd/src/ftpd.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -1,4 +1,4 @@
-/*     $NetBSD: ftpd.c,v 1.176 2006/05/09 20:18:06 mrg Exp $   */
+/*     $NetBSD: ftpd.c,v 1.187 2008/09/13 03:30:35 lukem Exp $ */
 
 /*
  * Copyright (c) 1997-2004 The NetBSD Foundation, Inc.
@@ -2896,6 +2896,7 @@ static int
 handleoobcmd()
 {
        char *cp;
+       int ret;
 
        if (!urgflag)
                return (0);
@@ -2904,9 +2905,14 @@ handleoobcmd()
        if (!transflag)
                return (0);
        cp = tmpline;
-       if (getline(cp, sizeof(tmpline), stdin) == NULL) {
+       ret = getline(cp, sizeof(tmpline)-1, stdin);
+       if (ret == -1) {
                reply(221, "You could at least say goodbye.");
                dologout(0);
+       } else if (ret == -2) {
+               /* Ignore truncated command */
+               /* XXX: abort xfer with "500 command too long", & return 1 ? */
+               return 0;
        }
                /*
                 * Manually parse OOB commands, because we can't

Modified: releng/7.1/crypto/openssl/apps/speed.c
==============================================================================
--- releng/7.1/crypto/openssl/apps/speed.c      Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.1/crypto/openssl/apps/speed.c      Wed Jan  7 20:17:55 2009        
(r186872)
@@ -2038,7 +2038,7 @@ int MAIN(int argc, char **argv)
                                {
                                ret=RSA_verify(NID_md5_sha1, buf,36, buf2,
                                        rsa_num, rsa_key[j]);
-                               if (ret == 0)
+                               if (ret <= 0)
                                        {
                                        BIO_printf(bio_err,
                                                "RSA verify failure\n");

Modified: releng/7.1/crypto/openssl/apps/spkac.c
==============================================================================
--- releng/7.1/crypto/openssl/apps/spkac.c      Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.1/crypto/openssl/apps/spkac.c      Wed Jan  7 20:17:55 2009        
(r186872)
@@ -285,7 +285,7 @@ bad:
        pkey = NETSCAPE_SPKI_get_pubkey(spki);
        if(verify) {
                i = NETSCAPE_SPKI_verify(spki, pkey);
-               if(i) BIO_printf(bio_err, "Signature OK\n");
+               if (i > 0) BIO_printf(bio_err, "Signature OK\n");
                else {
                        BIO_printf(bio_err, "Signature Failure\n");
                        ERR_print_errors(bio_err);

Modified: releng/7.1/crypto/openssl/apps/verify.c
==============================================================================
--- releng/7.1/crypto/openssl/apps/verify.c     Wed Jan  7 18:37:07 2009        
(r186871)
+++ releng/7.1/crypto/openssl/apps/verify.c     Wed Jan  7 20:17:55 2009        
(r186872)
@@ -266,7 +266,7 @@ static int check(X509_STORE *ctx, char *
 
        ret=0;
 end:
-       if (i)
+       if (i > 0)
                {
                fprintf(stdout,"OK\n");
                ret=1;
@@ -367,4 +367,3 @@ static int MS_CALLBACK cb(int ok, X509_S
                ERR_clear_error();
        return(ok);
        }
-

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
_______________________________________________
svn-src-all@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/svn-src-all
To unsubscribe, send any mail to "svn-src-all-unsubscr...@freebsd.org"

Reply via email to