Using GSS-API Mechanisms in SASL:
The GS2 Mechanism Family
simon@josefsson.orgThis document describes how to use a Generic Security Service
Application Program Interface (GSS-API) mechanism in the the
Simple Authentication and Security Layer (SASL) framework. This
is done by defining a new SASL mechanism family, called GS2. This
mechanism family offers a number of improvements over the previous
SASL/GSS-API mechanism: it is more general, uses fewer messages
for the authentication phase in some cases, and supports a
SASL-specific notion of channel binding.See <http://josefsson.org/sasl-gs2-*/> for more
information.Generic Security Service Application
Program Interface (GSS-API) is a framework that provide
security services to
applications. Simple Authentication and
Security Layer (SASL) is a framework to provide
authentication and security layers for connection based
protocols. This document describe how to use a GSS-API
mechanism in a connection-based protocol using the SASL
framework.All GSSAPI mechanisms are implicitly registered for use within
SASL by this specification. The SASL mechanism defined in this
document is known as the GS2 family.The "Kerberos V5 GSS-API mechanism"
is also supported in SASL through "SASL
GSSAPI mechanisms". The difference between that protocol
and the one described here, is that this protocol offer more
features (i.e., channel bindings and round-trip optimizations)
while the other protocol is more widely deployed. There are
interoperability concerns by having the same GSS-API mechanism
available under more than one SASL mechanism name, see the section
"Interoperability with the GSSAPI mechanism" below.There are interoperability and security concerns if this SASL
mechanism is used together with a GSS-API mechanism that negotiate
other GSS-API mechanisms (such
as SPNEGO), see the section
"Mechanisms that negotiate other mechanisms" below.There are interoperability and security concerns with GSSAPI
mechanism that do not provide integrity, see the section
"Non-integrity capable GSS-API mechanisms" below.SASL mechanism names starting with "GS2-" are reserved for SASL
mechanisms which conform to this document.The IESG is considered to be the owner of all SASL mechanisms
which conform to this document. This does not necessarily imply
that the IESG is considered to be the owner of the underlying
GSSAPI mechanism.The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL
NOT", "SHOULD", "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL"
in this document are to be interpreted as described in
.The SASL mechanism name for a GSS-API mechanism is the
concatenation of the string "GS2-" and
the Base32 encoding (with an upper
case alphabet) of the first ten bytes of the
binary SHA-1 hash string computed
over the ASN.1 DER encoding,
including the tag and length octets, of the GSS-API mechanism's
Object Identifier. The Base32 rules on padding characters and
characters outside of the base32 alphabet are not relevant to this
use of Base32. If any padding or non-alphabet characters are
encountered, the name is not a GS2 family mechanism name.The SASL mechanism name may be computed manually. This is useful
when the set of supported GSS-API mechanisms is known in advance.
It also obliterate the need to implement Base32, SHA-1 and DER in
the SASL mechanism. The computed mechanism name can be used
directly in the implementation, and the implementation need not
concern itself with that the mechanism is part of a mechanism
family.The OID for the SPKM-1 mechanism is
1.3.6.1.5.5.1.1. The ASN.1 DER encoding of the OID, including the
tag and length, is (in hex) 06 07 2b 06 01 05 05 01 01. The SHA-1
hash of the ASN.1 DER encoding is (in hex) 1c f8 f4 2b 5a 9f 80 fa
e9 f8 31 22 6d 5d 9d 56 27 86 61 ad. Convert the first ten octets
to binary, and re-group them in groups of 5, and convert them back
to decimal, which results in these computations:The last step translate each decimal value using table 3
in Base32. Thus the SASL
mechanism name for the SPKM-1 GSSAPI mechanism is
"GS2-DT4PIK22T6APV2PY".The OID for the Kerberos V5 GSS-API
mechanism is 1.2.840.113554.1.2.2 and its DER encoding
is (in hex) 06 09 2A 86 48 86 F7 12 01 02 02. The SHA-1 hash
is 82 d2 73 25 76 6b d6 c8 45 aa 93 25 51 6a fc ff 04 b0 43
60. Convert the first ten octets to binary, and re-group them
in groups of 5, and convert them back to decimal, which
results in these computations:The last step translate each decimal value using table 3
in Base32. Thus the SASL
mechanism name for the Kerberos V5 GSSAPI mechanism is
"GS2-QLJHGJLWNPLMQRNK".During the SASL authentication exchange for GS2, a number of
messages following the following format is sent between the
client and server.The "Context length" and "Wrap token length" fields each
contain a 4 octet (32 bit) integer encoded in network byte
order, that indicate the length of the "Context token" and "Wrap
token" fields, respectively. A length of 0 means that a
particular field is not present.The "Context token" field, if present, contain a GSS-API
context establishment token generated by GSS_Init_sec_context or
GSS_Accept_sec_context.The "Wrap token" field, if present, contain the output
generated by the GS2_Wrap function.The fields need not be aligned to 32-bit a boundary. There is
no padding between fields.Messages shorter than or equal to 8 octets are invalid. (The
only exception is the initial empty challenge sent by the server
which may be 0 octets.) From that it follows that at least one
of the "Context token length" and the "Wrap token length"
integers MUST be non-zero in a particular message. If the sum
of the length integers is longer than the entire message size,
minus 8 octets for the length fields, the message is
invalid.During any successful authentication exchange, the client and
server will each send exactly one (non-empty) "Wrap token".Conforming implementations MUST NOT send additional data after
the above message syntax, and MUST ignore additional data. To
illustrate, implementations MUST NOT assume that the last "Wrap
token length" octets of the packet correspond to the "Wrap
token", because that would be incorrect if the packet contained
additional data not described by this document.The format of the "Context token" field inside the SASL token
is defined by each GSS-API mechanism, and the data is computed
by (for the client) GSS_Init_sec_context and (for the server)
GSS_Accept_sec_context.The client calls GSS_Init_sec_context, passing in
input_context_handle of GSS_C_NO_CONTEXT (initially),
mech_type of the GSSAPI mechanism for which this SASL
mechanism is registered, the chan_binding is set to NULL, and
targ_name equal to output_name from GSS_Import_Name called
with input_name_type of GSS_C_NT_HOSTBASED_SERVICE (*) and
input_name_string of "service@hostname" where "service" is the
service name specified in the protocol's profile, and
"hostname" is the fully qualified host name of the server.(*) - Clients MAY use name types other than
GSS_C_NT_HOSTBASED_SERVICE to import servers' acceptor names,
but only when they have a priori knowledge that the servers
support alternate name types. Otherwise clients MUST use
GSS_C_NT_HOSTBASED_SERVICE for importing acceptor names.When calling the GSS_Init_sec_context the client SHOULD pass
the integ_req_flag of TRUE, but MAY set it to FALSE (see
section 10 below). If the client intends to request a
security layer, it MUST also supply to the
GSS_Init_sec_context a mutual_req_flag of TRUE, and a
sequence_req_flag of TRUE. If the client will be requesting a
security layer providing confidentiality protection, it MUST
also supply to the GSS_Init_sec_context a conf_req_flag of
TRUE.The client then responds with any resulting output_token.If GSS_Init_sec_context returns GSS_S_CONTINUE_NEEDED, then
the client expect the server to issue a token in a subsequent
challenge or as additional information to the outcome of the
authentication. The client pass the context token to another
call to GSS_Init_sec_context, repeating the procedure, until
GSS_S_COMPLETE is returned or authentication is aborted.If the server sent a (non-empty) "Wrap token", the context
token is processed before processing the other tokens. This
is required because GSS_Unwrap may need the context to be in
the state it is after the "Context token" in the message has
been processed.When GSS_Init_sec_context returns GSS_S_COMPLETE, the client
MUST examine the context to ensure that it provides a level of
protection permitted by the client's security policy.The server passes the first context token to
GSS_Accept_sec_context as input_token, setting
input_context_handle to GSS_C_NO_CONTEXT (initially), the
chan_binding set to NULL, and a suitable acceptor_cred_handle
(see below).Servers SHOULD use a credential obtained by calling
GSS_Acquire_cred or GSS_Add_cred for the GSS_C_NO_NAME
desired_name and the OID of the GSS-API mechanism for which
this SASL mechanism is registered (*). Servers MAY use
GSS_C_NO_CREDENTIAL as an acceptor credential handle. Servers
MAY use a credential obtained by calling GSS_Acquire_cred or
GSS_Add_cred for the server's principal name(s) (**) and the
GSS-API mechanism for which this SASL mechanism is
registered.(*) - Unlike GSS_Add_cred the GSS_Acquire_cred uses an OID
set of GSS-API mechanism as an input parameter. The OID set
can be created by using GSS_Create_empty_OID_set and
GSS_Add_OID_set_member. It can be freed by calling the
GSS_Release_oid_set.(**) - Use of server's principal names having
GSS_C_NT_HOSTBASED_SERVICE name type and "service@hostname"
format, where "service" is the service name specified in the
protocol's profile, and "hostname" is the fully qualified host
name of the server, is RECOMMENDED. The server name can be
generated by calling GSS_Import_name with input_name_type of
GSS_C_NT_HOSTBASED_SERVICE and input_name_string of
"service@hostname".The server then responds with any resulting output_token.The server pass any resulting challenge from the client to
another call to GSS_Accept_sec_context, repeating the
procedure, until GSS_S_COMPLETE is returned or authentication
is aborted.If the client sent a (non-empty) "Wrap token", the context
token is processed first.Upon successful establishment of the security context (i.e.
GSS_Accept_sec_context returns GSS_S_COMPLETE) the server
SHOULD verify that the negotiated GSS-API mechanism is indeed
the registered one. This is done by examining the value of
the mech_type parameter returned from the
GSS_Accept_sec_context call. If the value differ, the SASL
authentication MUST be aborted.Upon successful establishment of the security context and if
the server used GSS_C_NO_NAME/GSS_C_NO_CREDENTIAL to create
acceptor credential handle, the server SHOULD also check using
the GSS_Inquire_context that the target_name used by the
client matches:- the GSS_C_NT_HOSTBASED_SERVICE "service@hostname" name
syntax, where "service" is the service name specified in the
application protocol's profile, and "hostname" is the fully
qualified host name of the server.When GSS_Accept_sec_context returns GSS_S_COMPLETE, the
server MUST examine the context to ensure that it provides a
level of protection permitted by the server's security
policy.The Wrap token field MUST NOT be sent or received before the
PROT_READY flag is set locally (by GSS_Init_sec_context or
Gss_Accept_sec_context), or if the PROT_READY flag is never set,
before the context has been fully established. The Wrap token
field does not have to be present directly when the PROT_READY
flag is set. During any exchange, exactly one Wrap token field
is sent in each direction. The GS2_Wrap function is defined
below, and its inputs MUST follow the format described below.
If not exactly one Wrap token is received by the client and by
the server, the authentication MUST fail.If PROT_READY is never set by GSS_Init_sec_context or
GSS_Accept_sec_context, the flag is implied by successful
context negotiation. This is for GSS-API v1 mechanisms that do
not support PROT_READY, or for GSS-API mechanism that do not
provide per-message protection. This may result in a SASL token
consisting of a context token length of 0 and a Wrap token.The entity that sends the first Wrap token will have to specify
a bitmap of supported and preferred quality of protection
schemes. The entity that replies to the Wrap tokens will pick a
scheme, based on the bitmask and local policy. The quality of
protection values are defined in section 9.Two pairs of input formats to the GS2_Wrap function are
defined. The first pair is used when the client sends the Wrap
token first and the server responds. The other pair is used
when the server sends the Wrap token first and the client
responds.The inputs below are passed to GS2_Wrap, and the output is used
as the Wrap token value.Some fields in the input formats are optional, indicated by
brackets ("[" and "]") and explained by the text below.The GS2_Wrap function have two implementations, and which one
is used depends on whether the negotiated GSS-API context
supports per-message protection. When a context is
successfully negotiated (i.e., when GSS_S_COMPLETE is returned
from, for clients, GSS_Init_sec_context, or, for servers,
GSS_Accept_sec_context) and the output variable integ_avail is
FALSE, then GSS_Wrap cannot be used and instead we define
GS2_Wrap to be the identity function. When integ_avail is
negotiated TRUE, the GS2_Wrap is identical to calling the
GSS_Wrap function with conf_flag set to FALSE and using the
generated output_message as the output data.The input to GS2_Wrap when the client sends a Wrap token
field first is as follows.The "client_qops" integer indicate the client's preferred
quality of protection if channel bindings are absent or the
negotiation of the channel binding fails. The quality of
protection values are defined in section 9.The "client_maxbuf" field indicate the maximum protected
buffer size the client can receive in network byte order. It
MUST be 0 if the client doesn't advertise support for any
security layer, the server MUST verify this. Small values can
make it impossible for the server to send any protected
message to the client, due to the overhead added by GSS_Wrap,
and the server MAY reject the authentication if it detects
this situation.The "channel_binding_length" is a network byte order integer
that indicate the length of the "channel_binding_data"
field.The optional field "client_cbqops" is present only if
"channel_binding_length" is non-zero, and indicate the
client's preferred quality of protection if channel binding
negotiation succeeds. The quality of protection values are
defined in section 9.The optional field "channel_binding_data" is present only if
"channel_binding_length" is non-zero, and contain the actual
channel binding data.The optional field "authzid" contain the authorization
identity. The authorization identity is encoded
using UTF-8. The authorization
identity is not terminated with the NUL (U+0000) character.
Servers MUST validate that the authorization identity is valid
UTF-8.The input to GS2_Wrap when the server sends a Wrap token
field, after receiving the Wrap token in the previous section
from the client, is as follows.The "server_qop" field integer indicate the selected quality
of protection. The quality of protection values are defined
in section 9.The "server_maxbuf" field indicate the maximum protected data
buffer size the server can receive in network byte order. It
MUST be 0 if the server doesn't advertise support for any
security layer, the client MUST verify this. Small values can
make it impossible for the client to send any protected
message to the server, due to the overhead added by GSS_Wrap,
and the client MAY reject the authentication if it detects
this situation.The input to GS2_Wrap when the server sends the Wrap token
first is as follows.The "server_qops" field is an integer indicating the server's
preferred quality of protection if channel bindings are absent
or the negotiation of the channel binding fails. The quality
of protection values are defined in section 9.The "server_maxbuf" is the same as above.The optional field "server_cbqops" indicate the server's
preferred quality of protection if channel binding negotiation
succeeds. The quality of protection values are defined in
section 9.The optional field "channel_binding_data" contain the actual
channel binding data.The input to GS2_Wrap when the clients sends a Wrap token
field, after receiving the Wrap token in the previous section
from the server, is as follows.The "client_qop" field is the selected quality of protection.
The quality of protection values are defined in section 9.The "client_maxbuf" and "authzid" fields are as above.The GS2 mechanism provide its own channel binding mechanism,
instead of using the "chan_binding" parameter in the GSS-API
context functions. The reason for this is that the GS2 mechanism
provide an option to proceed even if the channel bindings does not
match. The GSS-API framework specifies that authentication cannot
proceed if channel bindings do not match.Client and servers MUST set the "chan_binding" parameter in the
calls to GSS_Init_sec_context and GSS_Accept_sec_context,
respectively, to NULL.Implementations SHOULD set the "client_cbqops" and
"server_cbqops" to no security layer and instead depend on the
session security afforded by the bound-in channel.In order to accomodate the requirement in
"Authentication frameworks and mechanisms
that support channel binding MUST communicate channel binding
failure to applications" implementations assert a bit in the
security layer bitmask (see Section 9) on negotiation
failures.Use of no SASL security layers in combination with channel
binding should provide better performance than using SASL security
layers over secure channels, and better security characteristics
than using no SASL security layers over secure channels without
channel binding.For more discussions of channel bindings, and the syntax of the
channel binding data for various security protocols, see
. For easy reference, the channel binding
format used for The Transport Layer
Security (TLS) Protocol is specified in
.This section describe several high-level protocol exchanges. The
descriptions do not assume any properties of the actual GSS-API
mechanism. Protocol profiles, GSS-API mechanism specific
behaviour, and to some extent implementation and policy choices,
will dictate which packets are sent in what order. The protocol
exchanges are examples and other exchanges are permitted and will
occur.An informal pseudo-language is used to describe the packets sent
below. GS2_Wrap refer to the operation of calling GS2_Wrap on the
indicated fields, formatted in the structures described earlier.
GSS_Init_sec_context and GSS_Accept_sec_context refer to the
context token generated by calling the respective function. The
GS2 SASL Message is denoted as [Context_token, Wrap_token], and
the length fields are not mentioned.An authentication exchange using GS2 may look like:GSS-API authentication is always initiated by the client. The
SASL framework allows either the client and server to initiate
authentication. In GS2 the server will send an initial empty
challenge (zero byte string) if it has not yet received a token
from the client. See section 3 of .The next example illustrate when the client sends its Wrap token
first.If the protocol profile support the optional initial client
response, the first empty message can be optimized away, and then
the protocol exchange will look like:If the protocol profile can also send additional information when
indicating the outcome of the authentication, then the protocol
exchange will look like:If the PROT_READY flag is never set by the GSS-API mechanism, the
GS2_Wrap message will be sent after the context has been
established. The protocol may look like:Alternatively, if the client finishes first, it may look
like:Adding channel bindings to the last examples, gives the following
complex situation. Here the client request confidentiality for
the application data if channel binding fails but no SASL security
layer if channel binding negotiation succeeds:If the protocol support initial data from the client, and the
PROT_READY flag is set in the client after the first call to
GSS_Init_sec_context, and the server can send additional data to
the client when indicating successful authentication, the
following protocol exchange will occur.The last example illustrate the optimal (round-trip wise)
authentication possible using this protocol.Authentication MUST NOT succeed if any one of the following
conditions are true:An invalid SASL token is received (e.g., length field checks
discussed in section 4.1 fail).GSS_Init/Accept_sec_context() return anything other than
GSS_S_CONTINUE_NEEDED or GSS_S_COMPLETE.GSS_Wrap() returns anything other than GSS_S_COMPLETE.GSS_Unwrap() returns anything other than GSS_S_COMPLETE.
(There can't be supplementary status codes in GS2 at this point,
so any indications of out of order processing or replays is
fatal.)The token returned from GSS_Unwrap fail to parse correctly
(e.g., too short, invalid maximum buffer size) as the expected
Wrap token.Local policy reject the attempt. For example, client and server
can't agree on qop proposal, or channel binding negotiation
failed.(server-side) Authorization of client principal (i.e., src_name
in GSS_Acecpt_sec_context) to requested authzid failed.The implementation MAY set any GSSAPI flags or arguments not
mentioned in this specification as is necessary for the
implementation to enforce its security policy.The fields "client_qops", "server_qops", "client_cbqops", and
"server_cbqops" are bit-fields that encode a set of requested
quality of protection. The fields "client_qop" and "server_qop"
encode a single quality of protection value.The "client_qop" and "server_qop" will contains the chosen
security layer.Note that "client_qop" and "server_qop" MAY indicate a quality of
protection that was not offered by the server and client,
respectively. This SHOULD only be used when the server or client
(respectively) would otherwise fail the entire authentication
exchange. The server/client that receives a "client_qop"/
"server_qop" MUST verify that it corresponds to an acceptable
security level.Whether the channel binding negotiation is successful or not may
influence the security layer selection. The most significant bit
is used to signal failed channel binding negotiation.
Implementations MUST set the bit if channel bindings were provided
from the other end and a local channel binding is absent or not
equal. Implementation MUST clear the bit otherwise.The security layers and their corresponding bit-masks are as
follows:The bit-masks 8-64 are reserved and may be defined in the future;
bits which are not understood MUST be negotiated off.When decoding any received data with GSS_Unwrap the major_status
other than the GSS_S_COMPLETE MUST be treated as a fatal
error.For integrity and confidentiality protection, GS2 negotiates the
maximum size of the output_message to send. Implementations can
use the GSS_Wrap_size_limit call to determine the corresponding
maximum size input_message.When no security layer is negotiated the octet will encode an
integer 1 as follows.When integrity is negotiated the octet will encode an integer 2
as follows.When confidentiality is negotiated, and channel binding
negotiation failed, the octet will encode an integer 128+4=132
as follows.When a bitmask that indicates that all security layers are
acceptable, the octet will encode an integer 1+2+4=7 as
follows.Mechanisms that do not support integrity can be used with GS2,
but some security features cannot be provided, in particular
including channel bindings, security layers, and integrity
protection of the authorization identity.Channel bindings and security layers MUST NOT be negotiated when
the GSS-API mechanism do not support integrity. It should also be
understood that the authorization identity is not integrity
protected.Whether a mechanism supports integrity or not, for the purpose of
GS2, is decided by whether the integ_avail output variable from
GSS_Init_sec_context (for clients) and GSS_Accept_sec_context (for
servers). If integ_avail is FALSE, integrity is not
supported.There is a potential interoperability problem if a client call
GSS_Init_sec_context with integ_req_flag of TRUE and the context
negotiation fails because the mechanism (due to design, the
capability of the credentials, or policy) cannot provide
per-message protection. Calling GSS_Init_sec_context with a FALSE
integ_req_flag instead is not optimal, since a mechanism may then
negotiate less security than it would have otherwise done.It is RECOMMENDED that implementations only ever call
GSS_Init_sec_context with a integ_req_flag of FALSE when it knows
that the particular GSS-API mechanism will not be able to
negotiate per-message protection services.Implementations MAY have a policy to disallow non-integrity
capable mechanisms, and always call GSS_Init_sec_context with the
integ_req_flag set to TRUE.The Kerberos V5 GSS-API mechanism
is currently used in SASL under the name "GSSAPI",
see GSSAPI mechanism. The Kerberos
V5 mechanism may also be used with the GS2 family. This causes an
interopability problem, which is discussed and resolved below.If a client (or server) only support Kerberos V5 under the
"GSSAPI" name and the server (or client) only support Kerberos V5
under the GS2 family, the authentication negotiation will
fail.If the Kerberos V5 mechanism is supported under GS2 in a
server, the server SHOULD also support Kerberos V5 through the
"GSSAPI" mechanism, to avoid interoperability problems with
older clients.Reasons for violating this recommendation may include security
considerations regarding the absent features in the GS2
mechanism. The Kerberos V5 "GSSAPI" SASL mechanism lack channel
bindings, which could enable certain tunnel
attacks.It is RECOMMENDED to negotiate Kerberos V5 through the GS2
mechanism rather than through the "GSSAPI" mechanism, if both
are available, because of the additional features in the GS2
mechanism.A GSS-API mechanism that negotiate other mechanisms interact
badly with the SASL mechanism negotiation. There are two
problems. The first is an interoperability problem and the second
is a security concern. The problems are described and resolved
below.If a client implement GSS-API mechanism X, potentially
negotiated through a GSS-API mechanism Y, and the server also
implement GSS-API mechanism X negotiated through a GSS-API
mechanism Z, the authentication negotiation will fail.If a client's policy is to first prefer GSSAPI mechanism X,
then non-GSSAPI mechanism Y, then GSSAPI mechanism Z, and if a
server supports mechanisms Y and Z but not X, then if the client
attempts to negotiate mechanism X by using a GSS-API mechanism
that negotiate other mechanisms (such as SPNEGO), it may end up
using mechanism Z when it ideally should have used mechanism Y.
For this reason, the use of GSS-API mechanisms that negotiate
other mechanisms are disallowed under GS2.GSS-API mechanisms that negotiate other mechanisms MUST NOT be
used with the GS2 SASL mechanism. This specifically exclude
negotiating SPNEGO under GS2.The
GSS_C_MA_MECH_NEGO attribute of
GSS_Inquire_attrs_for_mech() can be used to identify
such mechanisms.The IANA is advised that SASL mechanism names starting with
"GS2-" are reserved for SASL mechanisms which conform to this
document. The IANA is directed to place a statement to that
effect in the sasl-mechanisms registry.The security provided by GS2 depends on the security provided by
the GSS-API mechanism. If the mechanism do not provide integrity
protection, the authorization identity can be replaced by a man
in the middle, and channel bindings and security layers cannot be
negotiated. Therefor, it is generally recommended against using
any GSS-API mechanism widely on the Internet that do not support
integrity.Because the negotiation of a particular GSS-API mechanism may be
done in the clear, it is important for the GSS-API mechanisms to
be designed such that an active attacker cannot obtain an
authentication with weaker security properties by modifying the
challenges and responses. This is a generic design critera for
the GSS-API mechanisms used under GS2.GS2 permits channel binding negotiation to fail. Implementation
may have a local policy to reject authentication attempts in this
case.When a server or client supports multiple GSS-API mechanisms,
each of which has a different security strength, it is possible
for an active attacker to cause a party to use the least secure
mechanism supported. This problem and a solution is discussed in
section 6.1.2 of , but some additional
methods to mitigate the problem include:Use of an integrity protected transport, such
as TLS. To protect against
certain tunnel attacks, channel
bindings need to be used.A client or server which supports mechanisms of different
strengths should have a configurable minimum strength that it
will use. It is not sufficient for this minimum strength check
to only be on the server, since an active attacker can change
which mechanisms the client sees as being supported, causing
the client to send authentication credentials for its weakest
supported mechanism. This solution, however, is not guaranteed
to lead to the most secure mechanism supported by both parties,
and is therefor only recommended as an additional
precaution.The channel binding is sent without privacy protection and
knowledge of it is assumed to provide no advantage to an
attacker. This is a property that has to be considered when
specifying channel bindings for a security protocol that will be
used with GS2.When constructing the input_name_string, the client should not
canonicalize the server's fully qualified domain name using an
insecure or untrusted directory service, such as
the Domain Name System
without DNSSEC.The GS2 protocol hard code the SHA-1 algorithm for computing the
mechanism names. It is not possible to negotiate another hash
algorithm. However, no traditional cryptographic hash properties
(such as collision resistance or pre-image resistance) are
required nor assumed. The required and assumed property is that
it is statistically unlikely that two different DER-encoded OID's
share the same first 10 octets of the SHA-1 value. It is
possible to practically confirm that the SHA-1 algorithm has the
necessary property, by testing many different inputs.Additional security considerations are in the SASL and GSSAPI
specifications. Additional security considerations for the
Kerberos V5 GSSAPI mechanism can be found in
. We stress that service names should
not be canonicalized using an unsecured directory service such as
the DNS without DNSSEC. Security issues are also discussed
throughout this memo.The history of GS2 can be traced to the GSSAPI mechanism
described in RFC 2222. The GSSAPI mechanism had some drawbacks,
which created a need for an improved version. This document was
derived from draft-ietf-sasl-gssapi-02 which was prepared by
Alexey Melnikov with significant contributions from John G. Myers,
although the majority of this document has been rewritten by the
current author.Contributions of many members of the SASL mailing list are
gratefully acknowledged. In particular, ideas and feedback from
Sam Hartman, Jeffrey Hutzelman, Alexey Melnikov, Nicolas Williams,
and Tom Yu improved the document and the protocol.Man-in-the-Middle in Tunneled Authentication