Bug 2183447

Summary: Crash when verifying a client certificate
Product: Red Hat Enterprise Linux 9 Reporter: Renaud Métrich <rmetrich>
Component: freeradiusAssignee: Antonio Torres <antorres>
Status: CLOSED ERRATA QA Contact: Michal Polovka <mpolovka>
Severity: high Docs Contact:
Priority: high    
Version: 9.1CC: aland, antorres, frenaud, nikolai.kondrashov, vogt
Target Milestone: rcKeywords: Triaged
Target Release: ---Flags: pm-rhel: mirror+
Hardware: All   
OS: Linux   
Whiteboard:
Fixed In Version: freeradius-3.0.21-38.el9 Doc Type: No Doc Update
Doc Text:
Story Points: ---
Clone Of: Environment:
Last Closed: 2023-11-07 08:33:01 UTC Type: Bug
Regression: --- Mount Type: ---
Documentation: --- CRM:
Verified Versions: Category: ---
oVirt Team: --- RHEL 7.3 requirements from Atomic Host:
Cloudforms Team: --- Target Upstream Version:
Embargoed:

Description Renaud Métrich 2023-03-31 07:41:59 UTC
Description of problem:

We have a customer encountering a crash of radiusd when `cbtls_verity()` executes:
-------- 8< ---------------- 8< ---------------- 8< ---------------- 8< --------
(gdb) f 6
#6  0x000055ce87cc8992 in cbtls_verify (ok=1, ctx=0x55ce894cb7b0) at src/main/tls.c:3007
3007		RDEBUG2("(TLS) Creating attributes from %s certificate", cert_names[lookup]);
(gdb) p err
$1 = 0
(gdb) p depth
$2 = 3
(gdb) p lookup
$3 = 3
(gdb) p cert_names
$4 = {0x55ce87cda04f "client", 0x55ce87cd5871 "server"}
-------- 8< ---------------- 8< ---------------- 8< ---------------- 8< --------

Here above, we can see that "lookup" is out of range, it should be only 0 or 1, but is 3 here.
"lookup" is initially set to "depth" variable, which doesn't make sense to me since there was no error with the certificate:
-------- 8< ---------------- 8< ---------------- 8< ---------------- 8< --------
2936 int cbtls_verify(int ok, X509_STORE_CTX *ctx)
2937 {
 :
2970         client_cert = X509_STORE_CTX_get_current_cert(ctx);
2971         err = X509_STORE_CTX_get_error(ctx);
2972         depth = X509_STORE_CTX_get_error_depth(ctx);
2973 
2974 HERE>>  lookup = depth;
2975 
2976         /*
2977          *      Log client/issuing cert.  If there's an error, log
2978          *      issuing cert.
2979          */
2980         if ((lookup > 1) && !my_ok) lookup = 1;
-------- 8< ---------------- 8< ---------------- 8< ---------------- 8< --------

I don't understand the logic behind setting "lookup" to "depth" at all, IMHO it should be set to 0 (since it's a client cert here).
Upstream v3.0.x branch has exact same code (which disappeared with more recent branches).

Version-Release number of selected component (if applicable):

freeradius-3.0.21-34.el9

How reproducible:

Always on customer system when doing when doing EAP-TLS

Additional info:

Coredump available in initial customer case if needed.

Comment 17 aland 2023-05-26 20:02:17 UTC
See the v3.0.x branch.  All uses of cert_attr_names[FR_TLS_ISSUER][lookup] are protected by a check: if (lookup <= 1) ...

Comment 26 errata-xmlrpc 2023-11-07 08:33:01 UTC
Since the problem described in this bug report should be
resolved in a recent advisory, it has been closed with a
resolution of ERRATA.

For information on the advisory (freeradius bug fix and enhancement update), and where to find the updated
files, follow the link below.

If the solution does not work for you, open a new bug report.

https://access.redhat.com/errata/RHBA-2023:6443