Sync from SUSE:SLFO:1.1 openssh revision 1f52701bd4d048c0b32b6640d188bff0

This commit is contained in:
Adrian Schröter 2025-02-26 14:32:25 +01:00
parent 27b76bf9b3
commit b8fef84968
38 changed files with 1965 additions and 2053 deletions

View File

@ -76,8 +76,7 @@ index 6d2d3976234..aac1e92d9cd 100644
struct Authctxt { struct Authctxt {
sig_atomic_t success; sig_atomic_t success;
@@ -111,6 +112,10 @@ struct Authmethod { @@ -111,6 +112,10 @@ struct Authmethod {
# int *enabled; int *enabled;
int (*userauth)(struct ssh *, const char *);
}; };
+#define KbdintResultFailure -1 +#define KbdintResultFailure -1

View File

@ -0,0 +1,55 @@
From 66aaa678dbe59aa21d0d9d89a3596ecedde0254b Mon Sep 17 00:00:00 2001
From: "djm@openbsd.org" <djm@openbsd.org>
Date: Tue, 30 Apr 2024 02:14:10 +0000
Subject: [PATCH] upstream: correctly restore sigprocmask around ppoll()
reported
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
by Tõivo Leedjärv; ok deraadt@
OpenBSD-Commit-ID: c0c0f89de5294a166578f071eade2501929c4686
---
clientloop.c | 4 ++--
serverloop.c | 4 ++--
2 files changed, 4 insertions(+), 4 deletions(-)
diff --git a/clientloop.c b/clientloop.c
index be8bb5fc1f2..8ea2ada4216 100644
--- a/clientloop.c
+++ b/clientloop.c
#@@ -1,4 +1,4 @@
#-/* $OpenBSD: clientloop.c,v 1.404 2024/04/30 02:10:49 djm Exp $ */
#+/* $OpenBSD: clientloop.c,v 1.405 2024/04/30 02:14:10 djm Exp $ */
# /*
# * Author: Tatu Ylonen <ylo@cs.hut.fi>
# * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -1585,7 +1585,7 @@ client_loop(struct ssh *ssh, int have_pty, int escape_char_arg,
client_wait_until_can_do_something(ssh, &pfd, &npfd_alloc,
&npfd_active, channel_did_enqueue, &osigset,
&conn_in_ready, &conn_out_ready);
- if (sigprocmask(SIG_UNBLOCK, &bsigset, &osigset) == -1)
+ if (sigprocmask(SIG_SETMASK, &osigset, NULL) == -1)
error_f("osigset sigprocmask: %s", strerror(errno));
if (quit_pending)
diff --git a/serverloop.c b/serverloop.c
index f3683c2e4a6..94c8943a616 100644
--- a/serverloop.c
+++ b/serverloop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: serverloop.c,v 1.237 2023/08/21 04:59:54 djm Exp $ */
+/* $OpenBSD: serverloop.c,v 1.238 2024/04/30 02:14:10 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -380,7 +380,7 @@ server_loop2(struct ssh *ssh, Authctxt *authctxt)
wait_until_can_do_something(ssh, connection_in, connection_out,
&pfd, &npfd_alloc, &npfd_active, &osigset,
&conn_in_ready, &conn_out_ready);
- if (sigprocmask(SIG_UNBLOCK, &bsigset, &osigset) == -1)
+ if (sigprocmask(SIG_SETMASK, &osigset, NULL) == -1)
error_f("osigset sigprocmask: %s", strerror(errno));
if (received_sigterm) {

View File

@ -0,0 +1,32 @@
From 9844aa2521ccfb1a2d73745680327b79e0574445 Mon Sep 17 00:00:00 2001
From: "djm@openbsd.org" <djm@openbsd.org>
Date: Wed, 21 Feb 2024 05:57:34 +0000
Subject: [PATCH] upstream: fix proxy multiplexing mode, broken when keystroke
timing
obfuscation was added. GHPR#463 from montag451
OpenBSD-Commit-ID: 4e412d59b3f557d431f1d81c715a3bc0491cc677
---
clientloop.c | 4 ++--
1 file changed, 2 insertions(+), 2 deletions(-)
diff --git a/clientloop.c b/clientloop.c
index eb4902905fb..8ec36af94b3 100644
--- a/clientloop.c
+++ b/clientloop.c
@@ -1,4 +1,4 @@
-/* $OpenBSD: clientloop.c,v 1.402 2023/11/24 00:31:30 dtucker Exp $ */
+/* $OpenBSD: clientloop.c,v 1.403 2024/02/21 05:57:34 djm Exp $ */
/*
* Author: Tatu Ylonen <ylo@cs.hut.fi>
* Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -517,7 +517,7 @@ send_chaff(struct ssh *ssh)
{
int r;
- if ((ssh->kex->flags & KEX_HAS_PING) == 0)
+ if (ssh->kex == NULL || (ssh->kex->flags & KEX_HAS_PING) == 0)
return 0;
/* XXX probabilistically send chaff? */
/*

View File

@ -0,0 +1,38 @@
From 146c420d29d055cc75c8606327a1cf8439fe3a08 Mon Sep 17 00:00:00 2001
From: "djm@openbsd.org" <djm@openbsd.org>
Date: Mon, 1 Jul 2024 04:31:17 +0000
Subject: [PATCH] upstream: when sending ObscureKeystrokeTiming chaff packets,
we
can't rely on channel_did_enqueue to tell that there is data to send. This
flag indicates that the channels code enqueued a packet on _this_ ppoll()
iteration, not that data was enqueued in _any_ ppoll() iteration in the
timeslice. ok markus@
OpenBSD-Commit-ID: 009b74fd2769b36b5284a0188ade182f00564136
---
clientloop.c | 7 ++++---
1 file changed, 4 insertions(+), 3 deletions(-)
diff --git a/clientloop.c b/clientloop.c
index 0b6f3c9be02..8ed8b1c3449 100644
--- a/clientloop.c
+++ b/clientloop.c
#@@ -1,4 +1,4 @@
#-/* $OpenBSD: clientloop.c,v 1.407 2024/05/17 06:42:04 jsg Exp $ */
#+/* $OpenBSD: clientloop.c,v 1.408 2024/07/01 04:31:17 djm Exp $ */
# /*
# * Author: Tatu Ylonen <ylo@cs.hut.fi>
# * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -607,8 +607,9 @@ obfuscate_keystroke_timing(struct ssh *ssh, struct timespec *timeout,
if (timespeccmp(&now, &chaff_until, >=)) {
/* Stop if there have been no keystrokes for a while */
stop_reason = "chaff time expired";
- } else if (timespeccmp(&now, &next_interval, >=)) {
- /* Otherwise if we were due to send, then send chaff */
+ } else if (timespeccmp(&now, &next_interval, >=) &&
+ !ssh_packet_have_data_to_write(ssh)) {
+ /* If due to send but have no data, then send chaff */
if (send_chaff(ssh))
nchaff++;
}

19
fix-CVE-2024-6387.patch Normal file
View File

@ -0,0 +1,19 @@
Index: openssh-9.6p1/log.c
===================================================================
--- openssh-9.6p1.orig/log.c
+++ openssh-9.6p1/log.c
@@ -451,12 +451,14 @@ void
sshsigdie(const char *file, const char *func, int line, int showfunc,
LogLevel level, const char *suffix, const char *fmt, ...)
{
+#if 0
va_list args;
va_start(args, fmt);
sshlogv(file, func, line, showfunc, SYSLOG_LEVEL_FATAL,
suffix, fmt, args);
va_end(args);
+#endif
_exit(1);
}

View File

@ -0,0 +1,155 @@
diff --git a/krl.c b/krl.c
index 51a2871..4ecb2c7 100644
--- a/krl.c
+++ b/krl.c
@@ -672,6 +672,7 @@ revoked_certs_generate(struct revoked_certs *rc, struct sshbuf *buf)
break;
case KRL_SECTION_CERT_SERIAL_BITMAP:
if (rs->lo - bitmap_start > INT_MAX) {
+ r = SSH_ERR_INVALID_FORMAT;
error_f("insane bitmap gap");
goto out;
}
@@ -1057,6 +1058,7 @@ ssh_krl_from_blob(struct sshbuf *buf, struct ssh_krl **krlp)
}
if ((krl = ssh_krl_init()) == NULL) {
+ r = SSH_ERR_ALLOC_FAIL;
error_f("alloc failed");
goto out;
}
diff --git a/packet.c b/packet.c
index 72803fd..fa0f7ca 100644
--- a/packet.c
+++ b/packet.c
@@ -1839,6 +1839,14 @@ ssh_packet_read_poll_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
if ((r = sshpkt_get_string_direct(ssh, &d, &len)) != 0)
return r;
DBG(debug("Received SSH2_MSG_PING len %zu", len));
+ if (!ssh->state->after_authentication) {
+ DBG(debug("Won't reply to PING in preauth"));
+ break;
+ }
+ if (ssh_packet_is_rekeying(ssh)) {
+ DBG(debug("Won't reply to PING during KEX"));
+ break;
+ }
if ((r = sshpkt_start(ssh, SSH2_MSG_PONG)) != 0 ||
(r = sshpkt_put_string(ssh, d, len)) != 0 ||
(r = sshpkt_send(ssh)) != 0)
diff --git a/ssh-agent.c b/ssh-agent.c
index 73276f6..607c4a0 100644
--- a/ssh-agent.c
+++ b/ssh-agent.c
@@ -1207,6 +1207,7 @@ parse_key_constraint_extension(struct sshbuf *m, char **sk_providerp,
"restrict-destination-v00@openssh.com") == 0) {
if (*dcsp != NULL) {
error_f("%s already set", ext_name);
+ r = SSH_ERR_INVALID_FORMAT;
goto out;
}
if ((r = sshbuf_froms(m, &b)) != 0) {
@@ -1216,6 +1217,7 @@ parse_key_constraint_extension(struct sshbuf *m, char **sk_providerp,
while (sshbuf_len(b) != 0) {
if (*ndcsp >= AGENT_MAX_DEST_CONSTRAINTS) {
error_f("too many %s constraints", ext_name);
+ r = SSH_ERR_INVALID_FORMAT;
goto out;
}
*dcsp = xrecallocarray(*dcsp, *ndcsp, *ndcsp + 1,
@@ -1233,6 +1235,7 @@ parse_key_constraint_extension(struct sshbuf *m, char **sk_providerp,
}
if (*certs != NULL) {
error_f("%s already set", ext_name);
+ r = SSH_ERR_INVALID_FORMAT;
goto out;
}
if ((r = sshbuf_get_u8(m, &v)) != 0 ||
@@ -1244,6 +1247,7 @@ parse_key_constraint_extension(struct sshbuf *m, char **sk_providerp,
while (sshbuf_len(b) != 0) {
if (*ncerts >= AGENT_MAX_EXT_CERTS) {
error_f("too many %s constraints", ext_name);
+ r = SSH_ERR_INVALID_FORMAT;
goto out;
}
*certs = xrecallocarray(*certs, *ncerts, *ncerts + 1,
@@ -1744,6 +1748,7 @@ process_ext_session_bind(SocketEntry *e)
/* record new key/sid */
if (e->nsession_ids >= AGENT_MAX_SESSION_IDS) {
error_f("too many session IDs recorded");
+ r = -1;
goto out;
}
e->session_ids = xrecallocarray(e->session_ids, e->nsession_ids,
diff --git a/ssh-sk-client.c b/ssh-sk-client.c
index c00c633..27d27a2 100644
--- a/ssh-sk-client.c
+++ b/ssh-sk-client.c
@@ -429,6 +429,7 @@ sshsk_load_resident(const char *provider_path, const char *device,
}
if ((srk = calloc(1, sizeof(*srk))) == NULL) {
error_f("calloc failed");
+ r = SSH_ERR_ALLOC_FAIL;
goto out;
}
srk->key = key;
@@ -440,6 +441,7 @@ sshsk_load_resident(const char *provider_path, const char *device,
if ((tmp = recallocarray(srks, nsrks, nsrks + 1,
sizeof(*srks))) == NULL) {
error_f("recallocarray keys failed");
+ r = SSH_ERR_ALLOC_FAIL;
goto out;
}
debug_f("srks[%zu]: %s %s uidlen %zu", nsrks,
diff --git a/sshconnect2.c b/sshconnect2.c
index 9940833..9751b68 100644
--- a/sshconnect2.c
+++ b/sshconnect2.c
@@ -94,7 +94,7 @@ verify_host_key_callback(struct sshkey *hostkey, struct ssh *ssh)
options.required_rsa_size)) != 0)
fatal_r(r, "Bad server host key");
if (verify_host_key(xxx_host, xxx_hostaddr, hostkey,
- xxx_conn_info) == -1)
+ xxx_conn_info) != 0)
fatal("Host key verification failed.");
return 0;
}
@@ -692,6 +692,7 @@ input_userauth_pk_ok(int type, u_int32_t seq, struct ssh *ssh)
if ((pktype = sshkey_type_from_name(pkalg)) == KEY_UNSPEC) {
debug_f("server sent unknown pkalg %s", pkalg);
+ r = SSH_ERR_INVALID_FORMAT;
goto done;
}
if ((r = sshkey_from_blob(pkblob, blen, &key)) != 0) {
@@ -702,6 +703,7 @@ input_userauth_pk_ok(int type, u_int32_t seq, struct ssh *ssh)
error("input_userauth_pk_ok: type mismatch "
"for decoded key (received %d, expected %d)",
key->type, pktype);
+ r = SSH_ERR_INVALID_FORMAT;
goto done;
}
@@ -721,6 +723,7 @@ input_userauth_pk_ok(int type, u_int32_t seq, struct ssh *ssh)
SSH_FP_DEFAULT);
error_f("server replied with unknown key: %s %s",
sshkey_type(key), fp == NULL ? "<ERROR>" : fp);
+ r = SSH_ERR_INVALID_FORMAT;
goto done;
}
ident = format_identity(id);
diff --git a/sshsig.c b/sshsig.c
index 72bbf73..a88e939 100644
--- a/sshsig.c
+++ b/sshsig.c
@@ -877,6 +877,7 @@ cert_filter_principals(const char *path, u_long linenum,
}
if ((principals = sshbuf_dup_string(nprincipals)) == NULL) {
error_f("buffer error");
+ r = SSH_ERR_ALLOC_FAIL;
goto out;
}
/* success */

View File

@ -0,0 +1,40 @@
From fcc66557503124ab98491a598b706a24eb3cf0e1 Mon Sep 17 00:00:00 2001
From: Antonio Larrosa <alarrosa@suse.com>
Date: Mon, 12 Aug 2024 11:32:42 +0200
Subject: [PATCH] Fix a small memory leak in process_server_config_line_depth
The return value of argv_assemble is owned by the caller and should be
free'd. When processing the sSubsystem case there are two calls to
argv_assemble but only one of them is freed. This patch fixes the small
(29 bytes according to valgrind) memory leak.
The output from valgrind:
==115369== 29 bytes in 1 blocks are definitely lost in loss record 573 of 913
==115369== at 0x4845794: malloc (in /usr/libexec/valgrind/vgpreload_memcheck-amd64-linux.so)
==115369== by 0x124A22: argv_assemble (misc.c:2165)
==115369== by 0x1385E5: process_server_config_line_depth.constprop.0 (servconf.c:2004)
==115369== by 0x13984D: parse_server_config_depth.constprop.0 (servconf.c:3032)
==115369== by 0x139986: parse_server_config.constprop.0 (servconf.c:3049)
==115369== by 0x111C6E: main (sshd.c:1445)
Submitted to upstream at https://github.com/openssh/openssh-portable/pull/515
---
servconf.c | 1 +
1 file changed, 1 insertion(+)
diff --git a/servconf.c b/servconf.c
index 5a20d6f8..0b989b95 100644
--- a/servconf.c
+++ b/servconf.c
@@ -2006,6 +2006,7 @@ process_server_config_line_depth(ServerOptions *options, char *line,
# xasprintf(&options->subsystem_args[options->num_subsystems],
# "%s%s%s", arg, *arg2 == '\0' ? "" : " ", arg2);
xasprintf(&options->subsystem_args[options->num_subsystems],
"%s %s", arg, arg2);
free(arg2);
+ free(arg);
argv_consume(&ac);
options->num_subsystems++;
break;
--
2.45.2

25
fix-missing-lz.patch Normal file
View File

@ -0,0 +1,25 @@
Index: openssh-9.3p1/Makefile.in
===================================================================
--- openssh-9.3p1.orig/Makefile.in
+++ openssh-9.3p1/Makefile.in
@@ -250,17 +250,17 @@ ssh-ldap-helper$(EXEEXT): $(LIBCOMPAT) l
$(LD) -o $@ ldapconf.o ldapbody.o ldapmisc.o ldap-helper.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh -lopenbsd-compat $(LIBS)
sftp-server$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-sk.o sk-usbhid.o $(SFTPSERVER_OBJS)
- $(LD) -o $@ $(SFTPSERVER_OBJS) ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2)
+ $(LD) -o $@ $(SFTPSERVER_OBJS) ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2) -lz
sftp$(EXEEXT): $(LIBCOMPAT) libssh.a $(SFTP_OBJS)
$(LD) -o $@ $(SFTP_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(LIBEDIT)
# FIPS tests
cavstest-ctr$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-sk.o sk-usbhid.o cavstest-ctr.o
- $(LD) -o $@ cavstest-ctr.o ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2)
+ $(LD) -o $@ cavstest-ctr.o ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2) -lz
cavstest-kdf$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-sk.o sk-usbhid.o cavstest-kdf.o
- $(LD) -o $@ cavstest-kdf.o ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2)
+ $(LD) -o $@ cavstest-kdf.o ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2) -lz
# test driver for the loginrec code - not built by default
logintest: logintest.o $(LIBCOMPAT) libssh.a loginrec.o

View File

@ -14,11 +14,11 @@ index f0ea07e7b..35dcf45f1 100644
$(LD) -o $@ $(SSHOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(GSSLIBS) $(CHANNELLIBS) $(LD) -o $@ $(SSHOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(GSSLIBS) $(CHANNELLIBS)
sshd$(EXEEXT): libssh.a $(LIBCOMPAT) $(SSHDOBJS) sshd$(EXEEXT): libssh.a $(LIBCOMPAT) $(SSHDOBJS)
- $(LD) -o $@ $(SSHDOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(CHANNELLIBS) $(LIBWTMPDB) - $(LD) -o $@ $(SSHDOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(GSSLIBS) $(K5LIBS) $(CHANNELLIBS) $(LIBWTMPDB)
+ $(LD) -o $@ $(SSHDOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(CHANNELLIBS) $(LIBWTMPDB) $(LIBSYSTEMD) + $(LD) -o $@ $(SSHDOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(GSSLIBS) $(K5LIBS) $(CHANNELLIBS) $(LIBWTMPDB) $(LIBSYSTEMD)
sshd-session$(EXEEXT): libssh.a $(LIBCOMPAT) $(SSHD_SESSION_OBJS) scp$(EXEEXT): $(LIBCOMPAT) libssh.a $(SCP_OBJS)
$(LD) -o $@ $(SSHD_SESSION_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(GSSLIBS) $(K5LIBS) $(CHANNELLIBS) $(LIBWTMPDB) $(LD) -o $@ $(SCP_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)
diff --git a/configure.ac b/configure.ac diff --git a/configure.ac b/configure.ac
index a12c6f7ad..860df3379 100644 index a12c6f7ad..860df3379 100644
--- a/configure.ac --- a/configure.ac

View File

@ -104,10 +104,10 @@ Index: openssh-9.6p1/openbsd-compat/port-linux.h
#endif #endif
#ifdef LINUX_OOM_ADJUST #ifdef LINUX_OOM_ADJUST
Index: openssh-9.6p1/sshd-session.c Index: openssh-9.6p1/sshd.c
=================================================================== ===================================================================
--- openssh-9.6p1.orig/sshd-session.c --- openssh-9.6p1.orig/sshd.c
+++ openssh-9.6p1/sshd-session.c +++ openssh-9.6p1/sshd.c
@@ -511,7 +511,7 @@ privsep_preauth_child(struct ssh *ssh) @@ -511,7 +511,7 @@ privsep_preauth_child(struct ssh *ssh)
demote_sensitive_data(ssh); demote_sensitive_data(ssh);

View File

@ -99,9 +99,9 @@ Index: openssh-9.3p2/openbsd-compat/port-linux-sshd.c
=================================================================== ===================================================================
--- openssh-9.3p2.orig/openbsd-compat/port-linux-sshd.c --- openssh-9.3p2.orig/openbsd-compat/port-linux-sshd.c
+++ openssh-9.3p2/openbsd-compat/port-linux-sshd.c +++ openssh-9.3p2/openbsd-compat/port-linux-sshd.c
@@ -54,6 +54,20 @@ extern Authctxt *the_authctxt; @@ -53,6 +53,20 @@ extern Authctxt *the_authctxt;
extern Authctxt *the_authctxt;
extern int inetd_flag; extern int inetd_flag;
extern int rexeced_flag;
+/* Wrapper around is_selinux_enabled() to log its return value once only */ +/* Wrapper around is_selinux_enabled() to log its return value once only */
+int +int
@ -129,14 +129,14 @@ Index: openssh-9.3p2/openbsd-compat/port-linux-sshd.c
{ {
const char *reqlvl; const char *reqlvl;
char *role; char *role;
@@ -319,16 +333,16 @@ sshd_selinux_setup_pam_variables(void) @@ -329,16 +343,16 @@ sshd_selinux_setup_pam_variables(void)
ssh_selinux_get_role_level(&role, &reqlvl); ssh_selinux_get_role_level(&role, &reqlvl);
- rv = do_pam_putenv("SELINUX_ROLE_REQUESTED", role ? role : ""); - rv = do_pam_putenv("SELINUX_ROLE_REQUESTED", role ? role : "");
+ rv = set_it("SELINUX_ROLE_REQUESTED", role ? role : ""); + rv = set_it("SELINUX_ROLE_REQUESTED", role ? role : "");
if (inetd_flag) { if (inetd_flag && !rexeced_flag) {
use_current = "1"; use_current = "1";
} else { } else {
use_current = ""; use_current = "";
@ -205,287 +205,287 @@ Index: openssh-9.3p2/platform.c
#endif #endif
#ifdef USE_SOLARIS_PROJECTS #ifdef USE_SOLARIS_PROJECTS
#Index: openssh-9.3p2/ssh-keycat.c Index: openssh-9.3p2/ssh-keycat.c
#=================================================================== ===================================================================
#--- /dev/null --- /dev/null
#+++ openssh-9.3p2/ssh-keycat.c +++ openssh-9.3p2/ssh-keycat.c
#@@ -0,0 +1,241 @@ @@ -0,0 +1,241 @@
#+/* +/*
#+ * Redistribution and use in source and binary forms, with or without + * Redistribution and use in source and binary forms, with or without
#+ * modification, are permitted provided that the following conditions + * modification, are permitted provided that the following conditions
#+ * are met: + * are met:
#+ * 1. Redistributions of source code must retain the above copyright + * 1. Redistributions of source code must retain the above copyright
#+ * notice, and the entire permission notice in its entirety, + * notice, and the entire permission notice in its entirety,
#+ * including the disclaimer of warranties. + * including the disclaimer of warranties.
#+ * 2. Redistributions in binary form must reproduce the above copyright + * 2. Redistributions in binary form must reproduce the above copyright
#+ * notice, this list of conditions and the following disclaimer in the + * notice, this list of conditions and the following disclaimer in the
#+ * documentation and/or other materials provided with the distribution. + * documentation and/or other materials provided with the distribution.
#+ * 3. The name of the author may not be used to endorse or promote + * 3. The name of the author may not be used to endorse or promote
#+ * products derived from this software without specific prior + * products derived from this software without specific prior
#+ * written permission. + * written permission.
#+ * + *
#+ * ALTERNATIVELY, this product may be distributed under the terms of + * ALTERNATIVELY, this product may be distributed under the terms of
#+ * the GNU Public License, in which case the provisions of the GPL are + * the GNU Public License, in which case the provisions of the GPL are
#+ * required INSTEAD OF the above restrictions. (This clause is + * required INSTEAD OF the above restrictions. (This clause is
#+ * necessary due to a potential bad interaction between the GPL and + * necessary due to a potential bad interaction between the GPL and
#+ * the restrictions contained in a BSD-style copyright.) + * the restrictions contained in a BSD-style copyright.)
#+ * + *
#+ * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED + * THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
#+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES + * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
#+ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
#+ * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, + * DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT,
#+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES + * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
#+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
#+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
#+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, + * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT,
#+ * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) + * STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
#+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED + * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED
#+ * OF THE POSSIBILITY OF SUCH DAMAGE. + * OF THE POSSIBILITY OF SUCH DAMAGE.
#+ */ + */
#+ +
#+/* +/*
#+ * Copyright (c) 2011 Red Hat, Inc. + * Copyright (c) 2011 Red Hat, Inc.
#+ * Written by Tomas Mraz <tmraz@redhat.com> + * Written by Tomas Mraz <tmraz@redhat.com>
#+*/ +*/
#+ +
#+#define _GNU_SOURCE +#define _GNU_SOURCE
#+ +
#+#include "config.h" +#include "config.h"
#+#include <stdio.h> +#include <stdio.h>
#+#include <stdlib.h> +#include <stdlib.h>
#+#include <string.h> +#include <string.h>
#+#include <sys/types.h> +#include <sys/types.h>
#+#include <sys/stat.h> +#include <sys/stat.h>
#+#include <pwd.h> +#include <pwd.h>
#+#include <fcntl.h> +#include <fcntl.h>
#+#include <unistd.h> +#include <unistd.h>
#+#ifdef HAVE_STDINT_H +#ifdef HAVE_STDINT_H
#+#include <stdint.h> +#include <stdint.h>
#+#endif +#endif
#+ +
#+#include <security/pam_appl.h> +#include <security/pam_appl.h>
#+ +
#+#include "uidswap.h" +#include "uidswap.h"
#+#include "misc.h" +#include "misc.h"
#+ +
#+#define ERR_USAGE 1 +#define ERR_USAGE 1
#+#define ERR_PAM_START 2 +#define ERR_PAM_START 2
#+#define ERR_OPEN_SESSION 3 +#define ERR_OPEN_SESSION 3
#+#define ERR_CLOSE_SESSION 4 +#define ERR_CLOSE_SESSION 4
#+#define ERR_PAM_END 5 +#define ERR_PAM_END 5
#+#define ERR_GETPWNAM 6 +#define ERR_GETPWNAM 6
#+#define ERR_MEMORY 7 +#define ERR_MEMORY 7
#+#define ERR_OPEN 8 +#define ERR_OPEN 8
#+#define ERR_FILE_MODE 9 +#define ERR_FILE_MODE 9
#+#define ERR_FDOPEN 10 +#define ERR_FDOPEN 10
#+#define ERR_STAT 11 +#define ERR_STAT 11
#+#define ERR_WRITE 12 +#define ERR_WRITE 12
#+#define ERR_PAM_PUTENV 13 +#define ERR_PAM_PUTENV 13
#+#define BUFLEN 4096 +#define BUFLEN 4096
#+ +
#+/* Just ignore the messages in the conversation function */ +/* Just ignore the messages in the conversation function */
#+static int +static int
#+dummy_conv(int num_msg, const struct pam_message **msgm, +dummy_conv(int num_msg, const struct pam_message **msgm,
#+ struct pam_response **response, void *appdata_ptr) + struct pam_response **response, void *appdata_ptr)
#+{ +{
#+ struct pam_response *rsp; + struct pam_response *rsp;
#+ +
#+ (void)msgm; + (void)msgm;
#+ (void)appdata_ptr; + (void)appdata_ptr;
#+ +
#+ if (num_msg <= 0) + if (num_msg <= 0)
#+ return PAM_CONV_ERR; + return PAM_CONV_ERR;
#+ +
#+ /* Just allocate the array as empty responses */ + /* Just allocate the array as empty responses */
#+ rsp = calloc (num_msg, sizeof (struct pam_response)); + rsp = calloc (num_msg, sizeof (struct pam_response));
#+ if (rsp == NULL) + if (rsp == NULL)
#+ return PAM_CONV_ERR; + return PAM_CONV_ERR;
#+ +
#+ *response = rsp; + *response = rsp;
#+ return PAM_SUCCESS; + return PAM_SUCCESS;
#+} +}
#+ +
#+static struct pam_conv conv = { +static struct pam_conv conv = {
#+ dummy_conv, + dummy_conv,
#+ NULL + NULL
#+}; +};
#+ +
#+char * +char *
#+make_auth_keys_name(const struct passwd *pwd) +make_auth_keys_name(const struct passwd *pwd)
#+{ +{
#+ char *fname; + char *fname;
#+ +
#+ if (asprintf(&fname, "%s/.ssh/authorized_keys", pwd->pw_dir) < 0) + if (asprintf(&fname, "%s/.ssh/authorized_keys", pwd->pw_dir) < 0)
#+ return NULL; + return NULL;
#+ +
#+ return fname; + return fname;
#+} +}
#+ +
#+int +int
#+dump_keys(const char *user) +dump_keys(const char *user)
#+{ +{
#+ struct passwd *pwd; + struct passwd *pwd;
#+ int fd = -1; + int fd = -1;
#+ FILE *f = NULL; + FILE *f = NULL;
#+ char *fname = NULL; + char *fname = NULL;
#+ int rv = 0; + int rv = 0;
#+ char buf[BUFLEN]; + char buf[BUFLEN];
#+ size_t len; + size_t len;
#+ struct stat st; + struct stat st;
#+ +
#+ if ((pwd = getpwnam(user)) == NULL) { + if ((pwd = getpwnam(user)) == NULL) {
#+ return ERR_GETPWNAM; + return ERR_GETPWNAM;
#+ } + }
#+ +
#+ if ((fname = make_auth_keys_name(pwd)) == NULL) { + if ((fname = make_auth_keys_name(pwd)) == NULL) {
#+ return ERR_MEMORY; + return ERR_MEMORY;
#+ } + }
#+ +
#+ temporarily_use_uid(pwd); + temporarily_use_uid(pwd);
#+ +
#+ if ((fd = open(fname, O_RDONLY|O_NONBLOCK|O_NOFOLLOW, 0)) < 0) { + if ((fd = open(fname, O_RDONLY|O_NONBLOCK|O_NOFOLLOW, 0)) < 0) {
#+ rv = ERR_OPEN; + rv = ERR_OPEN;
#+ goto fail; + goto fail;
#+ } + }
#+ +
#+ if (fstat(fd, &st) < 0) { + if (fstat(fd, &st) < 0) {
#+ rv = ERR_STAT; + rv = ERR_STAT;
#+ goto fail; + goto fail;
#+ } + }
#+ +
#+ if (!S_ISREG(st.st_mode) || + if (!S_ISREG(st.st_mode) ||
#+ (st.st_uid != pwd->pw_uid && st.st_uid != 0)) { + (st.st_uid != pwd->pw_uid && st.st_uid != 0)) {
#+ rv = ERR_FILE_MODE; + rv = ERR_FILE_MODE;
#+ goto fail; + goto fail;
#+ } + }
#+ +
#+ unset_nonblock(fd); + unset_nonblock(fd);
#+ +
#+ if ((f = fdopen(fd, "r")) == NULL) { + if ((f = fdopen(fd, "r")) == NULL) {
#+ rv = ERR_FDOPEN; + rv = ERR_FDOPEN;
#+ goto fail; + goto fail;
#+ } + }
#+ +
#+ fd = -1; + fd = -1;
#+ +
#+ while ((len = fread(buf, 1, sizeof(buf), f)) > 0) { + while ((len = fread(buf, 1, sizeof(buf), f)) > 0) {
#+ rv = fwrite(buf, 1, len, stdout) != len ? ERR_WRITE : 0; + rv = fwrite(buf, 1, len, stdout) != len ? ERR_WRITE : 0;
#+ } + }
#+ +
#+fail: +fail:
#+ if (fd != -1) + if (fd != -1)
#+ close(fd); + close(fd);
#+ if (f != NULL) + if (f != NULL)
#+ fclose(f); + fclose(f);
#+ free(fname); + free(fname);
#+ restore_uid(); + restore_uid();
#+ return rv; + return rv;
#+} +}
#+ +
#+static const char *env_names[] = { "SELINUX_ROLE_REQUESTED", +static const char *env_names[] = { "SELINUX_ROLE_REQUESTED",
#+ "SELINUX_LEVEL_REQUESTED", + "SELINUX_LEVEL_REQUESTED",
#+ "SELINUX_USE_CURRENT_RANGE" + "SELINUX_USE_CURRENT_RANGE"
#+}; +};
#+ +
#+extern char **environ; +extern char **environ;
#+ +
#+int +int
#+set_pam_environment(pam_handle_t *pamh) +set_pam_environment(pam_handle_t *pamh)
#+{ +{
#+ int i; + int i;
#+ size_t j; + size_t j;
#+ +
#+ for (j = 0; j < sizeof(env_names)/sizeof(env_names[0]); ++j) { + for (j = 0; j < sizeof(env_names)/sizeof(env_names[0]); ++j) {
#+ int len = strlen(env_names[j]); + int len = strlen(env_names[j]);
#+ +
#+ for (i = 0; environ[i] != NULL; ++i) { + for (i = 0; environ[i] != NULL; ++i) {
#+ if (strncmp(env_names[j], environ[i], len) == 0 && + if (strncmp(env_names[j], environ[i], len) == 0 &&
#+ environ[i][len] == '=') { + environ[i][len] == '=') {
#+ if (pam_putenv(pamh, environ[i]) != PAM_SUCCESS) + if (pam_putenv(pamh, environ[i]) != PAM_SUCCESS)
#+ return ERR_PAM_PUTENV; + return ERR_PAM_PUTENV;
#+ } + }
#+ } + }
#+ } + }
#+ +
#+ return 0; + return 0;
#+} +}
#+ +
#+int +int
#+main(int argc, char *argv[]) +main(int argc, char *argv[])
#+{ +{
#+ pam_handle_t *pamh = NULL; + pam_handle_t *pamh = NULL;
#+ int retval; + int retval;
#+ int ev = 0; + int ev = 0;
#+ +
#+ if (argc != 2) { + if (argc != 2) {
#+ fprintf(stderr, "Usage: %s <user-name>\n", argv[0]); + fprintf(stderr, "Usage: %s <user-name>\n", argv[0]);
#+ return ERR_USAGE; + return ERR_USAGE;
#+ } + }
#+ +
#+ retval = pam_start("ssh-keycat", argv[1], &conv, &pamh); + retval = pam_start("ssh-keycat", argv[1], &conv, &pamh);
#+ if (retval != PAM_SUCCESS) { + if (retval != PAM_SUCCESS) {
#+ return ERR_PAM_START; + return ERR_PAM_START;
#+ } + }
#+ +
#+ ev = set_pam_environment(pamh); + ev = set_pam_environment(pamh);
#+ if (ev != 0) + if (ev != 0)
#+ goto finish; + goto finish;
#+ +
#+ retval = pam_open_session(pamh, PAM_SILENT); + retval = pam_open_session(pamh, PAM_SILENT);
#+ if (retval != PAM_SUCCESS) { + if (retval != PAM_SUCCESS) {
#+ ev = ERR_OPEN_SESSION; + ev = ERR_OPEN_SESSION;
#+ goto finish; + goto finish;
#+ } + }
#+ +
#+ ev = dump_keys(argv[1]); + ev = dump_keys(argv[1]);
#+ +
#+ retval = pam_close_session(pamh, PAM_SILENT); + retval = pam_close_session(pamh, PAM_SILENT);
#+ if (retval != PAM_SUCCESS) { + if (retval != PAM_SUCCESS) {
#+ ev = ERR_CLOSE_SESSION; + ev = ERR_CLOSE_SESSION;
#+ } + }
#+ +
#+finish: +finish:
#+ retval = pam_end (pamh,retval); + retval = pam_end (pamh,retval);
#+ if (retval != PAM_SUCCESS) { + if (retval != PAM_SUCCESS) {
#+ ev = ERR_PAM_END; + ev = ERR_PAM_END;
#+ } + }
#+ return ev; + return ev;
#+} +}
#Index: openssh-9.3p2/configure.ac Index: openssh-9.3p2/configure.ac
#=================================================================== ===================================================================
#--- openssh-9.3p2.orig/configure.ac --- openssh-9.3p2.orig/configure.ac
#+++ openssh-9.3p2/configure.ac +++ openssh-9.3p2/configure.ac
#@@ -3632,6 +3632,7 @@ AC_ARG_WITH([pam], @@ -3632,6 +3632,7 @@ AC_ARG_WITH([pam],
# PAM_MSG="yes" PAM_MSG="yes"
#
# SSHDLIBS="$SSHDLIBS -lpam" SSHDLIBS="$SSHDLIBS -lpam"
#+ KEYCATLIBS="$KEYCATLIBS -lpam" + KEYCATLIBS="$KEYCATLIBS -lpam"
# AC_DEFINE([USE_PAM], [1], AC_DEFINE([USE_PAM], [1],
# [Define if you want to enable PAM support]) [Define if you want to enable PAM support])
#
#@@ -3642,6 +3643,7 @@ AC_ARG_WITH([pam], @@ -3642,6 +3643,7 @@ AC_ARG_WITH([pam],
# ;; ;;
# *) *)
# SSHDLIBS="$SSHDLIBS -ldl" SSHDLIBS="$SSHDLIBS -ldl"
#+ KEYCATLIBS="$KEYCATLIBS -ldl" + KEYCATLIBS="$KEYCATLIBS -ldl"
# ;; ;;
# esac esac
# fi fi
#@@ -4875,6 +4877,7 @@ AC_ARG_WITH([selinux], @@ -4875,6 +4877,7 @@ AC_ARG_WITH([selinux],
# fi ] fi ]
# ) )
# AC_SUBST([SSHDLIBS]) AC_SUBST([SSHDLIBS])
#+AC_SUBST([KEYCATLIBS]) +AC_SUBST([KEYCATLIBS])
#
# # Check whether user wants Kerberos 5 support # Check whether user wants Kerberos 5 support
# KRB5_MSG="no" KRB5_MSG="no"
#@@ -5905,6 +5908,9 @@ fi @@ -5905,6 +5908,9 @@ fi
# if test ! -z "${SSHDLIBS}"; then if test ! -z "${SSHDLIBS}"; then
# echo " +for sshd: ${SSHDLIBS}" echo " +for sshd: ${SSHDLIBS}"
# fi fi
#+if test ! -z "${KEYCATLIBS}"; then +if test ! -z "${KEYCATLIBS}"; then
#+echo " +for ssh-keycat: ${KEYCATLIBS}" +echo " +for ssh-keycat: ${KEYCATLIBS}"
#+fi +fi
#
# echo "" echo ""
#

View File

@ -52,7 +52,7 @@ Index: openssh-9.3p2/session.c
platform_setusercontext(pw); platform_setusercontext(pw);
- if (platform_privileged_uidswap()) { - if (platform_privileged_uidswap()) {
+ if (platform_privileged_uidswap() && !is_child) { + if (platform_privileged_uidswap() && (!is_child || !use_privsep)) {
#ifdef HAVE_LOGIN_CAP #ifdef HAVE_LOGIN_CAP
if (setusercontext(lc, pw, pw->pw_uid, if (setusercontext(lc, pw, pw->pw_uid,
(LOGIN_SETALL & ~(LOGIN_SETPATH|LOGIN_SETUSER))) < 0) { (LOGIN_SETALL & ~(LOGIN_SETPATH|LOGIN_SETUSER))) < 0) {
@ -98,11 +98,11 @@ Index: openssh-9.3p2/session.c
exit(sftp_server_main(i, argv, s->pw)); exit(sftp_server_main(i, argv, s->pw));
} }
Index: openssh-9.3p2/sshd-session.c Index: openssh-9.3p2/sshd.c
=================================================================== ===================================================================
--- openssh-9.3p2.orig/sshd-session.c --- openssh-9.3p2.orig/sshd.c
+++ openssh-9.3p2/sshd-session.c +++ openssh-9.3p2/sshd.c
@@ -342,6 +342,10 @@ privsep_preauth_child(struct ssh *ssh) @@ -510,6 +510,10 @@ privsep_preauth_child(struct ssh *ssh)
/* Demote the private keys to public keys. */ /* Demote the private keys to public keys. */
demote_sensitive_data(ssh); demote_sensitive_data(ssh);
@ -113,12 +113,13 @@ Index: openssh-9.3p2/sshd-session.c
/* Demote the child */ /* Demote the child */
if (privsep_chroot) { if (privsep_chroot) {
/* Change our root directory */ /* Change our root directory */
@@ -444,7 +448,7 @@ privsep_postauth(struct ssh *ssh, Authct @@ -602,6 +606,9 @@ privsep_postauth(struct ssh *ssh, Authct
* 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)
+#if defined(DISABLE_FD_PASSING) && !defined(HAVE_CYGWIN) && !defined(WITH_SELINUX)
skip_privdrop = 1;
#endif
#ifdef DISABLE_FD_PASSING
if (1) {
+#elif defined(WITH_SELINUX)
+ if (0) {
+ /* even root user can be confined by SELinux */
#else
if (authctxt->pw->pw_uid == 0) {
#endif

View File

@ -9,16 +9,16 @@ Index: openssh-9.3p2/auth2-pubkey.c
+extern int inetd_flag; +extern int inetd_flag;
+extern int rexeced_flag; +extern int rexeced_flag;
+extern Authctxt *the_authctxt; +extern Authctxt *the_authctxt;
extern struct authmethod_cfg methodcfg_pubkey;
static char * static char *
format_key(const struct sshkey *key)
@@ -459,7 +462,8 @@ match_principals_command(struct passwd * @@ -459,7 +462,8 @@ match_principals_command(struct passwd *
if ((pid = subprocess("AuthorizedPrincipalsCommand", command, if ((pid = subprocess("AuthorizedPrincipalsCommand", command,
ac, av, &f, ac, av, &f,
SSH_SUBPROCESS_STDOUT_CAPTURE|SSH_SUBPROCESS_STDERR_DISCARD, SSH_SUBPROCESS_STDOUT_CAPTURE|SSH_SUBPROCESS_STDERR_DISCARD,
- runas_pw, temporarily_use_uid, restore_uid)) == 0) - runas_pw, temporarily_use_uid, restore_uid)) == 0)
+ runas_pw, temporarily_use_uid, restore_uid, + runas_pw, temporarily_use_uid, restore_uid,
+ inetd_flag, the_authctxt)) == 0) + (inetd_flag && !rexeced_flag), the_authctxt)) == 0)
goto out; goto out;
uid_swapped = 1; uid_swapped = 1;
@ -28,7 +28,7 @@ Index: openssh-9.3p2/auth2-pubkey.c
SSH_SUBPROCESS_STDOUT_CAPTURE|SSH_SUBPROCESS_STDERR_DISCARD, SSH_SUBPROCESS_STDOUT_CAPTURE|SSH_SUBPROCESS_STDERR_DISCARD,
- runas_pw, temporarily_use_uid, restore_uid)) == 0) - runas_pw, temporarily_use_uid, restore_uid)) == 0)
+ runas_pw, temporarily_use_uid, restore_uid, + runas_pw, temporarily_use_uid, restore_uid,
+ inetd_flag, the_authctxt)) == 0) + (inetd_flag && !rexeced_flag), the_authctxt)) == 0)
goto out; goto out;
uid_swapped = 1; uid_swapped = 1;
@ -87,13 +87,14 @@ Index: openssh-9.3p2/openbsd-compat/port-linux-sshd.c
=================================================================== ===================================================================
--- openssh-9.3p2.orig/openbsd-compat/port-linux-sshd.c --- openssh-9.3p2.orig/openbsd-compat/port-linux-sshd.c
+++ openssh-9.3p2/openbsd-compat/port-linux-sshd.c +++ openssh-9.3p2/openbsd-compat/port-linux-sshd.c
@@ -49,10 +49,6 @@ @@ -49,11 +49,6 @@
#include <unistd.h> #include <unistd.h>
#endif #endif
-extern ServerOptions options; -extern ServerOptions options;
-extern Authctxt *the_authctxt; -extern Authctxt *the_authctxt;
-extern int inetd_flag; -extern int inetd_flag;
-extern int rexeced_flag;
- -
/* Wrapper around is_selinux_enabled() to log its return value once only */ /* Wrapper around is_selinux_enabled() to log its return value once only */
int int
@ -132,7 +133,7 @@ Index: openssh-9.3p2/openbsd-compat/port-linux-sshd.c
if (r == 0) { if (r == 0) {
/* If launched from xinetd, we must use current level */ /* If launched from xinetd, we must use current level */
- if (inetd_flag) { - if (inetd_flag && !rexeced_flag) {
+ if (inetd) { + if (inetd) {
security_context_t sshdsc=NULL; security_context_t sshdsc=NULL;
@ -156,7 +157,7 @@ Index: openssh-9.3p2/openbsd-compat/port-linux-sshd.c
rv = set_it("SELINUX_ROLE_REQUESTED", role ? role : ""); rv = set_it("SELINUX_ROLE_REQUESTED", role ? role : "");
- if (inetd_flag) { - if (inetd_flag && !rexeced_flag) {
+ if (inetd) { + if (inetd) {
use_current = "1"; use_current = "1";
} else { } else {
@ -221,46 +222,56 @@ Index: openssh-9.3p2/platform.c
=================================================================== ===================================================================
--- openssh-9.3p2.orig/platform.c --- openssh-9.3p2.orig/platform.c
+++ openssh-9.3p2/platform.c +++ openssh-9.3p2/platform.c
@@ -34,6 +34,8 @@ @@ -34,6 +34,9 @@
#include "openbsd-compat/openbsd-compat.h"
extern int use_privsep;
extern ServerOptions options; extern ServerOptions options;
+extern int inetd_flag; +extern int inetd_flag;
+extern int rexeced_flag;
+extern Authctxt *the_authctxt; +extern Authctxt *the_authctxt;
/* return 1 if we are running with privilege to swap UIDs, 0 otherwise */ void
int platform_pre_listen(void)
@@ -185,7 +187,9 @@ platform_setusercontext_post_groups(stru @@ -185,7 +188,9 @@ platform_setusercontext_post_groups(stru
} }
#endif /* HAVE_SETPCRED */ #endif /* HAVE_SETPCRED */
#ifdef WITH_SELINUX #ifdef WITH_SELINUX
- sshd_selinux_setup_exec_context(pw->pw_name); - sshd_selinux_setup_exec_context(pw->pw_name);
+ sshd_selinux_setup_exec_context(pw->pw_name, + sshd_selinux_setup_exec_context(pw->pw_name,
+ inetd_flag, do_pam_putenv, the_authctxt, + (inetd_flag && !rexeced_flag), do_pam_putenv, the_authctxt,
+ options.use_pam); + options.use_pam);
#endif #endif
} }
Index: openssh-9.3p2/sshd-session.c Index: openssh-9.3p2/sshd.c
=================================================================== ===================================================================
--- openssh-9.3p2.orig/sshd-session.c --- openssh-9.3p2.orig/sshd.c
+++ openssh-9.3p2/sshd-session.c +++ openssh-9.3p2/sshd.c
@@ -166,7 +166,7 @@ int debug_flag = 0; @@ -166,7 +166,7 @@ int debug_flag = 0;
int debug_flag = 0; static int test_flag = 0;
/* Flag indicating that the daemon is being started from inetd. */ /* Flag indicating that the daemon is being started from inetd. */
-static int inetd_flag = 0; -static int inetd_flag = 0;
+int inetd_flag = 0; +int inetd_flag = 0;
/* debug goes to stderr unless inetd_flag is set */ /* Flag indicating that sshd should not detach and become a daemon. */
static int log_stderr = 0; static int no_daemon_flag = 0;
@@ -179,7 +179,7 @@ static char **saved_argv;
static int saved_argc;
/* re-exec */
-static int rexeced_flag = 0;
+int rexeced_flag = 0;
static int rexec_flag = 1;
static int rexec_argc = 0;
static char **rexec_argv;
@@ -2396,7 +2396,9 @@ main(int ac, char **av) @@ -2396,7 +2396,9 @@ main(int ac, char **av)
} }
#endif #endif
#ifdef WITH_SELINUX #ifdef WITH_SELINUX
- sshd_selinux_setup_exec_context(authctxt->pw->pw_name); - sshd_selinux_setup_exec_context(authctxt->pw->pw_name);
+ sshd_selinux_setup_exec_context(authctxt->pw->pw_name, + sshd_selinux_setup_exec_context(authctxt->pw->pw_name,
+ inetd_flag, do_pam_putenv, the_authctxt, + (inetd_flag && !rexeced_flag), do_pam_putenv, the_authctxt,
+ options.use_pam); + options.use_pam);
#endif #endif
#ifdef USE_PAM #ifdef USE_PAM

View File

@ -7,7 +7,7 @@ Index: openssh-8.8p1/Makefile.in
--- openssh-8.8p1.orig/Makefile.in --- openssh-8.8p1.orig/Makefile.in
+++ openssh-8.8p1/Makefile.in +++ openssh-8.8p1/Makefile.in
@@ -26,6 +26,7 @@ SFTP_SERVER=$(libexecdir)/sftp-server @@ -26,6 +26,7 @@ SFTP_SERVER=$(libexecdir)/sftp-server
SSHD_SESSION=$(libexecdir)/sshd-session SSH_KEYSIGN=$(libexecdir)/ssh-keysign
SSH_PKCS11_HELPER=$(libexecdir)/ssh-pkcs11-helper SSH_PKCS11_HELPER=$(libexecdir)/ssh-pkcs11-helper
SSH_SK_HELPER=$(libexecdir)/ssh-sk-helper SSH_SK_HELPER=$(libexecdir)/ssh-sk-helper
+CAVSTEST_CTR=$(libexecdir)/cavstest-ctr +CAVSTEST_CTR=$(libexecdir)/cavstest-ctr
@ -16,7 +16,7 @@ Index: openssh-8.8p1/Makefile.in
STRIP_OPT=@STRIP_OPT@ STRIP_OPT=@STRIP_OPT@
@@ -69,6 +70,8 @@ MKDIR_P=@MKDIR_P@ @@ -69,6 +70,8 @@ MKDIR_P=@MKDIR_P@
TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) sshd-session$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-pkcs11-helper$(EXEEXT) ssh-agent$(EXEEXT) scp$(EXEEXT) sftp-server$(EXEEXT) sftp$(EXEEXT) ssh-sk-helper$(EXEEXT) TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-pkcs11-helper$(EXEEXT) ssh-agent$(EXEEXT) scp$(EXEEXT) sftp-server$(EXEEXT) sftp$(EXEEXT) ssh-sk-helper$(EXEEXT)
+TARGETS += cavstest-ctr$(EXEEXT) +TARGETS += cavstest-ctr$(EXEEXT)
+ +
@ -29,7 +29,7 @@ Index: openssh-8.8p1/Makefile.in
+# FIPS tests +# FIPS tests
+cavstest-ctr$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-sk.o sk-usbhid.o cavstest-ctr.o +cavstest-ctr$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-sk.o sk-usbhid.o cavstest-ctr.o
+ $(LD) -o $@ cavstest-ctr.o ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2) -lz + $(LD) -o $@ cavstest-ctr.o ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2)
+ +
# test driver for the loginrec code - not built by default # test driver for the loginrec code - not built by default
logintest: logintest.o $(LIBCOMPAT) libssh.a loginrec.o logintest: logintest.o $(LIBCOMPAT) libssh.a loginrec.o

View File

@ -16,7 +16,7 @@ Index: openssh-8.8p1/Makefile.in
STRIP_OPT=@STRIP_OPT@ STRIP_OPT=@STRIP_OPT@
@@ -70,7 +71,7 @@ MKDIR_P=@MKDIR_P@ @@ -70,7 +71,7 @@ MKDIR_P=@MKDIR_P@
TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) sshd-session$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-pkcs11-helper$(EXEEXT) ssh-agent$(EXEEXT) scp$(EXEEXT) sftp-server$(EXEEXT) sftp$(EXEEXT) ssh-sk-helper$(EXEEXT) TARGETS=ssh$(EXEEXT) sshd$(EXEEXT) ssh-add$(EXEEXT) ssh-keygen$(EXEEXT) ssh-keyscan${EXEEXT} ssh-keysign${EXEEXT} ssh-pkcs11-helper$(EXEEXT) ssh-agent$(EXEEXT) scp$(EXEEXT) sftp-server$(EXEEXT) sftp$(EXEEXT) ssh-sk-helper$(EXEEXT)
-TARGETS += cavstest-ctr$(EXEEXT) -TARGETS += cavstest-ctr$(EXEEXT)
+TARGETS += cavstest-ctr$(EXEEXT) cavstest-kdf$(EXEEXT) +TARGETS += cavstest-ctr$(EXEEXT) cavstest-kdf$(EXEEXT)
@ -25,10 +25,10 @@ Index: openssh-8.8p1/Makefile.in
ssh-xmss.o \ ssh-xmss.o \
@@ -252,6 +253,9 @@ sftp$(EXEEXT): $(LIBCOMPAT) libssh.a $(S @@ -252,6 +253,9 @@ sftp$(EXEEXT): $(LIBCOMPAT) libssh.a $(S
cavstest-ctr$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-sk.o sk-usbhid.o cavstest-ctr.o cavstest-ctr$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-sk.o sk-usbhid.o cavstest-ctr.o
$(LD) -o $@ cavstest-ctr.o ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2) -lz $(LD) -o $@ cavstest-ctr.o ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2)
+cavstest-kdf$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-sk.o sk-usbhid.o cavstest-kdf.o +cavstest-kdf$(EXEEXT): $(LIBCOMPAT) libssh.a ssh-sk.o sk-usbhid.o cavstest-kdf.o
+ $(LD) -o $@ cavstest-kdf.o ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2) -lz + $(LD) -o $@ cavstest-kdf.o ssh-sk.o sk-usbhid.o $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LIBFIDO2)
+ +
# test driver for the loginrec code - not built by default # test driver for the loginrec code - not built by default
logintest: logintest.o $(LIBCOMPAT) libssh.a loginrec.o logintest: logintest.o $(LIBCOMPAT) libssh.a loginrec.o

View File

@ -389,17 +389,17 @@ Index: openssh-9.6p1/hmac.c
ssh_hmac_update(ctx, m, mlen) < 0 || ssh_hmac_update(ctx, m, mlen) < 0 ||
Index: openssh-9.6p1/kex.c Index: openssh-9.6p1/kex.c
=================================================================== ===================================================================
--- openssh-9.6p1.orig/kex-names.c --- openssh-9.6p1.orig/kex.c
+++ openssh-9.6p1/kex-names.c +++ openssh-9.6p1/kex.c
@@ -64,6 +64,8 @@ @@ -64,6 +64,8 @@
#include "ssherr.h" #include "digest.h"
#include "xmalloc.h" #include "xmalloc.h"
+#include "fips.h" +#include "fips.h"
+ +
struct kexalg { /* prototype */
char *name; static int kex_choose_conf(struct ssh *, uint32_t seq);
u_int type; static int kex_input_newkeys(int, u_int32_t, struct ssh *);
@@ -87,7 +89,7 @@ struct kexalg { @@ -87,7 +89,7 @@ struct kexalg {
int ec_nid; int ec_nid;
int hash_alg; int hash_alg;
@ -647,8 +647,8 @@ Index: openssh-9.6p1/servconf.c
#include "digest.h" #include "digest.h"
+#include "fips.h" +#include "fips.h"
#if !defined(SSHD_PAM_SERVICE) static void add_listen_addr(ServerOptions *, const char *,
# define SSHD_PAM_SERVICE "sshd" const char *, int);
@@ -207,6 +208,23 @@ option_clear_or_none(const char *o) @@ -207,6 +208,23 @@ option_clear_or_none(const char *o)
return o == NULL || strcasecmp(o, "none") == 0; return o == NULL || strcasecmp(o, "none") == 0;
} }
@ -754,7 +754,7 @@ Index: openssh-9.6p1/ssh-keygen.c
@@ -3794,6 +3815,15 @@ main(int argc, char **argv) @@ -3794,6 +3815,15 @@ main(int argc, char **argv)
key_type_name = DEFAULT_KEY_TYPE_NAME; key_type_name = DEFAULT_KEY_TYPE_NAME;
type = sshkey_type_from_shortname(key_type_name); type = sshkey_type_from_name(key_type_name);
+ +
+ /* protocol v1 is not allowed in FIPS mode, DSA is not acceptable because + /* protocol v1 is not allowed in FIPS mode, DSA is not acceptable because
+ * it has to be 1024 bit due to RFC 4253 using SHA-1 which implies 1024 bit + * it has to be 1024 bit due to RFC 4253 using SHA-1 which implies 1024 bit
@ -785,8 +785,8 @@ Index: openssh-9.6p1/sshd.c
--- openssh-9.6p1.orig/sshd.c --- openssh-9.6p1.orig/sshd.c
+++ openssh-9.6p1/sshd.c +++ openssh-9.6p1/sshd.c
@@ -128,6 +128,8 @@ @@ -128,6 +128,8 @@
#include "addr.h"
#include "srclimit.h" #include "srclimit.h"
#include "dh.h"
+#include "fips.h" +#include "fips.h"
+ +

View File

@ -459,13 +459,13 @@ Index: openssh-8.8p1/sshd.c
--- openssh-8.8p1.orig/sshd.c --- openssh-8.8p1.orig/sshd.c
+++ openssh-8.8p1/sshd.c +++ openssh-8.8p1/sshd.c
@@ -1547,6 +1547,10 @@ main(int ac, char **av) @@ -1547,6 +1547,10 @@ main(int ac, char **av)
struct connection_info connection_info; struct connection_info *connection_info = NULL;
sigset_t sigmask; sigset_t sigmask;
+ /* initialize fips - can go before ssh_malloc_init(), since that is a + /* initialize fips - can go before ssh_malloc_init(), since that is a
+ * OpenBSD-only thing (as of OpenSSH 7.6p1) */ + * OpenBSD-only thing (as of OpenSSH 7.6p1) */
+ fips_ssh_init(); + fips_ssh_init();
+ +
memset(&connection_info, 0, sizeof(connection_info));
#ifdef HAVE_SECUREWARE #ifdef HAVE_SECUREWARE
(void)set_auth_parameters(ac, av); (void)set_auth_parameters(ac, av);
#endif

View File

@ -128,7 +128,7 @@ Index: openssh-8.9p1/Makefile.in
--- openssh-8.9p1.orig/Makefile.in --- openssh-8.9p1.orig/Makefile.in
+++ openssh-8.9p1/Makefile.in +++ openssh-8.9p1/Makefile.in
@@ -27,6 +27,8 @@ SFTP_SERVER=$(libexecdir)/sftp-server @@ -27,6 +27,8 @@ SFTP_SERVER=$(libexecdir)/sftp-server
SSHD_SESSION=$(libexecdir)/sshd-session SSH_KEYSIGN=$(libexecdir)/ssh-keysign
SSH_PKCS11_HELPER=$(libexecdir)/ssh-pkcs11-helper SSH_PKCS11_HELPER=$(libexecdir)/ssh-pkcs11-helper
SSH_SK_HELPER=$(libexecdir)/ssh-sk-helper SSH_SK_HELPER=$(libexecdir)/ssh-sk-helper
+SSH_LDAP_HELPER=$(libexecdir)/ssh-ldap-helper +SSH_LDAP_HELPER=$(libexecdir)/ssh-ldap-helper
@ -168,7 +168,7 @@ Index: openssh-8.9p1/Makefile.in
$(LD) -o $@ $(SFTPSERVER_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS) $(LD) -o $@ $(SFTPSERVER_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat -lssh $(LIBS)
@@ -421,6 +429,10 @@ install-files: @@ -421,6 +429,10 @@ install-files:
$(INSTALL) -m 0755 $(STRIP_OPT) sshd-session$(EXEEXT) $(DESTDIR)$(SSHD_SESSION)$(EXEEXT) $(INSTALL) -m 0755 $(STRIP_OPT) sshd$(EXEEXT) $(DESTDIR)$(sbindir)/sshd$(EXEEXT)
$(INSTALL) -m 4711 $(STRIP_OPT) ssh-keysign$(EXEEXT) $(DESTDIR)$(SSH_KEYSIGN)$(EXEEXT) $(INSTALL) -m 4711 $(STRIP_OPT) ssh-keysign$(EXEEXT) $(DESTDIR)$(SSH_KEYSIGN)$(EXEEXT)
$(INSTALL) -m 0755 $(STRIP_OPT) ssh-pkcs11-helper$(EXEEXT) $(DESTDIR)$(SSH_PKCS11_HELPER)$(EXEEXT) $(INSTALL) -m 0755 $(STRIP_OPT) ssh-pkcs11-helper$(EXEEXT) $(DESTDIR)$(SSH_PKCS11_HELPER)$(EXEEXT)
+ if test ! -z "$(INSTALL_SSH_LDAP_HELPER)" ; then \ + if test ! -z "$(INSTALL_SSH_LDAP_HELPER)" ; then \

View File

@ -32,17 +32,17 @@ Index: openssh-8.8p1/servconf.c
--- openssh-8.8p1.orig/servconf.c --- openssh-8.8p1.orig/servconf.c
+++ openssh-8.8p1/servconf.c +++ openssh-8.8p1/servconf.c
@@ -92,6 +92,7 @@ initialize_server_options(ServerOptions @@ -92,6 +92,7 @@ initialize_server_options(ServerOptions
/* Portable-specific options */ /* Portable-specific options */
options->use_pam = -1; options->use_pam = -1;
options->pam_service_name = NULL;
+ options->use_pam_check_locks = -1; + options->use_pam_check_locks = -1;
/* Standard Options */ /* Standard Options */
options->num_ports = 0; options->num_ports = 0;
@@ -278,6 +279,8 @@ fill_default_server_options(ServerOption @@ -278,6 +279,8 @@ fill_default_server_options(ServerOption
/* Portable-specific options */
if (options->use_pam == -1)
options->use_pam = 0; options->use_pam = 0;
if (options->pam_service_name == NULL)
options->pam_service_name = xstrdup(SSHD_PAM_SERVICE);
+ if (options->use_pam_check_locks == -1) + if (options->use_pam_check_locks == -1)
+ options->use_pam_check_locks = 0; + options->use_pam_check_locks = 0;
@ -52,27 +52,26 @@ Index: openssh-8.8p1/servconf.c
typedef enum { typedef enum {
sBadOption, /* == unknown option */ sBadOption, /* == unknown option */
/* Portable-specific options */ /* Portable-specific options */
- sUsePAM, sPAMServiceName, - sUsePAM,
+ sUsePAM, sPAMServiceName, sUsePAMChecklocks, + sUsePAM, sUsePAMChecklocks,
/* Standard Options */ /* Standard Options */
sPort, sHostKeyFile, sLoginGraceTime, sPort, sHostKeyFile, sLoginGraceTime,
sPermitRootLogin, sLogFacility, sLogLevel, sLogVerbose, sPermitRootLogin, sLogFacility, sLogLevel, sLogVerbose,
@@ -535,9 +538,11 @@ static struct { @@ -535,8 +538,10 @@ static struct {
/* Portable-specific options */
#ifdef USE_PAM #ifdef USE_PAM
{ "usepam", sUsePAM, SSHCFG_GLOBAL }, { "usepam", sUsePAM, SSHCFG_GLOBAL },
{ "pamservicename", sPAMServiceName, SSHCFG_ALL },
+ { "usepamchecklocks", sUsePAMChecklocks, SSHCFG_GLOBAL }, + { "usepamchecklocks", sUsePAMChecklocks, SSHCFG_GLOBAL },
#else #else
{ "usepam", sUnsupported, SSHCFG_GLOBAL }, { "usepam", sUnsupported, SSHCFG_GLOBAL },
{ "pamservicename", sUnsupported, SSHCFG_ALL },
+ { "usepamchecklocks", sUnsupported, SSHCFG_GLOBAL }, + { "usepamchecklocks", sUnsupported, SSHCFG_GLOBAL },
#endif #endif
{ "pamauthenticationviakbdint", sDeprecated, SSHCFG_GLOBAL }, { "pamauthenticationviakbdint", sDeprecated, SSHCFG_GLOBAL },
/* Standard Options */ /* Standard Options */
@@ -1331,6 +1336,9 @@ process_server_config_line_depth(ServerO @@ -1331,6 +1336,9 @@ process_server_config_line_depth(ServerO
if (*activep && *charptr == NULL) case sUsePAM:
*charptr = xstrdup(arg); intptr = &options->use_pam;
break; goto parse_flag;
+ case sUsePAMChecklocks: + case sUsePAMChecklocks:
+ intptr = &options->use_pam_check_locks; + intptr = &options->use_pam_check_locks;
+ goto parse_flag; + goto parse_flag;
@ -84,9 +83,9 @@ Index: openssh-8.8p1/servconf.h
--- openssh-8.8p1.orig/servconf.h --- openssh-8.8p1.orig/servconf.h
+++ openssh-8.8p1/servconf.h +++ openssh-8.8p1/servconf.h
@@ -200,6 +200,7 @@ typedef struct { @@ -200,6 +200,7 @@ typedef struct {
char *adm_forced_command;
int use_pam; /* Enable auth via PAM */ int use_pam; /* Enable auth via PAM */
char *pam_service_name;
+ int use_pam_check_locks; /* internally check for locked accounts even when using PAM */ + int use_pam_check_locks; /* internally check for locked accounts even when using PAM */
int permit_tun; int permit_tun;

View File

@ -61,7 +61,7 @@ Index: openssh-8.8p1/sshd.c
+ +
#include "xmalloc.h" #include "xmalloc.h"
#include "ssh.h" #include "ssh.h"
#include "sshpty.h" #include "ssh2.h"
@@ -308,6 +312,10 @@ sighup_handler(int sig) @@ -308,6 +312,10 @@ sighup_handler(int sig)
static void static void
sighup_restart(void) sighup_restart(void)
@ -84,4 +84,4 @@ Index: openssh-8.8p1/sshd.c
+ +
/* Accept a connection and return in a forked child */ /* Accept a connection and return in a forked child */
server_accept_loop(&sock_in, &sock_out, server_accept_loop(&sock_in, &sock_out,
&newsock, config_s, log_stderr); &newsock, config_s);

View File

@ -1,7 +1,8 @@
diff -up openssh/auth2.c.role-mls openssh/auth2.c Index: openssh-9.6p1/auth2.c
--- openssh/auth2.c.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/auth2.c 2018-08-22 11:14:56.815430916 +0200 --- openssh-9.6p1.orig/auth2.c
@@ -256,6 +256,9 @@ input_userauth_request(int type, u_int32 +++ openssh-9.6p1/auth2.c
@@ -273,6 +273,9 @@ input_userauth_request(int type, u_int32
Authctxt *authctxt = ssh->authctxt; Authctxt *authctxt = ssh->authctxt;
Authmethod *m = NULL; Authmethod *m = NULL;
char *user = NULL, *service = NULL, *method = NULL, *style = NULL; char *user = NULL, *service = NULL, *method = NULL, *style = NULL;
@ -11,7 +12,7 @@ diff -up openssh/auth2.c.role-mls openssh/auth2.c
int r, authenticated = 0; int r, authenticated = 0;
double tstart = monotime_double(); double tstart = monotime_double();
@@ -268,6 +271,11 @@ input_userauth_request(int type, u_int32 @@ -286,6 +289,11 @@ input_userauth_request(int type, u_int32
debug("userauth-request for user %s service %s method %s", user, service, method); debug("userauth-request for user %s service %s method %s", user, service, method);
debug("attempt %d failures %d", authctxt->attempt, authctxt->failures); debug("attempt %d failures %d", authctxt->attempt, authctxt->failures);
@ -23,32 +24,36 @@ diff -up openssh/auth2.c.role-mls openssh/auth2.c
if ((style = strchr(user, ':')) != NULL) if ((style = strchr(user, ':')) != NULL)
*style++ = 0; *style++ = 0;
@@ -314,7 +314,13 @@ input_userauth_request(int type, u_int32 @@ -313,8 +321,15 @@ input_userauth_request(int type, u_int32
setproctitle("%s [net]", authctxt->valid ? user : "unknown"); use_privsep ? " [net]" : "");
authctxt->service = xstrdup(service); authctxt->service = xstrdup(service);
authctxt->style = style ? xstrdup(style) : NULL; authctxt->style = style ? xstrdup(style) : NULL;
- if (use_privsep)
+#ifdef WITH_SELINUX +#ifdef WITH_SELINUX
+ authctxt->role = role ? xstrdup(role) : NULL; + authctxt->role = role ? xstrdup(role) : NULL;
+#endif +#endif
mm_inform_authserv(service, style); + if (use_privsep) {
mm_inform_authserv(service, style);
+#ifdef WITH_SELINUX +#ifdef WITH_SELINUX
+ mm_inform_authrole(role); + mm_inform_authrole(role);
+#endif +#endif
+ }
userauth_banner(ssh); userauth_banner(ssh);
if ((r = kex_server_update_ext_info(ssh)) != 0) if ((r = kex_server_update_ext_info(ssh)) != 0)
fatal_fr(r, "kex_server_update_ext_info failed"); fatal_fr(r, "kex_server_update_ext_info failed");
diff -up openssh/auth2-gss.c.role-mls openssh/auth2-gss.c Index: openssh-9.6p1/auth2-gss.c
--- openssh/auth2-gss.c.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/auth2-gss.c 2018-08-22 11:15:42.459799171 +0200 --- openssh-9.6p1.orig/auth2-gss.c
@@ -281,6 +281,7 @@ input_gssapi_mic(int type, u_int32_t ple +++ openssh-9.6p1/auth2-gss.c
@@ -331,6 +331,7 @@ input_gssapi_mic(int type, u_int32_t ple
Authctxt *authctxt = ssh->authctxt; Authctxt *authctxt = ssh->authctxt;
Gssctxt *gssctxt; Gssctxt *gssctxt;
int r, authenticated = 0; int r, authenticated = 0;
+ char *micuser; + char *micuser;
struct sshbuf *b; struct sshbuf *b;
gss_buffer_desc mic, gssbuf; gss_buffer_desc mic, gssbuf;
u_char *p; const char *displayname;
@@ -298,7 +299,13 @@ input_gssapi_mic(int type, u_int32_t ple @@ -348,7 +349,13 @@ input_gssapi_mic(int type, u_int32_t ple
fatal_f("sshbuf_new failed"); fatal_f("sshbuf_new failed");
mic.value = p; mic.value = p;
mic.length = len; mic.length = len;
@ -63,7 +68,7 @@ diff -up openssh/auth2-gss.c.role-mls openssh/auth2-gss.c
"gssapi-with-mic", ssh->kex->session_id); "gssapi-with-mic", ssh->kex->session_id);
if ((gssbuf.value = sshbuf_mutable_ptr(b)) == NULL) if ((gssbuf.value = sshbuf_mutable_ptr(b)) == NULL)
@@ -311,6 +318,8 @@ input_gssapi_mic(int type, u_int32_t ple @@ -362,6 +369,8 @@ input_gssapi_mic(int type, u_int32_t ple
logit("GSSAPI MIC check failed"); logit("GSSAPI MIC check failed");
sshbuf_free(b); sshbuf_free(b);
@ -71,11 +76,12 @@ diff -up openssh/auth2-gss.c.role-mls openssh/auth2-gss.c
+ free(micuser); + free(micuser);
free(mic.value); free(mic.value);
authctxt->postponed = 0; if ((!use_privsep || mm_is_monitor()) &&
diff -up openssh/auth2-hostbased.c.role-mls openssh/auth2-hostbased.c Index: openssh-9.6p1/auth2-hostbased.c
--- openssh/auth2-hostbased.c.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/auth2-hostbased.c 2018-08-22 11:14:56.816430924 +0200 --- openssh-9.6p1.orig/auth2-hostbased.c
@@ -123,7 +123,16 @@ userauth_hostbased(struct ssh *ssh) +++ openssh-9.6p1/auth2-hostbased.c
@@ -128,7 +128,16 @@ userauth_hostbased(struct ssh *ssh, cons
/* reconstruct packet */ /* reconstruct packet */
if ((r = sshbuf_put_stringb(b, ssh->kex->session_id)) != 0 || if ((r = sshbuf_put_stringb(b, ssh->kex->session_id)) != 0 ||
(r = sshbuf_put_u8(b, SSH2_MSG_USERAUTH_REQUEST)) != 0 || (r = sshbuf_put_u8(b, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
@ -92,10 +98,11 @@ diff -up openssh/auth2-hostbased.c.role-mls openssh/auth2-hostbased.c
(r = sshbuf_put_cstring(b, authctxt->service)) != 0 || (r = sshbuf_put_cstring(b, authctxt->service)) != 0 ||
(r = sshbuf_put_cstring(b, method)) != 0 || (r = sshbuf_put_cstring(b, method)) != 0 ||
(r = sshbuf_put_string(b, pkalg, alen)) != 0 || (r = sshbuf_put_string(b, pkalg, alen)) != 0 ||
diff -up openssh/auth2-pubkey.c.role-mls openssh/auth2-pubkey.c Index: openssh-9.6p1/auth2-pubkey.c
--- openssh/auth2-pubkey.c.role-mls 2018-08-22 11:14:56.816430924 +0200 ===================================================================
+++ openssh/auth2-pubkey.c 2018-08-22 11:17:07.331483958 +0200 --- openssh-9.6p1.orig/auth2-pubkey.c
@@ -169,9 +169,16 @@ userauth_pubkey(struct ssh *ssh) +++ openssh-9.6p1/auth2-pubkey.c
@@ -200,9 +200,16 @@ userauth_pubkey(struct ssh *ssh, const c
goto done; goto done;
} }
/* reconstruct packet */ /* reconstruct packet */
@ -114,9 +121,10 @@ diff -up openssh/auth2-pubkey.c.role-mls openssh/auth2-pubkey.c
if ((r = sshbuf_put_u8(b, SSH2_MSG_USERAUTH_REQUEST)) != 0 || if ((r = sshbuf_put_u8(b, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
(r = sshbuf_put_cstring(b, userstyle)) != 0 || (r = sshbuf_put_cstring(b, userstyle)) != 0 ||
(r = sshbuf_put_cstring(b, authctxt->service)) != 0 || (r = sshbuf_put_cstring(b, authctxt->service)) != 0 ||
diff -up openssh/auth.h.role-mls openssh/auth.h Index: openssh-9.6p1/auth.h
--- openssh/auth.h.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/auth.h 2018-08-22 11:14:56.816430924 +0200 --- openssh-9.6p1.orig/auth.h
+++ openssh-9.6p1/auth.h
@@ -65,6 +65,9 @@ struct Authctxt { @@ -65,6 +65,9 @@ struct Authctxt {
char *service; char *service;
struct passwd *pw; /* set if 'valid' */ struct passwd *pw; /* set if 'valid' */
@ -127,10 +135,11 @@ diff -up openssh/auth.h.role-mls openssh/auth.h
/* Method lists for multiple authentication */ /* Method lists for multiple authentication */
char **auth_methods; /* modified from server config */ char **auth_methods; /* modified from server config */
diff -up openssh/auth-pam.c.role-mls openssh/auth-pam.c Index: openssh-9.6p1/auth-pam.c
--- openssh/auth-pam.c.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/auth-pam.c 2018-08-22 11:14:56.816430924 +0200 --- openssh-9.6p1.orig/auth-pam.c
@@ -1172,7 +1172,7 @@ is_pam_session_open(void) +++ openssh-9.6p1/auth-pam.c
@@ -1242,7 +1242,7 @@ is_pam_session_open(void)
* during the ssh authentication process. * during the ssh authentication process.
*/ */
int int
@ -139,22 +148,24 @@ diff -up openssh/auth-pam.c.role-mls openssh/auth-pam.c
{ {
int ret = 1; int ret = 1;
char *compound; char *compound;
diff -up openssh/auth-pam.h.role-mls openssh/auth-pam.h Index: openssh-9.6p1/auth-pam.h
--- openssh/auth-pam.h.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/auth-pam.h 2018-08-22 11:14:56.817430932 +0200 --- openssh-9.6p1.orig/auth-pam.h
+++ openssh-9.6p1/auth-pam.h
@@ -33,7 +33,7 @@ u_int do_pam_account(void); @@ -33,7 +33,7 @@ u_int do_pam_account(void);
void do_pam_session(struct ssh *); void do_pam_session(struct ssh *);
void do_pam_setcred(void); void do_pam_setcred(int );
void do_pam_chauthtok(void); void do_pam_chauthtok(void);
-int do_pam_putenv(char *, char *); -int do_pam_putenv(char *, char *);
+int do_pam_putenv(char *, const char *); +int do_pam_putenv(char *, const char *);
char ** fetch_pam_environment(void); char ** fetch_pam_environment(void);
char ** fetch_pam_child_environment(void); char ** fetch_pam_child_environment(void);
void free_pam_environment(char **); void free_pam_environment(char **);
diff -up openssh/misc.c.role-mls openssh/misc.c Index: openssh-9.6p1/misc.c
--- openssh/misc.c.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/misc.c 2018-08-22 11:14:56.817430932 +0200 --- openssh-9.6p1.orig/misc.c
@@ -542,6 +542,7 @@ char * +++ openssh-9.6p1/misc.c
@@ -771,6 +771,7 @@ char *
colon(char *cp) colon(char *cp)
{ {
int flag = 0; int flag = 0;
@ -162,7 +173,7 @@ diff -up openssh/misc.c.role-mls openssh/misc.c
if (*cp == ':') /* Leading colon is part of file name. */ if (*cp == ':') /* Leading colon is part of file name. */
return NULL; return NULL;
@@ -557,6 +558,13 @@ colon(char *cp) @@ -786,6 +787,13 @@ colon(char *cp)
return (cp); return (cp);
if (*cp == '/') if (*cp == '/')
return NULL; return NULL;
@ -176,10 +187,11 @@ diff -up openssh/misc.c.role-mls openssh/misc.c
} }
return NULL; return NULL;
} }
diff -up openssh-8.6p1/monitor.c.role-mls openssh-8.6p1/monitor.c Index: openssh-9.6p1/monitor.c
--- openssh-8.6p1/monitor.c.role-mls 2021-04-16 05:55:25.000000000 +0200 ===================================================================
+++ openssh-8.6p1/monitor.c 2021-05-21 14:21:56.719414087 +0200 --- openssh-9.6p1.orig/monitor.c
@@ -117,6 +117,9 @@ int mm_answer_sign(struct ssh *, int, st +++ openssh-9.6p1/monitor.c
@@ -120,6 +120,9 @@ int mm_answer_sign(struct ssh *, int, st
int mm_answer_pwnamallow(struct ssh *, int, struct sshbuf *); int mm_answer_pwnamallow(struct ssh *, int, struct sshbuf *);
int mm_answer_auth2_read_banner(struct ssh *, int, struct sshbuf *); int mm_answer_auth2_read_banner(struct ssh *, int, struct sshbuf *);
int mm_answer_authserv(struct ssh *, int, struct sshbuf *); int mm_answer_authserv(struct ssh *, int, struct sshbuf *);
@ -189,7 +201,7 @@ diff -up openssh-8.6p1/monitor.c.role-mls openssh-8.6p1/monitor.c
int mm_answer_authpassword(struct ssh *, int, struct sshbuf *); int mm_answer_authpassword(struct ssh *, int, struct sshbuf *);
int mm_answer_bsdauthquery(struct ssh *, int, struct sshbuf *); int mm_answer_bsdauthquery(struct ssh *, int, struct sshbuf *);
int mm_answer_bsdauthrespond(struct ssh *, int, struct sshbuf *); int mm_answer_bsdauthrespond(struct ssh *, int, struct sshbuf *);
@@ -195,6 +198,9 @@ struct mon_table mon_dispatch_proto20[] @@ -200,6 +203,9 @@ struct mon_table mon_dispatch_proto20[]
{MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign}, {MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign},
{MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow}, {MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow},
{MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv}, {MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv},
@ -199,7 +211,7 @@ diff -up openssh-8.6p1/monitor.c.role-mls openssh-8.6p1/monitor.c
{MONITOR_REQ_AUTH2_READ_BANNER, MON_ONCE, mm_answer_auth2_read_banner}, {MONITOR_REQ_AUTH2_READ_BANNER, MON_ONCE, mm_answer_auth2_read_banner},
{MONITOR_REQ_AUTHPASSWORD, MON_AUTH, mm_answer_authpassword}, {MONITOR_REQ_AUTHPASSWORD, MON_AUTH, mm_answer_authpassword},
#ifdef USE_PAM #ifdef USE_PAM
@@ -803,6 +809,9 @@ mm_answer_pwnamallow(struct ssh *ssh, in @@ -834,6 +840,9 @@ mm_answer_pwnamallow(struct ssh *ssh, in
/* Allow service/style information on the auth context */ /* Allow service/style information on the auth context */
monitor_permit(mon_dispatch, MONITOR_REQ_AUTHSERV, 1); monitor_permit(mon_dispatch, MONITOR_REQ_AUTHSERV, 1);
@ -209,7 +221,7 @@ diff -up openssh-8.6p1/monitor.c.role-mls openssh-8.6p1/monitor.c
monitor_permit(mon_dispatch, MONITOR_REQ_AUTH2_READ_BANNER, 1); monitor_permit(mon_dispatch, MONITOR_REQ_AUTH2_READ_BANNER, 1);
#ifdef USE_PAM #ifdef USE_PAM
@@ -877,6 +886,26 @@ key_base_type_match(const char *method, @@ -908,6 +917,26 @@ key_base_type_match(const char *method,
return found; return found;
} }
@ -236,16 +248,16 @@ diff -up openssh-8.6p1/monitor.c.role-mls openssh-8.6p1/monitor.c
int int
mm_answer_authpassword(struct ssh *ssh, int sock, struct sshbuf *m) mm_answer_authpassword(struct ssh *ssh, int sock, struct sshbuf *m)
{ {
@@ -1251,7 +1280,7 @@ monitor_valid_userblob(struct ssh *ssh, @@ -1280,7 +1309,7 @@ monitor_valid_userblob(struct ssh *ssh,
struct sshbuf *b; struct sshbuf *b;
struct sshkey *hostkey = NULL; struct sshkey *hostkey = NULL;
const u_char *p; const u_char *p;
- char *userstyle, *cp; - char *userstyle, *cp;
+ char *userstyle, *s, *cp; + char *userstyle, *s, *cp;
size_t len; size_t len;
u_char type; u_char type;
int hostbound = 0, r, fail = 0; int hostbound = 0, r, fail = 0;
@@ -1282,6 +1311,8 @@ monitor_valid_userblob(struct ssh *ssh, @@ -1311,6 +1340,8 @@ monitor_valid_userblob(struct ssh *ssh,
fail++; fail++;
if ((r = sshbuf_get_cstring(b, &cp, NULL)) != 0) if ((r = sshbuf_get_cstring(b, &cp, NULL)) != 0)
fatal_fr(r, "parse userstyle"); fatal_fr(r, "parse userstyle");
@ -254,7 +266,7 @@ diff -up openssh-8.6p1/monitor.c.role-mls openssh-8.6p1/monitor.c
xasprintf(&userstyle, "%s%s%s", authctxt->user, xasprintf(&userstyle, "%s%s%s", authctxt->user,
authctxt->style ? ":" : "", authctxt->style ? ":" : "",
authctxt->style ? authctxt->style : ""); authctxt->style ? authctxt->style : "");
@@ -1317,7 +1348,7 @@ monitor_valid_hostbasedblob(const u_char @@ -1361,7 +1392,7 @@ monitor_valid_hostbasedblob(const u_char
{ {
struct sshbuf *b; struct sshbuf *b;
const u_char *p; const u_char *p;
@ -263,7 +275,7 @@ diff -up openssh-8.6p1/monitor.c.role-mls openssh-8.6p1/monitor.c
size_t len; size_t len;
int r, fail = 0; int r, fail = 0;
u_char type; u_char type;
@@ -1338,6 +1370,8 @@ monitor_valid_hostbasedblob(const u_char @@ -1382,6 +1413,8 @@ monitor_valid_hostbasedblob(const u_char
fail++; fail++;
if ((r = sshbuf_get_cstring(b, &cp, NULL)) != 0) if ((r = sshbuf_get_cstring(b, &cp, NULL)) != 0)
fatal_fr(r, "parse userstyle"); fatal_fr(r, "parse userstyle");
@ -272,9 +284,10 @@ diff -up openssh-8.6p1/monitor.c.role-mls openssh-8.6p1/monitor.c
xasprintf(&userstyle, "%s%s%s", authctxt->user, xasprintf(&userstyle, "%s%s%s", authctxt->user,
authctxt->style ? ":" : "", authctxt->style ? ":" : "",
authctxt->style ? authctxt->style : ""); authctxt->style ? authctxt->style : "");
diff -up openssh/monitor.h.role-mls openssh/monitor.h Index: openssh-9.6p1/monitor.h
--- openssh/monitor.h.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/monitor.h 2018-08-22 11:14:56.818430941 +0200 --- openssh-9.6p1.orig/monitor.h
+++ openssh-9.6p1/monitor.h
@@ -55,6 +55,10 @@ enum monitor_reqtype { @@ -55,6 +55,10 @@ enum monitor_reqtype {
MONITOR_REQ_GSSCHECKMIC = 48, MONITOR_ANS_GSSCHECKMIC = 49, MONITOR_REQ_GSSCHECKMIC = 48, MONITOR_ANS_GSSCHECKMIC = 49,
MONITOR_REQ_TERM = 50, MONITOR_REQ_TERM = 50,
@ -286,10 +299,11 @@ diff -up openssh/monitor.h.role-mls openssh/monitor.h
MONITOR_REQ_PAM_START = 100, MONITOR_REQ_PAM_START = 100,
MONITOR_REQ_PAM_ACCOUNT = 102, MONITOR_ANS_PAM_ACCOUNT = 103, MONITOR_REQ_PAM_ACCOUNT = 102, MONITOR_ANS_PAM_ACCOUNT = 103,
MONITOR_REQ_PAM_INIT_CTX = 104, MONITOR_ANS_PAM_INIT_CTX = 105, MONITOR_REQ_PAM_INIT_CTX = 104, MONITOR_ANS_PAM_INIT_CTX = 105,
diff -up openssh/monitor_wrap.c.role-mls openssh/monitor_wrap.c Index: openssh-9.6p1/monitor_wrap.c
--- openssh/monitor_wrap.c.role-mls 2018-08-22 11:14:56.818430941 +0200 ===================================================================
+++ openssh/monitor_wrap.c 2018-08-22 11:21:47.938747968 +0200 --- openssh-9.6p1.orig/monitor_wrap.c
@@ -390,6 +390,27 @@ mm_inform_authserv(char *service, char * +++ openssh-9.6p1/monitor_wrap.c
@@ -396,6 +396,27 @@ mm_inform_authserv(char *service, char *
sshbuf_free(m); sshbuf_free(m);
} }
@ -317,10 +331,11 @@ diff -up openssh/monitor_wrap.c.role-mls openssh/monitor_wrap.c
/* Do the password authentication */ /* Do the password authentication */
int int
mm_auth_password(struct ssh *ssh, char *password) mm_auth_password(struct ssh *ssh, char *password)
diff -up openssh/monitor_wrap.h.role-mls openssh/monitor_wrap.h Index: openssh-9.6p1/monitor_wrap.h
--- openssh/monitor_wrap.h.role-mls 2018-08-22 11:14:56.818430941 +0200 ===================================================================
+++ openssh/monitor_wrap.h 2018-08-22 11:22:10.439929513 +0200 --- openssh-9.6p1.orig/monitor_wrap.h
@@ -44,6 +44,9 @@ DH *mm_choose_dh(int, int, int); +++ openssh-9.6p1/monitor_wrap.h
@@ -49,6 +49,9 @@ int mm_sshkey_sign(struct ssh *, struct
const u_char *, size_t, const char *, const char *, const u_char *, size_t, const char *, const char *,
const char *, u_int compat); const char *, u_int compat);
void mm_inform_authserv(char *, char *); void mm_inform_authserv(char *, char *);
@ -330,10 +345,11 @@ diff -up openssh/monitor_wrap.h.role-mls openssh/monitor_wrap.h
struct passwd *mm_getpwnamallow(struct ssh *, const char *); struct passwd *mm_getpwnamallow(struct ssh *, const char *);
char *mm_auth2_read_banner(void); char *mm_auth2_read_banner(void);
int mm_auth_password(struct ssh *, char *); int mm_auth_password(struct ssh *, char *);
diff -up openssh/openbsd-compat/Makefile.in.role-mls openssh/openbsd-compat/Makefile.in Index: openssh-9.6p1/openbsd-compat/Makefile.in
--- openssh/openbsd-compat/Makefile.in.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/openbsd-compat/Makefile.in 2018-08-22 11:14:56.819430949 +0200 --- openssh-9.6p1.orig/openbsd-compat/Makefile.in
@@ -92,7 +92,8 @@ PORTS= port-aix.o \ +++ openssh-9.6p1/openbsd-compat/Makefile.in
@@ -100,7 +100,8 @@ PORTS= port-aix.o \
port-prngd.o \ port-prngd.o \
port-solaris.o \ port-solaris.o \
port-net.o \ port-net.o \
@ -343,10 +359,11 @@ diff -up openssh/openbsd-compat/Makefile.in.role-mls openssh/openbsd-compat/Make
.c.o: .c.o:
$(CC) $(CFLAGS_NOPIE) $(PICFLAG) $(CPPFLAGS) -c $< $(CC) $(CFLAGS_NOPIE) $(PICFLAG) $(CPPFLAGS) -c $<
diff -up openssh/openbsd-compat/port-linux.c.role-mls openssh/openbsd-compat/port-linux.c Index: openssh-9.6p1/openbsd-compat/port-linux.c
--- openssh/openbsd-compat/port-linux.c.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/openbsd-compat/port-linux.c 2018-08-22 11:14:56.819430949 +0200 --- openssh-9.6p1.orig/openbsd-compat/port-linux.c
@@ -100,37 +100,6 @@ ssh_selinux_getctxbyname(char *pwname) +++ openssh-9.6p1/openbsd-compat/port-linux.c
@@ -101,37 +101,6 @@ ssh_selinux_getctxbyname(char *pwname)
return sc; return sc;
} }
@ -384,7 +401,7 @@ diff -up openssh/openbsd-compat/port-linux.c.role-mls openssh/openbsd-compat/por
/* Set the TTY context for the specified user */ /* Set the TTY context for the specified user */
void void
ssh_selinux_setup_pty(char *pwname, const char *tty) ssh_selinux_setup_pty(char *pwname, const char *tty)
@@ -145,7 +114,11 @@ ssh_selinux_setup_pty(char *pwname, cons @@ -144,7 +113,11 @@ ssh_selinux_setup_pty(char *pwname, cons
debug3("%s: setting TTY context on %s", __func__, tty); debug3("%s: setting TTY context on %s", __func__, tty);
@ -397,9 +414,10 @@ diff -up openssh/openbsd-compat/port-linux.c.role-mls openssh/openbsd-compat/por
/* XXX: should these calls fatal() upon failure in enforcing mode? */ /* XXX: should these calls fatal() upon failure in enforcing mode? */
diff -up openssh/openbsd-compat/port-linux.h.role-mls openssh/openbsd-compat/port-linux.h Index: openssh-9.6p1/openbsd-compat/port-linux.h
--- openssh/openbsd-compat/port-linux.h.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/openbsd-compat/port-linux.h 2018-08-22 11:14:56.819430949 +0200 --- openssh-9.6p1.orig/openbsd-compat/port-linux.h
+++ openssh-9.6p1/openbsd-compat/port-linux.h
@@ -20,9 +20,10 @@ @@ -20,9 +20,10 @@
#ifdef WITH_SELINUX #ifdef WITH_SELINUX
int ssh_selinux_enabled(void); int ssh_selinux_enabled(void);
@ -412,10 +430,11 @@ diff -up openssh/openbsd-compat/port-linux.h.role-mls openssh/openbsd-compat/por
#endif #endif
#ifdef LINUX_OOM_ADJUST #ifdef LINUX_OOM_ADJUST
diff -up openssh/openbsd-compat/port-linux-sshd.c.role-mls openssh/openbsd-compat/port-linux-sshd.c Index: openssh-9.6p1/openbsd-compat/port-linux-sshd.c
--- openssh/openbsd-compat/port-linux-sshd.c.role-mls 2018-08-22 11:14:56.819430949 +0200 ===================================================================
+++ openssh/openbsd-compat/port-linux-sshd.c 2018-08-22 11:14:56.819430949 +0200 --- /dev/null
@@ -0,0 +1,420 @@ +++ openssh-9.6p1/openbsd-compat/port-linux-sshd.c
@@ -0,0 +1,421 @@
+/* +/*
+ * Copyright (c) 2005 Daniel Walsh <dwalsh@redhat.com> + * Copyright (c) 2005 Daniel Walsh <dwalsh@redhat.com>
+ * Copyright (c) 2014 Petr Lautrbach <plautrba@redhat.com> + * Copyright (c) 2014 Petr Lautrbach <plautrba@redhat.com>
@ -469,6 +488,7 @@ diff -up openssh/openbsd-compat/port-linux-sshd.c.role-mls openssh/openbsd-compa
+extern ServerOptions options; +extern ServerOptions options;
+extern Authctxt *the_authctxt; +extern Authctxt *the_authctxt;
+extern int inetd_flag; +extern int inetd_flag;
+extern int rexeced_flag;
+ +
+/* Send audit message */ +/* Send audit message */
+static int +static int
@ -674,7 +694,7 @@ diff -up openssh/openbsd-compat/port-linux-sshd.c.role-mls openssh/openbsd-compa
+ +
+ if (r == 0) { + if (r == 0) {
+ /* If launched from xinetd, we must use current level */ + /* If launched from xinetd, we must use current level */
+ if (inetd_flag) { + if (inetd_flag && !rexeced_flag) {
+ security_context_t sshdsc=NULL; + security_context_t sshdsc=NULL;
+ +
+ if (getcon_raw(&sshdsc) < 0) + if (getcon_raw(&sshdsc) < 0)
@ -748,7 +768,7 @@ diff -up openssh/openbsd-compat/port-linux-sshd.c.role-mls openssh/openbsd-compa
+ +
+ rv = do_pam_putenv("SELINUX_ROLE_REQUESTED", role ? role : ""); + rv = do_pam_putenv("SELINUX_ROLE_REQUESTED", role ? role : "");
+ +
+ if (inetd_flag) { + if (inetd_flag && !rexeced_flag) {
+ use_current = "1"; + use_current = "1";
+ } else { + } else {
+ use_current = ""; + use_current = "";
@ -836,10 +856,11 @@ diff -up openssh/openbsd-compat/port-linux-sshd.c.role-mls openssh/openbsd-compa
+#endif +#endif
+#endif +#endif
+ +
diff -up openssh/platform.c.role-mls openssh/platform.c Index: openssh-9.6p1/platform.c
--- openssh/platform.c.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/platform.c 2018-08-22 11:14:56.819430949 +0200 --- openssh-9.6p1.orig/platform.c
@@ -183,7 +183,7 @@ platform_setusercontext_post_groups(stru +++ openssh-9.6p1/platform.c
@@ -185,7 +185,7 @@ platform_setusercontext_post_groups(stru
} }
#endif /* HAVE_SETPCRED */ #endif /* HAVE_SETPCRED */
#ifdef WITH_SELINUX #ifdef WITH_SELINUX
@ -848,10 +869,11 @@ diff -up openssh/platform.c.role-mls openssh/platform.c
#endif #endif
} }
diff -up openssh/sshd.c.role-mls openssh/sshd.c Index: openssh-9.6p1/sshd.c
--- openssh/sshd-session.c.role-mls 2018-08-20 07:57:29.000000000 +0200 ===================================================================
+++ openssh/sshd-session.c 2018-08-22 11:14:56.820430957 +0200 --- openssh-9.6p1.orig/sshd.c
@@ -2186,6 +2186,9 @@ main(int ac, char **av) +++ openssh-9.6p1/sshd.c
@@ -2387,6 +2387,9 @@ main(int ac, char **av)
restore_uid(); restore_uid();
} }
#endif #endif
@ -860,4 +882,4 @@ diff -up openssh/sshd.c.role-mls openssh/sshd.c
+#endif +#endif
#ifdef USE_PAM #ifdef USE_PAM
if (options.use_pam) { if (options.use_pam) {
do_pam_setcred(); do_pam_setcred(1);

File diff suppressed because it is too large Load Diff

View File

@ -3,7 +3,7 @@ Index: openssh-8.9p1/Makefile.in
--- openssh-8.9p1.orig/Makefile.in --- openssh-8.9p1.orig/Makefile.in
+++ openssh-8.9p1/Makefile.in +++ openssh-8.9p1/Makefile.in
@@ -116,7 +116,7 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \ @@ -116,7 +116,7 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \
kexsntrup761x25519.o kexmlkem768x25519.o sntrup761.o kexgen.o \ kexsntrup761x25519.o sntrup761.o kexgen.o \
kexgssc.o \ kexgssc.o \
sftp-realpath.o platform-pledge.o platform-tracing.o platform-misc.o \ sftp-realpath.o platform-pledge.o platform-tracing.o platform-misc.o \
- sshbuf-io.o - sshbuf-io.o
@ -236,7 +236,7 @@ Index: openssh-8.9p1/audit-linux.c
/* Below is the sshd audit API code */ /* Below is the sshd audit API code */
void void
@@ -76,49 +176,211 @@ audit_connection_from(const char *host, @@ -76,49 +176,210 @@ audit_connection_from(const char *host,
/* not implemented */ /* not implemented */
} }
@ -315,7 +315,6 @@ Index: openssh-8.9p1/audit-linux.c
case SSH_AUTH_FAIL_PASSWD: case SSH_AUTH_FAIL_PASSWD:
+ if (options.use_pam) + if (options.use_pam)
+ break; + break;
+ /* Fallthrough */
+ case SSH_LOGIN_EXCEED_MAXTRIES: + case SSH_LOGIN_EXCEED_MAXTRIES:
case SSH_AUTH_FAIL_KBDINT: case SSH_AUTH_FAIL_KBDINT:
case SSH_AUTH_FAIL_PUBKEY: case SSH_AUTH_FAIL_PUBKEY:
@ -452,7 +451,7 @@ Index: openssh-8.9p1/audit-linux.c
+ } + }
+ audit_ok = audit_log_user_message(audit_fd, AUDIT_CRYPTO_KEY_USER, + audit_ok = audit_log_user_message(audit_fd, AUDIT_CRYPTO_KEY_USER,
+ buf, NULL, + buf, NULL,
+ ssh_remote_ipaddr(ssh), /*FIXME listening_for_clients() ? NULL : ssh_remote_ipaddr(ssh) */ + listening_for_clients() ? NULL : ssh_remote_ipaddr(ssh),
+ NULL, 1); + NULL, 1);
+ audit_close(audit_fd); + audit_close(audit_fd);
+ /* do not abort if the error is EPERM and sshd is run as non root user */ + /* do not abort if the error is EPERM and sshd is run as non root user */
@ -519,19 +518,19 @@ Index: openssh-8.9p1/audit.c
+void +void
+audit_unsupported(struct ssh *ssh, int what) +audit_unsupported(struct ssh *ssh, int what)
+{ +{
+ mm_audit_unsupported_body(ssh, what); + PRIVSEP(audit_unsupported_body(ssh, what));
+} +}
+ +
+void +void
+audit_kex(struct ssh *ssh, int ctos, char *enc, char *mac, char *comp, char *pfs) +audit_kex(struct ssh *ssh, int ctos, char *enc, char *mac, char *comp, char *pfs)
+{ +{
+ mm_audit_kex_body(ssh, ctos, enc, mac, comp, pfs, getpid(), getuid()); + PRIVSEP(audit_kex_body(ssh, ctos, enc, mac, comp, pfs, getpid(), getuid()));
+} +}
+ +
+void +void
+audit_session_key_free(struct ssh *ssh, int ctos) +audit_session_key_free(struct ssh *ssh, int ctos)
+{ +{
+ mm_audit_session_key_free_body(ssh, ctos, getpid(), getuid()); + PRIVSEP(audit_session_key_free_body(ssh, ctos, getpid(), getuid()));
+} +}
+ +
# ifndef CUSTOM_SSH_AUDIT_EVENTS # ifndef CUSTOM_SSH_AUDIT_EVENTS
@ -779,18 +778,18 @@ Index: openssh-8.9p1/auth.h
+ const u_char *, size_t, const char *, u_int, struct sshkey_sig_details **); + const u_char *, size_t, const char *, u_int, struct sshkey_sig_details **);
/* Key / cert options linkage to auth layer */ /* Key / cert options linkage to auth layer */
int auth_activate_options(struct ssh *, struct sshauthopt *); const struct sshauthopt *auth_options(struct ssh *);
Index: openssh-8.9p1/auth2-hostbased.c Index: openssh-8.9p1/auth2-hostbased.c
=================================================================== ===================================================================
--- openssh-8.9p1.orig/auth2-hostbased.c --- openssh-8.9p1.orig/auth2-hostbased.c
+++ openssh-8.9p1/auth2-hostbased.c +++ openssh-8.9p1/auth2-hostbased.c
@@ -149,7 +149,7 @@ userauth_hostbased(struct ssh *ssh, cons @@ -149,7 +149,7 @@ userauth_hostbased(struct ssh *ssh, cons
authenticated = 0; authenticated = 0;
if (mm_hostbased_key_allowed(ssh, authctxt->pw, cuser, if (PRIVSEP(hostbased_key_allowed(ssh, authctxt->pw, cuser,
chost, key) && chost, key)) &&
- mm_sshkey_verify(key, sig, slen, - PRIVSEP(sshkey_verify(key, sig, slen,
+ mm_hostbased_key_verify(ssh, key, sig, slen, + PRIVSEP(hostbased_key_verify(ssh, key, sig, slen,
sshbuf_ptr(b), sshbuf_len(b), pkalg, ssh->compat, NULL) == 0) sshbuf_ptr(b), sshbuf_len(b), pkalg, ssh->compat, NULL)) == 0)
authenticated = 1; authenticated = 1;
@@ -166,6 +166,19 @@ done: @@ -166,6 +166,19 @@ done:
@ -820,12 +819,12 @@ Index: openssh-8.9p1/auth2-pubkey.c
@@ -223,7 +223,7 @@ userauth_pubkey(struct ssh *ssh, const c @@ -223,7 +223,7 @@ userauth_pubkey(struct ssh *ssh, const c
/* test for correct signature */ /* test for correct signature */
authenticated = 0; authenticated = 0;
if (mm_user_key_allowed(ssh, pw, key, 1, &authopts) && if (PRIVSEP(user_key_allowed(ssh, pw, key, 1, &authopts)) &&
- mm_sshkey_verify(key, sig, slen, - PRIVSEP(sshkey_verify(key, sig, slen,
+ mm_user_key_verify(ssh, key, sig, slen, + PRIVSEP(user_key_verify(ssh, key, sig, slen,
sshbuf_ptr(b), sshbuf_len(b), sshbuf_ptr(b), sshbuf_len(b),
(ssh->compat & SSH_BUG_SIGTYPE) == 0 ? pkalg : NULL, (ssh->compat & SSH_BUG_SIGTYPE) == 0 ? pkalg : NULL,
ssh->compat, &sig_details) == 0) { ssh->compat, &sig_details)) == 0) {
@@ -316,6 +316,19 @@ done: @@ -316,6 +316,19 @@ done:
return authenticated; return authenticated;
} }
@ -855,7 +854,7 @@ Index: openssh-8.9p1/auth2.c
/* Invalid user, fake password information */ /* Invalid user, fake password information */
authctxt->pw = fakepw(); authctxt->pw = fakepw();
-#ifdef SSH_AUDIT_EVENTS -#ifdef SSH_AUDIT_EVENTS
- mm_audit_event(ssh, SSH_INVALID_USER); - PRIVSEP(audit_event(ssh, SSH_INVALID_USER));
-#endif -#endif
} }
#ifdef USE_PAM #ifdef USE_PAM
@ -940,8 +939,8 @@ Index: openssh-8.9p1/kex.c
#include "xmalloc.h" #include "xmalloc.h"
+#include "audit.h" +#include "audit.h"
/* prototype */ #ifdef GSSAPI
static int kex_choose_conf(struct ssh *, uint32_t seq); #include "ssh-gss.h"
@@ -879,12 +880,16 @@ kex_start_rekex(struct ssh *ssh) @@ -879,12 +880,16 @@ kex_start_rekex(struct ssh *ssh)
} }
@ -1125,7 +1124,7 @@ Index: openssh-8.9p1/monitor.c
extern struct sshbuf *loginmsg; extern struct sshbuf *loginmsg;
extern struct sshauthopt *auth_opts; /* XXX move to permanent ssh->authctxt? */ extern struct sshauthopt *auth_opts; /* XXX move to permanent ssh->authctxt? */
+extern void destroy_sensitive_data(struct ssh *); +extern void destroy_sensitive_data(struct ssh *, int);
+ +
/* State exported from the child */ /* State exported from the child */
static struct sshbuf *child_state; static struct sshbuf *child_state;
@ -1258,7 +1257,7 @@ Index: openssh-8.9p1/monitor.c
sshpam_cleanup(); sshpam_cleanup();
#endif #endif
+ destroy_sensitive_data(ssh); + destroy_sensitive_data(ssh, 0);
+ +
while (waitpid(pmonitor->m_pid, &status, 0) == -1) while (waitpid(pmonitor->m_pid, &status, 0) == -1)
if (errno != EINTR) if (errno != EINTR)
@ -1302,12 +1301,12 @@ Index: openssh-8.9p1/monitor.c
+ debug3("%s entering", __func__); + debug3("%s entering", __func__);
+ if ((r = sshbuf_get_u32(m, &handle)) != 0 || + if ((r = sshbuf_get_u32(m, &handle)) != 0 ||
+ (r = sshbuf_get_string(m, &cmd, &len)) != 0) + (r = sshbuf_get_string(m, &cmd, &len)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ +
+ s = session_by_id(handle); + s = session_by_id(handle);
+ if (s == NULL || s->ttyfd != -1 || s->command == NULL || + if (s == NULL || s->ttyfd != -1 || s->command == NULL ||
+ strcmp(s->command, cmd) != 0) + strcmp(s->command, cmd) != 0)
+ fatal_f("invalid handle"); + fatal("%s: invalid handle", __func__);
+ mm_session_close(ssh, s); + mm_session_close(ssh, s);
free(cmd); free(cmd);
return (0); return (0);
@ -1350,7 +1349,7 @@ Index: openssh-8.9p1/monitor.c
+ int what, r; + int what, r;
+ +
+ if ((r = sshbuf_get_u32(m, &what)) != 0) + if ((r = sshbuf_get_u32(m, &what)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ +
+ audit_unsupported_body(ssh, what); + audit_unsupported_body(ssh, what);
+ +
@ -1375,10 +1374,10 @@ Index: openssh-8.9p1/monitor.c
+ (r = sshbuf_get_cstring(m, &compress, NULL)) != 0 || + (r = sshbuf_get_cstring(m, &compress, NULL)) != 0 ||
+ (r = sshbuf_get_cstring(m, &pfs, NULL)) != 0 || + (r = sshbuf_get_cstring(m, &pfs, NULL)) != 0 ||
+ (r = sshbuf_get_u64(m, &tmp)) != 0) + (r = sshbuf_get_u64(m, &tmp)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ pid = (pid_t) tmp; + pid = (pid_t) tmp;
+ if ((r = sshbuf_get_u64(m, &tmp)) != 0) + if ((r = sshbuf_get_u64(m, &tmp)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ uid = (pid_t) tmp; + uid = (pid_t) tmp;
+ +
+ audit_kex_body(ssh, ctos, cipher, mac, compress, pfs, pid, uid); + audit_kex_body(ssh, ctos, cipher, mac, compress, pfs, pid, uid);
@ -1403,10 +1402,10 @@ Index: openssh-8.9p1/monitor.c
+ +
+ if ((r = sshbuf_get_u32(m, &ctos)) != 0 || + if ((r = sshbuf_get_u32(m, &ctos)) != 0 ||
+ (r = sshbuf_get_u64(m, &tmp)) != 0) + (r = sshbuf_get_u64(m, &tmp)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ pid = (pid_t) tmp; + pid = (pid_t) tmp;
+ if ((r = sshbuf_get_u64(m, &tmp)) != 0) + if ((r = sshbuf_get_u64(m, &tmp)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ uid = (uid_t) tmp; + uid = (uid_t) tmp;
+ +
+ audit_session_key_free_body(ssh, ctos, pid, uid); + audit_session_key_free_body(ssh, ctos, pid, uid);
@ -1428,10 +1427,10 @@ Index: openssh-8.9p1/monitor.c
+ +
+ if ((r = sshbuf_get_cstring(m, &fp, &len)) != 0 || + if ((r = sshbuf_get_cstring(m, &fp, &len)) != 0 ||
+ (r = sshbuf_get_u64(m, &tmp)) != 0) + (r = sshbuf_get_u64(m, &tmp)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ pid = (pid_t) tmp; + pid = (pid_t) tmp;
+ if ((r = sshbuf_get_u64(m, &tmp)) != 0) + if ((r = sshbuf_get_u64(m, &tmp)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ uid = (uid_t) tmp; + uid = (uid_t) tmp;
+ +
+ audit_destroy_sensitive_data(ssh, fp, pid, uid); + audit_destroy_sensitive_data(ssh, fp, pid, uid);
@ -1527,7 +1526,7 @@ Index: openssh-8.9p1/monitor_wrap.c
+ mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUDIT_COMMAND, m); + mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUDIT_COMMAND, m);
+ +
+ if ((r = sshbuf_get_u32(m, &handle)) != 0) + if ((r = sshbuf_get_u32(m, &handle)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ sshbuf_free(m); + sshbuf_free(m);
+ +
+ return (handle); + return (handle);
@ -1542,19 +1541,19 @@ Index: openssh-8.9p1/monitor_wrap.c
+ debug3("%s entering command %s", __func__, command); + debug3("%s entering command %s", __func__, command);
+ +
+ if ((m = sshbuf_new()) == NULL) + if ((m = sshbuf_new()) == NULL)
+ fatal_f("sshbuf_new failed"); + fatal("%s: sshbuf_new failed", __func__);
+ if ((r = sshbuf_put_u32(m, handle)) != 0 || + if ((r = sshbuf_put_u32(m, handle)) != 0 ||
+ (r = sshbuf_put_cstring(m, command)) != 0) + (r = sshbuf_put_cstring(m, command)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ +
+ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_END_COMMAND, m); + mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_END_COMMAND, m);
sshbuf_free(m); sshbuf_free(m);
} }
#endif /* SSH_AUDIT_EVENTS */ #endif /* SSH_AUDIT_EVENTS */
@@ -1217,3 +1257,83 @@ mm_ssh_gssapi_update_creds(ssh_gssapi_cc @@ -1074,3 +1114,130 @@ mm_ssh_gssapi_update_creds(ssh_gssapi_cc
return &ci;
} }
#endif /* GSSAPI */
+#ifdef SSH_AUDIT_EVENTS +#ifdef SSH_AUDIT_EVENTS
+void +void
+mm_audit_unsupported_body(struct ssh *ssh, int what) +mm_audit_unsupported_body(struct ssh *ssh, int what)
@ -1563,9 +1562,9 @@ Index: openssh-8.9p1/monitor_wrap.c
+ struct sshbuf *m; + struct sshbuf *m;
+ +
+ if ((m = sshbuf_new()) == NULL) + if ((m = sshbuf_new()) == NULL)
+ fatal_f("sshbuf_new failed"); + fatal("%s: sshbuf_new failed", __func__);
+ if ((r = sshbuf_put_u32(m, what)) != 0) + if ((r = sshbuf_put_u32(m, what)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ +
+ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_UNSUPPORTED, m); + mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_UNSUPPORTED, m);
+ mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUDIT_UNSUPPORTED, + mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUDIT_UNSUPPORTED,
@ -1582,7 +1581,7 @@ Index: openssh-8.9p1/monitor_wrap.c
+ struct sshbuf *m; + struct sshbuf *m;
+ +
+ if ((m = sshbuf_new()) == NULL) + if ((m = sshbuf_new()) == NULL)
+ fatal_f("sshbuf_new failed"); + fatal("%s: sshbuf_new failed", __func__);
+ if ((r = sshbuf_put_u32(m, ctos)) != 0 || + if ((r = sshbuf_put_u32(m, ctos)) != 0 ||
+ (r = sshbuf_put_cstring(m, cipher)) != 0 || + (r = sshbuf_put_cstring(m, cipher)) != 0 ||
+ (r = sshbuf_put_cstring(m, (mac ? mac : "<implicit>"))) != 0 || + (r = sshbuf_put_cstring(m, (mac ? mac : "<implicit>"))) != 0 ||
@ -1590,7 +1589,7 @@ Index: openssh-8.9p1/monitor_wrap.c
+ (r = sshbuf_put_cstring(m, fps)) != 0 || + (r = sshbuf_put_cstring(m, fps)) != 0 ||
+ (r = sshbuf_put_u64(m, pid)) != 0 || + (r = sshbuf_put_u64(m, pid)) != 0 ||
+ (r = sshbuf_put_u64(m, uid)) != 0) + (r = sshbuf_put_u64(m, uid)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ +
+ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_KEX, m); + mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_KEX, m);
+ mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUDIT_KEX, + mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUDIT_KEX,
@ -1606,11 +1605,11 @@ Index: openssh-8.9p1/monitor_wrap.c
+ struct sshbuf *m; + struct sshbuf *m;
+ +
+ if ((m = sshbuf_new()) == NULL) + if ((m = sshbuf_new()) == NULL)
+ fatal_f("sshbuf_new failed"); + fatal("%s: sshbuf_new failed", __func__);
+ if ((r = sshbuf_put_u32(m, ctos)) != 0 || + if ((r = sshbuf_put_u32(m, ctos)) != 0 ||
+ (r = sshbuf_put_u64(m, pid)) != 0 || + (r = sshbuf_put_u64(m, pid)) != 0 ||
+ (r = sshbuf_put_u64(m, uid)) != 0) + (r = sshbuf_put_u64(m, uid)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ +
+ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_SESSION_KEY_FREE, m); + mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_SESSION_KEY_FREE, m);
+ mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUDIT_SESSION_KEY_FREE, + mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_AUDIT_SESSION_KEY_FREE,
@ -1625,15 +1624,62 @@ Index: openssh-8.9p1/monitor_wrap.c
+ struct sshbuf *m; + struct sshbuf *m;
+ +
+ if ((m = sshbuf_new()) == NULL) + if ((m = sshbuf_new()) == NULL)
+ fatal_f("sshbuf_new failed"); + fatal("%s: sshbuf_new failed", __func__);
+ if ((r = sshbuf_put_cstring(m, fp)) != 0 || + if ((r = sshbuf_put_cstring(m, fp)) != 0 ||
+ (r = sshbuf_put_u64(m, pid)) != 0 || + (r = sshbuf_put_u64(m, pid)) != 0 ||
+ (r = sshbuf_put_u64(m, uid)) != 0) + (r = sshbuf_put_u64(m, uid)) != 0)
+ fatal_fr(r, "buffer error"); + fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ +
+ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_SERVER_KEY_FREE, m); + mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUDIT_SERVER_KEY_FREE, m);
+ sshbuf_free(m); + sshbuf_free(m);
+} +}
+
+int mm_forward_audit_messages(int fdin)
+{
+ u_char buf[4];
+ u_int blen, msg_len;
+ struct sshbuf *m;
+ int ret = 0;
+
+ debug3("%s: entering", __func__);
+ m = sshbuf_new();
+ do {
+ int r;
+
+ blen = atomicio(read, fdin, buf, sizeof(buf));
+ if (blen == 0) /* closed pipe */
+ break;
+ if (blen != sizeof(buf)) {
+ error("%s: Failed to read the buffer from child", __func__);
+ ret = -1;
+ break;
+ }
+
+ msg_len = get_u32(buf);
+ if (msg_len > 256 * 1024)
+ fatal("%s: read: bad msg_len %d", __func__, msg_len);
+ sshbuf_reset(m);
+ if ((r = sshbuf_reserve(m, msg_len, NULL)) != 0)
+ fatal("%s: buffer error: %s", __func__, ssh_err(r));
+ if (atomicio(read, fdin, sshbuf_mutable_ptr(m), msg_len) != msg_len) {
+ error("%s: Failed to read the the buffer conent from the child", __func__);
+ ret = -1;
+ break;
+ }
+ if (atomicio(vwrite, pmonitor->m_recvfd, buf, blen) != blen ||
+ atomicio(vwrite, pmonitor->m_recvfd, sshbuf_mutable_ptr(m), msg_len) != msg_len) {
+ error("%s: Failed to write the messag to the monitor", __func__);
+ ret = -1;
+ break;
+ }
+ } while (1);
+ sshbuf_free(m);
+ return ret;
+}
+void mm_set_monitor_pipe(int fd)
+{
+ pmonitor->m_recvfd = fd;
+}
+#endif /* SSH_AUDIT_EVENTS */ +#endif /* SSH_AUDIT_EVENTS */
Index: openssh-8.9p1/monitor_wrap.h Index: openssh-8.9p1/monitor_wrap.h
=================================================================== ===================================================================
@ -1649,8 +1695,8 @@ Index: openssh-8.9p1/monitor_wrap.h
+int mm_user_key_verify(struct ssh *, const struct sshkey *, const u_char *, size_t, +int mm_user_key_verify(struct ssh *, const struct sshkey *, const u_char *, size_t,
const u_char *, size_t, const char *, u_int, struct sshkey_sig_details **); const u_char *, size_t, const char *, u_int, struct sshkey_sig_details **);
void mm_decode_activate_server_options(struct ssh *ssh, struct sshbuf *m); #ifdef GSSAPI
@@ -83,7 +85,12 @@ void mm_sshpam_free_ctx(void *); @@ -83,7 +85,14 @@ void mm_sshpam_free_ctx(void *);
#ifdef SSH_AUDIT_EVENTS #ifdef SSH_AUDIT_EVENTS
#include "audit.h" #include "audit.h"
void mm_audit_event(struct ssh *, ssh_audit_event_t); void mm_audit_event(struct ssh *, ssh_audit_event_t);
@ -1661,6 +1707,8 @@ Index: openssh-8.9p1/monitor_wrap.h
+void mm_audit_kex_body(struct ssh *, int, char *, char *, char *, char *, pid_t, uid_t); +void mm_audit_kex_body(struct ssh *, int, char *, char *, char *, char *, pid_t, uid_t);
+void mm_audit_session_key_free_body(struct ssh *, int, pid_t, uid_t); +void mm_audit_session_key_free_body(struct ssh *, int, pid_t, uid_t);
+void mm_audit_destroy_sensitive_data(struct ssh *, const char *, pid_t, uid_t); +void mm_audit_destroy_sensitive_data(struct ssh *, const char *, pid_t, uid_t);
+int mm_forward_audit_messages(int);
+void mm_set_monitor_pipe(int);
#endif #endif
struct Session; struct Session;
@ -1690,7 +1738,12 @@ Index: openssh-8.9p1/packet.c
/* /*
* Returns the IP-address of the remote host as a string. The returned * Returns the IP-address of the remote host as a string. The returned
* string must not be freed. * string must not be freed.
@@ -579,22 +587,19 @@ ssh_packet_rdomain_in(struct ssh *ssh) @@ -579,26 +587,23 @@ ssh_packet_rdomain_in(struct ssh *ssh)
/* Closes the connection and clears and frees internal data structures. */
static void
-ssh_packet_close_internal(struct ssh *ssh, int do_close)
+ssh_packet_close_internal(struct ssh *ssh, int do_close, int do_audit)
{ {
struct session_state *state = ssh->state; struct session_state *state = ssh->state;
u_int mode; u_int mode;
@ -1722,7 +1775,7 @@ Index: openssh-8.9p1/packet.c
#endif /* WITH_ZLIB */ #endif /* WITH_ZLIB */
cipher_free(state->send_context); cipher_free(state->send_context);
cipher_free(state->receive_context); cipher_free(state->receive_context);
+ if (had_keys && state->server_side) { + if (do_audit && had_keys && state->server_side) {
+ /* Assuming this is called only from privsep child */ + /* Assuming this is called only from privsep child */
+ audit_session_key_free(ssh, MODE_MAX); + audit_session_key_free(ssh, MODE_MAX);
+ } + }
@ -1737,6 +1790,28 @@ Index: openssh-8.9p1/packet.c
free(ssh->local_ipaddr); free(ssh->local_ipaddr);
ssh->local_ipaddr = NULL; ssh->local_ipaddr = NULL;
free(ssh->remote_ipaddr); free(ssh->remote_ipaddr);
@@ -650,13 +665,19 @@ ssh_packet_close_internal(struct ssh *ss
void
ssh_packet_close(struct ssh *ssh)
{
- ssh_packet_close_internal(ssh, 1);
+ ssh_packet_close_internal(ssh, 1, 1);
}
void
ssh_packet_clear_keys(struct ssh *ssh)
{
- ssh_packet_close_internal(ssh, 0);
+ ssh_packet_close_internal(ssh, 0, 1);
+}
+
+void
+ssh_packet_clear_keys_noaudit(struct ssh *ssh)
+{
+ ssh_packet_close_internal(ssh, 0, 0);
}
/* Sets remote side protocol flags. */
@@ -892,6 +913,7 @@ ssh_set_newkeys(struct ssh *ssh, int mod @@ -892,6 +913,7 @@ ssh_set_newkeys(struct ssh *ssh, int mod
(unsigned long long)state->p_send.bytes, (unsigned long long)state->p_send.bytes,
(unsigned long long)state->p_send.blocks); (unsigned long long)state->p_send.blocks);
@ -1745,7 +1820,7 @@ Index: openssh-8.9p1/packet.c
state->newkeys[mode] = NULL; state->newkeys[mode] = NULL;
} }
/* note that both bytes and the seqnr are not reset */ /* note that both bytes and the seqnr are not reset */
@@ -2183,6 +2205,72 @@ ssh_packet_get_output(struct ssh *ssh) @@ -2183,6 +2205,73 @@ ssh_packet_get_output(struct ssh *ssh)
return (void *)ssh->state->output; return (void *)ssh->state->output;
} }
@ -1775,8 +1850,9 @@ Index: openssh-8.9p1/packet.c
+ return; + return;
+ +
+ cipher_free(state->receive_context); + cipher_free(state->receive_context);
+ state->receive_context = NULL;
+ cipher_free(state->send_context); + cipher_free(state->send_context);
+ state->send_context = state->receive_context = NULL; + state->send_context = NULL;
+ +
+ sshbuf_free(state->input); + sshbuf_free(state->input);
+ state->input = NULL; + state->input = NULL;
@ -1822,6 +1898,14 @@ Index: openssh-8.9p1/packet.h
=================================================================== ===================================================================
--- openssh-8.9p1.orig/packet.h --- openssh-8.9p1.orig/packet.h
+++ openssh-8.9p1/packet.h +++ openssh-8.9p1/packet.h
@@ -102,6 +102,7 @@ int ssh_packet_get_connection_out(s
void ssh_packet_close(struct ssh *);
void ssh_packet_set_input_hook(struct ssh *, ssh_packet_hook_fn *, void *);
void ssh_packet_clear_keys(struct ssh *);
+void ssh_packet_clear_keys_noaudit(struct ssh *);
void ssh_clear_newkeys(struct ssh *, int);
int ssh_packet_is_rekeying(struct ssh *);
@@ -220,4 +221,5 @@ const u_char *sshpkt_ptr(struct ssh *, s @@ -220,4 +221,5 @@ const u_char *sshpkt_ptr(struct ssh *, s
# undef EC_POINT # undef EC_POINT
#endif #endif
@ -1837,11 +1921,22 @@ Index: openssh-8.9p1/session.c
extern u_int utmp_len; extern u_int utmp_len;
extern int startup_pipe; extern int startup_pipe;
-extern void destroy_sensitive_data(void); -extern void destroy_sensitive_data(void);
+extern void destroy_sensitive_data(struct ssh *); +extern void destroy_sensitive_data(struct ssh *, int);
extern struct sshbuf *loginmsg; extern struct sshbuf *loginmsg;
extern struct sshauthopt *auth_opts; extern struct sshauthopt *auth_opts;
extern char *tun_fwd_ifnames; /* serverloop.c */ extern char *tun_fwd_ifnames; /* serverloop.c */
@@ -644,6 +644,14 @@ do_exec_pty(struct ssh *ssh, Session *s, @@ -157,6 +157,10 @@ static Session *sessions = NULL;
login_cap_t *lc;
#endif
+#ifdef SSH_AUDIT_EVENTS
+int paudit[2];
+#endif
+
static int is_child = 0;
static int in_chroot = 0;
@@ -642,6 +646,14 @@ do_exec_pty(struct ssh *ssh, Session *s,
/* Parent. Close the slave side of the pseudo tty. */ /* Parent. Close the slave side of the pseudo tty. */
close(ttyfd); close(ttyfd);
@ -1856,42 +1951,85 @@ Index: openssh-8.9p1/session.c
/* Enter interactive session. */ /* Enter interactive session. */
s->ptymaster = ptymaster; s->ptymaster = ptymaster;
ssh_packet_set_interactive(ssh, 1, ssh_packet_set_interactive(ssh, 1,
@@ -736,15 +744,19 @@ do_exec(struct ssh *ssh, Session *s, con @@ -706,15 +718,21 @@ do_exec(struct ssh *ssh, Session *s, con
s->self); s->self);
#ifdef SSH_AUDIT_EVENTS #ifdef SSH_AUDIT_EVENTS
+ if (s->command != NULL || s->command_handle != -1) + if (s->command != NULL || s->command_handle != -1)
+ fatal("do_exec: command already set"); + fatal("do_exec: command already set");
if (command != NULL) if (command != NULL)
- mm_audit_run_command(command); - PRIVSEP(audit_run_command(command));
+ s->command = xstrdup(command); + s->command = xstrdup(command);
else if (s->ttyfd == -1) { else if (s->ttyfd == -1) {
char *shell = s->pw->pw_shell; char *shell = s->pw->pw_shell;
if (shell[0] == '\0') /* empty shell means /bin/sh */ if (shell[0] == '\0') /* empty shell means /bin/sh */
shell =_PATH_BSHELL; shell =_PATH_BSHELL;
- mm_audit_run_command(shell); - PRIVSEP(audit_run_command(shell));
+ s->command = xstrdup(shell); + s->command = xstrdup(shell);
} }
+ if (s->command != NULL && s->ptyfd == -1) + if (s->command != NULL && s->ptyfd == -1)
+ s->command_handle = mm_audit_run_command(ssh, s->command); + s->command_handle = PRIVSEP(audit_run_command(ssh, s->command));
+ if (pipe(paudit) < 0)
+ fatal("pipe: %s", strerror(errno));
#endif #endif
if (s->ttyfd != -1) if (s->ttyfd != -1)
ret = do_exec_pty(ssh, s, command); ret = do_exec_pty(ssh, s, command);
@@ -1550,8 +1562,11 @@ do_child(struct ssh *ssh, Session *s, co @@ -730,6 +748,20 @@ do_exec(struct ssh *ssh, Session *s, con
*/
sshbuf_reset(loginmsg);
+#ifdef SSH_AUDIT_EVENTS
+ close(paudit[1]);
+ if (use_privsep && ret == 0) {
+ /*
+ * Read the audit messages from forked child and send them
+ * back to monitor. We don't want to communicate directly,
+ * because the messages might get mixed up.
+ * Continue after the pipe gets closed (all messages sent).
+ */
+ ret = mm_forward_audit_messages(paudit[0]);
+ }
+ close(paudit[0]);
+#endif /* SSH_AUDIT_EVENTS */
+
return ret;
}
@@ -1530,11 +1562,30 @@ do_child(struct ssh *ssh, Session *s, co
int env_size;
int r = 0;
+#ifdef SSH_AUDIT_EVENTS
+ int pparent = paudit[1];
+ close(paudit[0]);
+ /* Hack the monitor pipe to avoid race condition with parent */
+ if (use_privsep)
+ mm_set_monitor_pipe(pparent);
+#endif
+
sshpkt_fmt_connection_id(ssh, remote_id, sizeof(remote_id)); sshpkt_fmt_connection_id(ssh, remote_id, sizeof(remote_id));
/* remove hostkey from the child's memory */ /* remove hostkey from the child's memory */
- destroy_sensitive_data(); - destroy_sensitive_data();
+ destroy_sensitive_data(ssh); - ssh_packet_clear_keys(ssh);
ssh_packet_clear_keys(ssh); + destroy_sensitive_data(ssh, use_privsep);
+ /* Don't audit this - both us and the parent would be talking to the + ssh_packet_clear_keys_noaudit(ssh);
+ monitor over a single socket, with no synchronization. */ + /*
+ * We can audit this, because we hacked the pipe to direct the
+ * messages over postauth child. But this message requires an answer
+ * which we can't do using a one-way pipe.
+ */
+ packet_destroy_all(ssh, 0, 1); + packet_destroy_all(ssh, 0, 1);
+
+#ifdef SSH_AUDIT_EVENTS
+ /* Notify parent that we are done */
+ close(pparent);
+#endif
/* Force a password change */ /* Force a password change */
if (s->authctxt->force_pwchange) { if (s->authctxt->force_pwchange) {
@@ -1763,6 +1778,9 @@ session_unused(int id) @@ -1743,6 +1794,9 @@ session_unused(int id)
sessions[id].ttyfd = -1; sessions[id].ttyfd = -1;
sessions[id].ptymaster = -1; sessions[id].ptymaster = -1;
sessions[id].x11_chanids = NULL; sessions[id].x11_chanids = NULL;
@ -1901,7 +2039,7 @@ Index: openssh-8.9p1/session.c
sessions[id].next_unused = sessions_first_unused; sessions[id].next_unused = sessions_first_unused;
sessions_first_unused = id; sessions_first_unused = id;
} }
@@ -1843,6 +1861,19 @@ session_open(Authctxt *authctxt, int cha @@ -1822,6 +1876,19 @@ session_open(Authctxt *authctxt, int cha
} }
Session * Session *
@ -1912,7 +2050,7 @@ Index: openssh-8.9p1/session.c
+ if (s->used) + if (s->used)
+ return s; + return s;
+ } + }
+ debug_f("unknown id %d", id); + debug("%s: unknown id %d", __func__, id);
+ session_dump(); + session_dump();
+ return NULL; + return NULL;
+} +}
@ -1921,7 +2059,7 @@ Index: openssh-8.9p1/session.c
session_by_tty(char *tty) session_by_tty(char *tty)
{ {
int i; int i;
@@ -2450,6 +2481,32 @@ session_exit_message(struct ssh *ssh, Se @@ -2429,6 +2496,32 @@ session_exit_message(struct ssh *ssh, Se
chan_write_failed(ssh, c); chan_write_failed(ssh, c);
} }
@ -1943,7 +2081,7 @@ Index: openssh-8.9p1/session.c
+{ +{
+ if (s->command != NULL) { + if (s->command != NULL) {
+ if (s->command_handle != -1) + if (s->command_handle != -1)
+ mm_audit_end_command(ssh, s->command_handle, s->command); + PRIVSEP(audit_end_command(ssh, s->command_handle, s->command));
+ free(s->command); + free(s->command);
+ s->command = NULL; + s->command = NULL;
+ s->command_handle = -1; + s->command_handle = -1;
@ -1954,7 +2092,7 @@ Index: openssh-8.9p1/session.c
void void
session_close(struct ssh *ssh, Session *s) session_close(struct ssh *ssh, Session *s)
{ {
@@ -2463,6 +2520,10 @@ session_close(struct ssh *ssh, Session * @@ -2470,6 +2563,10 @@ session_close(struct ssh *ssh, Session *
if (s->ttyfd != -1) if (s->ttyfd != -1)
session_pty_cleanup(s); session_pty_cleanup(s);
@ -1965,7 +2103,7 @@ Index: openssh-8.9p1/session.c
free(s->term); free(s->term);
free(s->display); free(s->display);
free(s->x11_chanids); free(s->x11_chanids);
@@ -2537,14 +2598,14 @@ session_close_by_channel(struct ssh *ssh @@ -2544,14 +2641,14 @@ session_close_by_channel(struct ssh *ssh
} }
void void
@ -1982,7 +2120,7 @@ Index: openssh-8.9p1/session.c
else else
session_close(ssh, s); session_close(ssh, s);
} }
@@ -2671,6 +2732,15 @@ do_authenticated2(struct ssh *ssh, Authc @@ -2677,6 +2774,15 @@ do_authenticated2(struct ssh *ssh, Authc
server_loop2(ssh, authctxt); server_loop2(ssh, authctxt);
} }
@ -1998,10 +2136,10 @@ Index: openssh-8.9p1/session.c
void void
do_cleanup(struct ssh *ssh, Authctxt *authctxt) do_cleanup(struct ssh *ssh, Authctxt *authctxt)
{ {
@@ -2734,7 +2804,7 @@ do_cleanup(struct ssh *ssh, Authctxt *au @@ -2740,7 +2846,7 @@ do_cleanup(struct ssh *ssh, Authctxt *au
* or if running in monitor. * or if running in monitor.
*/ */
if (mm_is_monitor()) if (!use_privsep || mm_is_monitor())
- session_destroy_all(ssh, session_pty_cleanup2); - session_destroy_all(ssh, session_pty_cleanup2);
+ session_destroy_all(ssh, do_cleanup_one_session); + session_destroy_all(ssh, do_cleanup_one_session);
} }
@ -2042,34 +2180,6 @@ Index: openssh-8.9p1/sshd.c
=================================================================== ===================================================================
--- openssh-8.9p1.orig/sshd.c --- openssh-8.9p1.orig/sshd.c
+++ openssh-8.9p1/sshd.c +++ openssh-8.9p1/sshd.c
@@ -219,6 +219,15 @@ close_listen_socks(void)
num_listen_socks = 0;
}
+/*
+ * Is this process listening for clients (i.e. not specific to any specific
+ * client connection?)
+ */
+int listening_for_clients(void)
+{
+ return num_listen_socks > 0;
+}
+
/* Allocate and initialise the children array */
static void
child_alloc(void)
@@ -897,6 +906,7 @@ server_accept_loop(int *sock_in, int *so
if (received_sigterm) {
logit("Received signal %d; terminating.",
(int) received_sigterm);
+ /* destroy_sensitive_data(ssh, 0); FIXME */
close_listen_socks();
if (options.pid_file != NULL)
unlink(options.pid_file);
Index: openssh-8.9p1/sshd-session.c
===================================================================
--- openssh-8.9p1.orig/sshd-session.c
+++ openssh-8.9p1/sshd-session.c
@@ -125,6 +125,7 @@ @@ -125,6 +125,7 @@
#include "ssh-gss.h" #include "ssh-gss.h"
#endif #endif
@ -2079,18 +2189,34 @@ Index: openssh-8.9p1/sshd-session.c
#include "auth-options.h" #include "auth-options.h"
#include "version.h" #include "version.h"
@@ -265,8 +266,8 @@ struct sshbuf *loginmsg; @@ -265,8 +266,8 @@ struct sshbuf *loginmsg;
struct sshbuf *loginmsg; struct passwd *privsep_pw = NULL;
/* Prototypes for various functions defined later in this file. */ /* Prototypes for various functions defined later in this file. */
-void destroy_sensitive_data(void); -void destroy_sensitive_data(void);
-void demote_sensitive_data(void); -void demote_sensitive_data(void);
+void destroy_sensitive_data(struct ssh *); +void destroy_sensitive_data(struct ssh *, int);
+void demote_sensitive_data(struct ssh *); +void demote_sensitive_data(struct ssh *);
static void do_ssh2_kex(struct ssh *); static void do_ssh2_kex(struct ssh *);
/* static char *listener_proctitle;
@@ -382,18 +383,40 @@ grace_alarm_handler(int sig) @@ -284,6 +285,15 @@ close_listen_socks(void)
_exit(EXIT_LOGIN_GRACE); num_listen_socks = 0;
}
+/*
+ * Is this process listening for clients (i.e. not specific to any specific
+ * client connection?)
+ */
+int listening_for_clients(void)
+{
+ return num_listen_socks >= 0;
+}
+
static void
close_startup_pipes(void)
{
@@ -382,18 +392,45 @@ grace_alarm_handler(int sig)
ssh_remote_port(the_active_state));
} }
-/* Destroy the host and server keys. They will no longer be needed. */ -/* Destroy the host and server keys. They will no longer be needed. */
@ -2100,7 +2226,7 @@ Index: openssh-8.9p1/sshd-session.c
+ */ + */
void void
-destroy_sensitive_data(void) -destroy_sensitive_data(void)
+destroy_sensitive_data(struct ssh *ssh) +destroy_sensitive_data(struct ssh *ssh, int privsep)
{ {
u_int i; u_int i;
+#ifdef SSH_AUDIT_EVENTS +#ifdef SSH_AUDIT_EVENTS
@ -2122,7 +2248,12 @@ Index: openssh-8.9p1/sshd-session.c
sensitive_data.host_keys[i] = NULL; sensitive_data.host_keys[i] = NULL;
+ if (fp != NULL) { + if (fp != NULL) {
+#ifdef SSH_AUDIT_EVENTS +#ifdef SSH_AUDIT_EVENTS
+ audit_destroy_sensitive_data(ssh, fp, pid, uid); + if (privsep)
+ PRIVSEP(audit_destroy_sensitive_data(ssh, fp,
+ pid, uid));
+ else
+ audit_destroy_sensitive_data(ssh, fp,
+ pid, uid);
+#endif +#endif
+ free(fp); + free(fp);
+ } + }
@ -2133,7 +2264,7 @@ Index: openssh-8.9p1/sshd-session.c
sshkey_free(sensitive_data.host_certificates[i]); sshkey_free(sensitive_data.host_certificates[i]);
sensitive_data.host_certificates[i] = NULL; sensitive_data.host_certificates[i] = NULL;
} }
@@ -402,20 +430,38 @@ destroy_sensitive_data(void) @@ -402,20 +439,38 @@ destroy_sensitive_data(void)
/* Demote private to public keys for network child */ /* Demote private to public keys for network child */
void void
@ -2173,7 +2304,7 @@ Index: openssh-8.9p1/sshd-session.c
} }
/* Certs do not need demotion */ /* Certs do not need demotion */
} }
@@ -443,7 +489,7 @@ reseed_prngs(void) @@ -443,7 +498,7 @@ reseed_prngs(void)
} }
static void static void
@ -2182,7 +2313,7 @@ Index: openssh-8.9p1/sshd-session.c
{ {
gid_t gidset[1]; gid_t gidset[1];
@@ -458,7 +504,7 @@ privsep_preauth_child(void) @@ -458,7 +513,7 @@ privsep_preauth_child(void)
reseed_prngs(); reseed_prngs();
/* Demote the private keys to public keys. */ /* Demote the private keys to public keys. */
@ -2191,16 +2322,16 @@ Index: openssh-8.9p1/sshd-session.c
/* Demote the child */ /* Demote the child */
if (privsep_chroot) { if (privsep_chroot) {
@@ -493,7 +539,7 @@ privsep_preauth(struct ssh *ssh) @@ -493,7 +548,7 @@ privsep_preauth(struct ssh *ssh)
pmonitor->m_pkex = &ssh->kex;
box = ssh_sandbox_init(pmonitor); if (use_privsep == PRIVSEP_ON)
box = ssh_sandbox_init(pmonitor);
- pid = fork(); - pid = fork();
+ pmonitor->m_pid = pid = fork(); + pmonitor->m_pid = pid = fork();
if (pid == -1) { if (pid == -1) {
fatal("fork of unprivileged child failed"); fatal("fork of unprivileged child failed");
} else if (pid != 0) { } else if (pid != 0) {
@@ -538,7 +584,7 @@ privsep_preauth(struct ssh *ssh) @@ -538,7 +593,7 @@ privsep_preauth(struct ssh *ssh)
/* Arrange for logging to be sent to the monitor */ /* Arrange for logging to be sent to the monitor */
set_log_handler(mm_log_handler, pmonitor); set_log_handler(mm_log_handler, pmonitor);
@ -2209,7 +2340,7 @@ Index: openssh-8.9p1/sshd-session.c
setproctitle("%s", "[net]"); setproctitle("%s", "[net]");
if (box != NULL) if (box != NULL)
ssh_sandbox_child(box); ssh_sandbox_child(box);
@@ -582,7 +628,7 @@ privsep_postauth(struct ssh *ssh, Authct @@ -582,7 +637,7 @@ privsep_postauth(struct ssh *ssh, Authct
pmonitor->m_sendfd = -1; pmonitor->m_sendfd = -1;
/* Demote the private keys to public keys. */ /* Demote the private keys to public keys. */
@ -2218,17 +2349,43 @@ Index: openssh-8.9p1/sshd-session.c
reseed_prngs(); reseed_prngs();
@@ -2311,6 +2358,9 @@ main(int ac, char **av) @@ -1136,7 +1191,7 @@ server_listen(void)
* from this function are in a forked subprocess.
*/
static void
-server_accept_loop(int *sock_in, int *sock_out, int *newsock, int *config_s)
+server_accept_loop(struct ssh *ssh, int *sock_in, int *sock_out, int *newsock, int *config_s)
{
struct pollfd *pfd = NULL;
int i, j, ret, npfd;
@@ -1179,6 +1234,7 @@ server_accept_loop(int *sock_in, int *so
if (received_sigterm) {
logit("Received signal %d; terminating.",
(int) received_sigterm);
+ destroy_sensitive_data(ssh, 0);
close_listen_socks();
if (options.pid_file != NULL)
unlink(options.pid_file);
@@ -2088,7 +2144,7 @@ main(int ac, char **av)
#endif
/* Accept a connection and return in a forked child */
- server_accept_loop(&sock_in, &sock_out,
+ server_accept_loop(ssh, &sock_in, &sock_out,
&newsock, config_s);
}
@@ -2311,6 +2367,9 @@ main(int ac, char **av)
do_authenticated(ssh, authctxt); do_authenticated(ssh, authctxt);
/* The connection has been terminated. */ /* The connection has been terminated. */
+ packet_destroy_all(ssh, 1, 1); + packet_destroy_all(ssh, 1, 1);
+ destroy_sensitive_data(ssh); + destroy_sensitive_data(ssh, 1);
+ +
ssh_packet_get_bytes(ssh, &ibytes, &obytes); ssh_packet_get_bytes(ssh, &ibytes, &obytes);
verbose("Transferred: sent %llu, received %llu bytes", verbose("Transferred: sent %llu, received %llu bytes",
(unsigned long long)obytes, (unsigned long long)ibytes); (unsigned long long)obytes, (unsigned long long)ibytes);
@@ -2491,6 +2541,15 @@ do_ssh2_kex(struct ssh *ssh) @@ -2491,6 +2550,15 @@ do_ssh2_kex(struct ssh *ssh)
void void
cleanup_exit(int i) cleanup_exit(int i)
{ {
@ -2241,35 +2398,32 @@ Index: openssh-8.9p1/sshd-session.c
+ if (in_cleanup) + if (in_cleanup)
+ _exit(i); + _exit(i);
+ in_cleanup = 1; + in_cleanup = 1;
extern int auth_attempted; /* monitor.c */
if (the_active_state != NULL && the_authctxt != NULL) { if (the_active_state != NULL && the_authctxt != NULL) {
@@ -2525,7 +2593,9 @@ cleanup_exit(int i) do_cleanup(the_active_state, the_authctxt);
if (use_privsep && privsep_is_preauth &&
@@ -2503,9 +2571,16 @@ cleanup_exit(int i)
}
}
} }
+ is_privsep_child = use_privsep && pmonitor != NULL && pmonitor->m_pid == 0;
+ if (sensitive_data.host_keys != NULL && the_active_state != NULL)
+ destroy_sensitive_data(the_active_state, is_privsep_child);
+ if (the_active_state != NULL)
+ packet_destroy_all(the_active_state, 1, is_privsep_child);
#ifdef SSH_AUDIT_EVENTS #ifdef SSH_AUDIT_EVENTS
/* done after do_cleanup so it can cancel the PAM auth 'thread' */ /* done after do_cleanup so it can cancel the PAM auth 'thread' */
- if (the_active_state != NULL && mm_is_monitor()) - if (the_active_state != NULL && (!use_privsep || mm_is_monitor()))
+ if (the_active_state != NULL && + if (the_active_state != NULL &&
+ (the_authctxt == NULL || !the_authctxt->authenticated) && + (the_authctxt == NULL || !the_authctxt->authenticated) &&
+ mm_is_monitor()) + (!use_privsep || mm_is_monitor()))
audit_event(the_active_state, SSH_CONNECTION_ABANDON); audit_event(the_active_state, SSH_CONNECTION_ABANDON);
#endif #endif
/* Override default fatal exit value when auth was attempted */ _exit(i);
Index: openssh-8.9p1/sshkey.c Index: openssh-8.9p1/sshkey.c
=================================================================== ===================================================================
--- openssh-8.9p1.orig/sshkey.c --- openssh-8.9p1.orig/sshkey.c
+++ openssh-8.9p1/sshkey.c +++ openssh-8.9p1/sshkey.c
@@ -35,6 +35,9 @@ sshkey_type_is_valid_ca(int type) @@ -400,6 +400,38 @@ sshkey_type_is_valid_ca(int type)
#include <openssl/evp.h>
#include <openssl/err.h>
#include <openssl/pem.h>
+# if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+# include <openssl/core_names.h>
+# endif
#endif
#include "crypto_api.h"
@@ -400,6 +403,53 @@ sshkey_type_is_valid_ca(int type)
} }
int int
@ -2277,38 +2431,23 @@ Index: openssh-8.9p1/sshkey.c
+{ +{
+ switch (k->type) { + switch (k->type) {
+#ifdef WITH_OPENSSL +#ifdef WITH_OPENSSL
+# if (OPENSSL_VERSION_NUMBER >= 0x30000000L)
+ case KEY_RSA_CERT:
+ case KEY_RSA:
+ case KEY_ECDSA_CERT:
+ case KEY_ECDSA: {
+ BIGNUM *d = NULL;
+ EVP_PKEY_get_bn_param(k->pkey, OSSL_PKEY_PARAM_PRIV_KEY, &d);
+ return d != NULL;
+ }
+# else /* OPENSSL < 3.0.0 */
+ case KEY_RSA_CERT: + case KEY_RSA_CERT:
+ case KEY_RSA: { + case KEY_RSA: {
+ const BIGNUM *d = NULL; + const BIGNUM *d;
+ RSA *rsakey = EVP_PKEY_get0_RSA(k->pkey); + RSA_get0_key(k->rsa, NULL, NULL, &d);
+ if (rsakey)
+ RSA_get0_key(rsakey, NULL, NULL, &d);
+ return d != NULL; + return d != NULL;
+ } + }
+# ifdef OPENSSL_HAS_ECC
+ case KEY_ECDSA_CERT:
+ case KEY_ECDSA: {
+ EC_KEY *eckey = EVP_PKEY_get0_EC_KEY(k->pkey);
+ return (eckey != NULL) && (EC_KEY_get0_private_key(eckey) != NULL);
+ }
+# endif /* OPENSSL_HAS_ECC */
+# endif /* OPENSSL < 3.0.0 */
+ case KEY_DSA_CERT: + case KEY_DSA_CERT:
+ case KEY_DSA: { + case KEY_DSA: {
+ const BIGNUM *priv_key = NULL; + const BIGNUM *priv_key;
+ DSA_get0_key(k->dsa, NULL, &priv_key); + DSA_get0_key(k->dsa, NULL, &priv_key);
+ return priv_key != NULL; + return priv_key != NULL;
+ } + }
+#ifdef OPENSSL_HAS_ECC
+ case KEY_ECDSA_CERT:
+ case KEY_ECDSA:
+ return EC_KEY_get0_private_key(k->ecdsa) != NULL;
+#endif /* OPENSSL_HAS_ECC */
+#endif /* WITH_OPENSSL */ +#endif /* WITH_OPENSSL */
+ case KEY_ED25519_CERT: + case KEY_ED25519_CERT:
+ case KEY_ED25519: + case KEY_ED25519:
@ -2328,9 +2467,9 @@ Index: openssh-8.9p1/sshkey.h
--- openssh-8.9p1.orig/sshkey.h --- openssh-8.9p1.orig/sshkey.h
+++ openssh-8.9p1/sshkey.h +++ openssh-8.9p1/sshkey.h
@@ -189,6 +189,7 @@ int sshkey_shield_private(struct sshke @@ -189,6 +189,7 @@ int sshkey_shield_private(struct sshke
int sshkey_unshield_private(struct sshkey *);
int sshkey_type_from_name(const char *); int sshkey_type_from_name(const char *);
int sshkey_type_from_shortname(const char *);
+int sshkey_is_private(const struct sshkey *); +int sshkey_is_private(const struct sshkey *);
int sshkey_is_cert(const struct sshkey *); int sshkey_is_cert(const struct sshkey *);
int sshkey_is_sk(const struct sshkey *); int sshkey_is_sk(const struct sshkey *);

View File

@ -123,21 +123,28 @@ Index: openssh-8.9p1/sshd.c
=================================================================== ===================================================================
--- openssh-8.9p1.orig/sshd.c --- openssh-8.9p1.orig/sshd.c
+++ openssh-8.9p1/sshd.c +++ openssh-8.9p1/sshd.c
@@ -1201,7 +1201,8 @@ prepare_proctitle(int ac, char **av) @@ -148,7 +148,7 @@ extern char *__progname;
ServerOptions options;
/* Name of the server configuration file. */
-char *config_file_name = _PATH_SERVER_CONFIG_FILE;
+char *config_file_name = NULL;
/*
* Debug mode flag. This can be set on the command line. If debug
@@ -1591,6 +1591,7 @@ prepare_proctitle(int ac, char **av)
int
main(int ac, char **av)
{
+ struct stat st;
struct ssh *ssh = NULL;
extern char *optarg; extern char *optarg;
extern int optind; extern int optind;
int log_stderr = 0, inetd_flag = 0, test_flag = 0, no_daemon_flag = 0;
- char *config_file_name = _PATH_SERVER_CONFIG_FILE;
+ char *config_file_name = NULL;
+ struct stat st;
int r, opt, do_dump_cfg = 0, keytype, already_daemon, have_agent = 0;
int sock_in = -1, sock_out = -1, newsock = -1, rexec_argc = 0;
int devnull, config_s[2] = { -1 , -1 }, have_connection_info = 0;
@@ -1806,7 +1807,21 @@ main(int ac, char **av) @@ -1806,7 +1807,21 @@ main(int ac, char **av)
/* Fetch our configuration */ */
if ((cfg = sshbuf_new()) == NULL) (void)atomicio(vwrite, startup_pipe, "\0", 1);
fatal("sshbuf_new config failed"); }
+ if (config_file_name == NULL) { + } else if (config_file_name == NULL) {
+ /* If only the vendor configuration file exists, use that. + /* If only the vendor configuration file exists, use that.
+ * Else use the standard configuration file. + * Else use the standard configuration file.
+ */ + */
@ -150,12 +157,11 @@ Index: openssh-8.9p1/sshd.c
+ config_file_name = _PATH_SERVER_CONFIG_FILE; + config_file_name = _PATH_SERVER_CONFIG_FILE;
+ } + }
+ load_server_config(config_file_name, cfg); + load_server_config(config_file_name, cfg);
- if (strcasecmp(config_file_name, "none") != 0) } else if (strcasecmp(config_file_name, "none") != 0)
+ } else if (strcasecmp(config_file_name, "none") != 0)
+ /* load config specified on commandline */ + /* load config specified on commandline */
load_server_config(config_file_name, cfg); load_server_config(config_file_name, cfg);
parse_server_config(&options, config_file_name, cfg, parse_server_config(&options, rexeced_flag ? "rexec" : config_file_name,
Index: openssh-8.9p1/sshd_config.5 Index: openssh-8.9p1/sshd_config.5
=================================================================== ===================================================================
--- openssh-8.9p1.orig/sshd_config.5 --- openssh-8.9p1.orig/sshd_config.5

View File

@ -84,14 +84,13 @@ Index: openssh-9.6p1/ssh_config.5
The list of key exchange algorithms that are offered for GSSAPI The list of key exchange algorithms that are offered for GSSAPI
key exchange. Possible values are key exchange. Possible values are
.Bd -literal -offset 3n .Bd -literal -offset 3n
@@ -991,10 +993,8 @@ gss-nistp256-sha256-, @@ -991,9 +993,8 @@ gss-nistp256-sha256-,
gss-curve25519-sha256- gss-curve25519-sha256-
.Ed .Ed
.Pp .Pp
-The default is -The default is
-.Dq gss-group14-sha256-,gss-group16-sha512-,gss-nistp256-sha256-, -.Dq gss-gex-sha1-,gss-group14-sha1- .
-gss-curve25519-sha256-,gss-group14-sha1-,gss-gex-sha1- . This option only applies to protocol version 2 connections using GSSAPI.
This option only applies to connections using GSSAPI.
+.Pp +.Pp
.It Cm HashKnownHosts .It Cm HashKnownHosts
Indicates that Indicates that
@ -160,7 +159,7 @@ Index: openssh-9.6p1/ssh_config.5
.It Cm HostKeyAlias .It Cm HostKeyAlias
Specifies an alias that should be used instead of the Specifies an alias that should be used instead of the
real host name when looking up or saving the host key real host name when looking up or saving the host key
@@ -1311,37 +1313,30 @@ it may be zero or more of: @@ -1311,31 +1313,26 @@ it may be zero or more of:
and and
.Cm pam . .Cm pam .
.It Cm KexAlgorithms .It Cm KexAlgorithms
@ -170,12 +169,8 @@ Index: openssh-9.6p1/ssh_config.5
+existing policies with sub-policies are present in manual page +existing policies with sub-policies are present in manual page
+.Xr update-crypto-policies 8 . +.Xr update-crypto-policies 8 .
+.Pp +.Pp
Specifies the permitted KEX (Key Exchange) algorithms that will be used and Specifies the available KEX (Key Exchange) algorithms.
their preference order.
The selected algorithm will be the first algorithm in this list that
the server also supports.
Multiple algorithms must be comma-separated. Multiple algorithms must be comma-separated.
.Pp
If the specified list begins with a If the specified list begins with a
.Sq + .Sq +
-character, then the specified algorithms will be appended to the default set -character, then the specified algorithms will be appended to the default set
@ -191,11 +186,9 @@ Index: openssh-9.6p1/ssh_config.5
.Sq ^ .Sq ^
character, then the specified algorithms will be placed at the head of the character, then the specified algorithms will be placed at the head of the
-default set. -default set.
-.Pp
-The default is: -The default is:
-.Bd -literal -offset indent -.Bd -literal -offset indent
-sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, -sntrup761x25519-sha512@openssh.com,
-mlkem768x25519-sha256,
-curve25519-sha256,curve25519-sha256@libssh.org, -curve25519-sha256,curve25519-sha256@libssh.org,
-ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521, -ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,
-diffie-hellman-group-exchange-sha256, -diffie-hellman-group-exchange-sha256,
@ -206,7 +199,7 @@ Index: openssh-9.6p1/ssh_config.5
-.Ed -.Ed
+built-in openssh default set. +built-in openssh default set.
.Pp .Pp
The list of supported key exchange algorithms may also be obtained using The list of available key exchange algorithms may also be obtained using
.Qq ssh -Q kex . .Qq ssh -Q kex .
@@ -1445,37 +1442,34 @@ function, and all code in the @@ -1445,37 +1442,34 @@ function, and all code in the
file. file.
@ -393,7 +386,7 @@ Index: openssh-9.6p1/sshd_config.5
The list of available ciphers may also be obtained using The list of available ciphers may also be obtained using
.Qq ssh -Q cipher . .Qq ssh -Q cipher .
.It Cm ClientAliveCountMax .It Cm ClientAliveCountMax
@@ -764,53 +760,45 @@ For this to work @@ -764,52 +760,45 @@ For this to work
.Cm GSSAPIKeyExchange .Cm GSSAPIKeyExchange
needs to be enabled in the server and also used by the client. needs to be enabled in the server and also used by the client.
.It Cm GSSAPIKexAlgorithms .It Cm GSSAPIKexAlgorithms
@ -422,9 +415,8 @@ Index: openssh-9.6p1/sshd_config.5
.Ed .Ed
-.Pp -.Pp
-The default is -The default is
-.Dq gss-group14-sha256-,gss-group16-sha512-,gss-nistp256-sha256-, -.Dq gss-gex-sha1-,gss-group14-sha1- .
-gss-curve25519-sha256-,gss-group14-sha1-,gss-gex-sha1- . This option only applies to protocol version 2 connections using GSSAPI.
This option only applies to connections using GSSAPI.
.It Cm HostbasedAcceptedAlgorithms .It Cm HostbasedAcceptedAlgorithms
+The default is handled system-wide by +The default is handled system-wide by
+.Xr crypto-policies 7 . +.Xr crypto-policies 7 .
@ -500,7 +492,7 @@ Index: openssh-9.6p1/sshd_config.5
The list of available signature algorithms may also be obtained using The list of available signature algorithms may also be obtained using
.Qq ssh -Q HostKeyAlgorithms . .Qq ssh -Q HostKeyAlgorithms .
.It Cm IgnoreRhosts .It Cm IgnoreRhosts
@@ -1027,24 +1006,30 @@ file on logout. @@ -1027,20 +1006,26 @@ file on logout.
The default is The default is
.Cm yes . .Cm yes .
.It Cm KexAlgorithms .It Cm KexAlgorithms
@ -510,13 +502,9 @@ Index: openssh-9.6p1/sshd_config.5
+existing policies with sub-policies are present in manual page +existing policies with sub-policies are present in manual page
+.Xr update-crypto-policies 8 . +.Xr update-crypto-policies 8 .
+.Pp +.Pp
Specifies the permitted KEX (Key Exchange) algorithms that the server will Specifies the available KEX (Key Exchange) algorithms.
offer to clients.
The ordering of this list is not important, as the client specifies the
preference order.
Multiple algorithms must be comma-separated. Multiple algorithms must be comma-separated.
.Pp Alternately if the specified list begins with a
If the specified list begins with a
.Sq + .Sq +
-character, then the specified algorithms will be appended to the default set -character, then the specified algorithms will be appended to the default set
-instead of replacing them. -instead of replacing them.
@ -532,17 +520,16 @@ Index: openssh-9.6p1/sshd_config.5
character, then the specified algorithms will be placed at the head of the character, then the specified algorithms will be placed at the head of the
-default set. -default set.
+built-in openssh default set. +built-in openssh default set.
.Pp
The supported algorithms are: The supported algorithms are:
.Pp .Pp
@@ -1072,17 +1057,6 @@ ecdh-sha2-nistp521 .Bl -item -compact -offset indent
@@ -1072,16 +1057,6 @@ ecdh-sha2-nistp521
sntrup761x25519-sha512@openssh.com sntrup761x25519-sha512@openssh.com
.El .El
.Pp .Pp
-The default is: -The default is:
-.Bd -literal -offset indent -.Bd -literal -offset indent
-sntrup761x25519-sha512,sntrup761x25519-sha512@openssh.com, -sntrup761x25519-sha512@openssh.com,
-mlkem768x25519-sha256,
-curve25519-sha256,curve25519-sha256@libssh.org, -curve25519-sha256,curve25519-sha256@libssh.org,
-ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521, -ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,
-diffie-hellman-group-exchange-sha256, -diffie-hellman-group-exchange-sha256,
@ -550,7 +537,7 @@ Index: openssh-9.6p1/sshd_config.5
-diffie-hellman-group14-sha256,diffie-hellman-group14-sha1 -diffie-hellman-group14-sha256,diffie-hellman-group14-sha1
-.Ed -.Ed
-.Pp -.Pp
The list of supported key exchange algorithms may also be obtained using The list of available key exchange algorithms may also be obtained using
.Qq ssh -Q KexAlgorithms . .Qq ssh -Q KexAlgorithms .
.It Cm ListenAddress .It Cm ListenAddress
@@ -1167,21 +1142,27 @@ function, and all code in the @@ -1167,21 +1142,27 @@ function, and all code in the

BIN
openssh-9.6p1.tar.gz (Stored with Git LFS) Normal file

Binary file not shown.

16
openssh-9.6p1.tar.gz.asc Normal file
View File

@ -0,0 +1,16 @@
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEcWi5g4FaXu9ZpK39Kj9BTnNgYLoFAmWAXvAACgkQKj9BTnNg
YLrypA/6A1O8e80XnzVWIFhXkbv/biGL10Q5ZMvjQvND6mbkphNWZ4G4QOEh0nBG
rseD3Fce7me9pfeLYVhaNXO9R3OYAXxjbWfQwI7FpBU4QUCnbH53PG32B6ESq7pl
0vlDqdqI7aBAyMpp+8WFD+EvHWUVA77JtfU4MFw7myKJacrVrDUygDaZkJKOhqKf
N1Nurz4YppdQ5zIK1ElL0jlRJXm08flLFRg8fD5/5rwabpUbZIY9b5qZzGKgnR7I
sxUBlDkfLnvKIlKzUXbRvOHazvFAHYH1ltJZGlJUc/+H/ZaPigWf4IR+E1FB9c2O
zxaZhlbwGKyD+p7l08F9n8T21taxpBCW1Uxkx7MLTz8k9huPNpdX5l8VM4Gotmn8
I4V3Fevyx+M3XJYeKtkspa51h0GqF3gNFPLxW7ERGaIuqwoxuHxIEKwYE+JPmQag
UDma5LDrSrasa8Rw8g5urGE48PeDQ5muPy8Bi9eIGZU5JLqX6TNgz7QDDs/dQsHB
iny4wQOLmdIA78IGttiCo0rqikEvFtFDFR4mCUTC8K0nQKzWwGewO3gRTcHttzyU
xMalxw+wt9cUJ8gb1E9p7OeMUuXdaHMmem8/PcFCar/vKx1mdV/On6evnp3P8yQA
la8WnbcP0+zJg0GGwGszpFlOMjWCDB0kUTBCT+MR+IWbj/pVZVA=
=G9YA
-----END PGP SIGNATURE-----

BIN
openssh-9.9p2.tar.gz (Stored with Git LFS)

Binary file not shown.

View File

@ -1,16 +0,0 @@
-----BEGIN PGP SIGNATURE-----
iQIzBAABCgAdFiEEcWi5g4FaXu9ZpK39Kj9BTnNgYLoFAme0QfUACgkQKj9BTnNg
YLo91A/7BcRjsaDO7VydmhkGWrQOtD/7p4LaSjJE8JY23YsEVRvOkUKJ8OPo7uVq
LxcpDqlaVxHSO/zVfgZg4tQHJct4MLp20PvokMCi6+k7GcioL+TOB19ON0FAx/Pq
vgUWv7jd7w0kT/Rpkygtrg4i0oFf2lg5cJEGFTHAuXsny+Sj+vmcCk92K2TW4e/8
tKgBsZrN7qVnmOAUeyAxFLZ7WiDVzfLTlPiVOfrGjEkbzNLiavjiCGBhGspkluRi
16O5txRp248FqlLgv42sgfUmJOqLSuSNchqk5ioB/9lHia5tDFG/d/4uNP/ELX6M
cAKvs0C0XV3QZxCxBQDL7/49YMsdFnbRIin86mPcahqb75ZpkK9rIgHuKhpgY8Jo
q8WlIPehai3vBWAkpFAsPWOZZwjd6a4C/YmD3pGyjH32rL6gxdHjKGs49nhKkDG9
izwIeCmNu3Ta+e/wEPcOBSX75bFfC83f51yhJb6PUvBl9OSm/L0LeoszmsKWd32j
Iu19zqlabAH7zZSEl1ZWd6Ct0X5XOEaOXGamz5Qw7XIEqfYmQyX/aY5M3/mWmq0K
1Z29MCEtFOirIiwcwUw80d4MCIIEol26M97Y00ZmZMBO7bCoCVr8FldHBfqbHBtC
dTdqesVDiRD/j5VZ3y/MgYo5e13F2OvtdCbvUi3DF2Uh5Rnk2nw=
=r4jr
-----END PGP SIGNATURE-----

View File

@ -1,17 +1,3 @@
-------------------------------------------------------------------
Mon Sep 23 06:16:59 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Update to openssh 9.9p1:
* No changes for askpass, see main package changelog for
details.
-------------------------------------------------------------------
Thu Aug 1 09:17:11 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Update to openssh 9.8p1:
* No changes for askpass, see main package changelog for
details.
------------------------------------------------------------------- -------------------------------------------------------------------
Sun Feb 25 18:26:23 UTC 2024 - Hans Petter Jansson <hpj@suse.com> Sun Feb 25 18:26:23 UTC 2024 - Hans Petter Jansson <hpj@suse.com>

View File

@ -1,7 +1,7 @@
# #
# spec file for package openssh-askpass-gnome # spec file for package openssh-askpass-gnome
# #
# Copyright (c) 2024 SUSE LLC # Copyright (c) 2020 SUSE LLC
# #
# All modifications and additions to the file contributed by third parties # All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed # remain the property of their copyright owners, unless otherwise agreed
@ -18,7 +18,7 @@
%define _name openssh %define _name openssh
Name: openssh-askpass-gnome Name: openssh-askpass-gnome
Version: 9.9p2 Version: 9.6p1
Release: 0 Release: 0
Summary: A GNOME-Based Passphrase Dialog for OpenSSH Summary: A GNOME-Based Passphrase Dialog for OpenSSH
License: BSD-2-Clause License: BSD-2-Clause

View File

@ -207,9 +207,9 @@ Index: openssh-9.3p2/packet.h
--- openssh-9.3p2.orig/packet.h --- openssh-9.3p2.orig/packet.h
+++ openssh-9.3p2/packet.h +++ openssh-9.3p2/packet.h
@@ -103,6 +103,7 @@ void ssh_packet_close(struct ssh *); @@ -103,6 +103,7 @@ void ssh_packet_close(struct ssh *);
void ssh_packet_close(struct ssh *);
void ssh_packet_set_input_hook(struct ssh *, ssh_packet_hook_fn *, void *); void ssh_packet_set_input_hook(struct ssh *, ssh_packet_hook_fn *, void *);
void ssh_packet_clear_keys(struct ssh *); void ssh_packet_clear_keys(struct ssh *);
void ssh_packet_clear_keys_noaudit(struct ssh *);
+void ssh_clear_curkeys(struct ssh *, int); +void ssh_clear_curkeys(struct ssh *, int);
void ssh_clear_newkeys(struct ssh *, int); void ssh_clear_newkeys(struct ssh *, int);
@ -264,12 +264,12 @@ Index: openssh-9.3p2/sshbuf.h
/* Macros for decoding/encoding integers */ /* Macros for decoding/encoding integers */
#define PEEK_U64(p) \ #define PEEK_U64(p) \
(((u_int64_t)(((const u_char *)(p))[0]) << 56) | \ (((u_int64_t)(((const u_char *)(p))[0]) << 56) | \
Index: openssh-9.3p2/sshd-session.c Index: openssh-9.3p2/sshd.c
=================================================================== ===================================================================
--- openssh-9.3p2.orig/sshd-session.c --- openssh-9.3p2.orig/sshd.c
+++ openssh-9.3p2/sshd-session.c +++ openssh-9.3p2/sshd.c
@@ -197,6 +197,19 @@ static void do_ssh2_kex(struct ssh *); @@ -272,6 +272,19 @@ static void do_ssh2_kex(struct ssh *);
static void do_ssh2_kex(struct ssh *); static char *listener_proctitle;
/* /*
+ * Clear some stack space. This is a bit naive, but hopefully helps mitigate + * Clear some stack space. This is a bit naive, but hopefully helps mitigate
@ -285,10 +285,10 @@ Index: openssh-9.3p2/sshd-session.c
+} +}
+ +
+/* +/*
* Signal handler for the alarm after the login grace period has expired. * Close all listening sockets
* As usual, this may only take signal-safe actions, even though it is */
* terminal. static void
@@ -260,6 +260,8 @@ destroy_sensitive_data(struct ssh *ssh, @@ -430,6 +443,8 @@ destroy_sensitive_data(struct ssh *ssh,
sensitive_data.host_certificates[i] = NULL; sensitive_data.host_certificates[i] = NULL;
} }
} }
@ -297,32 +297,32 @@ Index: openssh-9.3p2/sshd-session.c
} }
/* Demote private to public keys for network child */ /* Demote private to public keys for network child */
@@ -431,6 +432,8 @@ privsep_preauth(struct ssh *ssh) @@ -600,6 +615,8 @@ privsep_preauth(struct ssh *ssh)
static void
privsep_postauth(struct ssh *ssh, Authctxt *authctxt)
{ {
int skip_privdrop = 0;
+ clobber_stack(); + clobber_stack();
+ +
/* #ifdef DISABLE_FD_PASSING
* Hack for systems that don't support FD passing: retain privileges if (1) {
* in the post-auth privsep process so it can allocate PTYs directly. #else
@@ -1354,6 +1356,7 @@ main(int ac, char **av) @@ -2360,6 +2377,7 @@ main(int ac, char **av)
*/ if (use_privsep) {
mm_send_keystate(ssh, pmonitor); mm_send_keystate(ssh, pmonitor);
ssh_packet_clear_keys(ssh); ssh_packet_clear_keys(ssh);
+ clobber_stack(); + clobber_stack();
exit(0); exit(0);
}
authenticated: @@ -2436,6 +2454,7 @@ main(int ac, char **av)
@@ -1431,6 +1434,7 @@ main(int ac, char **av) if (use_privsep)
mm_terminate();
mm_terminate();
+ clobber_stack(); + clobber_stack();
exit(0); exit(0);
} }
@@ -1577,8 +1581,10 @@ cleanup_exit(int i) @@ -2596,8 +2615,10 @@ cleanup_exit(int i)
/* cleanup_exit can be called at the very least from the privsep /* cleanup_exit can be called at the very least from the privsep
wrappers used for auditing. Make sure we don't recurse wrappers used for auditing. Make sure we don't recurse
indefinitely. */ indefinitely. */
@ -332,14 +332,13 @@ Index: openssh-9.3p2/sshd-session.c
_exit(i); _exit(i);
+ } + }
in_cleanup = 1; in_cleanup = 1;
extern int auth_attempted; /* monitor.c */ if (the_active_state != NULL && the_authctxt != NULL) {
do_cleanup(the_active_state, the_authctxt);
@@ -1604,6 +1610,8 @@ cleanup_exit(int i) @@ -2623,5 +2644,7 @@ cleanup_exit(int i)
mm_is_monitor()) (!use_privsep || mm_is_monitor()))
audit_event(the_active_state, SSH_CONNECTION_ABANDON); audit_event(the_active_state, SSH_CONNECTION_ABANDON);
#endif #endif
+ +
+ clobber_stack(); + clobber_stack();
/* Override default fatal exit value when auth was attempted */ _exit(i);
if (i == 255 && auth_attempted) }
_exit(EXIT_AUTH_ATTEMPTED);

View File

@ -25,7 +25,7 @@ Index: openssh-8.9p1/ssh_config.5
+diffie-hellman-group14-sha1 +diffie-hellman-group14-sha1
.Ed .Ed
.Pp .Pp
The list of supported key exchange algorithms may also be obtained using The list of available key exchange algorithms may also be obtained using
Index: openssh-8.9p1/sshd_config.5 Index: openssh-8.9p1/sshd_config.5
=================================================================== ===================================================================
--- openssh-8.9p1.orig/sshd_config.5 --- openssh-8.9p1.orig/sshd_config.5
@ -38,4 +38,4 @@ Index: openssh-8.9p1/sshd_config.5
+diffie-hellman-group14-sha256,diffie-hellman-group14-sha1 +diffie-hellman-group14-sha256,diffie-hellman-group14-sha1
.Ed .Ed
.Pp .Pp
The list of supported key exchange algorithms may also be obtained using The list of available key exchange algorithms may also be obtained using

View File

@ -1,40 +1,11 @@
------------------------------------------------------------------- -------------------------------------------------------------------
Tue Feb 18 09:15:48 UTC 2025 - Antonio Larrosa <alarrosa@suse.com> Tue Feb 18 16:49:36 UTC 2025 - Antonio Larrosa <alarrosa@suse.com>
- Update to openssh 9.9p2: - Fix ssh client segfault with GSSAPIKeyExchange=yes in ssh_kex2
= Security due to gssapi proposal not being correctly initialized
* Fix CVE-2025-26465 - ssh(1) in OpenSSH versions 6.8p1 to 9.9p1 (bsc#1236826). The problem was introduced in the rebase of
(inclusive) contained a logic error that allowed an on-path the patch for 9.6p1:
attacker (a.k.a MITM) to impersonate any server when the * openssh-8.0p1-gssapi-keyex.patch
VerifyHostKeyDNS option is enabled. This option is off by
default.
* Fix CVE-2025-26466 - sshd(8) in OpenSSH versions 9.5p1 to 9.9p1
(inclusive) is vulnerable to a memory/CPU denial-of-service
related to the handling of SSH2_MSG_PING packets. This
condition may be mitigated using the existing
PerSourcePenalties feature.
Both vulnerabilities were discovered and demonstrated to be
exploitable by the Qualys Security Advisory team. The openSSH
team thanks them for their detailed review of OpenSSH.
= Bugfixes
* ssh(1), sshd(8): fix regression in Match directive that caused
failures when predicates and their arguments were separated by
'=' characters instead of whitespace (bz3739).
* sshd(8): fix the "Match invalid-user" predicate, which was
matching incorrectly in the initial pass of config evaluation.
* ssh(1), sshd(8), ssh-keyscan(1): fix mlkem768x25519-sha256 key
exchange on big-endian systems.
* Fix a number of build problems on particular operating systems
and configurations.
- Remove patches that are already included in 9.9p2:
* 0001-fix-utmpx-ifdef.patch
* 0002-upstream-fix-regression-introduced-when-I-switched-the-Match.patch
* 0003-upstream-fix-previous-change-to-ssh_config-Match_-which-broken-on.patch
* 0004-upstream-fix-ML-KEM768x25519-KEX-on-big-endian-systems-spotted-by.patch
* fix-CVE-2025-26465-and-CVE-2025-26466.patch
------------------------------------------------------------------- -------------------------------------------------------------------
Thu Feb 13 11:29:19 UTC 2025 - Antonio Larrosa <alarrosa@suse.com> Thu Feb 13 11:29:19 UTC 2025 - Antonio Larrosa <alarrosa@suse.com>
@ -44,203 +15,12 @@ Thu Feb 13 11:29:19 UTC 2025 - Antonio Larrosa <alarrosa@suse.com>
(bsc#1237040, CVE-2025-26465, bsc#1237041, CVE-2025-26466): (bsc#1237040, CVE-2025-26465, bsc#1237041, CVE-2025-26466):
* fix-CVE-2025-26465-and-CVE-2025-26466.patch * fix-CVE-2025-26465-and-CVE-2025-26466.patch
------------------------------------------------------------------- - From Fri Oct 11 09:28:30 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
Wed Jan 22 15:25:28 UTC 2025 - Dominique Leuenberger <dimstar@opensuse.org>
- Drop rcFOO symlinks for CODE16 (PED-266).
-------------------------------------------------------------------
Mon Oct 28 11:18:04 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Don't force using gcc11 on SLFO/ALP which have a newer version.
-------------------------------------------------------------------
Mon Oct 28 10:29:33 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Add patches from upstream:
- To fix a copy&paste oversight in an ifdef :
* 0001-fix-utmpx-ifdef.patch
- To fix a regression introduced when the "Match" criteria
tokenizer was modified since it stopped supporting the
"Match criteria=argument" format:
* 0002-upstream-fix-regression-introduced-when-I-switched-the-Match.patch
- To fix the previous patch which broke on negated Matches:
* 0003-upstream-fix-previous-change-to-ssh_config-Match_-which-broken-on.patch
- To fix the ML-KEM768x25519 kex algorithm on big-endian systems:
* 0004-upstream-fix-ML-KEM768x25519-KEX-on-big-endian-systems-spotted-by.patch
-------------------------------------------------------------------
Mon Oct 14 15:06:19 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Use %{with ...} instead of 0%{with ...}
-------------------------------------------------------------------
Fri Oct 11 09:28:30 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Add a patch to fix a regression introduced in 9.6 that makes X11 - Add a patch to fix a regression introduced in 9.6 that makes X11
forwarding very slow. Submitted to upstream in forwarding very slow. Submitted to upstream in
https://bugzilla.mindrot.org/show_bug.cgi?id=3655#c4 . Fixes https://bugzilla.mindrot.org/show_bug.cgi?id=3655#c4 . Fixes
bsc#1229449: bsc#1229449:
* fix-x11-regression-bsc1229449.patch * fix-x11-regression-bsc1229449.patch
- Remove empty line at the end of sshd-sle.pamd (bsc#1227456)
-------------------------------------------------------------------
Wed Sep 25 10:45:17 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Add a const to the openssl 1.1/RSA section of sshkey_is_private
to keep it similar to what it used before the 9.9 rebase:
* openssh-8.1p1-audit.patch
- Add a openssl11 bcond to the spec file for the SLE12 case
instead of checking suse_version in different parts.
- Move conditional patches to a number >= 1000.
-------------------------------------------------------------------
Mon Sep 23 06:16:59 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Update to openssh 9.9p1:
= Future deprecation notice
* OpenSSH plans to remove support for the DSA signature algorithm
in early 2025. This release disables DSA by default at compile
time. DSA, as specified in the SSHv2 protocol, is inherently
weak - being limited to a 160 bit private key and use of the
SHA1 digest. Its estimated security level is only 80 bits
symmetric equivalent.
OpenSSH has disabled DSA keys by default since 2015 but has
retained run-time optional support for them. DSA was the only
mandatory-to-implement algorithm in the SSHv2 RFCs, mostly
because alternative algorithms were encumbered by patents when
the SSHv2 protocol was specified.
This has not been the case for decades at this point and better
algorithms are well supported by all actively-maintained SSH
implementations. We do not consider the costs of maintaining
DSA in OpenSSH to be justified and hope that removing it from
OpenSSH can accelerate its wider deprecation in supporting
cryptography libraries.
= Potentially-incompatible changes
* ssh(1): remove support for pre-authentication compression.
OpenSSH has only supported post-authentication compression in
the server for some years. Compression before authentication
significantly increases the attack surface of SSH servers and
risks creating oracles that reveal information about
information sent during authentication.
* ssh(1), sshd(8): processing of the arguments to the "Match"
configuration directive now follows more shell-like rules for
quoted strings, including allowing nested quotes and \-escaped
characters. If configurations contained workarounds for the
previous simplistic quote handling then they may need to be
adjusted. If this is the case, it's most likely to be in the
arguments to a "Match exec" confition. In this case, moving the
command to be evaluated from the Match line to an external
shell script is easiest way to preserve compatibility with both
the old and new versions.
= New features
* ssh(1), sshd(8): add support for a new hybrid post-quantum key
exchange based on the FIPS 203 Module-Lattice Key Enapsulation
mechanism (ML-KEM) combined with X25519 ECDH as described by
https://datatracker.ietf.org/doc/html/draft-kampanakis-curdle-ssh-pq-ke-03
This algorithm "mlkem768x25519-sha256" is available by default.
* ssh(1): the ssh_config "Include" directive can now expand
environment as well as the same set of %-tokens "Match Exec"
supports.
* sshd(8): add a sshd_config "RefuseConnection" option that, if
set will terminate the connection at the first authentication
request.
* sshd(8): add a "refuseconnection" penalty class to sshd_config
PerSourcePenalties that is applied when a connection is dropped
by the new RefuseConnection keyword.
* sshd(8): add a "Match invalid-user" predicate to sshd_config
Match options that matches when the target username is not
valid on the server.
* ssh(1), sshd(8): update the Streamlined NTRUPrime code to a
substantially faster implementation.
* ssh(1), sshd(8): the hybrid Streamlined NTRUPrime/X25519 key
exchange algorithm now has an IANA-assigned name in addition to
the "@openssh.com" vendor extension name. This algorithm is now
also available under this name "sntrup761x25519-sha512"
* ssh(1), sshd(8), ssh-agent(1): prevent private keys from being
included in core dump files for most of their lifespans. This
is in addition to pre-existing controls in ssh-agent(1) and
sshd(8) that prevented coredumps. This feature is supported on
OpenBSD, Linux and FreeBSD.
* All: convert key handling to use the libcrypto EVP_PKEY API,
with the exception of DSA.
* sshd(8): add a random amount of jitter (up to 4 seconds) to the
grace login time to make its expiry unpredictable.
= Bugfixes
* sshd(8): relax absolute path requirement back to what it was
prior to OpenSSH 9.8, which incorrectly required that sshd was
started with an absolute path in inetd mode. bz3717
* sshd(8): fix regression introduced in openssh-9.8 that swapped
the order of source and destination addresses in some sshd log
messages.
* sshd(8): do not apply authorized_keys options when signature
verification fails. Prevents more restrictive key options being
incorrectly applied to subsequent keys in authorized_keys.
bz3733
* ssh-keygen(1): include pathname in some of ssh-keygen's
passphrase prompts. Helps the user know what's going on when
ssh-keygen is invoked via other tools. Requested in GHPR503
* ssh(1), ssh-add(1): make parsing user@host consistently look
for the last '@' in the string rather than the first. This
makes it possible to more consistently use usernames that
contain '@' characters.
* ssh(1), sshd(8): be more strict in parsing key type names. Only
allow short names (e.g "rsa") in user-interface code and
require full SSH protocol names (e.g. "ssh-rsa") everywhere
else. bz3725
* regress: many performance and correctness improvements to the
re-keying regression test.
* ssh-keygen(1): clarify that ed25519 is the default key type
generated and clarify that rsa-sha2-512 is the default
signature scheme when RSA is in use. GHPR505
* sshd(8): fix minor memory leak in Subsystem option parsing;
GHPR515
* All: additional hardening and consistency checks for the sshbuf
code.
* sshd(8): reduce default logingrace penalty to ensure that a
single forgotton login that times out will be below the penalty
threshold.
* ssh(1): fix proxy multiplexing (-O proxy) bug. If a mux started
with ControlPersist then later has a forwarding added using mux
proxy connection and the forwarding was used, then when the mux
proxy session terminated, the mux master process would issue a
bad message that terminated the connection.
= Portability
* sync contrib/ssh-copy-id to the latest upstream version.
* regress: improve portablility for some awk(1) usage
(e.g. Solaris)
* In the contrib/redhat RPM spec file, without_openssl was
previously incorrectly enabled unconditionally.
* sshd(8) restore audit call before exit that regressed in
openssh-9.8. Fixes an issue where the SSH_CONNECTION_ABANDON
event was not recorded.
* sshd(8): add support for class-imposed loging restrictions on
FreeBSD. Allowing auth_hostok(3) and auth_timeok(3) to control
logins.
* Build fixes for Musl libc.
* Fix detection of setres*id on GNU/Hurd
- Drop patches that were already merged by upstream:
* fix-memleak-in-process_server_config_line_depth.patch
* fix-audit-fail-attempt.patch
- Rebase patch with significant changes:
* openssh-8.1p1-audit.patch
- Rebase patches with context or trivial changes:
* openssh-7.7p1-fips.patch
* openssh-8.0p1-gssapi-keyex.patch
* openssh-9.6p1-crypto-policies-man.patch
* openssh-mitigate-lingering-secrets.patch
- Several spec file fixes so the package builds and can be
installed in SLE 15 SP5 and SLE 12 SP5
- Use gcc11 when building in SLE12 and SLE15.
-------------------------------------------------------------------
Thu Sep 12 07:43:18 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Drop most of openssh-6.6p1-keycat.patch (actually, it was just - Drop most of openssh-6.6p1-keycat.patch (actually, it was just
commented out). The keycat binary isn't really installed nor commented out). The keycat binary isn't really installed nor
supported, so we can drop it, except for the code that is used supported, so we can drop it, except for the code that is used
@ -251,23 +31,6 @@ Thu Sep 12 07:43:18 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
instructions and sshd shows them to users even before a prompt instructions and sshd shows them to users even before a prompt
is requested. This fixes MFA push notifications (boo#1229010). is requested. This fixes MFA push notifications (boo#1229010).
* 0001-auth-pam-Immediately-report-instructions-to-clients-and-fix-handling-in-ssh-client.patch * 0001-auth-pam-Immediately-report-instructions-to-clients-and-fix-handling-in-ssh-client.patch
-------------------------------------------------------------------
Fri Aug 23 12:10:00 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Add patch to fix sshd not logging in the audit failed login
attempts (submitted to upstream in
https://github.com/openssh/openssh-portable/pull/516):
* fix-audit-fail-attempt.patch
- Use --enable-dsa-keys when building openssh. It's required if
the user sets the crypto-policy mode to LEGACY, where DSA keys
should be allowed. The option was added by upstream in 9.7 and
set to disabled by default.
- These two changes fix 2 of the 3 issues reported in bsc#1229650.
-------------------------------------------------------------------
Mon Aug 12 08:55:38 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Fix a dbus connection leaked in the logind patch that was - Fix a dbus connection leaked in the logind patch that was
missing a sd_bus_unref call (found by Matthias Gerstner): missing a sd_bus_unref call (found by Matthias Gerstner):
* logind_set_tty.patch * logind_set_tty.patch
@ -275,291 +38,8 @@ Mon Aug 12 08:55:38 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
subsystem configuration option: subsystem configuration option:
* fix-memleak-in-process_server_config_line_depth.patch * fix-memleak-in-process_server_config_line_depth.patch
------------------------------------------------------------------- - From Wed Jul 10 11:35:18 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
Thu Aug 1 09:17:11 UTC 2024 - Antonio Larrosa <alarrosa@suse.com> - Remove empty line at the end of sshd-sle.pamd (bsc#1227456)
- Update to openssh 9.8p1:
= Security
* 1) Race condition in sshd(8) (bsc#1226642, CVE-2024-6387).
A critical vulnerability in sshd(8) was present in Portable
OpenSSH versions between 8.5p1 and 9.7p1 (inclusive) that may
allow arbitrary code execution with root privileges.
Successful exploitation has been demonstrated on 32-bit
Linux/glibc systems with ASLR. Under lab conditions, the attack
requires on average 6-8 hours of continuous connections up to
the maximum the server will accept. Exploitation on 64-bit
systems is believed to be possible but has not been
demonstrated at this time. It's likely that these attacks will
be improved upon.
Exploitation on non-glibc systems is conceivable but has not
been examined. Systems that lack ASLR or users of downstream
Linux distributions that have modified OpenSSH to disable
per-connection ASLR re-randomisation (yes - this is a thing, no
- we don't understand why) may potentially have an easier path
to exploitation. OpenBSD is not vulnerable.
We thank the Qualys Security Advisory Team for discovering,
reporting and demonstrating exploitability of this problem, and
for providing detailed feedback on additional mitigation
measures.
* 2) Logic error in ssh(1) ObscureKeystrokeTiming (bsc#1227318,
CVE-2024-39894).
In OpenSSH version 9.5 through 9.7 (inclusive), when connected
to an OpenSSH server version 9.5 or later, a logic error in the
ssh(1) ObscureKeystrokeTiming feature (on by default) rendered
this feature ineffective - a passive observer could still
detect which network packets contained real keystrokes when the
countermeasure was active because both fake and real keystroke
packets were being sent unconditionally.
This bug was found by Philippos Giavridis and also
independently by Jacky Wei En Kung, Daniel Hugenroth and
Alastair Beresford of the University of Cambridge Computer Lab.
Worse, the unconditional sending of both fake and real
keystroke packets broke another long-standing timing attack
mitigation. Since OpenSSH 2.9.9 sshd(8) has sent fake keystoke
echo packets for traffic received on TTYs in echo-off mode,
such as when entering a password into su(8) or sudo(8). This
bug rendered these fake keystroke echoes ineffective and could
allow a passive observer of a SSH session to once again detect
when echo was off and obtain fairly limited timing information
about keystrokes in this situation (20ms granularity by
default).
This additional implication of the bug was identified by
Jacky Wei En Kung, Daniel Hugenroth and Alastair Beresford and
we thank them for their detailed analysis.
This bug does not affect connections when
ObscureKeystrokeTiming was disabled or sessions where no TTY
was requested.
= Future deprecation notice
* OpenSSH plans to remove support for the DSA signature algorithm
in early 2025. This release disables DSA by default at compile
time.
DSA, as specified in the SSHv2 protocol, is inherently weak -
being limited to a 160 bit private key and use of the SHA1
digest. Its estimated security level is only 80 bits symmetric
equivalent.
OpenSSH has disabled DSA keys by default since 2015 but has
retained run-time optional support for them. DSA was the only
mandatory-to-implement algorithm in the SSHv2 RFCs, mostly
because alternative algorithms were encumbered by patents when
the SSHv2 protocol was specified.
This has not been the case for decades at this point and better
algorithms are well supported by all actively-maintained SSH
implementations. We do not consider the costs of maintaining
DSA in OpenSSH to be justified and hope that removing it from
OpenSSH can accelerate its wider deprecation in supporting
cryptography libraries.
This release, and its deactivation of DSA by default at
compile-time, marks the second step in our timeline to finally
deprecate DSA. The final step of removing DSA support entirely
is planned for the first OpenSSH release of 2025.
DSA support may be re-enabled in OpenBSD by setting
"DSAKEY=yes" in Makefile.inc. To enable DSA support in
portable OpenSSH, pass the "--enable-dsa-keys" option to
configure.
= Potentially-incompatible changes
* all: as mentioned above, the DSA signature algorithm is now
disabled at compile time.
* sshd(8): the server will now block client addresses that
repeatedly fail authentication, repeatedly connect without ever
completing authentication or that crash the server. See the
discussion of PerSourcePenalties below for more information.
Operators of servers that accept connections from many users,
or servers that accept connections from addresses behind NAT or
proxies may need to consider these settings.
* sshd(8): the server has been split into a listener binary,
sshd(8), and a per-session binary "sshd-session". This allows
for a much smaller listener binary, as it no longer needs to
support the SSH protocol. As part of this work, support for
disabling privilege separation (which previously required code
changes to disable) and disabling re-execution of sshd(8) has
been removed. Further separation of sshd-session into
additional, minimal binaries is planned for the future.
* sshd(8): several log messages have changed. In particular, some
log messages will be tagged with as originating from a process
named "sshd-session" rather than "sshd".
* ssh-keyscan(1): this tool previously emitted comment lines
containing the hostname and SSH protocol banner to standard
error. This release now emits them to standard output, but adds
a new "-q" flag to silence them altogether.
* sshd(8): (portable OpenSSH only) sshd will no longer use
argv[0] as the PAM service name. A new "PAMServiceName"
sshd_config(5) directive allows selecting the service name at
runtime. This defaults to "sshd". bz2101
* (portable OpenSSH only) Automatically-generated files, such as
configure, config.h.in, etc will now be checked in to the
portable OpenSSH git release branch (e.g. V_9_8). This should
ensure that the contents of the signed release branch exactly
match the contents of the signed release tarball.
= New features
* sshd(8): as described above, sshd(8) will now penalise client
addresses that, for various reasons, do not successfully
complete authentication. This feature is controlled by a new
sshd_config(5) PerSourcePenalties option and is on by default.
sshd(8) will now identify situations where the session did not
authenticate as expected. These conditions include when the
client repeatedly attempted authentication unsucessfully
(possibly indicating an attack against one or more accounts,
e.g. password guessing), or when client behaviour caused sshd
to crash (possibly indicating attempts to exploit bugs in
sshd).
When such a condition is observed, sshd will record a penalty
of some duration (e.g. 30 seconds) against the client's
address. If this time is above a minimum configurable
threshold, then all connections from the client address will be
refused (along with any others in the same
PerSourceNetBlockSize CIDR range) until the penalty expire.
Repeated offenses by the same client address will accrue
greater penalties, up to a configurable maximum. Address ranges
may be fully exempted from penalties, e.g. to guarantee access
from a set of trusted management addresses, using the new
sshd_config(5) PerSourcePenaltyExemptList option.
We hope these options will make it significantly more difficult
for attackers to find accounts with weak/guessable passwords or
exploit bugs in sshd(8) itself. This option is enabled by
default.
* ssh(8): allow the HostkeyAlgorithms directive to disable the
implicit fallback from certificate host key to plain host keys.
= Bugfixes
* misc: fix a number of inaccuracies in the PROTOCOL.*
documentation files. GHPR430 GHPR487
* all: switch to strtonum(3) for more robust integer parsing in
most places.
* ssh(1), sshd(8): correctly restore sigprocmask around ppoll()
* ssh-keysign(8): stricter validation of messaging socket fd
GHPR492
* sftp(1): flush stdout after writing "sftp>" prompt when not
using editline. GHPR480
* sftp-server(8): fix home-directory extension implementation,
it previously always returned the current user's home directory
contrary to the spec. GHPR477
* ssh-keyscan(1): do not close stdin to prevent error messages
when stdin is read multiple times. E.g.
echo localhost | ssh-keyscan -f - -f -
* regression tests: fix rekey test that was testing the same KEX
algorithm repeatedly instead of testing all of them. bz3692
* ssh_config(5), sshd_config(5): clarify the KEXAlgorithms
directive documentation, especially around what is supported
vs available. bz3701.
= Portability
* sshd(8): expose SSH_AUTH_INFO_0 always to PAM auth modules
unconditionally. The previous behaviour was to expose it only
when particular authentication methods were in use.
* build: fix OpenSSL ED25519 support detection. An incorrect
function signature in configure.ac previously prevented
enabling the recently added support for ED25519 private keys in
PEM PKCS8 format.
* ssh(1), ssh-agent(8): allow the presence of the WAYLAND_DISPLAY
environment variable to enable SSH_ASKPASS, similarly to the
X11 DISPLAY environment variable. GHPR479
* build: improve detection of the -fzero-call-used-regs compiler
flag. bz3673.
* build: relax OpenSSL version check to accept all OpenSSL 3.x
versions.
* sshd(8): add support for notifying systemd on server listen and
reload, using a standalone implementation that doesn't depend
on libsystemd. bz2641
- Update to openssh 9.7p1:
= New features
* ssh(1), sshd(8): add a "global" ChannelTimeout type that
watches all open channels and will close all open channels if
there is no traffic on any of them for the specified interval.
This is in addition to the existing per-channel timeouts added
recently.
This supports situations like having both session and x11
forwarding channels open where one may be idle for an extended
period but the other is actively used. The global timeout could
close both channels when both have been idle for too long.
* All: make DSA key support compile-time optional, defaulting to
on.
= Bugfixes
* sshd(8): don't append an unnecessary space to the end of
subsystem arguments (bz3667)
* ssh(1): fix the multiplexing "channel proxy" mode, broken when
keystroke timing obfuscation was added. (GHPR#463)
* ssh(1), sshd(8): fix spurious configuration parsing errors when
options that accept array arguments are overridden (bz3657).
* ssh-agent(1): fix potential spin in signal handler (bz3670)
* Many fixes to manual pages and other documentation, including
GHPR#462, GHPR#454, GHPR#442 and GHPR#441.
* Greatly improve interop testing against PuTTY.
= Portability
* Improve the error message when the autoconf OpenSSL header
check fails (bz#3668)
* Improve detection of broken toolchain -fzero-call-used-regs
support (bz3645).
* Fix regress/misc/fuzz-harness fuzzers and make them compile
without warnings when using clang16
- Use gcc-11 in SLE to avoid a "parameter name omitted" error
- Rebase patches:
* logind_set_tty.patch
* openssh-6.6.1p1-selinux-contexts.patch
* openssh-6.6p1-keycat.patch
* openssh-6.6p1-privsep-selinux.patch
* openssh-7.6p1-cleanup-selinux.patch
* openssh-7.7p1-cavstest-ctr.patch
* openssh-7.7p1-cavstest-kdf.patch
* openssh-7.7p1-fips.patch
* openssh-7.7p1-fips_checks.patch
* openssh-7.7p1-ldap.patch
* openssh-7.7p1-pam_check_locks.patch
* openssh-7.7p1-systemd-notify.patch
* openssh-7.8p1-role-mls.patch
* openssh-8.0p1-gssapi-keyex.patch
* openssh-8.1p1-audit.patch
* openssh-8.4p1-vendordir.patch
* openssh-9.6p1-crypto-policies-man.patch
* openssh-mitigate-lingering-secrets.patch
* openssh-reenable-dh-group14-sha1-default.patch
* wtmpdb.patch
- Thanks to Fedora developers for an initial version of the
rebase of the following patches:
* openssh-8.0p1-gssapi-keyex.patch
* openssh-7.8p1-role-mls.patch
* openssh-8.1p1-audit.patch
- Remove patches that are already included in 9.8p1:
* fix-CVE-2024-6387.patch
* 0001-upstream-fix-proxy-multiplexing-mode_-broken-when-keystroke.patch
* 0001-upstream-correctly-restore-sigprocmask-around-ppoll.patch
* 0001-upstream-when-sending-ObscureKeystrokeTiming-chaff-packets_.patch
- Remove patch that is now merged into
openssh-7.7p1-cavstest-ctr.patch and
openssh-7.7p1-cavstest-kdf.patch where it belongs:
* fix-missing-lz.patch
-------------------------------------------------------------------
Mon Jul 15 17:49:06 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>
- Add sshd.socket and sshd@.service units as alternative to the
sshd.service that makes systemd listen to the ssh port
and run sshd per incoming connection. To enable this,
disable sshd.service and enable sshd.socket . If you want to
use a non standard sshd port with sshd.socket you can do
"systemctl edit sshd.socket" and add something like:
[Socket]
ListenStream=8022
which listens on port 8022 as well as on port 22. If you want
to reset the list of listened ports and just use 8022, use:
[Socket]
ListenStream=
ListenStream=8022
- To enable a vsock listener in sshd (which allows to connect to
libvirt VMs), the systemd-experimental package needs to be
installed in the guest system, the libvirt-ssh-proxy package
needs to be installed in the host and the vm needs to have
vsock support (in virt-manager, click in "Add hardware" and
add "VSOCK VirtIO").
------------------------------------------------------------------- -------------------------------------------------------------------
Fri Jul 5 17:49:06 UTC 2024 - Antonio Larrosa <alarrosa@suse.com> Fri Jul 5 17:49:06 UTC 2024 - Antonio Larrosa <alarrosa@suse.com>

View File

@ -1,7 +1,7 @@
# #
# spec file for package openssh # spec file for package openssh
# #
# Copyright (c) 2024 SUSE LLC # Copyright (c) 2020 SUSE LLC
# #
# All modifications and additions to the file contributed by third parties # All modifications and additions to the file contributed by third parties
# remain the property of their copyright owners, unless otherwise agreed # remain the property of their copyright owners, unless otherwise agreed
@ -34,24 +34,12 @@
%bcond_without allow_root_password_login_by_default %bcond_without allow_root_password_login_by_default
%endif %endif
%if 0%{?suse_version} >= 1550 || 0%{?sle_version} >= 150600
%bcond_without crypto_policies
%else
%bcond_with crypto_policies
%endif
%if 0%{?suse_version} < 1500
%bcond_without openssl11
%else
%bcond_with openssl11
%endif
#Compat macro for new _fillupdir macro introduced in Nov 2017 #Compat macro for new _fillupdir macro introduced in Nov 2017
%if ! %{defined _fillupdir} %if ! %{defined _fillupdir}
%define _fillupdir %{_localstatedir}/adm/fillup-templates %define _fillupdir %{_localstatedir}/adm/fillup-templates
%endif %endif
Name: openssh Name: openssh
Version: 9.9p2 Version: 9.6p1
Release: 0 Release: 0
Summary: Secure Shell Client and Server (Remote Login Program) Summary: Secure Shell Client and Server (Remote Login Program)
License: BSD-2-Clause AND MIT License: BSD-2-Clause AND MIT
@ -73,8 +61,6 @@ Source12: cavs_driver-ssh.pl
Source13: https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/RELEASE_KEY.asc#/openssh.keyring Source13: https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/RELEASE_KEY.asc#/openssh.keyring
Source14: sysusers-sshd.conf Source14: sysusers-sshd.conf
Source15: sshd-sle.pamd Source15: sshd-sle.pamd
Source16: sshd@.service
Source17: sshd.socket
Patch1: openssh-7.7p1-X11_trusted_forwarding.patch Patch1: openssh-7.7p1-X11_trusted_forwarding.patch
Patch3: openssh-7.7p1-enable_PAM_by_default.patch Patch3: openssh-7.7p1-enable_PAM_by_default.patch
Patch4: openssh-7.7p1-eal3.patch Patch4: openssh-7.7p1-eal3.patch
@ -133,43 +119,44 @@ Patch50: openssh-openssl-3.patch
Patch51: wtmpdb.patch Patch51: wtmpdb.patch
Patch52: logind_set_tty.patch Patch52: logind_set_tty.patch
Patch54: openssh-mitigate-lingering-secrets.patch Patch54: openssh-mitigate-lingering-secrets.patch
Patch100: fix-missing-lz.patch
Patch102: openssh-7.8p1-role-mls.patch Patch102: openssh-7.8p1-role-mls.patch
Patch103: openssh-6.6p1-privsep-selinux.patch Patch103: openssh-6.6p1-privsep-selinux.patch
Patch104: openssh-6.6p1-keycat.patch Patch104: openssh-6.6p1-keycat.patch
Patch105: openssh-6.6.1p1-selinux-contexts.patch Patch105: openssh-6.6.1p1-selinux-contexts.patch
Patch106: openssh-7.6p1-cleanup-selinux.patch Patch106: openssh-7.6p1-cleanup-selinux.patch
# PATCH-FIX-OPENSUSE bsc#1211301 Add crypto-policies support
Patch107: openssh-9.6p1-crypto-policies.patch
Patch108: openssh-9.6p1-crypto-policies-man.patch
# PATCH-FIX-UPSTREAM bsc#1226642 fix CVE-2024-6387
Patch109: fix-CVE-2024-6387.patch
# PATCH-FIX-UPSTREAM
Patch110: 0001-upstream-fix-proxy-multiplexing-mode_-broken-when-keystroke.patch
# PATCH-FIX-UPSTREAM
Patch111: 0001-upstream-correctly-restore-sigprocmask-around-ppoll.patch
# PATCH-FIX-UPSTREAM bsc#1227318 CVE-2024-39894
Patch112: 0001-upstream-when-sending-ObscureKeystrokeTiming-chaff-packets_.patch
Patch113: fix-CVE-2025-26465-and-CVE-2025-26466.patch
# 200 - 300 -- Patches submitted to upstream # 200 - 300 -- Patches submitted to upstream
# PATCH-FIX-UPSTREAM -- https://github.com/openssh/openssh-portable/pull/452 boo#1229010 # PATCH-FIX-UPSTREAM -- https://github.com/openssh/openssh-portable/pull/452 boo#1229010
Patch200: 0001-auth-pam-Immediately-report-instructions-to-clients-and-fix-handling-in-ssh-client.patch Patch200: 0001-auth-pam-Immediately-report-instructions-to-clients-and-fix-handling-in-ssh-client.patch
# PATCH-FIX-UPSTREAM -- https://bugzilla.mindrot.org/show_bug.cgi?id=3655#c4 # PATCH-FIX-UPSTREAM -- bsc#1229449
Patch201: fix-x11-regression-bsc1229449.patch Patch201: fix-x11-regression-bsc1229449.patch
# PATCH-FIX-UPSTREAM
Patch202: fix-memleak-in-process_server_config_line_depth.patch
# 1000 - 2000 -- Conditional patches # 1000 - 2000 -- Conditional patches
%if %{with crypto_policies} %if 0%{with allow_root_password_login_by_default}
# PATCH-FIX-OPENSUSE bsc#1211301 Add crypto-policies support Patch1000: openssh-7.7p1-allow_root_password_login.patch
Patch1000: openssh-9.6p1-crypto-policies.patch
Patch1001: openssh-9.6p1-crypto-policies-man.patch
%endif
%if %{with allow_root_password_login_by_default}
# PATCH-FIX-SLE Allow root login with password by default (for SLE12 and SLE15)
Patch1002: openssh-7.7p1-allow_root_password_login.patch
%endif %endif
BuildRequires: audit-devel BuildRequires: audit-devel
BuildRequires: automake BuildRequires: automake
%if 0%{?suse_version} < 1600
BuildRequires: gcc11
%endif
BuildRequires: groff BuildRequires: groff
BuildRequires: libedit-devel BuildRequires: libedit-devel
BuildRequires: libselinux-devel BuildRequires: libselinux-devel
%if %{with ldap} %if %{with ldap}
BuildRequires: openldap2-devel BuildRequires: openldap2-devel
%endif %endif
%if %{with openssl11}
BuildRequires: libopenssl-1_1-devel
BuildRequires: openssl-1_1
%else
BuildRequires: openssl-devel BuildRequires: openssl-devel
%endif
BuildRequires: pam-devel BuildRequires: pam-devel
BuildRequires: pkgconfig BuildRequires: pkgconfig
BuildRequires: zlib-devel BuildRequires: zlib-devel
@ -179,7 +166,7 @@ BuildRequires: sysuser-shadow
BuildRequires: sysuser-tools BuildRequires: sysuser-tools
Requires: %{name}-clients = %{version}-%{release} Requires: %{name}-clients = %{version}-%{release}
Requires: %{name}-server = %{version}-%{release} Requires: %{name}-server = %{version}-%{release}
%if 0%{?suse_version} >= 1550 || 0%{?suse_version} < 1500 %if 0%{?suse_version} >= 1550
BuildRequires: pkgconfig(krb5) BuildRequires: pkgconfig(krb5)
%else %else
BuildRequires: krb5-mini-devel BuildRequires: krb5-mini-devel
@ -225,16 +212,14 @@ clients.
Summary: SSH (Secure Shell) server Summary: SSH (Secure Shell) server
Group: Productivity/Networking/SSH Group: Productivity/Networking/SSH
Requires: %{name}-common = %{version}-%{release} Requires: %{name}-common = %{version}-%{release}
%if %{with crypto_policies}
Requires: crypto-policies >= 20220824 Requires: crypto-policies >= 20220824
%endif
Recommends: audit Recommends: audit
Requires(pre): findutils Requires(pre): findutils
Requires(pre): grep Requires(pre): grep
Requires(post): %fillup_prereq Requires(post): %fillup_prereq
Requires(post): permissions Requires(post): permissions
Provides: openssh:%{_sbindir}/sshd Provides: openssh:%{_sbindir}/sshd
%if %{with allow_root_password_login_by_default} %if 0%{with allow_root_password_login_by_default}
# For a brief period of time this package existed in SLE/Leap. # For a brief period of time this package existed in SLE/Leap.
# It was removed before GM but some people might have it from # It was removed before GM but some people might have it from
# a beta distribution version (boo#1227350) # a beta distribution version (boo#1227350)
@ -254,7 +239,7 @@ also be forwarded over the secure channel.
This package contains the Secure Shell daemon, which allows clients to This package contains the Secure Shell daemon, which allows clients to
securely connect to your server. securely connect to your server.
%if %{with allow_root_password_login_by_default} %if 0%{with allow_root_password_login_by_default}
%package server-config-disallow-rootlogin %package server-config-disallow-rootlogin
Summary: Config to disallow password root logins to sshd Summary: Config to disallow password root logins to sshd
Group: Productivity/Networking/SSH Group: Productivity/Networking/SSH
@ -283,9 +268,7 @@ ssh-copy-id(1).
%package clients %package clients
Summary: SSH (Secure Shell) client applications Summary: SSH (Secure Shell) client applications
Group: Productivity/Networking/SSH Group: Productivity/Networking/SSH
%if %{with crypto_policies}
Requires: crypto-policies >= 20220824 Requires: crypto-policies >= 20220824
%endif
Requires: %{name}-common = %{version}-%{release} Requires: %{name}-common = %{version}-%{release}
Provides: openssh:%{_bindir}/ssh Provides: openssh:%{_bindir}/ssh
@ -354,9 +337,6 @@ sed -i.libexec 's,@LIBEXECDIR@,%{_libexecdir}/ssh,' \
) )
%build %build
%if 0%{?suse_version} < 1600
export CC=gcc-11
%endif
autoreconf -fiv autoreconf -fiv
%ifarch s390 s390x %{sparc} %ifarch s390 s390x %{sparc}
PIEFLAGS="-fPIE" PIEFLAGS="-fPIE"
@ -397,7 +377,6 @@ export LDFLAGS CFLAGS CXXFLAGS CPPFLAGS
--disable-lastlog \ --disable-lastlog \
--with-logind \ --with-logind \
%endif %endif
--enable-dsa-keys \
--with-security-key-builtin \ --with-security-key-builtin \
--target=%{_target_cpu}-suse-linux --target=%{_target_cpu}-suse-linux
@ -422,11 +401,7 @@ install -d -m 755 %{buildroot}%{_sysconfdir}/slp.reg.d/
install -m 644 %{SOURCE5} %{buildroot}%{_sysconfdir}/slp.reg.d/ install -m 644 %{SOURCE5} %{buildroot}%{_sysconfdir}/slp.reg.d/
%endif %endif
install -D -m 0644 %{SOURCE10} %{buildroot}%{_unitdir}/sshd.service install -D -m 0644 %{SOURCE10} %{buildroot}%{_unitdir}/sshd.service
install -D -m 0644 %{SOURCE16} %{buildroot}%{_unitdir}/sshd@.service
install -D -m 0644 %{SOURCE17} %{buildroot}%{_unitdir}/sshd.socket
%if 0%{?suse_version} < 1600
ln -s service %{buildroot}%{_sbindir}/rcsshd ln -s service %{buildroot}%{_sbindir}/rcsshd
%endif
install -d -m 755 %{buildroot}%{_fillupdir} install -d -m 755 %{buildroot}%{_fillupdir}
install -m 644 %{SOURCE8} %{buildroot}%{_fillupdir} install -m 644 %{SOURCE8} %{buildroot}%{_fillupdir}
# install shell script to automate the process of adding your public key to a remote machine # install shell script to automate the process of adding your public key to a remote machine
@ -434,7 +409,7 @@ install -m 755 contrib/ssh-copy-id %{buildroot}%{_bindir}
install -m 644 contrib/ssh-copy-id.1 %{buildroot}%{_mandir}/man1 install -m 644 contrib/ssh-copy-id.1 %{buildroot}%{_mandir}/man1
sed -i -e s@%{_prefix}/libexec@%{_libexecdir}@g %{buildroot}%{_sysconfdir}/ssh/sshd_config sed -i -e s@%{_prefix}/libexec@%{_libexecdir}@g %{buildroot}%{_sysconfdir}/ssh/sshd_config
%if %{with allow_root_password_login_by_default} %if 0%{with allow_root_password_login_by_default}
echo "PermitRootLogin prohibit-password" > %{buildroot}%{_sysconfdir}/ssh/sshd_config.d/51-permit-root-login.conf echo "PermitRootLogin prohibit-password" > %{buildroot}%{_sysconfdir}/ssh/sshd_config.d/51-permit-root-login.conf
%else %else
echo "PermitRootLogin yes" > %{buildroot}%{_sysconfdir}/ssh/sshd_config.d/50-permit-root-login.conf echo "PermitRootLogin yes" > %{buildroot}%{_sysconfdir}/ssh/sshd_config.d/50-permit-root-login.conf
@ -446,21 +421,19 @@ mkdir -p %{buildroot}%{_distconfdir}/ssh/ssh{,d}_config.d
mv %{buildroot}%{_sysconfdir}/ssh/moduli %{buildroot}%{_distconfdir}/ssh/ mv %{buildroot}%{_sysconfdir}/ssh/moduli %{buildroot}%{_distconfdir}/ssh/
mv %{buildroot}%{_sysconfdir}/ssh/ssh_config %{buildroot}%{_distconfdir}/ssh/ mv %{buildroot}%{_sysconfdir}/ssh/ssh_config %{buildroot}%{_distconfdir}/ssh/
mv %{buildroot}%{_sysconfdir}/ssh/sshd_config %{buildroot}%{_distconfdir}/ssh/ mv %{buildroot}%{_sysconfdir}/ssh/sshd_config %{buildroot}%{_distconfdir}/ssh/
%if %{with allow_root_password_login_by_default} %if 0%{with allow_root_password_login_by_default}
mv %{buildroot}%{_sysconfdir}/ssh/sshd_config.d/51-permit-root-login.conf %{buildroot}%{_distconfdir}/ssh/sshd_config.d/51-permit-root-login.conf mv %{buildroot}%{_sysconfdir}/ssh/sshd_config.d/51-permit-root-login.conf %{buildroot}%{_distconfdir}/ssh/sshd_config.d/51-permit-root-login.conf
%else %else
mv %{buildroot}%{_sysconfdir}/ssh/sshd_config.d/50-permit-root-login.conf %{buildroot}%{_distconfdir}/ssh/sshd_config.d/50-permit-root-login.conf mv %{buildroot}%{_sysconfdir}/ssh/sshd_config.d/50-permit-root-login.conf %{buildroot}%{_distconfdir}/ssh/sshd_config.d/50-permit-root-login.conf
%endif %endif
%endif %endif
%if %{with crypto_policies}
install -m 644 ssh_config_suse %{buildroot}%{_sysconfdir}/ssh/ssh_config.d/50-suse.conf install -m 644 ssh_config_suse %{buildroot}%{_sysconfdir}/ssh/ssh_config.d/50-suse.conf
%if %{defined _distconfdir} %if %{defined _distconfdir}
install -m 644 sshd_config_suse_cp %{buildroot}%{_distconfdir}/ssh/sshd_config.d/40-suse-crypto-policies.conf install -m 644 sshd_config_suse_cp %{buildroot}%{_distconfdir}/ssh/sshd_config.d/40-suse-crypto-policies.conf
%else %else
install -m 644 sshd_config_suse_cp %{buildroot}%{_sysconfdir}/ssh/sshd_config.d/40-suse-crypto-policies.conf install -m 644 sshd_config_suse_cp %{buildroot}%{_sysconfdir}/ssh/sshd_config.d/40-suse-crypto-policies.conf
%endif %endif
%endif
%if 0%{?suse_version} < 1550 %if 0%{?suse_version} < 1550
# install firewall definitions # install firewall definitions
@ -486,19 +459,13 @@ install -m 644 %{SOURCE14} %{buildroot}%{_sysusersdir}/sshd.conf
# #
# this shows up earlier because otherwise the %%expand of # this shows up earlier because otherwise the %%expand of
# the macro is too late. # the macro is too late.
%if %{with openssl11}
%define opensslbin openssl-1_1
%else
%define opensslbin openssl
%endif
%{expand:%%global __os_install_post {%__os_install_post %{expand:%%global __os_install_post {%__os_install_post
for b in \ for b in \
%{_bindir}/ssh \ %{_bindir}/ssh \
%{_sbindir}/sshd \ %{_sbindir}/sshd \
%{_libexecdir}/ssh/sftp-server \ %{_libexecdir}/ssh/sftp-server \
; do ; do
%{opensslbin} dgst -sha256 -binary -hmac %{CHECKSUM_HMAC_KEY} < %{buildroot}$b > %{buildroot}$b%{CHECKSUM_SUFFIX} openssl dgst -sha256 -binary -hmac %{CHECKSUM_HMAC_KEY} < %{buildroot}$b > %{buildroot}$b%{CHECKSUM_SUFFIX}
done done
}} }}
@ -510,13 +477,12 @@ test -f /etc/pam.d/sshd.rpmsave && mv -v /etc/pam.d/sshd.rpmsave /etc/pam.d/sshd
test -f /etc/ssh/sshd_config.rpmsave && mv -v /etc/ssh/sshd_config.rpmsave /etc/ssh/sshd_config.rpmsave.old ||: test -f /etc/ssh/sshd_config.rpmsave && mv -v /etc/ssh/sshd_config.rpmsave /etc/ssh/sshd_config.rpmsave.old ||:
%endif %endif
%service_add_pre sshd.service sshd.socket %service_add_pre sshd.service
%post server %post server
%{fillup_only -n ssh} %{fillup_only -n ssh}
%service_add_post sshd.service sshd.socket %service_add_post sshd.service
%if %{with crypto_policies}
%if ! %{defined _distconfdir} %if ! %{defined _distconfdir}
test -f /etc/ssh/sshd_config && (grep -q "^Include /etc/ssh/sshd_config\.d/\*\.conf" /etc/ssh/sshd_config || ( \ test -f /etc/ssh/sshd_config && (grep -q "^Include /etc/ssh/sshd_config\.d/\*\.conf" /etc/ssh/sshd_config || ( \
echo "WARNING: /etc/ssh/sshd_config doesn't include config files from" echo "WARNING: /etc/ssh/sshd_config doesn't include config files from"
@ -525,22 +491,20 @@ test -f /etc/ssh/sshd_config && (grep -q "^Include /etc/ssh/sshd_config\.d/\*\.c
echo "/etc/ssh/sshd_config :" echo "/etc/ssh/sshd_config :"
echo "Include /etc/ssh/sshd_config.d/*.conf" ) ) ||: echo "Include /etc/ssh/sshd_config.d/*.conf" ) ) ||:
%endif %endif
%endif
%preun server %preun server
%service_del_preun sshd.service sshd.socket %service_del_preun sshd.service
%postun server %postun server
# The openssh-fips trigger script for openssh will normally restart sshd once # The openssh-fips trigger script for openssh will normally restart sshd once
# it gets installed, so only restart the service here if openssh-fips is not # it gets installed, so only restart the service here if openssh-fips is not
# present. # present.
if rpm -q openssh-fips >/dev/null 2>/dev/null; then if rpm -q openssh-fips >/dev/null 2>/dev/null; then
%service_del_postun_without_restart sshd.service sshd.socket %service_del_postun_without_restart sshd.service
else else
%service_del_postun sshd.service sshd.socket %service_del_postun sshd.service
fi fi
%if %{with crypto_policies}
%if ! %{defined _distconfdir} %if ! %{defined _distconfdir}
%post server-config-disallow-rootlogin %post server-config-disallow-rootlogin
test -f /etc/ssh/sshd_config && (grep -q "^Include /etc/ssh/sshd_config\.d/\*\.conf" /etc/ssh/sshd_config || ( \ test -f /etc/ssh/sshd_config && (grep -q "^Include /etc/ssh/sshd_config\.d/\*\.conf" /etc/ssh/sshd_config || ( \
@ -550,7 +514,6 @@ test -f /etc/ssh/sshd_config && (grep -q "^Include /etc/ssh/sshd_config\.d/\*\.c
echo "the following line is added at the start of /etc/ssh/sshd_config :" echo "the following line is added at the start of /etc/ssh/sshd_config :"
echo "Include /etc/ssh/sshd_config.d/*.conf" ) ) ||: echo "Include /etc/ssh/sshd_config.d/*.conf" ) ) ||:
%endif %endif
%endif
%if %{defined _distconfdir} %if %{defined _distconfdir}
%posttrans server %posttrans server
@ -565,7 +528,6 @@ test -f /etc/ssh/sshd_config.rpmsave && mv -v /etc/ssh/sshd_config.rpmsave /etc/
test -f /etc/ssh/ssh_config.rpmsave && mv -v /etc/ssh/ssh_config.rpmsave /etc/ssh/ssh_config.rpmsave.old ||: test -f /etc/ssh/ssh_config.rpmsave && mv -v /etc/ssh/ssh_config.rpmsave /etc/ssh/ssh_config.rpmsave.old ||:
%endif %endif
%if %{with crypto_policies}
%if ! %{defined _distconfdir} %if ! %{defined _distconfdir}
%post clients %post clients
test -f /etc/ssh/ssh_config && (grep -q "^Include /etc/ssh/ssh_config\.d/\*\.conf" /etc/ssh/ssh_config || ( \ test -f /etc/ssh/ssh_config && (grep -q "^Include /etc/ssh/ssh_config\.d/\*\.conf" /etc/ssh/ssh_config || ( \
@ -575,7 +537,6 @@ test -f /etc/ssh/ssh_config && (grep -q "^Include /etc/ssh/ssh_config\.d/\*\.con
echo "/etc/ssh/ssh_config :" echo "/etc/ssh/ssh_config :"
echo "Include /etc/ssh/ssh_config.d/*.conf" ) ) ||: echo "Include /etc/ssh/ssh_config.d/*.conf" ) ) ||:
%endif %endif
%endif
%if %{defined _distconfdir} %if %{defined _distconfdir}
%posttrans clients %posttrans clients
@ -610,9 +571,7 @@ test -f /etc/ssh/ssh_config.rpmsave && mv -v /etc/ssh/ssh_config.rpmsave /etc/ss
%files server %files server
%attr(0755,root,root) %{_sbindir}/sshd %attr(0755,root,root) %{_sbindir}/sshd
%if 0%{?suse_version} < 1600
%attr(0755,root,root) %{_sbindir}/rcsshd %attr(0755,root,root) %{_sbindir}/rcsshd
%endif
%attr(0755,root,root) %{_sbindir}/sshd-gen-keys-start %attr(0755,root,root) %{_sbindir}/sshd-gen-keys-start
%dir %attr(0755,root,root) %{_localstatedir}/lib/sshd %dir %attr(0755,root,root) %{_localstatedir}/lib/sshd
%dir %attr(0755,root,root) %{_sysconfdir}/ssh/sshd_config.d %dir %attr(0755,root,root) %{_sysconfdir}/ssh/sshd_config.d
@ -625,22 +584,17 @@ test -f /etc/ssh/ssh_config.rpmsave && mv -v /etc/ssh/ssh_config.rpmsave /etc/ss
%attr(0640,root,root) %config(noreplace) %{_sysconfdir}/ssh/sshd_config %attr(0640,root,root) %config(noreplace) %{_sysconfdir}/ssh/sshd_config
%attr(0644,root,root) %config(noreplace) %{_sysconfdir}/pam.d/sshd %attr(0644,root,root) %config(noreplace) %{_sysconfdir}/pam.d/sshd
%endif %endif
%if %{with crypto_policies}
%if %{defined _distconfdir} %if %{defined _distconfdir}
%attr(0600,root,root) %config(noreplace) %{_distconfdir}/ssh/sshd_config.d/40-suse-crypto-policies.conf %attr(0600,root,root) %config(noreplace) %{_distconfdir}/ssh/sshd_config.d/40-suse-crypto-policies.conf
%else %else
%attr(0600,root,root) %config(noreplace) %{_sysconfdir}/ssh/sshd_config.d/40-suse-crypto-policies.conf %attr(0600,root,root) %config(noreplace) %{_sysconfdir}/ssh/sshd_config.d/40-suse-crypto-policies.conf
%endif %endif
%endif
%attr(0644,root,root) %{_unitdir}/sshd.service %attr(0644,root,root) %{_unitdir}/sshd.service
%attr(0644,root,root) %{_unitdir}/sshd@.service
%attr(0644,root,root) %{_unitdir}/sshd.socket
%attr(0644,root,root) %{_sysusersdir}/sshd.conf %attr(0644,root,root) %{_sysusersdir}/sshd.conf
%attr(0444,root,root) %{_mandir}/man5/sshd_config* %attr(0444,root,root) %{_mandir}/man5/sshd_config*
%attr(0444,root,root) %{_mandir}/man8/sftp-server.8* %attr(0444,root,root) %{_mandir}/man8/sftp-server.8*
%attr(0444,root,root) %{_mandir}/man8/sshd.8* %attr(0444,root,root) %{_mandir}/man8/sshd.8*
%attr(0755,root,root) %{_libexecdir}/ssh/sftp-server %attr(0755,root,root) %{_libexecdir}/ssh/sftp-server
%attr(0755,root,root) %{_libexecdir}/ssh/sshd-session
%if 0%{?suse_version} < 1600 %if 0%{?suse_version} < 1600
%dir %{_sysconfdir}/slp.reg.d %dir %{_sysconfdir}/slp.reg.d
%config %{_sysconfdir}/slp.reg.d/ssh.reg %config %{_sysconfdir}/slp.reg.d/ssh.reg
@ -652,7 +606,7 @@ test -f /etc/ssh/ssh_config.rpmsave && mv -v /etc/ssh/ssh_config.rpmsave /etc/ss
%config %{_fwdefdir}/sshd %config %{_fwdefdir}/sshd
%endif %endif
%if %{with allow_root_password_login_by_default} %if 0%{with allow_root_password_login_by_default}
%files server-config-disallow-rootlogin %files server-config-disallow-rootlogin
%if %{defined _distconfdir} %if %{defined _distconfdir}
%{_distconfdir}/ssh/sshd_config.d/51-permit-root-login.conf %{_distconfdir}/ssh/sshd_config.d/51-permit-root-login.conf
@ -669,10 +623,8 @@ test -f /etc/ssh/ssh_config.rpmsave && mv -v /etc/ssh/ssh_config.rpmsave /etc/ss
%endif %endif
%files clients %files clients
%if %{with crypto_policies}
%dir %attr(0755,root,root) %{_sysconfdir}/ssh/ssh_config.d %dir %attr(0755,root,root) %{_sysconfdir}/ssh/ssh_config.d
%attr(0644,root,root) %config(noreplace) %{_sysconfdir}/ssh/ssh_config.d/50-suse.conf %attr(0644,root,root) %config(noreplace) %{_sysconfdir}/ssh/ssh_config.d/50-suse.conf
%endif
%if %{defined _distconfdir} %if %{defined _distconfdir}
%attr(0644,root,root) %{_distconfdir}/ssh/ssh_config %attr(0644,root,root) %{_distconfdir}/ssh/ssh_config
%else %else

View File

@ -1,11 +0,0 @@
[Unit]
Description=OpenSSH Server Socket
Conflicts=sshd.service
[Socket]
ListenStream=22
Accept=yes
[Install]
WantedBy=sockets.target

View File

@ -1,11 +0,0 @@
[Unit]
Description=OpenSSH Per-Connection Server Daemon
Documentation=man:systemd-ssh-generator(8) man:sshd(8)
After=network.target
[Service]
EnvironmentFile=-/etc/sysconfig/ssh
ExecStartPre=/usr/sbin/sshd-gen-keys-start
ExecStartPre=/usr/sbin/sshd -t $SSHD_OPTS
ExecStart=-/usr/sbin/sshd -i $SSHD_OPTS
StandardInput=socket

View File

@ -174,16 +174,12 @@ diff -ur openssh-8.9p1.old/Makefile.in openssh-8.9p1/Makefile.in
AR=@AR@ AR=@AR@
AWK=@AWK@ AWK=@AWK@
RANLIB=@RANLIB@ RANLIB=@RANLIB@
@@ -212,10 +213,10 @@ @@ -212,7 +213,7 @@
$(LD) -o $@ $(SSHOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(GSSLIBS) $(CHANNELLIBS) $(LD) -o $@ $(SSHOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(GSSLIBS) $(CHANNELLIBS)
sshd$(EXEEXT): libssh.a $(LIBCOMPAT) $(SSHDOBJS) sshd$(EXEEXT): libssh.a $(LIBCOMPAT) $(SSHDOBJS)
- $(LD) -o $@ $(SSHDOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(CHANNELLIBS) - $(LD) -o $@ $(SSHDOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(GSSLIBS) $(K5LIBS) $(CHANNELLIBS)
+ $(LD) -o $@ $(SSHDOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(CHANNELLIBS) $(LIBWTMPDB) + $(LD) -o $@ $(SSHDOBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(GSSLIBS) $(K5LIBS) $(CHANNELLIBS) $(LIBWTMPDB)
sshd-session$(EXEEXT): libssh.a $(LIBCOMPAT) $(SSHD_SESSION_OBJS)
- $(LD) -o $@ $(SSHD_SESSION_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(GSSLIBS) $(K5LIBS) $(CHANNELLIBS)
+ $(LD) -o $@ $(SSHD_SESSION_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(SSHDLIBS) $(LIBS) $(GSSLIBS) $(K5LIBS) $(CHANNELLIBS) $(LIBWTMPDB)
scp$(EXEEXT): $(LIBCOMPAT) libssh.a $(SCP_OBJS) scp$(EXEEXT): $(LIBCOMPAT) libssh.a $(SCP_OBJS)
$(LD) -o $@ $(SCP_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS) $(LD) -o $@ $(SCP_OBJS) $(LDFLAGS) -lssh -lopenbsd-compat $(LIBS)