forked from rpms/iperf3
		
	Compare commits
	
		
			2 Commits
		
	
	
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
| 0776a06542 | |||
| 0d8fa1dab6 | 
							
								
								
									
										45
									
								
								SOURCES/0004-cve-2023-38403.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										45
									
								
								SOURCES/0004-cve-2023-38403.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,45 @@ | |||||||
|  | From 41f5129d402bcd14ec4d2cde875203ab51076352 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Bruce A. Mah" <bmah@es.net> | ||||||
|  | Date: Fri, 7 Jul 2023 11:03:43 -0700 | ||||||
|  | Subject: [PATCH] Fix memory allocation hazard (#1542). | ||||||
|  | 
 | ||||||
|  | Reported by:	@someusername123 on GitHub | ||||||
|  | ---
 | ||||||
|  |  src/iperf_api.c | 9 ++++++++- | ||||||
|  |  1 file changed, 8 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/iperf_api.c b/src/iperf_api.c
 | ||||||
|  | index f2d416214..a95e02418 100644
 | ||||||
|  | --- a/src/iperf_api.c
 | ||||||
|  | +++ b/src/iperf_api.c
 | ||||||
|  | @@ -2670,6 +2670,7 @@ static cJSON *
 | ||||||
|  |  JSON_read(int fd) | ||||||
|  |  { | ||||||
|  |      uint32_t hsize, nsize; | ||||||
|  | +    size_t strsize;
 | ||||||
|  |      char *str; | ||||||
|  |      cJSON *json = NULL; | ||||||
|  |      int rc; | ||||||
|  | @@ -2682,7 +2683,9 @@ JSON_read(int fd)
 | ||||||
|  |      if (Nread(fd, (char*) &nsize, sizeof(nsize), Ptcp) >= 0) { | ||||||
|  |  	hsize = ntohl(nsize); | ||||||
|  |  	/* Allocate a buffer to hold the JSON */ | ||||||
|  | -	str = (char *) calloc(sizeof(char), hsize+1);	/* +1 for trailing null */
 | ||||||
|  | +	strsize = hsize + 1;              /* +1 for trailing NULL */
 | ||||||
|  | +	if (strsize) {
 | ||||||
|  | +	str = (char *) calloc(sizeof(char), strsize);
 | ||||||
|  |  	if (str != NULL) { | ||||||
|  |  	    rc = Nread(fd, str, hsize, Ptcp); | ||||||
|  |  	    if (rc >= 0) { | ||||||
|  | @@ -2701,6 +2704,10 @@ JSON_read(int fd)
 | ||||||
|  |  	    } | ||||||
|  |  	} | ||||||
|  |  	free(str); | ||||||
|  | +	}
 | ||||||
|  | +	else {
 | ||||||
|  | +	    printf("WARNING:  Data length overflow\n");
 | ||||||
|  | +	}
 | ||||||
|  |      } | ||||||
|  |      return json; | ||||||
|  |  } | ||||||
|  | 
 | ||||||
							
								
								
									
										497
									
								
								SOURCES/0005-cve-2023-7250.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										497
									
								
								SOURCES/0005-cve-2023-7250.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,497 @@ | |||||||
|  | From 5e3704dd850a5df2fb2b3eafd117963d017d07b4 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: "Bruce A. Mah" <bmah@es.net> | ||||||
|  | Date: Tue, 1 Aug 2023 14:02:54 -0700 | ||||||
|  | Subject: [PATCH] Implement fixes to make the control connection more robust. | ||||||
|  | 
 | ||||||
|  | These include various timeouts in Nread() to guarantee that it will | ||||||
|  | eventually exit, a 10-second timeout for each attempt to read data | ||||||
|  | from the network and an approximately 30-second overall timeout per | ||||||
|  | Nread() call. | ||||||
|  | 
 | ||||||
|  | Also the iperf3 server now checks the length of the received session | ||||||
|  | cookie, and errors out if this happens to be incorrect. | ||||||
|  | 
 | ||||||
|  | Reported by Jorge Sancho Larraz - Canonical. | ||||||
|  | ---
 | ||||||
|  |  src/iperf_server_api.c |  7 ++++- | ||||||
|  |  src/net.c              | 62 ++++++++++++++++++++++++++++++++++++++++++ | ||||||
|  |  2 files changed, 68 insertions(+), 1 deletion(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/iperf_server_api.c b/src/iperf_server_api.c
 | ||||||
|  | index 5fa1dd7..c528d5f 100644
 | ||||||
|  | --- a/src/iperf_server_api.c
 | ||||||
|  | +++ b/src/iperf_server_api.c
 | ||||||
|  | @@ -118,7 +118,12 @@ iperf_accept(struct iperf_test *test)
 | ||||||
|  |      if (test->ctrl_sck == -1) { | ||||||
|  |          /* Server free, accept new client */ | ||||||
|  |          test->ctrl_sck = s; | ||||||
|  | -        if (Nread(test->ctrl_sck, test->cookie, COOKIE_SIZE, Ptcp) < 0) {
 | ||||||
|  | +        if (Nread(test->ctrl_sck, test->cookie, COOKIE_SIZE, Ptcp) != COOKIE_SIZE) {
 | ||||||
|  | +            /*
 | ||||||
|  | +             * Note this error covers both the case of a system error
 | ||||||
|  | +             * or the inability to read the correct amount of data
 | ||||||
|  | +             * (i.e. timed out).
 | ||||||
|  | +             */
 | ||||||
|  |              i_errno = IERECVCOOKIE; | ||||||
|  |              return -1; | ||||||
|  |          } | ||||||
|  | diff --git a/src/iperf_time.c b/src/iperf_time.c
 | ||||||
|  | new file mode 100644 | ||||||
|  | index 0000000..a435dd3
 | ||||||
|  | --- /dev/null
 | ||||||
|  | +++ b/src/iperf_time.c
 | ||||||
|  | @@ -0,0 +1,156 @@
 | ||||||
|  | +/*
 | ||||||
|  | + * iperf, Copyright (c) 2014-2018, The Regents of the University of
 | ||||||
|  | + * California, through Lawrence Berkeley National Laboratory (subject
 | ||||||
|  | + * to receipt of any required approvals from the U.S. Dept. of
 | ||||||
|  | + * Energy).  All rights reserved.
 | ||||||
|  | + *
 | ||||||
|  | + * If you have questions about your rights to use or distribute this
 | ||||||
|  | + * software, please contact Berkeley Lab's Technology Transfer
 | ||||||
|  | + * Department at TTD@lbl.gov.
 | ||||||
|  | + *
 | ||||||
|  | + * NOTICE.  This software is owned by the U.S. Department of Energy.
 | ||||||
|  | + * As such, the U.S. Government has been granted for itself and others
 | ||||||
|  | + * acting on its behalf a paid-up, nonexclusive, irrevocable,
 | ||||||
|  | + * worldwide license in the Software to reproduce, prepare derivative
 | ||||||
|  | + * works, and perform publicly and display publicly.  Beginning five
 | ||||||
|  | + * (5) years after the date permission to assert copyright is obtained
 | ||||||
|  | + * from the U.S. Department of Energy, and subject to any subsequent
 | ||||||
|  | + * five (5) year renewals, the U.S. Government is granted for itself
 | ||||||
|  | + * and others acting on its behalf a paid-up, nonexclusive,
 | ||||||
|  | + * irrevocable, worldwide license in the Software to reproduce,
 | ||||||
|  | + * prepare derivative works, distribute copies to the public, perform
 | ||||||
|  | + * publicly and display publicly, and to permit others to do so.
 | ||||||
|  | + *
 | ||||||
|  | + * This code is distributed under a BSD style license, see the LICENSE
 | ||||||
|  | + * file for complete information.
 | ||||||
|  | + */
 | ||||||
|  | +
 | ||||||
|  | +
 | ||||||
|  | +#include <stddef.h>
 | ||||||
|  | +
 | ||||||
|  | +#include "iperf_config.h"
 | ||||||
|  | +#include "iperf_time.h"
 | ||||||
|  | +
 | ||||||
|  | +#ifdef HAVE_CLOCK_GETTIME
 | ||||||
|  | +
 | ||||||
|  | +#include <time.h>
 | ||||||
|  | +
 | ||||||
|  | +int
 | ||||||
|  | +iperf_time_now(struct iperf_time *time1)
 | ||||||
|  | +{
 | ||||||
|  | +    struct timespec ts;
 | ||||||
|  | +    int result;
 | ||||||
|  | +    result = clock_gettime(CLOCK_MONOTONIC, &ts);
 | ||||||
|  | +    if (result == 0) {
 | ||||||
|  | +        time1->secs = (uint32_t) ts.tv_sec;
 | ||||||
|  | +        time1->usecs = (uint32_t) ts.tv_nsec / 1000;
 | ||||||
|  | +    }
 | ||||||
|  | +    return result;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +#else
 | ||||||
|  | +
 | ||||||
|  | +#include <sys/time.h>
 | ||||||
|  | +
 | ||||||
|  | +int
 | ||||||
|  | +iperf_time_now(struct iperf_time *time1)
 | ||||||
|  | +{
 | ||||||
|  | +    struct timeval tv;
 | ||||||
|  | +    int result;
 | ||||||
|  | +    result = gettimeofday(&tv, NULL);
 | ||||||
|  | +    time1->secs = tv.tv_sec;
 | ||||||
|  | +    time1->usecs = tv.tv_usec;
 | ||||||
|  | +    return result;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +#endif
 | ||||||
|  | +
 | ||||||
|  | +/* iperf_time_add_usecs
 | ||||||
|  | + *
 | ||||||
|  | + * Add a number of microseconds to a iperf_time.
 | ||||||
|  | + */
 | ||||||
|  | +void
 | ||||||
|  | +iperf_time_add_usecs(struct iperf_time *time1, uint64_t usecs)
 | ||||||
|  | +{
 | ||||||
|  | +    time1->secs += usecs / 1000000L;
 | ||||||
|  | +    time1->usecs += usecs % 1000000L;
 | ||||||
|  | +    if ( time1->usecs >= 1000000L ) {
 | ||||||
|  | +        time1->secs += time1->usecs / 1000000L;
 | ||||||
|  | +        time1->usecs %= 1000000L;
 | ||||||
|  | +    }
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +uint64_t
 | ||||||
|  | +iperf_time_in_usecs(struct iperf_time *time)
 | ||||||
|  | +{
 | ||||||
|  | +    return time->secs * 1000000LL + time->usecs;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +double
 | ||||||
|  | +iperf_time_in_secs(struct iperf_time *time)
 | ||||||
|  | +{
 | ||||||
|  | +    return time->secs + time->usecs / 1000000.0;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +/* iperf_time_compare
 | ||||||
|  | + *
 | ||||||
|  | + * Compare two timestamps
 | ||||||
|  | + *
 | ||||||
|  | + * Returns -1 if time1 is earlier, 1 if time1 is later,
 | ||||||
|  | + * or 0 if the timestamps are equal.
 | ||||||
|  | + */
 | ||||||
|  | +int
 | ||||||
|  | +iperf_time_compare(struct iperf_time *time1, struct iperf_time *time2)
 | ||||||
|  | +{
 | ||||||
|  | +    if (time1->secs < time2->secs)
 | ||||||
|  | +        return -1;
 | ||||||
|  | +    if (time1->secs > time2->secs)
 | ||||||
|  | +        return 1;
 | ||||||
|  | +    if (time1->usecs < time2->usecs)
 | ||||||
|  | +        return -1;
 | ||||||
|  | +    if (time1->usecs > time2->usecs)
 | ||||||
|  | +        return 1;
 | ||||||
|  | +    return 0;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  | +/* iperf_time_diff
 | ||||||
|  | + *
 | ||||||
|  | + * Calculates the time from time2 to time1, assuming time1 is later than time2.
 | ||||||
|  | + * The diff will always be positive, so the return value should be checked
 | ||||||
|  | + * to determine if time1 was earlier than time2.
 | ||||||
|  | + *
 | ||||||
|  | + * Returns 1 if the time1 is less than or equal to time2, otherwise 0.
 | ||||||
|  | + */
 | ||||||
|  | +int
 | ||||||
|  | +iperf_time_diff(struct iperf_time *time1, struct iperf_time *time2, struct iperf_time *diff)
 | ||||||
|  | +{
 | ||||||
|  | +    int past = 0;
 | ||||||
|  | +    int cmp = 0;
 | ||||||
|  | +
 | ||||||
|  | +    cmp = iperf_time_compare(time1, time2);
 | ||||||
|  | +    if (cmp == 0) {
 | ||||||
|  | +        diff->secs = 0;
 | ||||||
|  | +        diff->usecs = 0;
 | ||||||
|  | +        past = 1;
 | ||||||
|  | +    }
 | ||||||
|  | +    else if (cmp == 1) {
 | ||||||
|  | +        diff->secs = time1->secs - time2->secs;
 | ||||||
|  | +        diff->usecs = time1->usecs;
 | ||||||
|  | +        if (diff->usecs < time2->usecs) {
 | ||||||
|  | +            diff->secs -= 1;
 | ||||||
|  | +            diff->usecs += 1000000;
 | ||||||
|  | +        }
 | ||||||
|  | +        diff->usecs = diff->usecs - time2->usecs;
 | ||||||
|  | +    } else {
 | ||||||
|  | +        diff->secs = time2->secs - time1->secs;
 | ||||||
|  | +        diff->usecs = time2->usecs;
 | ||||||
|  | +        if (diff->usecs < time1->usecs) {
 | ||||||
|  | +            diff->secs -= 1;
 | ||||||
|  | +            diff->usecs += 1000000;
 | ||||||
|  | +        }
 | ||||||
|  | +        diff->usecs = diff->usecs - time1->usecs;
 | ||||||
|  | +        past = 1;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  | +    return past;
 | ||||||
|  | +}
 | ||||||
|  | diff --git a/src/iperf_time.h b/src/iperf_time.h
 | ||||||
|  | new file mode 100644 | ||||||
|  | index 0000000..588ee26
 | ||||||
|  | --- /dev/null
 | ||||||
|  | +++ b/src/iperf_time.h
 | ||||||
|  | @@ -0,0 +1,49 @@
 | ||||||
|  | +/*
 | ||||||
|  | + * iperf, Copyright (c) 2014-2018, The Regents of the University of
 | ||||||
|  | + * California, through Lawrence Berkeley National Laboratory (subject
 | ||||||
|  | + * to receipt of any required approvals from the U.S. Dept. of
 | ||||||
|  | + * Energy).  All rights reserved.
 | ||||||
|  | + *
 | ||||||
|  | + * If you have questions about your rights to use or distribute this
 | ||||||
|  | + * software, please contact Berkeley Lab's Technology Transfer
 | ||||||
|  | + * Department at TTD@lbl.gov.
 | ||||||
|  | + *
 | ||||||
|  | + * NOTICE.  This software is owned by the U.S. Department of Energy.
 | ||||||
|  | + * As such, the U.S. Government has been granted for itself and others
 | ||||||
|  | + * acting on its behalf a paid-up, nonexclusive, irrevocable,
 | ||||||
|  | + * worldwide license in the Software to reproduce, prepare derivative
 | ||||||
|  | + * works, and perform publicly and display publicly.  Beginning five
 | ||||||
|  | + * (5) years after the date permission to assert copyright is obtained
 | ||||||
|  | + * from the U.S. Department of Energy, and subject to any subsequent
 | ||||||
|  | + * five (5) year renewals, the U.S. Government is granted for itself
 | ||||||
|  | + * and others acting on its behalf a paid-up, nonexclusive,
 | ||||||
|  | + * irrevocable, worldwide license in the Software to reproduce,
 | ||||||
|  | + * prepare derivative works, distribute copies to the public, perform
 | ||||||
|  | + * publicly and display publicly, and to permit others to do so.
 | ||||||
|  | + *
 | ||||||
|  | + * This code is distributed under a BSD style license, see the LICENSE
 | ||||||
|  | + * file for complete information.
 | ||||||
|  | + */
 | ||||||
|  | +#ifndef __IPERF_TIME_H
 | ||||||
|  | +#define __IPERF_TIME_H
 | ||||||
|  | +
 | ||||||
|  | +#include <stdint.h>
 | ||||||
|  | +
 | ||||||
|  | +struct iperf_time {
 | ||||||
|  | +    uint32_t secs;
 | ||||||
|  | +    uint32_t usecs;
 | ||||||
|  | +};
 | ||||||
|  | +
 | ||||||
|  | +int iperf_time_now(struct iperf_time *time1);
 | ||||||
|  | +
 | ||||||
|  | +void iperf_time_add_usecs(struct iperf_time *time1, uint64_t usecs);
 | ||||||
|  | +
 | ||||||
|  | +int iperf_time_compare(struct iperf_time *time1, struct iperf_time *time2);
 | ||||||
|  | +
 | ||||||
|  | +int iperf_time_diff(struct iperf_time *time1, struct iperf_time *time2, struct iperf_time *diff);
 | ||||||
|  | +
 | ||||||
|  | +uint64_t iperf_time_in_usecs(struct iperf_time *time);
 | ||||||
|  | +
 | ||||||
|  | +double iperf_time_in_secs(struct iperf_time *time);
 | ||||||
|  | +
 | ||||||
|  | +#endif
 | ||||||
|  | diff --git a/src/iperf.h b/src/iperf.h
 | ||||||
|  | index f55994f..f137b07 100755
 | ||||||
|  | --- a/src/iperf.h
 | ||||||
|  | +++ b/src/iperf.h
 | ||||||
|  | @@ -61,6 +61,7 @@
 | ||||||
|  |  #include "timer.h" | ||||||
|  |  #include "queue.h" | ||||||
|  |  #include "cjson.h" | ||||||
|  | +#include "iperf_time.h"
 | ||||||
|  |   | ||||||
|  |  typedef uint64_t iperf_size_t; | ||||||
|  |   | ||||||
|  | diff --git a/src/net.c b/src/net.c
 | ||||||
|  | index fd525ee..8804a39 100644
 | ||||||
|  | --- a/src/net.c
 | ||||||
|  | +++ b/src/net.c
 | ||||||
|  | @@ -60,10 +60,14 @@
 | ||||||
|  |  #include <poll.h> | ||||||
|  |  #endif /* HAVE_POLL_H */ | ||||||
|  |   | ||||||
|  | +#include "iperf.h"
 | ||||||
|  |  #include "iperf_util.h" | ||||||
|  |  #include "net.h" | ||||||
|  |  #include "timer.h" | ||||||
|  |   | ||||||
|  | +static int nread_read_timeout = 10;
 | ||||||
|  | +static int nread_overall_timeout = 30;
 | ||||||
|  | +
 | ||||||
|  |  /* | ||||||
|  |   * timeout_connect adapted from netcat, via OpenBSD and FreeBSD | ||||||
|  |   * Copyright (c) 2001 Eric Jackson <ericj@monkey.org> | ||||||
|  | @@ -313,6 +317,32 @@ Nread(int fd, char *buf, size_t count, int prot)
 | ||||||
|  |  { | ||||||
|  |      register ssize_t r; | ||||||
|  |      register size_t nleft = count; | ||||||
|  | +    struct iperf_time ftimeout = { 0, 0 };
 | ||||||
|  | +
 | ||||||
|  | +    fd_set rfdset;
 | ||||||
|  | +    struct timeval timeout = { nread_read_timeout, 0 };
 | ||||||
|  | +
 | ||||||
|  | +    /*
 | ||||||
|  | +     * fd might not be ready for reading on entry. Check for this
 | ||||||
|  | +     * (with timeout) first.
 | ||||||
|  | +     *
 | ||||||
|  | +     * This check could go inside the while() loop below, except we're
 | ||||||
|  | +     * currently considering whether it might make sense to support a
 | ||||||
|  | +     * codepath that bypassese this check, for situations where we
 | ||||||
|  | +     * already know that fd has data on it (for example if we'd gotten
 | ||||||
|  | +     * to here as the result of a select() call.
 | ||||||
|  | +     */
 | ||||||
|  | +    {
 | ||||||
|  | +        FD_ZERO(&rfdset);
 | ||||||
|  | +        FD_SET(fd, &rfdset);
 | ||||||
|  | +        r = select(fd + 1, &rfdset, NULL, NULL, &timeout);
 | ||||||
|  | +        if (r < 0) {
 | ||||||
|  | +            return NET_HARDERROR;
 | ||||||
|  | +        }
 | ||||||
|  | +        if (r == 0) {
 | ||||||
|  | +            return 0;
 | ||||||
|  | +        }
 | ||||||
|  | +    }
 | ||||||
|  |   | ||||||
|  |      while (nleft > 0) { | ||||||
|  |          r = read(fd, buf, nleft); | ||||||
|  | @@ -326,6 +356,39 @@ Nread(int fd, char *buf, size_t count, int prot)
 | ||||||
|  |   | ||||||
|  |          nleft -= r; | ||||||
|  |          buf += r; | ||||||
|  | +
 | ||||||
|  | +        /*
 | ||||||
|  | +         * We need some more bytes but don't want to wait around
 | ||||||
|  | +         * forever for them. In the case of partial results, we need
 | ||||||
|  | +         * to be able to read some bytes every nread_timeout seconds.
 | ||||||
|  | +         */
 | ||||||
|  | +        if (nleft > 0) {
 | ||||||
|  | +            struct iperf_time now;
 | ||||||
|  | +
 | ||||||
|  | +            /*
 | ||||||
|  | +             * Also, we have an approximate upper limit for the total time
 | ||||||
|  | +             * that a Nread call is supposed to take. We trade off accuracy
 | ||||||
|  | +             * of this timeout for a hopefully lower performance impact.
 | ||||||
|  | +             */
 | ||||||
|  | +            iperf_time_now(&now);
 | ||||||
|  | +            if (ftimeout.secs == 0) {
 | ||||||
|  | +                ftimeout = now;
 | ||||||
|  | +                iperf_time_add_usecs(&ftimeout, nread_overall_timeout * 1000000L);
 | ||||||
|  | +            }
 | ||||||
|  | +            if (iperf_time_compare(&ftimeout, &now) < 0) {
 | ||||||
|  | +                break;
 | ||||||
|  | +            }
 | ||||||
|  | +
 | ||||||
|  | +            FD_ZERO(&rfdset);
 | ||||||
|  | +            FD_SET(fd, &rfdset);
 | ||||||
|  | +            r = select(fd + 1, &rfdset, NULL, NULL, &timeout);
 | ||||||
|  | +            if (r < 0) {
 | ||||||
|  | +                return NET_HARDERROR;
 | ||||||
|  | +            }
 | ||||||
|  | +            if (r == 0) {
 | ||||||
|  | +                break;
 | ||||||
|  | +            }
 | ||||||
|  | +        }
 | ||||||
|  |      } | ||||||
|  |      return count - nleft; | ||||||
|  |  } | ||||||
|  | diff --git a/src/Makefile.am b/src/Makefile.am
 | ||||||
|  | index 9184e84..1c24b62 100644
 | ||||||
|  | --- a/src/Makefile.am
 | ||||||
|  | +++ b/src/Makefile.am
 | ||||||
|  | @@ -21,6 +21,8 @@ libiperf_la_SOURCES     = \
 | ||||||
|  |                          iperf_server_api.c \ | ||||||
|  |                          iperf_tcp.c \ | ||||||
|  |                          iperf_tcp.h \ | ||||||
|  | +                        iperf_time.c \
 | ||||||
|  | +                        iperf_time.h \
 | ||||||
|  |                          iperf_udp.c \ | ||||||
|  |                          iperf_udp.h \ | ||||||
|  |  			iperf_sctp.c \ | ||||||
|  | diff --git a/src/Makefile.in b/src/Makefile.in
 | ||||||
|  | index 714f601..6e75194 100644
 | ||||||
|  | --- a/src/Makefile.in
 | ||||||
|  | +++ b/src/Makefile.in
 | ||||||
|  | @@ -142,7 +142,8 @@ libiperf_la_LIBADD =
 | ||||||
|  |  am_libiperf_la_OBJECTS = cjson.lo iperf_api.lo iperf_error.lo \ | ||||||
|  |  	iperf_auth.lo iperf_client_api.lo iperf_locale.lo \ | ||||||
|  |  	iperf_server_api.lo iperf_tcp.lo iperf_udp.lo iperf_sctp.lo \ | ||||||
|  | -	iperf_util.lo dscp.lo net.lo tcp_info.lo timer.lo units.lo
 | ||||||
|  | +	iperf_util.lo iperf_time.lo dscp.lo net.lo tcp_info.lo \
 | ||||||
|  | +	timer.lo units.lo
 | ||||||
|  |  libiperf_la_OBJECTS = $(am_libiperf_la_OBJECTS) | ||||||
|  |  AM_V_lt = $(am__v_lt_@AM_V@) | ||||||
|  |  am__v_lt_ = $(am__v_lt_@AM_DEFAULT_V@) | ||||||
|  | @@ -165,6 +166,7 @@ am__objects_1 = iperf3_profile-cjson.$(OBJEXT) \
 | ||||||
|  |  	iperf3_profile-iperf_udp.$(OBJEXT) \ | ||||||
|  |  	iperf3_profile-iperf_sctp.$(OBJEXT) \ | ||||||
|  |  	iperf3_profile-iperf_util.$(OBJEXT) \ | ||||||
|  | +	iperf3_profile-iperf_time.$(OBJEXT) \
 | ||||||
|  |  	iperf3_profile-dscp.$(OBJEXT) iperf3_profile-net.$(OBJEXT) \ | ||||||
|  |  	iperf3_profile-tcp_info.$(OBJEXT) \ | ||||||
|  |  	iperf3_profile-timer.$(OBJEXT) iperf3_profile-units.$(OBJEXT) | ||||||
|  | @@ -220,6 +222,7 @@ am__depfiles_remade = ./$(DEPDIR)/cjson.Plo ./$(DEPDIR)/dscp.Plo \
 | ||||||
|  |  	./$(DEPDIR)/iperf3_profile-iperf_sctp.Po \ | ||||||
|  |  	./$(DEPDIR)/iperf3_profile-iperf_server_api.Po \ | ||||||
|  |  	./$(DEPDIR)/iperf3_profile-iperf_tcp.Po \ | ||||||
|  | +	./$(DEPDIR)/iperf3_profile-iperf_time.Po \
 | ||||||
|  |  	./$(DEPDIR)/iperf3_profile-iperf_udp.Po \ | ||||||
|  |  	./$(DEPDIR)/iperf3_profile-iperf_util.Po \ | ||||||
|  |  	./$(DEPDIR)/iperf3_profile-main.Po \ | ||||||
|  | @@ -230,11 +233,12 @@ am__depfiles_remade = ./$(DEPDIR)/cjson.Plo ./$(DEPDIR)/dscp.Plo \
 | ||||||
|  |  	./$(DEPDIR)/iperf_auth.Plo ./$(DEPDIR)/iperf_client_api.Plo \ | ||||||
|  |  	./$(DEPDIR)/iperf_error.Plo ./$(DEPDIR)/iperf_locale.Plo \ | ||||||
|  |  	./$(DEPDIR)/iperf_sctp.Plo ./$(DEPDIR)/iperf_server_api.Plo \ | ||||||
|  | -	./$(DEPDIR)/iperf_tcp.Plo ./$(DEPDIR)/iperf_udp.Plo \
 | ||||||
|  | -	./$(DEPDIR)/iperf_util.Plo ./$(DEPDIR)/net.Plo \
 | ||||||
|  | -	./$(DEPDIR)/t_timer-t_timer.Po ./$(DEPDIR)/t_units-t_units.Po \
 | ||||||
|  | -	./$(DEPDIR)/t_uuid-t_uuid.Po ./$(DEPDIR)/tcp_info.Plo \
 | ||||||
|  | -	./$(DEPDIR)/timer.Plo ./$(DEPDIR)/units.Plo
 | ||||||
|  | +	./$(DEPDIR)/iperf_tcp.Plo ./$(DEPDIR)/iperf_time.Plo \
 | ||||||
|  | +	./$(DEPDIR)/iperf_udp.Plo ./$(DEPDIR)/iperf_util.Plo \
 | ||||||
|  | +	./$(DEPDIR)/net.Plo ./$(DEPDIR)/t_timer-t_timer.Po \
 | ||||||
|  | +	./$(DEPDIR)/t_units-t_units.Po ./$(DEPDIR)/t_uuid-t_uuid.Po \
 | ||||||
|  | +	./$(DEPDIR)/tcp_info.Plo ./$(DEPDIR)/timer.Plo \
 | ||||||
|  | +	./$(DEPDIR)/units.Plo
 | ||||||
|  |  am__mv = mv -f | ||||||
|  |  COMPILE = $(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) \ | ||||||
|  |  	$(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) | ||||||
|  | @@ -613,6 +613,8 @@ libiperf_la_SOURCES = \
 | ||||||
|  |                          iperf_server_api.c \ | ||||||
|  |                          iperf_tcp.c \ | ||||||
|  |                          iperf_tcp.h \ | ||||||
|  | +                        iperf_time.c \
 | ||||||
|  | +                        iperf_time.h \
 | ||||||
|  |                          iperf_udp.c \ | ||||||
|  |                          iperf_udp.h \ | ||||||
|  |  			iperf_sctp.c \ | ||||||
|  | @@ -850,6 +854,7 @@ distclean-compile:
 | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_sctp.Po@am__quote@ # am--include-marker | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_server_api.Po@am__quote@ # am--include-marker | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_tcp.Po@am__quote@ # am--include-marker | ||||||
|  | +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_time.Po@am__quote@ # am--include-marker
 | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_udp.Po@am__quote@ # am--include-marker | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-iperf_util.Po@am__quote@ # am--include-marker | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf3_profile-main.Po@am__quote@ # am--include-marker | ||||||
|  | @@ -865,6 +870,7 @@ distclean-compile:
 | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_sctp.Plo@am__quote@ # am--include-marker | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_server_api.Plo@am__quote@ # am--include-marker | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_tcp.Plo@am__quote@ # am--include-marker | ||||||
|  | +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_time.Plo@am__quote@ # am--include-marker
 | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_udp.Plo@am__quote@ # am--include-marker | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/iperf_util.Plo@am__quote@ # am--include-marker | ||||||
|  |  @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/net.Plo@am__quote@ # am--include-marker | ||||||
|  | @@ -1084,6 +1090,20 @@ iperf3_profile-iperf_util.obj: iperf_util.c
 | ||||||
|  |  @AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ | ||||||
|  |  @am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -c -o iperf3_profile-iperf_util.obj `if test -f 'iperf_util.c'; then $(CYGPATH_W) 'iperf_util.c'; else $(CYGPATH_W) '$(srcdir)/iperf_util.c'; fi` | ||||||
|  |   | ||||||
|  | +iperf3_profile-iperf_time.o: iperf_time.c
 | ||||||
|  | +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -MT iperf3_profile-iperf_time.o -MD -MP -MF $(DEPDIR)/iperf3_profile-iperf_time.Tpo -c -o iperf3_profile-iperf_time.o `test -f 'iperf_time.c' || echo '$(srcdir)/'`iperf_time.c
 | ||||||
|  | +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/iperf3_profile-iperf_time.Tpo $(DEPDIR)/iperf3_profile-iperf_time.Po
 | ||||||
|  | +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='iperf_time.c' object='iperf3_profile-iperf_time.o' libtool=no @AMDEPBACKSLASH@
 | ||||||
|  | +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | ||||||
|  | +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -c -o iperf3_profile-iperf_time.o `test -f 'iperf_time.c' || echo '$(srcdir)/'`iperf_time.c
 | ||||||
|  | +
 | ||||||
|  | +iperf3_profile-iperf_time.obj: iperf_time.c
 | ||||||
|  | +@am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -MT iperf3_profile-iperf_time.obj -MD -MP -MF $(DEPDIR)/iperf3_profile-iperf_time.Tpo -c -o iperf3_profile-iperf_time.obj `if test -f 'iperf_time.c'; then $(CYGPATH_W) 'iperf_time.c'; else $(CYGPATH_W) '$(srcdir)/iperf_time.c'; fi`
 | ||||||
|  | +@am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/iperf3_profile-iperf_time.Tpo $(DEPDIR)/iperf3_profile-iperf_time.Po
 | ||||||
|  | +@AMDEP_TRUE@@am__fastdepCC_FALSE@	$(AM_V_CC)source='iperf_time.c' object='iperf3_profile-iperf_time.obj' libtool=no @AMDEPBACKSLASH@
 | ||||||
|  | +@AMDEP_TRUE@@am__fastdepCC_FALSE@	DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@
 | ||||||
|  | +@am__fastdepCC_FALSE@	$(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -c -o iperf3_profile-iperf_time.obj `if test -f 'iperf_time.c'; then $(CYGPATH_W) 'iperf_time.c'; else $(CYGPATH_W) '$(srcdir)/iperf_time.c'; fi`
 | ||||||
|  | +
 | ||||||
|  |  iperf3_profile-dscp.o: dscp.c | ||||||
|  |  @am__fastdepCC_TRUE@	$(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(iperf3_profile_CFLAGS) $(CFLAGS) -MT iperf3_profile-dscp.o -MD -MP -MF $(DEPDIR)/iperf3_profile-dscp.Tpo -c -o iperf3_profile-dscp.o `test -f 'dscp.c' || echo '$(srcdir)/'`dscp.c | ||||||
|  |  @am__fastdepCC_TRUE@	$(AM_V_at)$(am__mv) $(DEPDIR)/iperf3_profile-dscp.Tpo $(DEPDIR)/iperf3_profile-dscp.Po | ||||||
|  | @@ -1634,6 +1654,7 @@ distclean: distclean-am
 | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_sctp.Po | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_server_api.Po | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_tcp.Po | ||||||
|  | +	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_time.Po
 | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_udp.Po | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_util.Po | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-main.Po | ||||||
|  | @@ -1649,6 +1670,7 @@ distclean: distclean-am
 | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf_sctp.Plo | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf_server_api.Plo | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf_tcp.Plo | ||||||
|  | +	-rm -f ./$(DEPDIR)/iperf_time.Plo
 | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf_udp.Plo | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf_util.Plo | ||||||
|  |  	-rm -f ./$(DEPDIR)/net.Plo | ||||||
|  | @@ -1716,6 +1738,7 @@ maintainer-clean: maintainer-clean-am
 | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_sctp.Po | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_server_api.Po | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_tcp.Po | ||||||
|  | +	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_time.Po
 | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_udp.Po | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-iperf_util.Po | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf3_profile-main.Po | ||||||
|  | @@ -1731,6 +1754,7 @@ maintainer-clean: maintainer-clean-am
 | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf_sctp.Plo | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf_server_api.Plo | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf_tcp.Plo | ||||||
|  | +	-rm -f ./$(DEPDIR)/iperf_time.Plo
 | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf_udp.Plo | ||||||
|  |  	-rm -f ./$(DEPDIR)/iperf_util.Plo | ||||||
|  |  	-rm -f ./$(DEPDIR)/net.Plo | ||||||
							
								
								
									
										231
									
								
								SOURCES/0006-cve-2024-26306.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										231
									
								
								SOURCES/0006-cve-2024-26306.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,231 @@ | |||||||
|  | From 299b356df6939f71619bf45bf7a7d2222e17d840 Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Sarah Larsen <swlarsen@Sarahs-MBP.lan> | ||||||
|  | Date: Wed, 20 Mar 2024 17:02:31 -0700 | ||||||
|  | Subject: [PATCH] Using OAEP padding instead of PKCS1 padding for OpenSSL. Fix | ||||||
|  |  for CVE-2024-26306. | ||||||
|  | 
 | ||||||
|  | Special thanks to Hubert Kario at Red Hat for finding the vulnerability. | ||||||
|  | 
 | ||||||
|  | diff --git a/src/iperf.h b/src/iperf.h
 | ||||||
|  | index f137b07..f6c0313 100755
 | ||||||
|  | --- a/src/iperf.h
 | ||||||
|  | +++ b/src/iperf.h
 | ||||||
|  | @@ -260,6 +260,7 @@ struct iperf_test
 | ||||||
|  |      int	      ctrl_sck_mss;			/* MSS for the control channel */ | ||||||
|  |      char     *server_rsa_private_key; | ||||||
|  |      char     *server_authorized_users; | ||||||
|  | +    int       use_pkcs1_padding;
 | ||||||
|  |   | ||||||
|  |      /* boolean variables for Options */ | ||||||
|  |      int       daemon;                           /* -D option */ | ||||||
|  | diff --git a/src/iperf_api.c b/src/iperf_api.c
 | ||||||
|  | index d40561c10..7fb741e77 100644
 | ||||||
|  | --- a/src/iperf_api.c
 | ||||||
|  | +++ b/src/iperf_api.c
 | ||||||
|  | @@ -1137,6 +1137,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
 | ||||||
|  |      {"rsa-public-key-path", required_argument, NULL, OPT_CLIENT_RSA_PUBLIC_KEY}, | ||||||
|  |      {"rsa-private-key-path", required_argument, NULL, OPT_SERVER_RSA_PRIVATE_KEY}, | ||||||
|  |      {"authorized-users-path", required_argument, NULL, OPT_SERVER_AUTHORIZED_USERS}, | ||||||
|  | +    {"use-pkcs1-padding", no_argument, NULL, OPT_USE_PKCS1_PADDING},
 | ||||||
|  |  #endif /* HAVE_SSL */ | ||||||
|  |  	{"fq-rate", required_argument, NULL, OPT_FQ_RATE}, | ||||||
|  |  	{"pacing-timer", required_argument, NULL, OPT_PACING_TIMER}, | ||||||
|  | @@ -1630,6 +1631,9 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
 | ||||||
|  |          case OPT_SERVER_AUTHORIZED_USERS: | ||||||
|  |              test->server_authorized_users = strdup(optarg); | ||||||
|  |              break; | ||||||
|  | +	       case OPT_USE_PKCS1_PADDING:
 | ||||||
|  | +	           test->use_pkcs1_padding = 1;
 | ||||||
|  | +	           break;
 | ||||||
|  |  #endif /* HAVE_SSL */ | ||||||
|  |  	    case OPT_PACING_TIMER: | ||||||
|  |  		test->settings->pacing_timer = unit_atoi(optarg); | ||||||
|  | @@ -1100,7 +1104,7 @@ iperf_parse_arguments(struct iperf_test *test, int argc, char **argv)
 | ||||||
|  |              i_errno = IESETCLIENTAUTH; | ||||||
|  |              return -1; | ||||||
|  |          } | ||||||
|  | -        encode_auth_setting(client_username, client_password, client_rsa_public_key, &test->settings->authtoken);
 | ||||||
|  | +        encode_auth_setting(client_username, client_password, client_rsa_public_key, &test->settings->authtoken, test->use_pkcs1_padding);
 | ||||||
|  |      } | ||||||
|  |   | ||||||
|  |      if (test->role == 'c' && (test->server_rsa_private_key || test->server_authorized_users)){ | ||||||
|  | @@ -1346,7 +1350,7 @@ int test_is_authorized(struct iperf_test *test){
 | ||||||
|  |      if (test->settings->authtoken){ | ||||||
|  |          char *username = NULL, *password = NULL; | ||||||
|  |          time_t ts; | ||||||
|  | -        decode_auth_setting(test->debug, test->settings->authtoken, test->server_rsa_private_key, &username, &password, &ts);
 | ||||||
|  | +        decode_auth_setting(test->debug, test->settings->authtoken, test->server_rsa_private_key, &username, &password, &ts, test->use_pkcs1_padding);
 | ||||||
|  |          int ret = check_authentication(username, password, ts, test->server_authorized_users); | ||||||
|  |          if (ret == 0){ | ||||||
|  |              iperf_printf(test, report_authetication_successed, username, ts); | ||||||
|  | diff --git a/src/iperf_locale.c b/src/iperf_locale.c
 | ||||||
|  | index d5a5354..3b6860d 100644
 | ||||||
|  | --- a/src/iperf_locale.c
 | ||||||
|  | +++ b/src/iperf_locale.c
 | ||||||
|  | @@ -128,6 +128,7 @@ const char usage_longstr[] = "Usage: iperf3 [-s|-c host] [options]\n"
 | ||||||
|  |  			   "                            authentication credentials\n" | ||||||
|  |                             "  --authorized-users-path   path to the configuration file containing user\n" | ||||||
|  |                             "                            credentials\n" | ||||||
|  | +                           "  --use-pkcs1-padding       use pkcs1 padding at your own risk\n"
 | ||||||
|  |  #endif //HAVE_SSL | ||||||
|  |                             "Client specific:\n" | ||||||
|  |                             "  -c, --client    <host>    run in client mode, connecting to <host>\n" | ||||||
|  | diff --git a/src/iperf_api.h b/src/iperf_api.h
 | ||||||
|  | index 3a5df03..255227c 100755
 | ||||||
|  | --- a/src/iperf_api.h
 | ||||||
|  | +++ b/src/iperf_api.h
 | ||||||
|  | @@ -68,6 +68,7 @@ struct iperf_stream;
 | ||||||
|  |  #define OPT_SERVER_AUTHORIZED_USERS 15 | ||||||
|  |  #define OPT_PACING_TIMER 16 | ||||||
|  |  #define OPT_CONNECT_TIMEOUT 17 | ||||||
|  | +#define OPT_USE_PKCS1_PADDING 30
 | ||||||
|  |   | ||||||
|  |  /* states */ | ||||||
|  |  #define TEST_START 1 | ||||||
|  | diff --git a/src/iperf_auth.h b/src/iperf_auth.h
 | ||||||
|  | index 38971d8..1f78699 100644
 | ||||||
|  | --- a/src/iperf_auth.h
 | ||||||
|  | +++ b/src/iperf_auth.h
 | ||||||
|  | @@ -30,7 +30,7 @@
 | ||||||
|  |   | ||||||
|  |  int test_load_pubkey(const char *public_keyfile); | ||||||
|  |  int test_load_private_key(const char *private_keyfile); | ||||||
|  | -int encode_auth_setting(const char *username, const char *password, const char *public_keyfile, char **authtoken);
 | ||||||
|  | -int decode_auth_setting(int enable_debug, const char *authtoken, const char *private_keyfile, char **username, char **password, time_t *ts);
 | ||||||
|  | +int encode_auth_setting(const char *username, const char *password, const char *public_keyfile, char **authtoken, int use_pkcs1_padding);
 | ||||||
|  | +int decode_auth_setting(int enable_debug, const char *authtoken, const char *private_keyfile, char **username, char **password, time_t *ts, int use_pkcs1_padding);
 | ||||||
|  |  int check_authentication(const char *username, const char *password, const time_t ts, const char *filename); | ||||||
|  |  ssize_t iperf_getpass (char **lineptr, size_t *n, FILE *stream); | ||||||
|  | diff --git a/src/iperf3.1 b/src/iperf3.1
 | ||||||
|  | index 1be8cc3..87c3e02 100644
 | ||||||
|  | --- a/src/iperf3.1
 | ||||||
|  | +++ b/src/iperf3.1
 | ||||||
|  | @@ -155,6 +155,15 @@ send output to a log file.
 | ||||||
|  |  force flushing output at every interval. | ||||||
|  |  Used to avoid buffering when sending output to pipe. | ||||||
|  |  .TP | ||||||
|  | +.BR --use-pkcs1-padding
 | ||||||
|  | +This option is only meaningful when using iperf3's authentication
 | ||||||
|  | +features. Versions of iperf3 prior to 3.17 used PCKS1 padding in the
 | ||||||
|  | +RSA-encrypted credentials, which was vulnerable to a side-channel
 | ||||||
|  | +attack that could reveal a server's private key.  Beginning with
 | ||||||
|  | +iperf-3.17, OAEP padding is used, however this is a breaking change
 | ||||||
|  | +that is not compatible with older iperf3 versions.  Use this option to
 | ||||||
|  | +preserve the less secure, but more compatible, behavior.
 | ||||||
|  | +.TP
 | ||||||
|  |  .BR -d ", " --debug " " | ||||||
|  |  emit debugging output. | ||||||
|  |  Primarily (perhaps exclusively) of use to developers. | ||||||
|  | diff --git a/src/iperf_auth.c b/src/iperf_auth.c
 | ||||||
|  | index f8d2b0a..2d7d519 100644
 | ||||||
|  | --- a/src/iperf_auth.c
 | ||||||
|  | +++ b/src/iperf_auth.c
 | ||||||
|  | @@ -194,11 +194,12 @@ int test_load_private_key(const char *file){
 | ||||||
|  |      return 0; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -int encrypt_rsa_message(const char *plaintext, const char *public_keyfile, unsigned char **encryptedtext) {
 | ||||||
|  | +int encrypt_rsa_message(const char *plaintext, const char *public_keyfile, unsigned char **encryptedtext, int use_pkcs1_padding) {
 | ||||||
|  |      EVP_PKEY *public_key = NULL; | ||||||
|  |      RSA *rsa = NULL; | ||||||
|  | -    unsigned char *rsa_buffer = NULL, pad = RSA_PKCS1_PADDING;
 | ||||||
|  | -    int keysize, encryptedtext_len, rsa_buffer_len;
 | ||||||
|  | +    unsigned char *rsa_buffer = NULL;
 | ||||||
|  | +    size_t encryptedtext_len = 0;
 | ||||||
|  | +    int rsa_buffer_len, keysize;
 | ||||||
|  |   | ||||||
|  |      public_key = load_pubkey(public_keyfile); | ||||||
|  |      rsa = EVP_PKEY_get1_RSA(public_key); | ||||||
|  | @@ -210,20 +211,35 @@ int encrypt_rsa_message(const char *plaintext, const char *public_keyfile, unsig
 | ||||||
|  |   | ||||||
|  |      BIO *bioBuff   = BIO_new_mem_buf((void*)plaintext, (int)strlen(plaintext)); | ||||||
|  |      rsa_buffer_len = BIO_read(bioBuff, rsa_buffer, keysize * 2); | ||||||
|  | -    encryptedtext_len = RSA_public_encrypt(rsa_buffer_len, rsa_buffer, *encryptedtext, rsa, pad);
 | ||||||
|  | +
 | ||||||
|  | +    int padding = RSA_PKCS1_OAEP_PADDING;
 | ||||||
|  | +    if (use_pkcs1_padding){
 | ||||||
|  | +        padding = RSA_PKCS1_PADDING;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  | +    encryptedtext_len = RSA_public_encrypt(rsa_buffer_len, rsa_buffer, *encryptedtext, rsa, padding);
 | ||||||
|  |   | ||||||
|  |      RSA_free(rsa); | ||||||
|  |      OPENSSL_free(rsa_buffer); | ||||||
|  | -    OPENSSL_free(bioBuff);  
 | ||||||
|  | +    OPENSSL_free(bioBuff);
 | ||||||
|  | +
 | ||||||
|  | +    if (encryptedtext_len < 0) {
 | ||||||
|  | +        goto errreturn;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  | +    return encryptedtext_len;
 | ||||||
|  |   | ||||||
|  | -    return encryptedtext_len;  
 | ||||||
|  | +  errreturn:
 | ||||||
|  | +    fprintf(stderr, "%s\n", ERR_error_string(ERR_get_error(), NULL));
 | ||||||
|  | +    return 0;
 | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedtext_len, const char *private_keyfile, unsigned char **plaintext) {
 | ||||||
|  | +int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedtext_len, const char *private_keyfile, unsigned char **plaintext, int use_pkcs1_padding) {
 | ||||||
|  |      EVP_PKEY *private_key = NULL; | ||||||
|  |      RSA *rsa = NULL; | ||||||
|  | -    unsigned char *rsa_buffer = NULL, pad = RSA_PKCS1_PADDING;
 | ||||||
|  | -    int plaintext_len, rsa_buffer_len, keysize;
 | ||||||
|  | +    unsigned char *rsa_buffer = NULL;
 | ||||||
|  | +    size_t plaintext_len = 0;
 | ||||||
|  | +    int rsa_buffer_len, keysize;
 | ||||||
|  |       | ||||||
|  |      private_key = load_key(private_keyfile); | ||||||
|  |      rsa = EVP_PKEY_get1_RSA(private_key); | ||||||
|  | @@ -235,35 +250,45 @@ int decrypt_rsa_message(const unsigned char *encryptedtext, const int encryptedt
 | ||||||
|  |   | ||||||
|  |      BIO *bioBuff   = BIO_new_mem_buf((void*)encryptedtext, encryptedtext_len); | ||||||
|  |      rsa_buffer_len = BIO_read(bioBuff, rsa_buffer, keysize * 2); | ||||||
|  | -    plaintext_len = RSA_private_decrypt(rsa_buffer_len, rsa_buffer, *plaintext, rsa, pad);
 | ||||||
|  | +
 | ||||||
|  | +    int padding = RSA_PKCS1_OAEP_PADDING;
 | ||||||
|  | +    if (use_pkcs1_padding){
 | ||||||
|  | +        padding = RSA_PKCS1_PADDING;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  | +    plaintext_len = RSA_private_decrypt(rsa_buffer_len, rsa_buffer, *plaintext, rsa, padding);
 | ||||||
|  |   | ||||||
|  |      RSA_free(rsa); | ||||||
|  |      OPENSSL_free(rsa_buffer); | ||||||
|  |      OPENSSL_free(bioBuff);    | ||||||
|  |   | ||||||
|  | +    if (plaintext_len < 0) {
 | ||||||
|  | +        plaintext_len = 0;
 | ||||||
|  | +    }
 | ||||||
|  | +
 | ||||||
|  |      return plaintext_len; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -int encode_auth_setting(const char *username, const char *password, const char *public_keyfile, char **authtoken){
 | ||||||
|  | +int encode_auth_setting(const char *username, const char *password, const char *public_keyfile, char **authtoken, int use_pkcs1_padding){
 | ||||||
|  |      time_t t = time(NULL); | ||||||
|  |      time_t utc_seconds = mktime(localtime(&t)); | ||||||
|  |      char text[150]; | ||||||
|  |      sprintf (text, "user: %s\npwd:  %s\nts:   %ld", username, password, utc_seconds); | ||||||
|  |      unsigned char *encrypted = NULL; | ||||||
|  |      int encrypted_len; | ||||||
|  | -    encrypted_len = encrypt_rsa_message(text, public_keyfile, &encrypted);
 | ||||||
|  | +    encrypted_len = encrypt_rsa_message(text, public_keyfile, &encrypted, use_pkcs1_padding);
 | ||||||
|  |      Base64Encode(encrypted, encrypted_len, authtoken); | ||||||
|  |      return (0); //success | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | -int decode_auth_setting(int enable_debug, char *authtoken, const char *private_keyfile, char **username, char **password, time_t *ts){
 | ||||||
|  | +int decode_auth_setting(int enable_debug, char *authtoken, const char *private_keyfile, char **username, char **password, time_t *ts, int use_pkcs1_padding){
 | ||||||
|  |      unsigned char *encrypted_b64 = NULL; | ||||||
|  |      size_t encrypted_len_b64; | ||||||
|  |      Base64Decode(authtoken, &encrypted_b64, &encrypted_len_b64);         | ||||||
|  |   | ||||||
|  |      unsigned char *plaintext = NULL; | ||||||
|  |      int plaintext_len; | ||||||
|  | -    plaintext_len = decrypt_rsa_message(encrypted_b64, encrypted_len_b64, private_keyfile, &plaintext);
 | ||||||
|  | +    plaintext_len = decrypt_rsa_message(encrypted_b64, encrypted_len_b64, private_keyfile, &plaintext, use_pkcs1_padding);
 | ||||||
|  |      plaintext[plaintext_len] = '\0'; | ||||||
|  |   | ||||||
|  |      char s_username[20], s_password[20]; | ||||||
							
								
								
									
										244
									
								
								SOURCES/0007-cve-2024-53580.patch
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										244
									
								
								SOURCES/0007-cve-2024-53580.patch
									
									
									
									
									
										Normal file
									
								
							| @ -0,0 +1,244 @@ | |||||||
|  | From 3f66f604df7f1038a49108c48612c2f4fe71331f Mon Sep 17 00:00:00 2001 | ||||||
|  | From: Sarah Larsen <swlarsen@es.net> | ||||||
|  | Date: Fri, 15 Nov 2024 23:23:05 +0000 | ||||||
|  | Subject: [PATCH] Add a variant of cJSON_GetObjectItem that does type-checking. | ||||||
|  | 
 | ||||||
|  | This avoids a potential server crash with malformed iperf3 | ||||||
|  | parameter sets. (CVE-2024-53580) | ||||||
|  | 
 | ||||||
|  | Vulnerability report submitted by Leonid Krolle Bi.Zone. | ||||||
|  | 
 | ||||||
|  | Original version of fix by @dopheide-esnet. | ||||||
|  | ---
 | ||||||
|  |  src/iperf_api.c   | 98 +++++++++++++++++++++++------------------------ | ||||||
|  |  src/iperf_error.c |  6 +-- | ||||||
|  |  src/iperf_util.c  | 38 +++++++++++++++++- | ||||||
|  |  src/iperf_util.h  |  1 + | ||||||
|  |  4 files changed, 90 insertions(+), 53 deletions(-) | ||||||
|  | 
 | ||||||
|  | diff --git a/src/iperf_util.c b/src/iperf_util.c
 | ||||||
|  | index 22ff43a..bf2c408 100644
 | ||||||
|  | --- a/src/iperf_util.c
 | ||||||
|  | +++ b/src/iperf_util.c
 | ||||||
|  | @@ -378,6 +378,42 @@ iperf_json_printf(const char *format, ...)
 | ||||||
|  |      return o; | ||||||
|  |  } | ||||||
|  |   | ||||||
|  | +/********************** cJSON GetObjectItem w/ Type Helper ********************/
 | ||||||
|  | +cJSON * iperf_cJSON_GetObjectItemType(cJSON * j, char * item_string, int expected_type){
 | ||||||
|  | +    cJSON *j_p;
 | ||||||
|  | +    if((j_p = cJSON_GetObjectItem(j, item_string)) != NULL)
 | ||||||
|  | +        switch(expected_type){
 | ||||||
|  | +        case cJSON_True:
 | ||||||
|  | +            if(cJSON_IsBool(j_p))
 | ||||||
|  | +                return j_p;
 | ||||||
|  | +            else
 | ||||||
|  | +                iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string);
 | ||||||
|  | +            break;
 | ||||||
|  | +        case cJSON_String:
 | ||||||
|  | +            if(cJSON_IsString(j_p))
 | ||||||
|  | +                return j_p;
 | ||||||
|  | +            else
 | ||||||
|  | +                iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string);
 | ||||||
|  | +            break;
 | ||||||
|  | +        case cJSON_Number:
 | ||||||
|  | +            if(cJSON_IsNumber(j_p))
 | ||||||
|  | +                return j_p;
 | ||||||
|  | +            else
 | ||||||
|  | +                iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string);
 | ||||||
|  | +            break;
 | ||||||
|  | +        case cJSON_Array:
 | ||||||
|  | +            if(cJSON_IsArray(j_p))
 | ||||||
|  | +                return j_p;
 | ||||||
|  | +            else
 | ||||||
|  | +                iperf_err(NULL, "iperf_cJSON_GetObjectItemType mismatch %s", item_string);
 | ||||||
|  | +            break;
 | ||||||
|  | +        default:
 | ||||||
|  | +            iperf_err(NULL, "unsupported type");
 | ||||||
|  | + }
 | ||||||
|  | +
 | ||||||
|  | +    return NULL;
 | ||||||
|  | +}
 | ||||||
|  | +
 | ||||||
|  |  /* Debugging routine to dump out an fd_set. */ | ||||||
|  |  void | ||||||
|  |  iperf_dump_fdset(FILE *fp, char *str, int nfds, fd_set *fds) | ||||||
|  | diff --git a/src/iperf_util.h b/src/iperf_util.h
 | ||||||
|  | index ee1d58c..0a33214 100644
 | ||||||
|  | --- a/src/iperf_util.h
 | ||||||
|  | +++ b/src/iperf_util.h
 | ||||||
|  | @@ -51,6 +51,7 @@ const char* get_system_info(void);
 | ||||||
|  |  const char* get_optional_features(void); | ||||||
|  |   | ||||||
|  |  cJSON* iperf_json_printf(const char *format, ...); | ||||||
|  | +cJSON * iperf_cJSON_GetObjectItemType(cJSON * j_p, char * item_string, int expected_type);
 | ||||||
|  |   | ||||||
|  |  void iperf_dump_fdset(FILE *fp, char *str, int nfds, fd_set *fds); | ||||||
|  |   | ||||||
|  | diff --git a/src/iperf_error.c b/src/iperf_error.c
 | ||||||
|  | index 945984e..f90d03f 100644
 | ||||||
|  | --- a/src/iperf_error.c
 | ||||||
|  | +++ b/src/iperf_error.c
 | ||||||
|  | @@ -45,7 +45,7 @@ iperf_err(struct iperf_test *test, const char *format, ...)
 | ||||||
|  |      if (test != NULL && test->json_output && test->json_top != NULL) | ||||||
|  |  	cJSON_AddStringToObject(test->json_top, "error", str); | ||||||
|  |      else | ||||||
|  | -	if (test && test->outfile && test->outfile != stdout) {
 | ||||||
|  | +	if (test != NULL && test->outfile != NULL && test->outfile != stdout) {
 | ||||||
|  |  	    fprintf(test->outfile, "iperf3: %s\n", str); | ||||||
|  |  	} | ||||||
|  |  	else { | ||||||
|  | diff --git a/src/iperf_api.c b/src/iperf_api.c
 | ||||||
|  | index 549ffcc..34b90c2 100755
 | ||||||
|  | --- a/src/iperf_api.c
 | ||||||
|  | +++ b/src/iperf_api.c
 | ||||||
|  | @@ -1547,58 +1547,58 @@ get_parameters(struct iperf_test *test)
 | ||||||
|  |  	    printf("get_parameters:\n%s\n", cJSON_Print(j)); | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "tcp")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "tcp", cJSON_True)) != NULL)
 | ||||||
|  |  	    set_protocol(test, Ptcp); | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "udp")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "udp", cJSON_True)) != NULL)
 | ||||||
|  |  	    set_protocol(test, Pudp); | ||||||
|  | -        if ((j_p = cJSON_GetObjectItem(j, "sctp")) != NULL)
 | ||||||
|  | +        if ((j_p = iperf_cJSON_GetObjectItemType(j, "sctp", cJSON_True)) != NULL)
 | ||||||
|  |              set_protocol(test, Psctp); | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "omit")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "omit", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->omit = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "server_affinity")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "server_affinity", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->server_affinity = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "time")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "time", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->duration = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "num")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "num", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->settings->bytes = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "blockcount")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "blockcount", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->settings->blocks = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "MSS")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "MSS", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->settings->mss = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "nodelay")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "nodelay", cJSON_True)) != NULL)
 | ||||||
|  |  	    test->no_delay = 1; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "parallel")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "parallel", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->num_streams = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "reverse")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "reverse", cJSON_True)) != NULL)
 | ||||||
|  |  	    iperf_set_test_reverse(test, 1); | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "window")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "window", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->settings->socket_bufsize = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "len")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "len", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->settings->blksize = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "bandwidth")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "bandwidth", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->settings->rate = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "fqrate")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "fqrate", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->settings->fqrate = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "pacing_timer")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "pacing_timer", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->settings->pacing_timer = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "burst")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "burst", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->settings->burst = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "TOS")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "TOS", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->settings->tos = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "flowlabel")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "flowlabel", cJSON_Number)) != NULL)
 | ||||||
|  |  	    test->settings->flowlabel = j_p->valueint; | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "title")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "title", cJSON_String)) != NULL)
 | ||||||
|  |  	    test->title = strdup(j_p->valuestring); | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "congestion")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "congestion", cJSON_String)) != NULL)
 | ||||||
|  |  	    test->congestion = strdup(j_p->valuestring); | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "congestion_used")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "congestion_used", cJSON_String)) != NULL)
 | ||||||
|  |  	    test->congestion_used = strdup(j_p->valuestring); | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "get_server_output")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "get_server_output", cJSON_Number)) != NULL)
 | ||||||
|  |  	    iperf_set_test_get_server_output(test, 1); | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "udp_counters_64bit")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "udp_counters_64bit", cJSON_Number)) != NULL)
 | ||||||
|  |  	    iperf_set_test_udp_counters_64bit(test, 1); | ||||||
|  |  #if defined(HAVE_SSL) | ||||||
|  | -	if ((j_p = cJSON_GetObjectItem(j, "authtoken")) != NULL)
 | ||||||
|  | +	if ((j_p = iperf_cJSON_GetObjectItemType(j, "authtoken", cJSON_String)) != NULL)
 | ||||||
|  |          test->settings->authtoken = strdup(j_p->valuestring); | ||||||
|  |  #endif //HAVE_SSL | ||||||
|  |  	if (test->sender && test->protocol->id == Ptcp && has_tcpinfo_retransmits()) | ||||||
|  | @@ -1745,10 +1745,10 @@ get_results(struct iperf_test *test)
 | ||||||
|  |  	i_errno = IERECVRESULTS; | ||||||
|  |          r = -1; | ||||||
|  |      } else { | ||||||
|  | -	j_cpu_util_total = cJSON_GetObjectItem(j, "cpu_util_total");
 | ||||||
|  | -	j_cpu_util_user = cJSON_GetObjectItem(j, "cpu_util_user");
 | ||||||
|  | -	j_cpu_util_system = cJSON_GetObjectItem(j, "cpu_util_system");
 | ||||||
|  | -	j_sender_has_retransmits = cJSON_GetObjectItem(j, "sender_has_retransmits");
 | ||||||
|  | +	j_cpu_util_total = iperf_cJSON_GetObjectItemType(j, "cpu_util_total", cJSON_Number);
 | ||||||
|  | +	j_cpu_util_user = iperf_cJSON_GetObjectItemType(j, "cpu_util_user", cJSON_Number);
 | ||||||
|  | +	j_cpu_util_system = iperf_cJSON_GetObjectItemType(j, "cpu_util_system", cJSON_Number);
 | ||||||
|  | +	j_sender_has_retransmits = iperf_cJSON_GetObjectItemType(j, "sender_has_retransmits", cJSON_Number);
 | ||||||
|  |  	if (j_cpu_util_total == NULL || j_cpu_util_user == NULL || j_cpu_util_system == NULL || j_sender_has_retransmits == NULL) { | ||||||
|  |  	    i_errno = IERECVRESULTS; | ||||||
|  |  	    r = -1; | ||||||
|  | @@ -1763,7 +1763,7 @@ get_results(struct iperf_test *test)
 | ||||||
|  |  	    result_has_retransmits = j_sender_has_retransmits->valueint; | ||||||
|  |  	    if (! test->sender) | ||||||
|  |  		test->sender_has_retransmits = result_has_retransmits; | ||||||
|  | -	    j_streams = cJSON_GetObjectItem(j, "streams");
 | ||||||
|  | +	    j_streams = iperf_cJSON_GetObjectItemType(j, "streams", cJSON_Array);
 | ||||||
|  |  	    if (j_streams == NULL) { | ||||||
|  |  		i_errno = IERECVRESULTS; | ||||||
|  |  		r = -1; | ||||||
|  | @@ -1775,14 +1775,14 @@ get_results(struct iperf_test *test)
 | ||||||
|  |  			i_errno = IERECVRESULTS; | ||||||
|  |  			r = -1; | ||||||
|  |  		    } else { | ||||||
|  | -			j_id = cJSON_GetObjectItem(j_stream, "id");
 | ||||||
|  | -			j_bytes = cJSON_GetObjectItem(j_stream, "bytes");
 | ||||||
|  | -			j_retransmits = cJSON_GetObjectItem(j_stream, "retransmits");
 | ||||||
|  | -			j_jitter = cJSON_GetObjectItem(j_stream, "jitter");
 | ||||||
|  | -			j_errors = cJSON_GetObjectItem(j_stream, "errors");
 | ||||||
|  | -			j_packets = cJSON_GetObjectItem(j_stream, "packets");
 | ||||||
|  | -			j_start_time = cJSON_GetObjectItem(j_stream, "start_time");
 | ||||||
|  | -			j_end_time = cJSON_GetObjectItem(j_stream, "end_time");
 | ||||||
|  | +			j_id = iperf_cJSON_GetObjectItemType(j_stream, "id", cJSON_Number);
 | ||||||
|  | +			j_bytes = iperf_cJSON_GetObjectItemType(j_stream, "bytes", cJSON_Number);
 | ||||||
|  | +			j_retransmits = iperf_cJSON_GetObjectItemType(j_stream, "retransmits", cJSON_Number);
 | ||||||
|  | +			j_jitter = iperf_cJSON_GetObjectItemType(j_stream, "jitter", cJSON_Number);
 | ||||||
|  | +			j_errors = iperf_cJSON_GetObjectItemType(j_stream, "errors", cJSON_Number);
 | ||||||
|  | +			j_packets = iperf_cJSON_GetObjectItemType(j_stream, "packets", cJSON_Number);
 | ||||||
|  | +			j_start_time = iperf_cJSON_GetObjectItemType(j_stream, "start_time", cJSON_Number);
 | ||||||
|  | +			j_end_time = iperf_cJSON_GetObjectItemType(j_stream, "end_time", cJSON_Number);
 | ||||||
|  |  			if (j_id == NULL || j_bytes == NULL || j_retransmits == NULL || j_jitter == NULL || j_errors == NULL || j_packets == NULL) { | ||||||
|  |  			    i_errno = IERECVRESULTS; | ||||||
|  |  			    r = -1; | ||||||
|  | @@ -1846,7 +1846,7 @@ get_results(struct iperf_test *test)
 | ||||||
|  |  		    } | ||||||
|  |  		    else { | ||||||
|  |  			/* No JSON, look for textual output.  Make a copy of the text for later. */ | ||||||
|  | -			j_server_output = cJSON_GetObjectItem(j, "server_output_text");
 | ||||||
|  | +			j_server_output = iperf_cJSON_GetObjectItemType(j, "server_output_text", cJSON_String);
 | ||||||
|  |  			if (j_server_output != NULL) { | ||||||
|  |  			    test->server_output_text = strdup(j_server_output->valuestring); | ||||||
|  |  			} | ||||||
|  | @@ -1855,7 +1855,7 @@ get_results(struct iperf_test *test)
 | ||||||
|  |  	    } | ||||||
|  |  	} | ||||||
|  |   | ||||||
|  | -	j_remote_congestion_used = cJSON_GetObjectItem(j, "congestion_used");
 | ||||||
|  | +	j_remote_congestion_used = iperf_cJSON_GetObjectItemType(j, "congestion_used", cJSON_String);
 | ||||||
|  |  	if (j_remote_congestion_used != NULL) { | ||||||
|  |  	    test->remote_congestion_used = strdup(j_remote_congestion_used->valuestring); | ||||||
|  |  	} | ||||||
| @ -1,6 +1,6 @@ | |||||||
| Name:           iperf3 | Name:           iperf3 | ||||||
| Version:        3.5 | Version:        3.5 | ||||||
| Release:        6%{?dist} | Release:        11%{?dist} | ||||||
| Summary:        Measurement tool for TCP/UDP bandwidth performance | Summary:        Measurement tool for TCP/UDP bandwidth performance | ||||||
| 
 | 
 | ||||||
| Group:          Applications/Internet | Group:          Applications/Internet | ||||||
| @ -13,6 +13,10 @@ BuildRequires:  openssl-devel | |||||||
| 
 | 
 | ||||||
| Patch0002:	0002-udp-counters-manpage.patch | Patch0002:	0002-udp-counters-manpage.patch | ||||||
| Patch0003:	0003-covscan-sctp.patch | Patch0003:	0003-covscan-sctp.patch | ||||||
|  | Patch0004:	0004-cve-2023-38403.patch | ||||||
|  | Patch0005:	0005-cve-2023-7250.patch | ||||||
|  | Patch0006:	0006-cve-2024-26306.patch | ||||||
|  | Patch0007:	0007-cve-2024-53580.patch | ||||||
| 
 | 
 | ||||||
| %description | %description | ||||||
| Iperf is a tool to measure maximum TCP bandwidth, allowing the tuning of | Iperf is a tool to measure maximum TCP bandwidth, allowing the tuning of | ||||||
| @ -60,6 +64,22 @@ rm -f %{buildroot}%{_libdir}/libiperf.la | |||||||
| %{_libdir}/*.so | %{_libdir}/*.so | ||||||
| 
 | 
 | ||||||
| %changelog | %changelog | ||||||
|  | * Wed Jan 08 2025 Michal Ruprich <mruprich@redhat.com> - 3.5-11 | ||||||
|  | - Resolves: RHEL-72924 - Denial of Service in iperf Due to Improper JSON Handling | ||||||
|  | 
 | ||||||
|  | * Tue Jun 11 2024 Michal Ruprich <mruprich@redhat.com> - 3.5-10 | ||||||
|  | - Resolves: RHEL-29578 - vulnerable to marvin attack if the authentication option is used | ||||||
|  | 
 | ||||||
|  | * Tue Jun 04 2024 Michal Ruprich <mruprich@redhat.com> - 3.5-9 | ||||||
|  | - Resolves: RHEL-17069 - possible denial of service | ||||||
|  | 
 | ||||||
|  | * Fri Jul 28 2023 Michal Ruprich <mruprich@redhat.com> - 3.5-8 | ||||||
|  | - Related: #2222205 - bumping nvr for correct update path | ||||||
|  | 
 | ||||||
|  | * Tue Jul 18 2023 Jonathan Wright <jonathan@almalinux.org> - 3.5-7 | ||||||
|  | - Fixes CVE-2023-38403 | ||||||
|  |   Resolves: rhbz#2223729 | ||||||
|  | 
 | ||||||
| * Tue May 05 2020 Michal Ruprich <michalruprich@gmail.com> - 3.5-6 | * Tue May 05 2020 Michal Ruprich <michalruprich@gmail.com> - 3.5-6 | ||||||
| - Related: #1665142 - Fixing a couple of covscan issues | - Related: #1665142 - Fixing a couple of covscan issues | ||||||
| 
 | 
 | ||||||
|  | |||||||
		Loading…
	
		Reference in New Issue
	
	Block a user