summaryrefslogtreecommitdiffstats
path: root/sshd-session.c
diff options
context:
space:
mode:
authorDamien Miller <djm@mindrot.org>2024-06-13 06:35:25 +0200
committerDamien Miller <djm@mindrot.org>2024-06-13 06:35:25 +0200
commitafe10313c1fa8d478af399ee7d54c8f85503013b (patch)
tree569888484b1a7e5669bccfd1b0fab8505e2947c4 /sshd-session.c
parentdelay lookup of privsep user until config loaded (diff)
downloadopenssh-afe10313c1fa8d478af399ee7d54c8f85503013b.tar.xz
openssh-afe10313c1fa8d478af399ee7d54c8f85503013b.zip
fix PTY allocation on Cygwin, broken by sshd split
Cygwin doesn't support FD passing and so used to disable post-auth privilege separation entirely because privsep requires PTY allocation to happen in the privileged monitor process with the PTY file descriptors being passed back to the unprivileged process. This brings back a minimal version of the previous special treatment for Cygwin (and any other platform that sets DISABLE_FD_PASSING): privilege separation remains enabled, but PTY allocation happens in the post-auth user process rather than the monitor. This either requires PTY allocation to not need privilege to begin with (this appears to be the case on Cygwin), or the post-auth privsep process retain privilege (other platforms that set the DISABLE_FD_PASSING option). Keeping privileges here is bad, but the non-Cygwin systems that set DISABLE_FD_PASSING are so deeply legacy that this is likely to be the least of their problems.
Diffstat (limited to 'sshd-session.c')
-rw-r--r--sshd-session.c18
1 files changed, 17 insertions, 1 deletions
diff --git a/sshd-session.c b/sshd-session.c
index dbc3074fa..7ab1ea472 100644
--- a/sshd-session.c
+++ b/sshd-session.c
@@ -379,6 +379,21 @@ privsep_preauth(struct ssh *ssh)
static void
privsep_postauth(struct ssh *ssh, Authctxt *authctxt)
{
+ int skip_privdrop = 0;
+
+ /*
+ * Hack for systems that don't support FD passing: retain privileges
+ * in the post-auth privsep process so it can allocate PTYs directly.
+ * This is basically equivalent to what we did <= 9.7, which was to
+ * disable post-auth privsep entriely.
+ * Cygwin doesn't need to drop privs here although it doesn't support
+ * fd passing, as AFAIK PTY allocation on this platform doesn't require
+ * special privileges to begin with.
+ */
+#if defined(DISABLE_FD_PASSING) && !defined(HAVE_CYGWIN)
+ skip_privdrop = 1;
+#endif
+
/* New socket pair */
monitor_reinit(pmonitor);
@@ -406,7 +421,8 @@ privsep_postauth(struct ssh *ssh, Authctxt *authctxt)
reseed_prngs();
/* Drop privileges */
- do_setusercontext(authctxt->pw);
+ if (!skip_privdrop)
+ do_setusercontext(authctxt->pw);
/* It is safe now to apply the key state */
monitor_apply_keystate(ssh, pmonitor);