kdc: reject kx509 requests when disabled

Fixes #1378.
This commit is contained in:
Roland C. Dowdeswell
2026-05-28 16:56:18 +01:00
committed by Nico Williams
parent 421c40c73e
commit e1ab030717
3 changed files with 35 additions and 19 deletions
+12 -19
View File
@@ -399,7 +399,6 @@ mk_error_response(krb5_context context,
Kx509Response rep;
const char *msg;
char *freeme0 = NULL;
char *freeme1 = NULL;
va_list ap;
if (code != 0) {
@@ -417,9 +416,6 @@ mk_error_response(krb5_context context,
va_end(ap);
}
if (!reqctx->config->enable_kx509)
code = KRB5KDC_ERR_POLICY;
/* Make sure we only send RFC4120 and friends wire protocol error codes */
if (code) {
if (code == KX509_ERR_NONE) {
@@ -441,12 +437,6 @@ mk_error_response(krb5_context context,
msg = freeme0;
va_end(ap);
if (!reqctx->config->enable_kx509 &&
asprintf(&freeme1, "kx509 service is disabled (%s)", msg) > -1 &&
freeme1 != NULL) {
msg = freeme1;
}
rep.hash = NULL;
rep.certificate = NULL;
rep.error_code = code;
@@ -468,7 +458,6 @@ mk_error_response(krb5_context context,
free(rep.e_text);
free(rep.hash);
free(freeme0);
free(freeme1);
return ret;
}
@@ -900,14 +889,15 @@ _kdc_do_kx509(kx509_req_context r)
if (r->req.authenticator.length == 0) {
/*
* Unauthenticated kx509 service availability probe.
*
* mk_error_response() will check whether the service is enabled and
* possibly change the error code and message.
*/
is_probe = 1;
kdc_audit_addkv((kdc_request_t)r, 0, "probe", "unauthenticated");
ret = mk_error_response(r->context, r, 4, 0,
"kx509 service is available");
if (!r->config->enable_kx509)
ret = mk_error_response(r->context, r, 4, KRB5KDC_ERR_POLICY,
"kx509 service is disabled");
else
ret = mk_error_response(r->context, r, 4, 0,
"kx509 service is available");
goto out;
}
@@ -938,6 +928,12 @@ _kdc_do_kx509(kx509_req_context r)
* Provided we got the session key, errors past this point will be
* authenticated.
*/
if (ret == 0 && !r->config->enable_kx509) {
ret = mk_error_response(r->context, r, 4, KRB5KDC_ERR_POLICY,
"kx509 service is disabled");
goto out;
}
if (ret == 0)
ret = krb5_ticket_get_client(r->context, ticket, &cprincipal);
@@ -983,9 +979,6 @@ _kdc_do_kx509(kx509_req_context r)
if (r->req.pk_key.length == 0) {
/*
* The request is an authenticated kx509 service availability probe.
*
* mk_error_response() will check whether the service is enabled and
* possibly change the error code and message.
*/
is_probe = 1;
kdc_audit_addkv((kdc_request_t)r, 0, "probe", "authenticated");
+1
View File
@@ -361,6 +361,7 @@ CLEANFILES= \
krb5-master2.conf \
krb5-pkinit-win.conf \
krb5-pkinit.conf \
krb5-pkinit-no-kx509.conf \
krb5-pkinit2.conf \
krb5-bx509.conf \
krb5-httpkadmind.conf \
+22
View File
@@ -195,6 +195,8 @@ ${hxtool} issue-certificate \
--certificate="FILE:kx509-template.crt" || exit 1
echo foo > ${objdir}/foopassword
sed 's/enable_kx509 = true/enable_kx509 = false/g' \
"${objdir}/krb5-pkinit.conf" > "${objdir}/krb5-pkinit-no-kx509.conf" || exit 1
echo Starting kdc ; > messages.log
KRB5_CONFIG="${objdir}/krb5-pkinit2.conf"
@@ -283,6 +285,26 @@ fi
echo "Check kx509 certificate acquisition"
${kx509} -s || { ec=1 ; eval "${testfailed}"; }
${kx509} -o PEM-FILE:${objdir}/kx509.pem || { ec=1 ; eval "${testfailed}"; }
${kx509} -K FILE:${keyfile2} \
-o PEM-FILE:${objdir}/kx509-keyed.pem || { ec=1 ; eval "${testfailed}"; }
echo "Restarting kdc with kx509 disabled ($kdcpid)"
sh ${leaks_kill} kdc $kdcpid || ec=1
KRB5_CONFIG="${objdir}/krb5-pkinit-no-kx509.conf"
${kdc} --detach --testing || { echo "kdc failed to start"; cat messages.log; exit 1; }
kdcpid=`getpid kdc`
echo "Check kx509 cannot be bypassed when disabled"; > messages.log
${kx509} -K FILE:${keyfile2} \
-o PEM-FILE:${objdir}/kx509-disabled.pem 2>/dev/null && \
{ echo "kx509 succeeded while [kdc] enable_kx509 was false"; ec=1 ; eval "${testfailed}"; }
echo "Restarting kdc with kx509 enabled ($kdcpid)"
sh ${leaks_kill} kdc $kdcpid || ec=1
KRB5_CONFIG="${objdir}/krb5-pkinit.conf"
${kdc} --detach --testing || { echo "kdc failed to start"; cat messages.log; exit 1; }
kdcpid=`getpid kdc`
${kdestroy}
echo "Check PKINIT w/ kx509 certificate"