Commit Graph

29814 Commits

Author SHA1 Message Date
Luke Howard
f538f0e5c2 krb5: use new krb5_time_abs() function
From Apple Heimdal-597.121.1: replace calls to labs() with krb5_time_abs()
2021-08-09 21:46:39 +10:00
Luke Howard
57a1a66348 krb5: default to client realm in _krb5_get_krbtgt
If _krb5_get_krbtgt() is called with a NULL realm, use the realm of the ccache
client
2021-08-09 21:46:32 +10:00
Luke Howard
8a4ce9950f krb5: add krb5_time_abs() function
From Apple drop, add krb5_time_abs() which returns the absolute difference
between two timestamps
2021-08-09 21:46:24 +10:00
Andrew Bartlett
3587b8c08c Allow _gss_string_to_oid() without HAVE_DLOPEN
This function became used outside the protection of
HAVE_DLOPEN (which Samba sets) with:

commit 5966c00701
Author: Luke Howard <lukeh@padl.com>
Date:   Sun Aug 8 10:34:28 2021 +1000

    gss: add gss_mg_name_to_oid internal API

    Add a new function for future internal use, gss_mg_name_to_oid(), which takes
    either a dot-separated OID or a "short" mechanism name (such as
    "sanon-x25519"), and returns a mechanism OID.

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
2021-08-09 09:58:58 +10:00
Luke Howard
ab8d4f508e roken: fix dependency typo - s/vin_h/vis_h/
Should close #777, #794.
2021-08-08 19:54:25 +10:00
Luke Howard
f86fccb344 gss: add split token test to check-negoex
Add test for split tokens to SAnon in NegoEx/SPNEGO
2021-08-08 18:16:17 +10:00
Luke Howard
06232dfcce gss: fix import/export of accumulating contexts
gss_{import,export}_sec_context did not work with partially accumulating
contexts, where the initial context token had not been completely accumulated,

Further, in gss_import_sec_context(), ctx->gc_input.value was not allocated to
a buffer sufficiently large to accumulate the target length.
2021-08-08 14:46:49 +10:00
Luke Howard
3b1f9f0a3f gss: error out in test_context if unknown OID
Fix regression in previous commit: exit with an error if test_context is called
with an unknown mechanism type.
2021-08-08 13:45:32 +10:00
Luke Howard
18c18d84b1 gss: merge gss_name_to_oid and gss_mg_name_to_oid
The recently introduced gss_mg_name_to_oid() function supported looking up
dynamically loaded mechanisms by name, but did not support partial matches or
the legacy "Kerberos 5" name as supported by gss_name_to_oid().

Consolidate these into a single function, and also add support for dynamically
loaded mechanisms to gss_oid_to_name().

API behavior difference: the Kerberos mechanism is now referred to by "krb5"
rather tha "Kerberos 5", although for legacy compatibility gss_name_to_oid()
will recognize the old name. However, gss_oid_to_name() will return "krb5". The
anticipated impact is minimal as these are not standard GSS-APIs and do not
appear to have any public usage outside Heimdal.
2021-08-08 11:37:09 +10:00
Luke Howard
5966c00701 gss: add gss_mg_name_to_oid internal API
Add a new function for future internal use, gss_mg_name_to_oid(), which takes
either a dot-separated OID or a "short" mechanism name (such as
"sanon-x25519"), and returns a mechanism OID.
2021-08-08 10:34:28 +10:00
Luke Howard
65651c8106 krb5: mask should be uint64_t, not size_t
size_t is not 64 bits on all platforms
2021-08-07 19:25:22 +10:00
Luke Howard
9d16808515 krb5: mask integers to avoid unnecessary expansion
Sign-extension would expand the encoding of packed negative integers to one
greater than required.
2021-08-07 19:18:42 +10:00
Luke Howard
6554dc69b0 gss: allow partial accept context export in SPNEGO
Support for exporting partially established acceptor context tokens. With this,
an acceptor can send the initiator an encrypted state cookie containing the
exported context token.

(The concrete mechanism, of course, must either require a single round trip or
support partial context export itself. Kerberos and GSS EAP would work, but
Kerberos with GSS_C_DCE_STYLE would not, as currently implemented.)

Partial context export is not permitted for initiators.
2021-08-07 18:56:33 +10:00
Roland C. Dowdeswell
fe426f7a28 fix type s/MUTAL/MUTUAL/ in gssapi/krb5 2021-08-07 18:54:56 +10:00
Roland C. Dowdeswell
3a6229f64a gss_accept_sec_context: support reassembling split tokens.
Microsoft will sometimes split GSS tokens when they exceed a certain
size in some protocols.  This is specified in

	[MS-SPNG]: Simple and Protected GSS-API Negotiation
	Mechanism (SPNEGO) Extension

https://winprotocoldoc.blob.core.windows.net/productionwindowsarchives/MS-SPNG/%5bMS-SPNG%5d.pdf

sections 3.1.5.4 to 3.1.5.9.

We extend gss_accept_sec_context() to recognise partial tokens and
to accumulate the fragments until an entire token is available to
be processed.  If the entire token is not yet available,
GSS_S_CONTINUE_NEEDED is returned with a zero length output token.
This is specified in RFC2744 page 25-26 to indicate that no reply
need be sent.

We include updates to the test framework to test split tokens when
using SPNEGO.
2021-08-07 18:54:56 +10:00
Roland C. Dowdeswell
80f3194a76 gssapi/krb5/{export,import}_sec_context: make smaller tokens. 2021-08-07 18:54:56 +10:00
Roland C. Dowdeswell
a2cfd2a25c gssapi/krb5/{export,import}_sec_context: fix for init_sec_ctx
When using these functions with gss_init_sec_context(), we noticed
that some things were missing and some needed to be made optional.
ctx->order may be NULL, ctx->ac->authenticator needs to be filled
out, and ctx->state needs be stored.

Note: SPNEGO still needs a little more work.
2021-08-07 18:54:56 +10:00
Roland C. Dowdeswell
81a8b5069e krb5_storage: add a packed integer type as an endian. 2021-08-07 18:49:33 +10:00
Roland C. Dowdeswell
6ccb21827b gss-token: initialise input buffer to empty 2021-08-07 08:40:20 +10:00
Robbie Harwood
0cb54fa69e kdc: fix typo in moduli file loading error message 2021-08-07 07:52:46 +10:00
Luke Howard
7188969371 krb5: add krb5_store_bytes()
Similar to krb5_storage_write(), but returns an error rather than the number of
bytes written.
2021-08-06 19:32:49 +10:00
Luke Howard
4e359bd5ce krb5: add krb5_store_datalen()
Store a data blob to the storage. The data is stored with an int32 as
length plus the data (not padded).  This function only differs from
krb5_store_data() insofar as it takes a void * and a length as parameters.

Patch from Roland C. Dowdeswell <elric@imrryr.org>
2021-08-06 19:22:15 +10:00
Luke Howard
8330e45444 gss: set GSS_C_CHANNEL_BOUND_FLAG for SAnon
SAnon includes channel bindings as part of the key derivation function, so they
cannot be ignored. Always set GSS_C_CHANNEL_BOUND_FLAG in the SAnon acceptor.
2021-08-06 13:21:36 +10:00
Isaac Boukris
d83321fdf3 Add channel-bindings tests 2021-08-06 13:15:19 +10:00
Isaac Boukris
f84a98bd5f Add client_aware_channel_bindings option
Add client support for KERB_AP_OPTIONS_CBT from MS-KILE.
2021-08-06 13:15:19 +10:00
Isaac Boukris
a4527a28a3 Implement KERB_AP_OPTIONS_CBT (server side)
if the client asserted knowledge of channel-bindings by
passing KERB_AP_OPTIONS_CBT, and the server passed bindings,
require the bindings to match.
2021-08-06 13:15:19 +10:00
Isaac Boukris
51ce4c8d15 gssapi: add channel-bound return flag
In gss_accept_sec_context, return a new flag to let
the caller know that bindings were provided and verified.
2021-08-06 13:15:19 +10:00
Andrew Bartlett
33fccb8bbe heimdal: Match windows and return KRB5KDC_ERR_CLIENT_REVOKED when the account is locked out
Windows does not check the password on an account that has been locked.

Heimdal does not implement locked_out, however the Samba hdb
backend does, and needs this checked before passwords (for bad
password lockout), not after in kdc_check_access().

Based on work to update Samba to current Heimdal by
Gary Lockyer <gary@catalyst.net.nz> and including cherry-pick of
Samba commit 580a705b83014e94556b9d5a8877406816e02190 which noted
that we need to return KRB5KDC_ERR_CLIENT_REVOKED to match Windows.

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
2021-08-06 12:48:12 +10:00
Andrew Bartlett
f03983b64d HEIMDAL: Require armor_server to be a krbtgt name, not just a server name
Samba has a different lookup path for krbtgt/ principals.

armor_server is in this case the same as the server in a normal
TGS-REQ, just inside the FAST armor, so needs to have the same
lookup properties as the TGS-REQ does.

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
2021-08-06 12:43:17 +10:00
Andrew Bartlett
61f1be93e3 kdc: Provide flag to hint to KDC that this is a FAST key lookup
For Samba the fast key is not stored in the replicated DB, so
this helps Samba find it in the Samba hdb module.

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
2021-08-06 12:43:17 +10:00
Luke Howard
5ba7f270eb kdc: return revoked error if principal locked out
According to #788, Windows clients expect a revoked error to be returned if the
client or service is locked out, rather than a generic policy error. This
should not affect non-Windows paths as the locked_out HDB entry flag is
otherwise not used by Heimdal.
2021-08-06 12:34:52 +10:00
Andrew Bartlett
75829cad18 Avoid -Werror=strict-overflow on in rk_dns_srv_order()
In a strict Samba build with -Werror=strict-overflow on Ubuntu 18.04
with gcc version 7.5.0 (Ubuntu 7.5.0-3ubuntu1~18.04)
we see

../../source4/heimdal/lib/roken/resolve.c: In function ‘rk_dns_srv_order’:
../../source4/heimdal/lib/roken/resolve.c:639:7: error: assuming signed overflow does not occur when simplifying conditional to constant [-Werror=strict-overflow]
     if(num_srv == 0)
       ^
cc1: all warnings being treated as errors

This avoids the issue by additionally setting a distinct flag.

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
2021-08-06 12:24:04 +10:00
Luke Howard
034bc1649d gss: avoid overflow in gss_inquire_cred()
See #791

Make found a boolean rather than a count of found mechanisms.
2021-08-06 12:23:50 +10:00
Luke Howard
5a56198161 hdb: fix leaks in alias handling
fetch_entry_or_alias() in libhdb failed to free the alias DB value or
principal, causing a leak
2021-08-05 17:08:53 +10:00
Luke Howard
510ee92c11 gss: treat empty cred store as GSS_C_NO_CRED_STORE
In acquire_mech_cred(), treat a credential store with no elements as equivalent
to GSS_C_NO_CRED_STORE, allowing a mechanism's gss_acquire_cred()
implementation to be called.
2021-08-05 15:53:18 +10:00
Luke Howard
3604497fda kdc: zero KDCFastState padata before free 2021-08-04 18:01:48 +10:00
Luke Howard
04e3ea4307 kdc: don't leak FAST req_body checksum buffer
The temporary buffer used to checksum the KDC-REQ body in
_kdc_fast_unwrap_request() was not freed.
2021-08-03 17:30:06 +10:00
Luke Howard
d672e49231 gss: don't leak NTLM cred on failure
Do not leak partially complete credential handle in _gss_ntlm_get_user_cred()
2021-08-02 17:09:55 +10:00
Luke Howard
73224fef5a gss: zero spnego mechanism token error buffer
Ensure mechanism error token buffer, which is allocated on the stack, is zero'd
out before freeing containing ASN.1 structure
2021-08-02 15:55:10 +10:00
Luke Howard
33cc416e36 hx509: don't leak context default_trust_anchors 2021-08-02 15:13:20 +10:00
Luke Howard
221c295d5d gss: honor GM_USE_MG_NAME in gss_accept_sec_context()
GM_USE_MG_NAME was not honored in the case where the mechanism emitted a name,
but the caller of gss_accept_sec_context() did not request it be returned. This
would result in m->gm_release_name() being called on the mechglue name, which
would crash either because that function pointer was NULL or because it would
have expected a mechanism name.
2021-08-01 22:12:25 +10:00
Luke Howard
b8728cae14 asn1: GSER is RFC3641, not RFC2641
Update README.md.
2021-07-09 20:04:56 +10:00
Luke Howard
f72627c3f0 gss: make IS_DCE_STYLE an inline function
To avoid future regressions such as the one corrected in 0dd19003, make
IS_DCE_STYLE() an inline function (rather than a macro) so that its
argument is typed.
2021-07-08 00:00:44 +10:00
Luke Howard
0dd1900308 gss: fix regression in rc4-hmac krb5 DCE unwrap
4b543b7 introduced a regression in the krb5 mechanism's gss_unwrap for
DCE applications, owing to IS_DCE_STYLE() being called with a krb5
instead of mechanism context handle.
2021-07-07 23:51:06 +10:00
Andrew Bartlett
c6df77a2cb Initialise err in hdb_create()
On Ubuntu 20.04 with gcc version 9.3.0 during a strict
Samba build with -Werror=maybe-uninitialized we get:

../../source4/heimdal/lib/hdb/hdb.c: In function ‘hdb_create’:
../../source4/heimdal/lib/hdb/hdb.c:831:13: error: ‘ret’ may be used uninitialized in this function [-Werror=maybe-uninitialized]
  831 |     if (*db && ret == 0)
      |         ~~~~^~~~~~~~~~~
cc1: all warnings being treated as errors

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
2021-07-06 10:06:54 +10:00
Andrew Bartlett
2ee8834696 Add const to _kdc_set_e_text()
On Ubuntu 20.04 with gcc version 9.3.0 in a Samba compile
using -Wdiscarded-qualifiers and -Werror we get:

../../source4/heimdal/kdc/kerberos5.c:2516:21: warning: passing argument 2 of ‘_kdc_set_e_text’ discards ‘const’ qualifier from pointer target type [-Wdiscarded-qualifiers]
 2516 |  _kdc_set_e_text(r, "Client have no reply key");
      |                     ^~~~~~~~~~~~~~~~~~~~~~~~~~
../../source4/heimdal/kdc/kerberos5.c:428:42: note: expected ‘char *’ but argument is of type ‘const char *’
  428 | _kdc_set_e_text(astgs_request_t r, char *fmt, ...)
      |                                    ~~~~~~^~~

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
2021-06-30 12:47:41 +10:00
Andrew Bartlett
8caadcd9fc Fix user2user principal (again)
73debbc166 accidentially reverted
the critical part of 040a093654,
presumably during conflict resolution.

Found by a strict Samba compile during import of current Heimdal.

See #780

Signed-off-by: Andrew Bartlett <abartlet@samba.org>
2021-06-30 12:46:18 +10:00
Nicolas Williams
8875cb656b kdc: Fix warnings for synthetic principals 2021-06-29 17:02:17 -05:00
Nicolas Williams
73debbc166 kdc: Audit more TGS failure reasons 2021-06-29 14:52:07 -05:00
Nicolas Williams
855b27ccfb httpkadmind: Allow host SPNs to fetch selves
Combined with the synthetic_clients feature, this will allow hosts that
have a PKINIT-worthy client certificate with a SAN with their host
principals to create their own principals and "extract" their host
keytabs.  Together with some other PKIX credential bootstrapping
protocol, this can help hosts bootstrap Kerberos host credentials.
2021-06-29 14:52:07 -05:00