Package: release.debian.org Severity: normal Tags: buster User: release.debian....@packages.debian.org Usertags: pu X-Debbugs-Cc: Debian FreeRADIUS Packaging Team <pkg-freeradius-maintain...@lists.alioth.debian.org>
* CVE-2019-13456: side-channel leak where 1 in 2048 handshakes fail * CVE-2019-17185: DoS due to multithreaded BN_CTX access * Add upstream fix for a crash bug. (Closes: #992036) This fixes 2 CVEs (already fixed in bullseye), and a crash that has been already fixed in a bullseye point release.
diff -Nru freeradius-3.0.17+dfsg/debian/changelog freeradius-3.0.17+dfsg/debian/changelog --- freeradius-3.0.17+dfsg/debian/changelog 2019-04-23 00:23:36.000000000 +0300 +++ freeradius-3.0.17+dfsg/debian/changelog 2022-08-27 22:29:38.000000000 +0300 @@ -1,3 +1,12 @@ +freeradius (3.0.17+dfsg-1.1+deb10u1) buster; urgency=medium + + * Non-maintainer upload. + * CVE-2019-13456: side-channel leak where 1 in 2048 handshakes fail + * CVE-2019-17185: DoS due to multithreaded BN_CTX access + * Add upstream fix for a crash bug. (Closes: #992036) + + -- Adrian Bunk <b...@debian.org> Sat, 27 Aug 2022 22:29:38 +0300 + freeradius (3.0.17+dfsg-1.1) unstable; urgency=high * Non-maintainer upload. diff -Nru freeradius-3.0.17+dfsg/debian/patches/0001-EAP-pwd-fix-DoS-due-to-multithreaded-BN_CTX-access.patch freeradius-3.0.17+dfsg/debian/patches/0001-EAP-pwd-fix-DoS-due-to-multithreaded-BN_CTX-access.patch --- freeradius-3.0.17+dfsg/debian/patches/0001-EAP-pwd-fix-DoS-due-to-multithreaded-BN_CTX-access.patch 1970-01-01 02:00:00.000000000 +0200 +++ freeradius-3.0.17+dfsg/debian/patches/0001-EAP-pwd-fix-DoS-due-to-multithreaded-BN_CTX-access.patch 2022-08-27 22:27:54.000000000 +0300 @@ -0,0 +1,137 @@ +From 6b522f8780813726799e6b8cf0f1f8e0ce2c8ebf Mon Sep 17 00:00:00 2001 +From: Mathy Vanhoef <mathy.vanh...@nyu.edu> +Date: Fri, 4 Oct 2019 17:53:52 +0400 +Subject: EAP-pwd: fix DoS due to multithreaded BN_CTX access + +The EAP-pwd module created one global OpenSSL BN_CTX instance, and +used this instance in all incoming requests. This means that different +threads used the same BN_CTX instance, which can result in a crash. +An adversary can trigger these crashes by concurrently initiating +multiple EAP-pwd handshakes from different clients. + +Fix this bug by creating a separate BN_CTX instance for each request. +--- + .../rlm_eap/types/rlm_eap_pwd/eap_pwd.h | 1 + + .../rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.c | 24 +++++++++---------- + .../rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.h | 2 -- + 3 files changed, 13 insertions(+), 14 deletions(-) + +diff --git a/src/modules/rlm_eap/types/rlm_eap_pwd/eap_pwd.h b/src/modules/rlm_eap/types/rlm_eap_pwd/eap_pwd.h +index 013a6e7992..ca12778f61 100644 +--- a/src/modules/rlm_eap/types/rlm_eap_pwd/eap_pwd.h ++++ b/src/modules/rlm_eap/types/rlm_eap_pwd/eap_pwd.h +@@ -90,6 +90,7 @@ typedef struct _pwd_session_t { + uint8_t *out; /* message to fragment */ + size_t out_pos; + size_t out_len; ++ BN_CTX *bnctx; + EC_GROUP *group; + EC_POINT *pwe; + BIGNUM *order; +diff --git a/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.c b/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.c +index 76cc57023e..eefca985d7 100644 +--- a/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.c ++++ b/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.c +@@ -55,8 +55,6 @@ static int mod_detach (void *arg) + + inst = (eap_pwd_t *) arg; + +- if (inst->bnctx) BN_CTX_free(inst->bnctx); +- + return 0; + } + +@@ -76,11 +74,6 @@ static int mod_instantiate (CONF_SECTION *cs, void **instance) + return -1; + } + +- if ((inst->bnctx = BN_CTX_new()) == NULL) { +- cf_log_err_cs(cs, "Failed to get BN context"); +- return -1; +- } +- + return 0; + } + +@@ -96,6 +89,7 @@ static int _free_pwd_session (pwd_session_t *session) + EC_POINT_clear_free(session->pwe); + BN_clear_free(session->order); + BN_clear_free(session->prime); ++ BN_CTX_free(session->bnctx); + + return 0; + } +@@ -217,6 +211,12 @@ static int mod_session_init (void *instance, eap_handler_t *handler) + session->order = NULL; + session->prime = NULL; + ++ session->bnctx = BN_CTX_new(); ++ if (session->bnctx == NULL) { ++ ERROR("rlm_eap_pwd: Failed to get BN context"); ++ return 0; ++ } ++ + /* + * The admin can dynamically change the MTU. + */ +@@ -496,7 +496,7 @@ static int mod_process(void *arg, eap_handler_t *handler) + /* + * compute our scalar and element + */ +- if (compute_scalar_element(session, inst->bnctx)) { ++ if (compute_scalar_element(session, session->bnctx)) { + DEBUG2("failed to compute server's scalar and element"); + return 0; + } +@@ -508,7 +508,7 @@ static int mod_process(void *arg, eap_handler_t *handler) + * element is a point, get both coordinates: x and y + */ + if (!EC_POINT_get_affine_coordinates_GFp(session->group, session->my_element, x, y, +- inst->bnctx)) { ++ session->bnctx)) { + DEBUG2("server point assignment failed"); + BN_clear_free(x); + BN_clear_free(y); +@@ -552,7 +552,7 @@ static int mod_process(void *arg, eap_handler_t *handler) + /* + * process the peer's commit and generate the shared key, k + */ +- if (process_peer_commit(session, in, in_len, inst->bnctx)) { ++ if (process_peer_commit(session, in, in_len, session->bnctx)) { + RDEBUG2("failed to process peer's commit"); + return 0; + } +@@ -560,7 +560,7 @@ static int mod_process(void *arg, eap_handler_t *handler) + /* + * compute our confirm blob + */ +- if (compute_server_confirm(session, session->my_confirm, inst->bnctx)) { ++ if (compute_server_confirm(session, session->my_confirm, session->bnctx)) { + ERROR("rlm_eap_pwd: failed to compute confirm!"); + return 0; + } +@@ -591,7 +591,7 @@ static int mod_process(void *arg, eap_handler_t *handler) + RDEBUG2("pwd exchange is incorrect: not commit!"); + return 0; + } +- if (compute_peer_confirm(session, peer_confirm, inst->bnctx)) { ++ if (compute_peer_confirm(session, peer_confirm, session->bnctx)) { + RDEBUG2("pwd exchange cannot compute peer's confirm"); + return 0; + } +diff --git a/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.h b/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.h +index 189530d066..2264566bb6 100644 +--- a/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.h ++++ b/src/modules/rlm_eap/types/rlm_eap_pwd/rlm_eap_pwd.h +@@ -40,8 +40,6 @@ + #include <freeradius-devel/modules.h> + + typedef struct _eap_pwd_t { +- BN_CTX *bnctx; +- + uint32_t group; + uint32_t fragment_size; + char const *server_id; +-- +2.30.2 + diff -Nru freeradius-3.0.17+dfsg/debian/patches/0001-EAP-pwd-fix-side-channel-leak-where-1-in-2018-handsh.patch freeradius-3.0.17+dfsg/debian/patches/0001-EAP-pwd-fix-side-channel-leak-where-1-in-2018-handsh.patch --- freeradius-3.0.17+dfsg/debian/patches/0001-EAP-pwd-fix-side-channel-leak-where-1-in-2018-handsh.patch 1970-01-01 02:00:00.000000000 +0200 +++ freeradius-3.0.17+dfsg/debian/patches/0001-EAP-pwd-fix-side-channel-leak-where-1-in-2018-handsh.patch 2022-08-27 22:28:06.000000000 +0300 @@ -0,0 +1,40 @@ +From 3ea2a5a026e73d81cd9a3e9bbd4300c433004bfa Mon Sep 17 00:00:00 2001 +From: Mathy Vanhoef <mathy.vanh...@nyu.edu> +Date: Wed, 5 Jun 2019 19:21:06 +0000 +Subject: EAP-pwd: fix side-channel leak where 1 in 2018 handshakes fail + +Previously the Hunting and Pecking algorithm of EAP-pwd aborted when +more than 10 iterations are needed. Every iteration has a 50% chance +of finding the password element. This means one in every 2048 handshakes +will fail, in which case an error frame is sent to the client. This +event leaks information that can be abused in an offline password +brute-force attack. More precisely, the adversary learns that all 10 +iterations failed for the given random EAP-pwd token. Using the same +techniques as in the Dragonblood attack, this can be used to brute-force +the password. + +This patch fixes the above issue by executing enough iterations such that +the password element is always found eventually. + +Note that timing and cache leaks remain a risk against the current +implementation of EAP-pwd. +--- + src/modules/rlm_eap/types/rlm_eap_pwd/eap_pwd.c | 2 +- + 1 file changed, 1 insertion(+), 1 deletion(-) + +diff --git a/src/modules/rlm_eap/types/rlm_eap_pwd/eap_pwd.c b/src/modules/rlm_eap/types/rlm_eap_pwd/eap_pwd.c +index c54f08c030..d94851c3aa 100644 +--- a/src/modules/rlm_eap/types/rlm_eap_pwd/eap_pwd.c ++++ b/src/modules/rlm_eap/types/rlm_eap_pwd/eap_pwd.c +@@ -192,7 +192,7 @@ int compute_password_element (pwd_session_t *session, uint16_t grp_num, + } + ctr = 0; + while (1) { +- if (ctr > 10) { ++ if (ctr > 100) { + DEBUG("unable to find random point on curve for group %d, something's fishy", grp_num); + goto fail; + } +-- +2.30.2 + diff -Nru freeradius-3.0.17+dfsg/debian/patches/allocate-from-the-request.diff freeradius-3.0.17+dfsg/debian/patches/allocate-from-the-request.diff --- freeradius-3.0.17+dfsg/debian/patches/allocate-from-the-request.diff 1970-01-01 02:00:00.000000000 +0200 +++ freeradius-3.0.17+dfsg/debian/patches/allocate-from-the-request.diff 2022-08-27 22:25:46.000000000 +0300 @@ -0,0 +1,34 @@ +From 7875ca06d1e312f55107c5e369097c7cb5369b53 Mon Sep 17 00:00:00 2001 +From: "Alan T. DeKok" <al...@freeradius.org> +Date: Thu, 5 Aug 2021 11:22:12 -0400 +Subject: [PATCH] allocate from the request, which is thread-safe. Helps with + #3188 + +The "check" item is taken from the "huntgroups" file. It's in +a statically allocated list which doesn't change, and shouldn't +change during run-time. Allocating memory in its context is +not thread-safe, and can cause issues +--- + src/main/pair.c | 4 ++-- + 1 file changed, 2 insertions(+), 2 deletions(-) + +diff --git a/src/main/pair.c b/src/main/pair.c +index 2f736d74cf7..3725ba1e10b 100644 +--- a/src/main/pair.c ++++ b/src/main/pair.c +@@ -84,13 +84,13 @@ int radius_compare_vps(UNUSED REQUEST *request, VALUE_PAIR *check, VALUE_PAIR *v + if (check->da->type == PW_TYPE_STRING) { + expr_p = check->vp_strvalue; + } else { +- expr_p = expr = vp_aprints_value(check, check, '\0'); ++ expr_p = expr = vp_aprints_value(request, check, '\0'); + } + + if (vp->da->type == PW_TYPE_STRING) { + value_p = vp->vp_strvalue; + } else { +- value_p = value = vp_aprints_value(vp, vp, '\0'); ++ value_p = value = vp_aprints_value(request, vp, '\0'); + } + + if (!expr_p || !value_p) { diff -Nru freeradius-3.0.17+dfsg/debian/patches/series freeradius-3.0.17+dfsg/debian/patches/series --- freeradius-3.0.17+dfsg/debian/patches/series 2019-04-23 00:23:36.000000000 +0300 +++ freeradius-3.0.17+dfsg/debian/patches/series 2022-08-27 22:29:25.000000000 +0300 @@ -10,3 +10,6 @@ snakeoil-certs.diff CVE-2019-11234-1.patch CVE-2019-11234-2.patch +0001-EAP-pwd-fix-DoS-due-to-multithreaded-BN_CTX-access.patch +0001-EAP-pwd-fix-side-channel-leak-where-1-in-2018-handsh.patch +allocate-from-the-request.diff