Repository navigation
Conversation
An `RdpServer` held one `Credentials`, so a server with more than one account could not use NLA: CredSSP checked every client against that single identity. `RdpServer::set_credential_list`, `RdpServerHandle::set_credential_list` and `ServerEvent::SetCredentialList` take a list. CredSSP checks the client's password against the entry whose user name matches, through `CredsspSequence::init_with_identities`; ClientInfo credentials must match one of the entries. `Acceptor::set_credential_list` does the same for embedders driving the acceptor themselves. `set_credentials` keeps its behaviour as a list of at most one. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
Splits the several-credentials CredSSP table from the checks on what reaches the setup handler, and pins the cases the list introduces: - the delegated credentials are those of the matching account; - a refused logon hands nothing to the handler; - an empty list fails CredSSP and leaves Client Info credentials unchecked, as no credentials at all do; - Client Info credentials must equal one of the accounts.
882ddbb to
cdf9967
Compare
|
An empty list shouldn't accept everyone on the TLS path. On master,
This should also reference #1357, which he keeps open as the anchor for credential changes. |
An empty list from `set_credential_list` left ClientInfo credentials unchecked, as `None` does, so a list that emptied at runtime (an account store reloading with no rows) opened a server without a credential validator to any client on the TLS path. The acceptor and the server now keep `Option<Vec<Credentials>>`: `None` still means no credentials were configured and keeps the Devolutions#1150 behaviour, while a list, empty or not, requires a match. An empty list refuses every ClientInfo logon unless an external validator decides them, and CredSSP still fails. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com>
|
Thanks, agreed: an empty list shouldn't open the server. Fixed in 8dcf6b2. The acceptor and the server now keep
The test is now I kept |
An
RdpServerholds a singleCredentials, so a server with more than one account cannot use NLA: CredSSP checks every client against that one identity.This adds a list of accepted credentials:
RdpServer::set_credential_list,RdpServerHandle::set_credential_listandServerEvent::SetCredentialListreplace the accepted set for subsequent connections.CredsspSequence::init_with_identities.CredentialsProxy::auth_datareturns every entry, so a SPNEGO client is matched against all of them.Acceptor::set_credential_listdoes the same for embedders that drive the acceptor themselves.set_credentialsandCredsspSequence::initkeep their behaviour: they are now a list of at most one entry.None(no credentials configured) keeps its behaviour from #1150: ClientInfo credentials are not checked. A list, even an empty one, requires a match: an empty list refuses every ClientInfo logon unless a credential validator decides them, and CredSSP fails.Tests
testsuite-core:
credssp_accepts_any_of_several_credentials: the accept/refuse table for HYBRID and HYBRID_EX.credssp_hands_the_matching_account_to_the_handler: with HYBRID_EX the delegated credentials are those of the matching account.refused_credssp_logon_hands_nothing_to_the_handler.an_empty_credential_list_fails_credsspandan_empty_credential_list_refuses_client_info_credentials.no_credentials_leave_client_info_credentials_uncheckedandan_empty_credential_list_leaves_client_info_credentials_to_the_validator.client_info_credentials_must_match_an_accepted_account.testsuite-extra:
server_handle_set_credential_list_accepts_any_listed_account: an e2e connection as the second listed account.The table and the ClientInfo test fail when the lookup checks only the first entry.
Refs #1357.