Skip to content

Commit 556adfa

Browse files
committed
Refine LM compatibility level logic
Fix a bug with level 4 not allowing NTLMv2 Rename the V2 flag to give the right meaning. Fix LM Challenger Response geneation, I realized the artifical NoLMResponseNTLMv1 boolean in MS-NLMP documents just refers to compatibility level 2 where NTLMv1 is used but LM is not. Add one call to check for v2 usage helper instead of doing raw checks on ctx flags outside of gss_ntlmssp.c Contextually make flags private, to gss_ntlmssp.c so helpers must be used. Signed-off-by: Simo Sorce <simo@redhat.com>
1 parent f89766b commit 556adfa

File tree

3 files changed

+31
-16
lines changed

3 files changed

+31
-16
lines changed

src/gss_auth.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,7 @@ uint32_t gssntlm_cli_auth(uint32_t *minor_status,
4141
lm_chal_resp.data[0] = 0;
4242
lm_chal_resp.length = 1;
4343

44-
} else if (ctx->sec_req & SEC_V2_ONLY) {
44+
} else if (gssntlm_sec_v2_ok(ctx)) {
4545

4646
/* ### NTLMv2 ### */
4747
uint8_t client_chal[8];
@@ -159,7 +159,7 @@ uint32_t gssntlm_cli_auth(uint32_t *minor_status,
159159
uint8_t client_chal[8];
160160
struct ntlm_buffer cli_chal = { client_chal, 8 };
161161
struct ntlm_key session_base_key = { .length = 16 };
162-
bool NoLMResponseNTLMv1 = true; /* FIXME: get from conf/env */
162+
bool NoLMResponseNTLMv1 = !gssntlm_sec_lm_ok(ctx);
163163
bool ext_sec;
164164

165165
nt_chal_resp.length = 24;

src/gss_ntlmssp.c

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,17 @@
2323
#include "gssapi_ntlmssp.h"
2424
#include "gss_ntlmssp.h"
2525

26+
#define SEC_LEVEL_MIN 0
27+
#define SEC_LEVEL_MAX 5
28+
29+
#define SEC_LM_OK 0x01
30+
#define SEC_NTLM_OK 0x02
31+
#define SEC_EXT_SEC_OK 0x04
32+
#define SEC_V2_OK 0x08
33+
#define SEC_DC_LM_OK 0x10
34+
#define SEC_DC_NTLM_OK 0x20
35+
#define SEC_DC_V2_OK 0x40
36+
2637
const gss_OID_desc gssntlm_oid = {
2738
.length = GSS_NTLMSSP_OID_LENGTH,
2839
.elements = discard_const(GSS_NTLMSSP_OID_STRING)
@@ -46,15 +57,15 @@ uint8_t gssntlm_required_security(int security_level, struct gssntlm_ctx *ctx)
4657
resp |= SEC_NTLM_OK | SEC_EXT_SEC_OK;
4758
break;
4859
case 3:
49-
resp |= SEC_V2_ONLY | SEC_EXT_SEC_OK;
60+
resp |= SEC_V2_OK | SEC_EXT_SEC_OK;
5061
break;
5162
case 4:
52-
resp |= SEC_NTLM_OK | SEC_EXT_SEC_OK;
5363
if (ctx->role == GSSNTLM_DOMAIN_CONTROLLER) resp &= ~SEC_DC_LM_OK;
64+
resp |= SEC_V2_OK | SEC_EXT_SEC_OK;
5465
break;
5566
case 5:
5667
if (ctx->role == GSSNTLM_DOMAIN_CONTROLLER) resp = SEC_DC_V2_OK;
57-
resp |= SEC_V2_ONLY | SEC_EXT_SEC_OK;
68+
resp |= SEC_V2_OK | SEC_EXT_SEC_OK;
5869
break;
5970
default:
6071
resp = 0xff;
@@ -135,6 +146,20 @@ bool gssntlm_sec_ntlm_ok(struct gssntlm_ctx *ctx)
135146
return false;
136147
}
137148

149+
bool gssntlm_sec_v2_ok(struct gssntlm_ctx *ctx)
150+
{
151+
switch (ctx->role) {
152+
case GSSNTLM_CLIENT:
153+
case GSSNTLM_SERVER:
154+
return (ctx->sec_req & SEC_V2_OK);
155+
case GSSNTLM_DOMAIN_SERVER:
156+
return true; /* defer decision to DC */
157+
case GSSNTLM_DOMAIN_CONTROLLER:
158+
return (ctx->sec_req & SEC_DC_V2_OK);
159+
}
160+
return false;
161+
}
162+
138163
bool gssntlm_ext_sec_ok(struct gssntlm_ctx *ctx)
139164
{
140165
return (ctx->sec_req & SEC_EXT_SEC_OK);

src/gss_ntlmssp.h

Lines changed: 1 addition & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -26,17 +26,6 @@
2626
#define DEF_NB_DOMAIN "WORKSTATION"
2727
#define MAX_CHALRESP_LIFETIME 36 * 60 * 60 /* 36 hours in seconds */
2828

29-
#define SEC_LEVEL_MIN 0
30-
#define SEC_LEVEL_MAX 5
31-
32-
#define SEC_LM_OK 0x01
33-
#define SEC_NTLM_OK 0x02
34-
#define SEC_EXT_SEC_OK 0x04
35-
#define SEC_V2_ONLY 0x08
36-
#define SEC_DC_LM_OK 0x10
37-
#define SEC_DC_NTLM_OK 0x20
38-
#define SEC_DC_V2_OK 0x40
39-
4029
#define NTLMSSP_DEFAULT_CLIENT_FLAGS ( \
4130
NTLMSSP_NEGOTIATE_ALWAYS_SIGN | \
4231
NTLMSSP_NEGOTIATE_128 | \
@@ -182,6 +171,7 @@ bool gssntlm_role_is_domain_member(struct gssntlm_ctx *ctx);
182171

183172
bool gssntlm_sec_lm_ok(struct gssntlm_ctx *ctx);
184173
bool gssntlm_sec_ntlm_ok(struct gssntlm_ctx *ctx);
174+
bool gssntlm_sec_v2_ok(struct gssntlm_ctx *ctx);
185175
bool gssntlm_ext_sec_ok(struct gssntlm_ctx *ctx);
186176

187177
uint32_t gssntlm_context_is_valid(struct gssntlm_ctx *ctx,

0 commit comments

Comments
 (0)