summaryrefslogtreecommitdiff
path: root/auth2-gss.c
diff options
context:
space:
mode:
authorSimon Wilkinson <simon@sxw.org.uk>2014-02-09 16:09:48 +0000
committerColin Watson <cjwatson@debian.org>2017-10-04 13:54:43 +0100
commit4e70490950e5c5134df48848affaf73685bf0284 (patch)
tree59de097e770693fb1f81268e85f7802df32cb58e /auth2-gss.c
parent62f54f20bf351468e0124f63cc2902ee40d9b0e9 (diff)
GSSAPI key exchange support
This patch has been rejected upstream: "None of the OpenSSH developers are in favour of adding this, and this situation has not changed for several years. This is not a slight on Simon's patch, which is of fine quality, but just that a) we don't trust GSSAPI implementations that much and b) we don't like adding new KEX since they are pre-auth attack surface. This one is particularly scary, since it requires hooks out to typically root-owned system resources." However, quite a lot of people rely on this in Debian, and it's better to have it merged into the main openssh package rather than having separate -krb5 packages (as we used to have). It seems to have a generally good security history. Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=1242 Last-Updated: 2017-10-04 Patch-Name: gssapi.patch
Diffstat (limited to 'auth2-gss.c')
-rw-r--r--auth2-gss.c49
1 files changed, 46 insertions, 3 deletions
diff --git a/auth2-gss.c b/auth2-gss.c
index 589283b72..fd411d3a7 100644
--- a/auth2-gss.c
+++ b/auth2-gss.c
@@ -1,7 +1,7 @@
1/* $OpenBSD: auth2-gss.c,v 1.26 2017/06/24 06:34:38 djm Exp $ */ 1/* $OpenBSD: auth2-gss.c,v 1.26 2017/06/24 06:34:38 djm Exp $ */
2 2
3/* 3/*
4 * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved. 4 * Copyright (c) 2001-2007 Simon Wilkinson. All rights reserved.
5 * 5 *
6 * Redistribution and use in source and binary forms, with or without 6 * Redistribution and use in source and binary forms, with or without
7 * modification, are permitted provided that the following conditions 7 * modification, are permitted provided that the following conditions
@@ -53,6 +53,41 @@ static int input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh);
53static int input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh); 53static int input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh);
54static int input_gssapi_errtok(int, u_int32_t, struct ssh *); 54static int input_gssapi_errtok(int, u_int32_t, struct ssh *);
55 55
56/*
57 * The 'gssapi_keyex' userauth mechanism.
58 */
59static int
60userauth_gsskeyex(struct ssh *ssh)
61{
62 Authctxt *authctxt = ssh->authctxt;
63 int authenticated = 0;
64 Buffer b;
65 gss_buffer_desc mic, gssbuf;
66 u_int len;
67
68 mic.value = packet_get_string(&len);
69 mic.length = len;
70
71 packet_check_eom();
72
73 ssh_gssapi_buildmic(&b, authctxt->user, authctxt->service,
74 "gssapi-keyex");
75
76 gssbuf.value = buffer_ptr(&b);
77 gssbuf.length = buffer_len(&b);
78
79 /* gss_kex_context is NULL with privsep, so we can't check it here */
80 if (!GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gss_kex_context,
81 &gssbuf, &mic))))
82 authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user,
83 authctxt->pw));
84
85 buffer_free(&b);
86 free(mic.value);
87
88 return (authenticated);
89}
90
56/* 91/*
57 * We only support those mechanisms that we know about (ie ones that we know 92 * We only support those mechanisms that we know about (ie ones that we know
58 * how to check local user kuserok and the like) 93 * how to check local user kuserok and the like)
@@ -240,7 +275,8 @@ input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh)
240 275
241 packet_check_eom(); 276 packet_check_eom();
242 277
243 authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user)); 278 authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user,
279 authctxt->pw));
244 280
245 if ((!use_privsep || mm_is_monitor()) && 281 if ((!use_privsep || mm_is_monitor()) &&
246 (displayname = ssh_gssapi_displayname()) != NULL) 282 (displayname = ssh_gssapi_displayname()) != NULL)
@@ -281,7 +317,8 @@ input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh)
281 gssbuf.length = buffer_len(&b); 317 gssbuf.length = buffer_len(&b);
282 318
283 if (!GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gssctxt, &gssbuf, &mic)))) 319 if (!GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gssctxt, &gssbuf, &mic))))
284 authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user)); 320 authenticated =
321 PRIVSEP(ssh_gssapi_userok(authctxt->user, authctxt->pw));
285 else 322 else
286 logit("GSSAPI MIC check failed"); 323 logit("GSSAPI MIC check failed");
287 324
@@ -301,6 +338,12 @@ input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh)
301 return 0; 338 return 0;
302} 339}
303 340
341Authmethod method_gsskeyex = {
342 "gssapi-keyex",
343 userauth_gsskeyex,
344 &options.gss_authentication
345};
346
304Authmethod method_gssapi = { 347Authmethod method_gssapi = {
305 "gssapi-with-mic", 348 "gssapi-with-mic",
306 userauth_gssapi, 349 userauth_gssapi,