Skip to content

Commit 7935d8c

Browse files
fix(dgw): checkout injection before connecting upstream
Missing Kerberos krb_kdc must fail closed without dialing the target. Issue: DGW-1900 Co-authored-by: Copilot <223556219+Copilot@users.noreply.github.com>
1 parent c2e42c6 commit 7935d8c

2 files changed

Lines changed: 38 additions & 30 deletions

File tree

‎devolutions-gateway/src/generic_client.rs‎

Lines changed: 26 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -131,6 +131,31 @@ where
131131
MappingStatus::Absent => false,
132132
};
133133

134+
// Checkout before dialing so missing Kerberos material cannot open an upstream socket.
135+
let credential_injection = if inject {
136+
let kerberos_enabled = crate::credential_injection::kerberos_injection_opt_in(
137+
conf.debug.enable_unstable,
138+
conf.debug.kerberos_credential_injection,
139+
);
140+
Some(
141+
CredentialInjection::checkout(
142+
&provisioning,
143+
&synthetic_kdc_registry,
144+
claims.jti,
145+
token,
146+
kerberos_enabled,
147+
)
148+
.with_context(|| {
149+
format!(
150+
"credential-injection material for {} is missing or expired; re-provision to retry",
151+
claims.jti
152+
)
153+
})?,
154+
)
155+
} else {
156+
None
157+
};
158+
134159
let ConnectedUpstream {
135160
leg: mut server_stream,
136161
server_addr,
@@ -159,25 +184,7 @@ where
159184

160185
let disconnect_interest = DisconnectInterest::from_reconnection_policy(claims.jet_reuse);
161186

162-
if inject {
163-
let kerberos_enabled = crate::credential_injection::kerberos_injection_opt_in(
164-
conf.debug.enable_unstable,
165-
conf.debug.kerberos_credential_injection,
166-
);
167-
let credential_injection = CredentialInjection::checkout(
168-
&provisioning,
169-
&synthetic_kdc_registry,
170-
claims.jti,
171-
token,
172-
kerberos_enabled,
173-
)
174-
.with_context(|| {
175-
format!(
176-
"credential-injection material for {} is missing or expired; re-provision to retry",
177-
claims.jti
178-
)
179-
})?;
180-
187+
if let Some(credential_injection) = credential_injection {
181188
info!(
182189
jti = %credential_injection.jti(),
183190
kerberos = credential_injection.uses_kerberos(),

‎devolutions-gateway/src/rd_clean_path.rs‎

Lines changed: 12 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -471,16 +471,6 @@ async fn handle_with_credential_injection(
471471
.clone()
472472
.context("missing token in RDCleanPath PDU")?;
473473

474-
let ConnectedRdpServer {
475-
tls_stream: server_stream,
476-
server_addr,
477-
selected_target: destination,
478-
x224_rsp,
479-
} = connect_rdp_server(&claims, cleanpath_pdu, agent_tunnel_handle.as_ref())
480-
.await
481-
.context("RDCleanPath connection failed")?;
482-
let x224_rsp = x224_rsp.context("RDCleanPath credential injection requires X.224")?;
483-
484474
let kerberos_enabled = crate::credential_injection::kerberos_injection_opt_in(
485475
conf.debug.enable_unstable,
486476
conf.debug.kerberos_credential_injection,
@@ -491,7 +481,18 @@ async fn handle_with_credential_injection(
491481
claims.jti,
492482
&token,
493483
kerberos_enabled,
494-
)?;
484+
)
485+
.context("checkout credential-injection material before connecting upstream")?;
486+
487+
let ConnectedRdpServer {
488+
tls_stream: server_stream,
489+
server_addr,
490+
selected_target: destination,
491+
x224_rsp,
492+
} = connect_rdp_server(&claims, cleanpath_pdu, agent_tunnel_handle.as_ref())
493+
.await
494+
.context("RDCleanPath connection failed")?;
495+
let x224_rsp = x224_rsp.context("RDCleanPath credential injection requires X.224")?;
495496

496497
let gateway_cert_chain_handle = tokio::spawn(crate::tls::get_cert_chain_for_acceptor_cached(
497498
gateway_hostname,

0 commit comments

Comments
 (0)