From nobody Wed Feb 21 13:43:14 2024 X-Original-To: dev-commits-src-all@mlmmj.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mlmmj.nyi.freebsd.org (Postfix) with ESMTP id 4TfyCR1nN1z5CCqZ; Wed, 21 Feb 2024 13:43:15 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "R3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4TfyCR0fyBz4cYp; Wed, 21 Feb 2024 13:43:15 +0000 (UTC) (envelope-from git@FreeBSD.org) DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708522995; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=1MOi2jlwEfKoxD+IjmX95SeqNMB0tB6dC395mQUr0Q0=; b=chnCKKPsxvSuRlVwz0q4cqTwO/Kw3jYwMv31A5uhV8m83iTbjdmUctzmZjSl6CJOZXqGJi HMEBQPGMGEL5hB99Oy7BSGuxXPuV5ON+qA6+cax8BOQBh87ntzH9B3eLKj0ktRhAQC7+fE ljCq/iTh7/Q4JjkOrwE/2s+WBL4ge4NxcPL+Br4hAAkP8T8DcA7DaccWn87Bf1zW1PahQQ ObRzsPhFsmoawLB26IsLP4rczWBwU0Px1DIhe4Lv3VBila7fj22kIg5glSK8cZ0pyHOBRr CCUeifpt/rarpj9CXRhmCE+Ki95fX/vgeGlpo7ruiF5ArdROTKDAvf/CqZFUJw== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=freebsd.org; s=dkim; t=1708522995; h=from:from:reply-to:subject:subject:date:date:message-id:message-id: to:to:cc:mime-version:mime-version:content-type:content-type: content-transfer-encoding:content-transfer-encoding; bh=1MOi2jlwEfKoxD+IjmX95SeqNMB0tB6dC395mQUr0Q0=; b=EvfQjlGlbeLTRopbUaAzOXp/yaGolCnjbjwsCIsyNwnfLfjScERFwT56LTGvAYkrBW8CU0 Ng2nw1uEWH62ur7HKYbcTgd5hxjerZ6yVSqM48LKKJ93nreLLc1ZsCRRnguTCbH3al3FJC taPg23IkILKy0NOB0q52bdsE+WraDwp/Ti4YBr0Xj8nh0i1ZAWrhl/LNxLF13IYmVFccUO 7TgVRsQrZ0KyaGJ0SLvkCKEWw897DbmQ71gvRqwwyY6mnzGdeiDAfJHX1Omjv4fl18HTr/ kFRPLYo6bW/NRSiMGFc4BIqoJJAxwgfJbgl/4QADIAimXnnN3g5Q6IKh1tfgsw== ARC-Authentication-Results: i=1; mx1.freebsd.org; none ARC-Seal: i=1; s=dkim; d=freebsd.org; t=1708522995; a=rsa-sha256; cv=none; b=wgV9X7c7vpQ6y+4bGMnaCbBbg8cPEgEgzqwoTqu3HjIxmJ0zkIJzdBfcZ8BJypHwFtvc6X ghCEsD7kJirSL7Nna7QU6WHABXYnOxpb3GnGCo1IX4eK75l7WwQOhFTiFQNHgO0ccjljVq UlTj5Q2E2M96An1jXscSAYpQQsSS87Qx0Jrprfjg7mSGaaKiAF9lLDlj0VjYxO36BVStcT DWsvo70pAkKYhvCfD6fTZzp9ji3+EsLdv8qGLoqmm3wdsoK/6xK0EmVtJFopXRkA18OiQo Zzz9yogNBRW5X7gv34WUreIP+u/DWOSEhOuZiiVWHLWk/elD/req3xnaCcqKjw== Received: from gitrepo.freebsd.org (gitrepo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:5]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id 4TfyCQ6YsYz14nP; Wed, 21 Feb 2024 13:43:14 +0000 (UTC) (envelope-from git@FreeBSD.org) Received: from gitrepo.freebsd.org ([127.0.1.44]) by gitrepo.freebsd.org (8.17.1/8.17.1) with ESMTP id 41LDhEAs048389; Wed, 21 Feb 2024 13:43:14 GMT (envelope-from git@gitrepo.freebsd.org) Received: (from git@localhost) by gitrepo.freebsd.org (8.17.1/8.17.1/Submit) id 41LDhE0Q048386; Wed, 21 Feb 2024 13:43:14 GMT (envelope-from git) Date: Wed, 21 Feb 2024 13:43:14 GMT Message-Id: <202402211343.41LDhE0Q048386@gitrepo.freebsd.org> To: src-committers@FreeBSD.org, dev-commits-src-all@FreeBSD.org, dev-commits-src-branches@FreeBSD.org From: Cy Schubert Subject: git: b1b256dd0f4d - stable/14 - heimdal: always confirm PA-PKINIT-KX for anon PKINIT List-Id: Commit messages for all branches of the src repository List-Archive: https://lists.freebsd.org/archives/dev-commits-src-all List-Help: List-Post: List-Subscribe: List-Unsubscribe: Sender: owner-dev-commits-src-all@freebsd.org X-BeenThere: dev-commits-src-all@freebsd.org MIME-Version: 1.0 Content-Type: text/plain; charset=utf-8 Content-Transfer-Encoding: 8bit X-Git-Committer: cy X-Git-Repository: src X-Git-Refname: refs/heads/stable/14 X-Git-Reftype: branch X-Git-Commit: b1b256dd0f4dd9ec7c03caf5a60e9928dc0fe39a Auto-Submitted: auto-generated The branch stable/14 has been updated by cy: URL: https://cgit.FreeBSD.org/src/commit/?id=b1b256dd0f4dd9ec7c03caf5a60e9928dc0fe39a commit b1b256dd0f4dd9ec7c03caf5a60e9928dc0fe39a Author: Cy Schubert AuthorDate: 2024-02-15 01:58:06 +0000 Commit: Cy Schubert CommitDate: 2024-02-21 13:42:58 +0000 heimdal: always confirm PA-PKINIT-KX for anon PKINIT Import upstream 38c797e1a. Upstream notes: RFC8062 Section 7 requires verification of the PA-PKINIT-KX key excahnge when anonymous PKINIT is used. Failure to do so can permit an active attacker to become a man-in-the-middle. Reported by: emaste Obtained from: upstream 38c797e1a Security: CVE-2019-12098 (cherry picked from commit 60616b445eb5b01597092fef5b14549f95000130) --- crypto/heimdal/lib/krb5/krb5_locl.h | 1 + crypto/heimdal/lib/krb5/pkinit.c | 92 +++++++++++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/crypto/heimdal/lib/krb5/krb5_locl.h b/crypto/heimdal/lib/krb5/krb5_locl.h index d0c68927ffbd..0ea132f94c82 100644 --- a/crypto/heimdal/lib/krb5/krb5_locl.h +++ b/crypto/heimdal/lib/krb5/krb5_locl.h @@ -240,6 +240,7 @@ struct _krb5_get_init_creds_opt_private { #define KRB5_INIT_CREDS_CANONICALIZE 1 #define KRB5_INIT_CREDS_NO_C_CANON_CHECK 2 #define KRB5_INIT_CREDS_NO_C_NO_EKU_CHECK 4 +#define KRB5_INIT_CREDS_PKINIT_KX_VALID 32 struct { krb5_gic_process_last_req func; void *ctx; diff --git a/crypto/heimdal/lib/krb5/pkinit.c b/crypto/heimdal/lib/krb5/pkinit.c index 7164a118c34a..3c914bb31f35 100644 --- a/crypto/heimdal/lib/krb5/pkinit.c +++ b/crypto/heimdal/lib/krb5/pkinit.c @@ -1306,6 +1306,98 @@ pk_rd_pa_reply_enckey(krb5_context context, return ret; } +/* + * RFC 8062 section 7: + * + * The client then decrypts the KDC contribution key and verifies that + * the ticket session key in the returned ticket is the combined key of + * the KDC contribution key and the reply key. + */ +KRB5_LIB_FUNCTION krb5_error_code KRB5_LIB_CALL +_krb5_pk_kx_confirm(krb5_context context, + krb5_pk_init_ctx ctx, + krb5_keyblock *reply_key, + krb5_keyblock *session_key, + PA_DATA *pa_pkinit_kx) +{ + krb5_error_code ret; + EncryptedData ed; + krb5_keyblock ck, sk_verify; + krb5_crypto ck_crypto = NULL; + krb5_crypto rk_crypto = NULL; + size_t len; + krb5_data data; + krb5_data p1 = { sizeof("PKINIT") - 1, "PKINIT" }; + krb5_data p2 = { sizeof("KEYEXCHANGE") - 1, "KEYEXCHANGE" }; + + heim_assert(ctx != NULL, "PKINIT context is non-NULL"); + heim_assert(reply_key != NULL, "reply key is non-NULL"); + heim_assert(session_key != NULL, "session key is non-NULL"); + + /* PA-PKINIT-KX is optional unless anonymous */ + if (pa_pkinit_kx == NULL) + return ctx->anonymous ? KRB5_KDCREP_MODIFIED : 0; + + memset(&ed, 0, sizeof(ed)); + krb5_keyblock_zero(&ck); + krb5_keyblock_zero(&sk_verify); + krb5_data_zero(&data); + + ret = decode_EncryptedData(pa_pkinit_kx->padata_value.data, + pa_pkinit_kx->padata_value.length, + &ed, &len); + if (ret) + goto out; + + if (len != pa_pkinit_kx->padata_value.length) { + ret = KRB5_KDCREP_MODIFIED; + goto out; + } + + ret = krb5_crypto_init(context, reply_key, 0, &rk_crypto); + if (ret) + goto out; + + ret = krb5_decrypt_EncryptedData(context, rk_crypto, + KRB5_KU_PA_PKINIT_KX, + &ed, &data); + if (ret) + goto out; + + ret = decode_EncryptionKey(data.data, data.length, + &ck, &len); + if (ret) + goto out; + + ret = krb5_crypto_init(context, &ck, 0, &ck_crypto); + if (ret) + goto out; + + ret = krb5_crypto_fx_cf2(context, ck_crypto, rk_crypto, + &p1, &p2, session_key->keytype, + &sk_verify); + if (ret) + goto out; + + if (sk_verify.keytype != session_key->keytype || + krb5_data_ct_cmp(&sk_verify.keyvalue, &session_key->keyvalue) != 0) { + ret = KRB5_KDCREP_MODIFIED; + goto out; + } + +out: + free_EncryptedData(&ed); + krb5_free_keyblock_contents(context, &ck); + krb5_free_keyblock_contents(context, &sk_verify); + if (ck_crypto) + krb5_crypto_destroy(context, ck_crypto); + if (rk_crypto) + krb5_crypto_destroy(context, rk_crypto); + krb5_data_free(&data); + + return ret; +} + static krb5_error_code pk_rd_pa_reply_dh(krb5_context context, const heim_octet_string *indata,