summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
Diffstat (limited to '')
-rw-r--r--debian/.git-dpm12
-rw-r--r--debian/.gitignore17
-rw-r--r--debian/NEWS523
-rw-r--r--debian/README.Debian295
-rwxr-xr-xdebian/adjust-openssl-dependencies36
-rwxr-xr-xdebian/agent-launch24
-rw-r--r--debian/changelog6888
-rw-r--r--debian/clean2
-rw-r--r--debian/control234
-rw-r--r--debian/copyright238
-rw-r--r--debian/gnome-ssh-askpass.191
-rw-r--r--debian/keygen-test/Makefile12
-rw-r--r--debian/keygen-test/getpid.c39
-rwxr-xr-xdebian/keygen-test/keygen-test12
-rw-r--r--debian/openssh-client-udeb.install3
-rw-r--r--debian/openssh-client.apport35
-rw-r--r--debian/openssh-client.dirs1
-rw-r--r--debian/openssh-client.docs4
-rwxr-xr-xdebian/openssh-client.install36
-rw-r--r--debian/openssh-client.links3
-rw-r--r--debian/openssh-client.lintian-overrides1
-rw-r--r--debian/openssh-client.maintscript1
-rw-r--r--debian/openssh-client.manpages2
-rw-r--r--debian/openssh-client.postinst48
-rw-r--r--debian/openssh-client.postrm22
-rw-r--r--debian/openssh-server-udeb.dirs1
-rw-r--r--debian/openssh-server-udeb.install2
-rw-r--r--debian/openssh-server.apport27
-rw-r--r--debian/openssh-server.config36
-rw-r--r--debian/openssh-server.dirs1
-rw-r--r--debian/openssh-server.examples1
-rwxr-xr-xdebian/openssh-server.install21
-rw-r--r--debian/openssh-server.links0
-rw-r--r--debian/openssh-server.lintian-overrides4
-rw-r--r--debian/openssh-server.maintscript1
-rw-r--r--debian/openssh-server.postinst144
-rw-r--r--debian/openssh-server.postrm35
-rw-r--r--debian/openssh-server.runit1
-rw-r--r--debian/openssh-server.ssh.default5
-rwxr-xr-xdebian/openssh-server.ssh.init166
-rw-r--r--debian/openssh-server.ssh.runscript/finish16
-rw-r--r--debian/openssh-server.ssh.runscript/run20
-rw-r--r--debian/openssh-server.sshd.pam.in55
-rw-r--r--debian/openssh-server.templates23
-rw-r--r--debian/openssh-server.ucf-md5sum110
-rw-r--r--debian/openssh-server.ufw.profile4
-rw-r--r--debian/openssh-sftp-server.install2
-rw-r--r--debian/openssh-sftp-server.links1
-rw-r--r--debian/openssh-tests.install11
-rw-r--r--debian/patches/CVE-2023-28531.patch31
-rw-r--r--debian/patches/CVE-2023-38408-1.patch30
-rw-r--r--debian/patches/CVE-2023-38408-2.patch104
-rw-r--r--debian/patches/CVE-2023-38408-3.patch174
-rw-r--r--debian/patches/CVE-2023-48795.patch468
-rw-r--r--debian/patches/CVE-2023-51384.patch168
-rw-r--r--debian/patches/CVE-2023-51385.patch94
-rw-r--r--debian/patches/authorized-keys-man-symlink.patch26
-rw-r--r--debian/patches/conch-ssh-rsa.patch42
-rw-r--r--debian/patches/debian-banner.patch162
-rw-r--r--debian/patches/debian-config.patch285
-rw-r--r--debian/patches/dnssec-sshfp.patch94
-rw-r--r--debian/patches/doc-hash-tab-completion.patch28
-rw-r--r--debian/patches/gnome-ssh-askpass2-icon.patch26
-rw-r--r--debian/patches/gssapi.patch4156
-rw-r--r--debian/patches/keepalive-extensions.patch135
-rw-r--r--debian/patches/maxhostnamelen.patch30
-rw-r--r--debian/patches/mention-ssh-keygen-on-keychange.patch44
-rw-r--r--debian/patches/no-openssl-version-status.patch62
-rw-r--r--debian/patches/openbsd-docs.patch255
-rw-r--r--debian/patches/package-versioning.patch47
-rw-r--r--debian/patches/remove-spurious-ssh-agent-options.patch29
-rw-r--r--debian/patches/restore-authorized_keys2.patch35
-rw-r--r--debian/patches/restore-tcp-wrappers.patch172
-rw-r--r--debian/patches/revert-ipqos-defaults.patch93
-rw-r--r--debian/patches/scp-quoting.patch41
-rw-r--r--debian/patches/selinux-role.patch471
-rw-r--r--debian/patches/series35
-rw-r--r--debian/patches/shell-path.patch39
-rw-r--r--debian/patches/ssh-agent-setgid.patch40
-rw-r--r--debian/patches/ssh-argv0.patch31
-rw-r--r--debian/patches/ssh-vulnkey-compat.patch42
-rw-r--r--debian/patches/syslog-level-silent.patch47
-rw-r--r--debian/patches/systemd-readiness.patch84
-rw-r--r--debian/patches/systemd-socket-activation.patch138
-rw-r--r--debian/patches/user-group-modes.patch210
-rw-r--r--debian/po/POTFILES.in1
-rw-r--r--debian/po/cs.po55
-rw-r--r--debian/po/da.po55
-rw-r--r--debian/po/de.po61
-rw-r--r--debian/po/es.po80
-rw-r--r--debian/po/fr.po59
-rw-r--r--debian/po/it.po58
-rw-r--r--debian/po/ja.po55
-rw-r--r--debian/po/nl.po60
-rw-r--r--debian/po/pt.po59
-rw-r--r--debian/po/pt_BR.po57
-rw-r--r--debian/po/ru.po57
-rw-r--r--debian/po/sv.po58
-rw-r--r--debian/po/templates.pot46
-rw-r--r--debian/po/tr.po58
-rwxr-xr-xdebian/rules217
-rwxr-xr-xdebian/run-tests45
-rw-r--r--debian/salsa-ci.yml3
-rw-r--r--debian/source/format1
-rw-r--r--debian/source/include-binaries1
-rw-r--r--debian/source/lintian-overrides2
-rw-r--r--debian/ssh-argv031
-rw-r--r--debian/ssh-argv0.164
-rw-r--r--debian/ssh-askpass-gnome.alternatives6
-rw-r--r--debian/ssh-askpass-gnome.desktop11
-rw-r--r--debian/ssh-askpass-gnome.examples1
-rwxr-xr-xdebian/ssh-askpass-gnome.install3
-rw-r--r--debian/ssh-askpass-gnome.manpages1
-rw-r--r--debian/ssh-askpass-gnome.pngbin0 -> 6949 bytes
-rw-r--r--debian/systemd/rescue-ssh.target6
-rw-r--r--debian/systemd/ssh-agent.service11
-rwxr-xr-xdebian/systemd/ssh-session-cleanup11
-rw-r--r--debian/systemd/ssh-session-cleanup.service13
-rw-r--r--debian/systemd/ssh.service22
-rw-r--r--debian/systemd/ssh.socket11
-rw-r--r--debian/tests/control10
-rwxr-xr-xdebian/tests/regress84
-rw-r--r--debian/upstream/signing-key.asc70
-rw-r--r--debian/watch3
124 files changed, 18680 insertions, 0 deletions
diff --git a/debian/.git-dpm b/debian/.git-dpm
new file mode 100644
index 0000000..f29b0d5
--- /dev/null
+++ b/debian/.git-dpm
@@ -0,0 +1,12 @@
+# see git-dpm(1) from git-dpm package
+14c4d6f0fa446414d1c38ad083107576d0ae3032
+14c4d6f0fa446414d1c38ad083107576d0ae3032
+cf3c3acb2b8f74eeca7fcee269b1d33ac83f1188
+cf3c3acb2b8f74eeca7fcee269b1d33ac83f1188
+openssh_9.2p1.orig.tar.gz
+3b172b8e971773a7018bbf3231f6589ae539ca4b
+1852380
+debianTag="debian/%e%%%V"
+patchedTag="patched/%e%%%V"
+upstreamTag="upstream/%U"
+signature:057ac5ac6e2fa0a26a105b085822a09f1a068683:833:openssh_9.2p1.orig.tar.gz.asc
diff --git a/debian/.gitignore b/debian/.gitignore
new file mode 100644
index 0000000..988323b
--- /dev/null
+++ b/debian/.gitignore
@@ -0,0 +1,17 @@
+/*.debhelper*
+/*substvars
+/build-deb
+/build-udeb
+/files
+/keygen-test/key1
+/keygen-test/key1.pub
+/keygen-test/key2
+/keygen-test/key2.pub
+/openssh-client
+/openssh-client-udeb
+/openssh-server
+/openssh-server-udeb
+/ssh
+/ssh-askpass-gnome
+/ssh-krb5
+/tmp
diff --git a/debian/NEWS b/debian/NEWS
new file mode 100644
index 0000000..9afbcb2
--- /dev/null
+++ b/debian/NEWS
@@ -0,0 +1,523 @@
+openssh (1:9.2p1-1) unstable; urgency=medium
+
+ OpenSSH 9.2 includes a number of changes that may affect existing
+ configurations:
+
+ * ssh(1): add a new EnableEscapeCommandline ssh_config(5) option that
+ controls whether the client-side ~C escape sequence that provides a
+ command-line is available. Among other things, the ~C command-line
+ could be used to add additional port-forwards at runtime.
+
+ This option defaults to "no", disabling the ~C command-line that was
+ previously enabled by default. Turning off the command-line allows
+ platforms that support sandboxing of the ssh(1) client (currently only
+ OpenBSD) to use a stricter default sandbox policy.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 08 Feb 2023 10:36:06 +0000
+
+openssh (1:9.1p1-1) unstable; urgency=medium
+
+ OpenSSH 9.1 includes a number of changes that may affect existing
+ configurations:
+
+ * ssh(1), sshd(8): SetEnv directives in ssh_config and sshd_config are
+ now first-match-wins to match other directives. Previously if an
+ environment variable was multiply specified the last set value would
+ have been used.
+
+ * ssh-keygen(8): ssh-keygen -A (generate all default host key types) will
+ no longer generate DSA keys, as these are insecure and have not been
+ used by default for some years.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 14 Nov 2022 16:35:59 +0000
+
+openssh (1:9.0p1-1) unstable; urgency=medium
+
+ OpenSSH 9.0 includes a number of changes that may affect existing
+ configurations:
+
+ * This release switches scp(1) from using the legacy scp/rcp protocol to
+ using the SFTP protocol by default.
+
+ Legacy scp/rcp performs wildcard expansion of remote filenames (e.g.
+ "scp host:* .") through the remote shell. This has the side effect of
+ requiring double quoting of shell meta-characters in file names
+ included on scp(1) command-lines, otherwise they could be interpreted
+ as shell commands on the remote side.
+
+ This creates one area of potential incompatibility: scp(1) when using
+ the SFTP protocol no longer requires this finicky and brittle quoting,
+ and attempts to use it may cause transfers to fail. We consider the
+ removal of the need for double-quoting shell characters in file names
+ to be a benefit and do not intend to introduce bug-compatibility for
+ legacy scp/rcp in scp(1) when using the SFTP protocol.
+
+ Another area of potential incompatibility relates to the use of remote
+ paths relative to other user's home directories, for example - "scp
+ host:~user/file /tmp". The SFTP protocol has no native way to expand a
+ ~user path. However, sftp-server(8) in OpenSSH 8.7 and later support a
+ protocol extension "expand-path@openssh.com" to support this.
+
+ In case of incompatibility, the scp(1) client may be instructed to use
+ the legacy scp/rcp using the -O flag.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 09 Apr 2022 14:14:10 +0100
+
+openssh (1:8.8p1-1) unstable; urgency=medium
+
+ OpenSSH 8.8 includes a number of changes that may affect existing
+ configurations:
+
+ * This release disables RSA signatures using the SHA-1 hash algorithm by
+ default. This change has been made as the SHA-1 hash algorithm is
+ cryptographically broken, and it is possible to create chosen-prefix
+ hash collisions for <USD$50K.
+
+ For most users, this change should be invisible and there is no need to
+ replace ssh-rsa keys. OpenSSH has supported RFC8332 RSA/SHA-256/512
+ signatures since release 7.2 and existing ssh-rsa keys will
+ automatically use the stronger algorithm where possible.
+
+ Incompatibility is more likely when connecting to older SSH
+ implementations that have not been upgraded or have not closely tracked
+ improvements in the SSH protocol. For these cases, it may be necessary
+ to selectively re-enable RSA/SHA1 to allow connection and/or user
+ authentication via the HostkeyAlgorithms and PubkeyAcceptedAlgorithms
+ options. For example, the following stanza in ~/.ssh/config will enable
+ RSA/SHA1 for host and user authentication for a single destination
+ host:
+
+ Host old-host
+ HostkeyAlgorithms +ssh-rsa
+ PubkeyAcceptedAlgorithms +ssh-rsa
+
+ We recommend enabling RSA/SHA1 only as a stopgap measure until legacy
+ implementations can be upgraded or reconfigured with another key type
+ (such as ECDSA or Ed25519).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 15 Feb 2022 19:20:21 +0000
+
+openssh (1:8.7p1-1) unstable; urgency=medium
+
+ OpenSSH 8.7 includes a number of changes that may affect existing
+ configurations:
+
+ * scp(1): this release changes the behaviour of remote to remote copies
+ (e.g. "scp host-a:/path host-b:") to transfer through the local host by
+ default. This was previously available via the -3 flag. This mode
+ avoids the need to expose credentials on the origin hop, avoids
+ triplicate interpretation of filenames by the shell (by the local
+ system, the copy origin and the destination) and, in conjunction with
+ the SFTP support for scp(1) mentioned below, allows use of all
+ authentication methods to the remote hosts (previously, only
+ non-interactive methods could be used). A -R flag has been added to
+ select the old behaviour.
+
+ * ssh(1)/sshd(8): both the client and server are now using a stricter
+ configuration file parser. The new parser uses more shell-like rules
+ for quotes, space and escape characters. It is also more strict in
+ rejecting configurations that include options lacking arguments.
+ Previously some options (e.g. DenyUsers) could appear on a line with no
+ subsequent arguments. This release will reject such configurations. The
+ new parser will also reject configurations with unterminated quotes and
+ multiple '=' characters after the option name.
+
+ * ssh(1): when using SSHFP DNS records for host key verification, ssh(1)
+ will verify all matching records instead of just those with the
+ specific signature type requested. This may cause host key verification
+ problems if stale SSHFP records of a different or legacy signature type
+ exist alongside other records for a particular host. bz#3322
+
+ * ssh-keygen(1): when generating a FIDO key and specifying an explicit
+ attestation challenge (using -Ochallenge), the challenge will now be
+ hashed by the builtin security key middleware. This removes the
+ (undocumented) requirement that challenges be exactly 32 bytes in
+ length and matches the expectations of libfido2.
+
+ * sshd(8): environment="..." directives in authorized_keys files are now
+ first-match-wins and limited to 1024 discrete environment variable
+ names.
+
+ OpenSSH 8.5 includes a number of changes that may affect existing
+ configurations:
+
+ * ssh(1), sshd(8): this release changes the first-preference signature
+ algorithm from ECDSA to ED25519.
+
+ * ssh(1), sshd(8): set the TOS/DSCP specified in the configuration for
+ interactive use prior to TCP connect. The connection phase of the SSH
+ session is time-sensitive and often explicitly interactive. The
+ ultimate interactive/bulk TOS/DSCP will be set after authentication
+ completes.
+
+ * ssh(1), sshd(8): remove the pre-standardization cipher
+ rijndael-cbc@lysator.liu.se. It is an alias for aes256-cbc before it
+ was standardized in RFC4253 (2006), has been deprecated and disabled by
+ default since OpenSSH 7.2 (2016) and was only briefly documented in
+ ssh.1 in 2001.
+
+ * ssh(1), sshd(8): update/replace the experimental post-quantum hybrid
+ key exchange method based on Streamlined NTRU Prime coupled with
+ X25519.
+
+ The previous sntrup4591761x25519-sha512@tinyssh.org method is replaced
+ with sntrup761x25519-sha512@openssh.com. Per its designers, the
+ sntrup4591761 algorithm was superseded almost two years ago by
+ sntrup761.
+
+ (note this both the updated method and the one that it replaced are
+ disabled by default)
+
+ * ssh(1): disable CheckHostIP by default. It provides insignificant
+ benefits while making key rotation significantly more difficult,
+ especially for hosts behind IP-based load-balancers.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 06 Nov 2021 12:23:47 +0000
+
+openssh (1:8.4p1-1) unstable; urgency=medium
+
+ OpenSSH 8.4 includes a number of changes that may affect existing
+ configurations:
+
+ * ssh-keygen(1): the format of the attestation information optionally
+ recorded when a FIDO key is generated has changed. It now includes the
+ authenticator data needed to validate attestation signatures.
+
+ * The API between OpenSSH and the FIDO token middleware has changed and
+ the SSH_SK_VERSION_MAJOR version has been incremented as a result.
+ Third-party middleware libraries must support the current API version
+ (7) to work with OpenSSH 8.4.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 18 Oct 2020 12:07:48 +0100
+
+openssh (1:8.3p1-1) unstable; urgency=medium
+
+ OpenSSH 8.3 includes a number of changes that may affect existing
+ configurations:
+
+ * sftp(1): reject an argument of "-1" in the same way as ssh(1) and scp(1)
+ do instead of accepting and silently ignoring it.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 07 Jun 2020 13:44:04 +0100
+
+openssh (1:8.2p1-1) unstable; urgency=medium
+
+ OpenSSH 8.2 includes a number of changes that may affect existing
+ configurations:
+
+ * ssh(1), sshd(8), ssh-keygen(1): This release removes the "ssh-rsa"
+ (RSA/SHA1) algorithm from those accepted for certificate signatures
+ (i.e. the client and server CASignatureAlgorithms option) and will use
+ the rsa-sha2-512 signature algorithm by default when the ssh-keygen(1)
+ CA signs new certificates.
+
+ Certificates are at special risk to SHA1 collision vulnerabilities as
+ an attacker has effectively unlimited time in which to craft a
+ collision that yields them a valid certificate, far more than the
+ relatively brief LoginGraceTime window that they have to forge a host
+ key signature.
+
+ The OpenSSH certificate format includes a CA-specified (typically
+ random) nonce value near the start of the certificate that should make
+ exploitation of chosen-prefix collisions in this context challenging,
+ as the attacker does not have full control over the prefix that
+ actually gets signed. Nonetheless, SHA1 is now a demonstrably broken
+ algorithm and further improvements in attacks are highly likely.
+
+ OpenSSH releases prior to 7.2 do not support the newer RSA/SHA2
+ algorithms and will refuse to accept certificates signed by an OpenSSH
+ 8.2+ CA using RSA keys unless the unsafe algorithm is explicitly
+ selected during signing ("ssh-keygen -t ssh-rsa"). Older
+ clients/servers may use another CA key type such as ssh-ed25519
+ (supported since OpenSSH 6.5) or one of the ecdsa-sha2-nistp256/384/521
+ types (supported since OpenSSH 5.7) instead if they cannot be upgraded.
+
+ * ssh(1), sshd(8): Remove diffie-hellman-group14-sha1 from the default
+ key exchange proposal for both the client and server.
+
+ * ssh-keygen(1): The command-line options related to the generation and
+ screening of safe prime numbers used by the
+ diffie-hellman-group-exchange-* key exchange algorithms have changed.
+ Most options have been folded under the -O flag.
+
+ * sshd(8): The sshd listener process title visible to ps(1) has changed
+ to include information about the number of connections that are
+ currently attempting authentication and the limits configured by
+ MaxStartups.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 21 Feb 2020 16:36:37 +0000
+
+openssh (1:8.1p1-1) unstable; urgency=medium
+
+ OpenSSH 8.1 includes a number of changes that may affect existing
+ configurations:
+
+ * ssh-keygen(1): when acting as a CA and signing certificates with an RSA
+ key, default to using the rsa-sha2-512 signature algorithm.
+ Certificates signed by RSA keys will therefore be incompatible with
+ OpenSSH versions prior to 7.2 unless the default is overridden (using
+ "ssh-keygen -t ssh-rsa -s ...").
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 10 Oct 2019 10:23:19 +0100
+
+openssh (1:8.0p1-1) experimental; urgency=medium
+
+ OpenSSH 8.0 includes a number of changes that may affect existing
+ configurations:
+
+ * sshd(8): Remove support for obsolete "host/port" syntax.
+ Slash-separated host/port was added in 2001 as an alternative to
+ host:port syntax for the benefit of IPv6 users. These days there are
+ established standards for this like [::1]:22 and the slash syntax is
+ easily mistaken for CIDR notation, which OpenSSH supports for some
+ things. Remove the slash notation from ListenAddress and PermitOpen.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 09 Jun 2019 22:47:27 +0100
+
+openssh (1:7.9p1-1) unstable; urgency=medium
+
+ OpenSSH 7.9 includes a number of changes that may affect existing
+ configurations:
+
+ * ssh(1), sshd(8): the setting of the new CASignatureAlgorithms option
+ bans the use of DSA keys as certificate authorities.
+ * sshd(8): the authentication success/failure log message has changed
+ format slightly. It now includes the certificate fingerprint
+ (previously it included only key ID and CA key fingerprint).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 21 Oct 2018 10:39:24 +0100
+
+openssh (1:7.8p1-1) unstable; urgency=medium
+
+ OpenSSH 7.8 includes a number of changes that may affect existing
+ configurations:
+
+ * ssh-keygen(1): Write OpenSSH format private keys by default instead of
+ using OpenSSL's PEM format. The OpenSSH format, supported in OpenSSH
+ releases since 2014 and described in the PROTOCOL.key file in the
+ source distribution, offers substantially better protection against
+ offline password guessing and supports key comments in private keys.
+ If necessary, it is possible to write old PEM-style keys by adding "-m
+ PEM" to ssh-keygen's arguments when generating or updating a key.
+ * sshd(8): Remove internal support for S/Key multiple factor
+ authentication. S/Key may still be used via PAM or BSD auth.
+ * ssh(1): Remove vestigial support for running ssh(1) as setuid. This
+ used to be required for hostbased authentication and the (long gone)
+ rhosts-style authentication, but has not been necessary for a long
+ time. Attempting to execute ssh as a setuid binary, or with uid !=
+ effective uid will now yield a fatal error at runtime.
+ * sshd(8): The semantics of PubkeyAcceptedKeyTypes and the similar
+ HostbasedAcceptedKeyTypes options have changed. These now specify
+ signature algorithms that are accepted for their respective
+ authentication mechanism, where previously they specified accepted key
+ types. This distinction matters when using the RSA/SHA2 signature
+ algorithms "rsa-sha2-256", "rsa-sha2-512" and their certificate
+ counterparts. Configurations that override these options but omit
+ these algorithm names may cause unexpected authentication failures (no
+ action is required for configurations that accept the default for these
+ options).
+ * sshd(8): The precedence of session environment variables has changed.
+ ~/.ssh/environment and environment="..." options in authorized_keys
+ files can no longer override SSH_* variables set implicitly by sshd.
+ * ssh(1)/sshd(8): The default IPQoS used by ssh/sshd has changed. They
+ will now use DSCP AF21 for interactive traffic and CS1 for bulk. For a
+ detailed rationale, please see the commit message:
+ https://cvsweb.openbsd.org/src/usr.bin/ssh/readconf.c#rev1.284
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 30 Aug 2018 15:35:27 +0100
+
+openssh (1:7.6p1-1) unstable; urgency=medium
+
+ OpenSSH 7.6 includes a number of changes that may affect existing
+ configurations:
+
+ * ssh(1): Delete SSH protocol version 1 support, associated configuration
+ options and documentation.
+ * ssh(1)/sshd(8): Remove support for the hmac-ripemd160 MAC.
+ * ssh(1)/sshd(8): Remove support for the arcfour, blowfish and CAST
+ ciphers.
+ * Refuse RSA keys <1024 bits in length and improve reporting for keys
+ that do not meet this requirement.
+ * ssh(1): Do not offer CBC ciphers by default.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 06 Oct 2017 12:36:48 +0100
+
+openssh (1:7.5p1-1) experimental; urgency=medium
+
+ OpenSSH 7.5 includes a number of changes that may affect existing
+ configurations:
+
+ * This release deprecates the sshd_config UsePrivilegeSeparation option,
+ thereby making privilege separation mandatory.
+
+ * The format of several log messages emitted by the packet code has
+ changed to include additional information about the user and their
+ authentication state. Software that monitors ssh/sshd logs may need to
+ account for these changes. For example:
+
+ Connection closed by user x 1.1.1.1 port 1234 [preauth]
+ Connection closed by authenticating user x 10.1.1.1 port 1234 [preauth]
+ Connection closed by invalid user x 1.1.1.1 port 1234 [preauth]
+
+ Affected messages include connection closure, timeout, remote
+ disconnection, negotiation failure and some other fatal messages
+ generated by the packet code.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 02 Apr 2017 02:58:01 +0100
+
+openssh (1:7.4p1-7) unstable; urgency=medium
+
+ This version restores the default for AuthorizedKeysFile to search both
+ ~/.ssh/authorized_keys and ~/.ssh/authorized_keys2, as was the case in
+ Debian configurations before 1:7.4p1-1. Upstream intends to phase out
+ searching ~/.ssh/authorized_keys2 by default, so you should ensure that
+ you are only using ~/.ssh/authorized_keys, at least for critical
+ administrative access; do not assume that the current default will remain
+ in place forever.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 05 Mar 2017 02:12:42 +0000
+
+openssh (1:7.4p1-1) unstable; urgency=medium
+
+ OpenSSH 7.4 includes a number of changes that may affect existing
+ configurations:
+
+ * ssh(1): Remove 3des-cbc from the client's default proposal. 64-bit
+ block ciphers are not safe in 2016 and we don't want to wait until
+ attacks like SWEET32 are extended to SSH. As 3des-cbc was the only
+ mandatory cipher in the SSH RFCs, this may cause problems connecting to
+ older devices using the default configuration, but it's highly likely
+ that such devices already need explicit configuration for key exchange
+ and hostkey algorithms already anyway.
+ * sshd(8): Remove support for pre-authentication compression. Doing
+ compression early in the protocol probably seemed reasonable in the
+ 1990s, but today it's clearly a bad idea in terms of both cryptography
+ (cf. multiple compression oracle attacks in TLS) and attack surface.
+ Pre-auth compression support has been disabled by default for >10
+ years. Support remains in the client.
+ * ssh-agent will refuse to load PKCS#11 modules outside a whitelist of
+ trusted paths by default. The path whitelist may be specified at
+ run-time.
+ * sshd(8): When a forced-command appears in both a certificate and an
+ authorized keys/principals command= restriction, sshd will now refuse
+ to accept the certificate unless they are identical. The previous
+ (documented) behaviour of having the certificate forced-command
+ override the other could be a bit confusing and error-prone.
+ * sshd(8): Remove the UseLogin configuration directive and support for
+ having /bin/login manage login sessions.
+
+ The unprivileged sshd process that deals with pre-authentication network
+ traffic is now subject to additional sandboxing restrictions by default:
+ that is, the default sshd_config now sets UsePrivilegeSeparation to
+ "sandbox" rather than "yes". This has been the case upstream for a while,
+ but until now the Debian configuration diverged unnecessarily.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 27 Dec 2016 18:01:46 +0000
+
+openssh (1:7.2p1-1) unstable; urgency=medium
+
+ OpenSSH 7.2 disables a number of legacy cryptographic algorithms by
+ default in ssh:
+
+ * Several ciphers blowfish-cbc, cast128-cbc, all arcfour variants and the
+ rijndael-cbc aliases for AES.
+ * MD5-based and truncated HMAC algorithms.
+
+ These algorithms are already disabled by default in sshd.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 08 Mar 2016 11:47:20 +0000
+
+openssh (1:7.1p1-2) unstable; urgency=medium
+
+ OpenSSH 7.0 disables several pieces of weak, legacy, and/or unsafe
+ cryptography.
+
+ * Support for the legacy SSH version 1 protocol is disabled by default at
+ compile time. Note that this also means that the Cipher keyword in
+ ssh_config(5) is effectively no longer usable; use Ciphers instead for
+ protocol 2. The openssh-client-ssh1 package includes "ssh1", "scp1",
+ and "ssh-keygen1" binaries which you can use if you have no alternative
+ way to connect to an outdated SSH1-only server; please contact the
+ server administrator or system vendor in such cases and ask them to
+ upgrade.
+ * Support for the 1024-bit diffie-hellman-group1-sha1 key exchange is
+ disabled by default at run-time. It may be re-enabled using the
+ instructions at http://www.openssh.com/legacy.html
+ * Support for ssh-dss, ssh-dss-cert-* host and user keys is disabled by
+ default at run-time. These may be re-enabled using the instructions at
+ http://www.openssh.com/legacy.html
+ * Support for the legacy v00 cert format has been removed.
+
+ Future releases will retire more legacy cryptography, including:
+
+ * Refusing all RSA keys smaller than 1024 bits (the current minimum is
+ 768 bits).
+ * Several ciphers will be disabled by default: blowfish-cbc, cast128-cbc,
+ all arcfour variants, and the rijndael-cbc aliases for AES.
+ * MD5-based HMAC algorithms will be disabled by default.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 08 Dec 2015 15:33:08 +0000
+
+openssh (1:6.9p1-1) unstable; urgency=medium
+
+ UseDNS now defaults to 'no'. Configurations that match against the client
+ host name (via sshd_config or authorized_keys) may need to re-enable it or
+ convert to matching against addresses.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 20 Aug 2015 10:38:58 +0100
+
+openssh (1:6.7p1-5) unstable; urgency=medium
+
+ openssh-server 1:6.7p1-4 changed the default setting of AcceptEnv to list
+ a number of specific LC_FOO variables rather than the wildcard LC_*. I
+ have since been persuaded that this was a bad idea and have reverted it,
+ but it is difficult to automatically undo the change to
+ /etc/ssh/sshd_config without compounding the problem (that of modifying
+ configuration that some users did not want to be modified) further. Most
+ users who upgraded via version 1:6.7p1-4 should restore the previous value
+ of "AcceptEnv LANG LC_*" in /etc/ssh/sshd_config.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 22 Mar 2015 23:09:32 +0000
+
+openssh (1:5.4p1-2) unstable; urgency=low
+
+ Smartcard support is now available using PKCS#11 tokens. If you were
+ previously using an unofficial build of Debian's OpenSSH package with
+ OpenSC-based smartcard support added, then note that commands like
+ 'ssh-add -s 0' will no longer work; you need to use 'ssh-add -s
+ /usr/lib/opensc-pkcs11.so' instead.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 10 Apr 2010 01:08:59 +0100
+
+openssh (1:3.8.1p1-9) experimental; urgency=low
+
+ The ssh package has been split into openssh-client and openssh-server. If
+ you had previously requested that the sshd server should not be run, then
+ that request will still be honoured. However, the recommended approach is
+ now to remove the openssh-server package if you do not want to run sshd.
+ You can remove the old /etc/ssh/sshd_not_to_be_run marker file after doing
+ that.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 2 Aug 2004 20:48:54 +0100
+
+openssh (1:3.5p1-1) unstable; urgency=low
+
+ This version of OpenSSH disables the environment option for public keys by
+ default, in order to avoid certain attacks (for example, LD_PRELOAD). If
+ you are using this option in an authorized_keys file, beware that the keys
+ in question will no longer work until the option is removed.
+
+ To re-enable this option, set "PermitUserEnvironment yes" in
+ /etc/ssh/sshd_config after the upgrade is complete, taking note of the
+ warning in the sshd_config(5) manual page.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 26 Oct 2002 19:41:51 +0100
+
+openssh (1:3.0.1p1-1) unstable; urgency=high
+
+ As of version 3, OpenSSH no longer uses separate files for ssh1 and ssh2
+ keys. This means the authorized_keys2 and known_hosts2 files are no longer
+ needed. They will still be read in order to maintain backward
+ compatibility.
+
+ -- Matthew Vernon <matthew@debian.org> Thu, 28 Nov 2001 17:43:01 +0000
diff --git a/debian/README.Debian b/debian/README.Debian
new file mode 100644
index 0000000..77d331b
--- /dev/null
+++ b/debian/README.Debian
@@ -0,0 +1,295 @@
+OpenSSH for Debian
+------------------
+
+UPGRADE ISSUES
+==============
+
+PermitRootLogin
+---------------
+
+As of 1:6.6p1-1, new installations will be set to "PermitRootLogin
+without-password" (or the synonymous "PermitRootLogin prohibit-password" as
+of 1:7.1p1-1). This disables password authentication for root, foiling
+password dictionary attacks on the root user. Some sites may wish to use
+the stronger "PermitRootLogin forced-commands-only" or "PermitRootLogin no",
+but note that "PermitRootLogin no" will break setups that SSH to root with a
+forced command to take full-system backups. You can use PermitRootLogin in
+a Match block if you want finer-grained control here.
+
+For many years Debian's OpenSSH packaging used "PermitRootLogin yes", in
+line with upstream. To avoid breaking local setups, this is still true for
+installations upgraded from before 1:6.6p1-1. If you wish to change this,
+you should edit /etc/ssh/sshd_config, change it manually, and run "service
+ssh restart" as root.
+
+Disabling PermitRootLogin means that an attacker possessing credentials for
+the root account (any credentials in the case of "yes", or private key
+material in the case of "prohibit-password") must compromise a normal user
+account rather than being able to SSH directly to root. Be careful to avoid
+a false illusion of security if you change this setting; any account you
+escalate to root from should be considered equivalent to root for the
+purposes of security against external attack. You might for example disable
+it if you know you will only ever log in as root from the physical console.
+
+Since the root account does not generally have non-password credentials
+unless you explicitly install an SSH public key in its
+~/.ssh/authorized_keys, which you presumably only do if you want to SSH to
+it, "prohibit-password" should be a reasonable default for most sites.
+
+As of OpenSSH 7.0, this is the upstream default.
+
+For further discussion, see:
+
+ https://bugs.debian.org/298138
+ https://bugzilla.mindrot.org/show_bug.cgi?id=2164
+
+X11 Forwarding
+--------------
+
+ssh's default for ForwardX11 has been changed to ``no'' because it has
+been pointed out that logging into remote systems administered by
+untrusted people is likely to open you up to X11 attacks, so you
+should have to actively decide that you trust the remote machine's
+root, before enabling X11. I strongly recommend that you do this on a
+machine-by-machine basis, rather than just enabling it in the default
+host settings.
+
+In order for X11 forwarding to work, you need to install xauth on the
+server. In Debian this is in the xbase-clients package.
+
+As of OpenSSH 3.1, the remote $DISPLAY uses localhost by default to reduce
+the security risks of X11 forwarding. Look up X11UseLocalhost in
+sshd_config(8) if this is a problem.
+
+OpenSSH 3.8 invented ForwardX11Trusted, which when set to no causes the
+ssh client to create an untrusted X cookie so that attacks on the
+forwarded X11 connection can't become attacks on X clients on the remote
+machine. However, this has some problems in implementation - notably a
+very short timeout of the untrusted cookie - breaks large numbers of
+existing setups, and generally seems immature. The Debian package
+therefore sets the default for this option to "yes" (in ssh itself,
+rather than in ssh_config).
+
+Fallback to RSH
+---------------
+
+The default for this setting has been changed from Yes to No, for
+security reasons, and to stop the delay attempting to rsh to machines
+that don't offer the service. Simply switch it back on in either
+/etc/ssh/ssh_config or ~/.ssh/config for those machines that you need
+it for.
+
+Setgid ssh-agent and environment variables
+------------------------------------------
+
+As of version 1:3.5p1-1, ssh-agent is installed setgid to prevent ptrace()
+attacks retrieving private key material. This has the side-effect of causing
+glibc to remove certain environment variables which might have security
+implications for set-id programs, including LD_PRELOAD, LD_LIBRARY_PATH, and
+TMPDIR.
+
+If you need to set any of these environment variables, you will need to do
+so in the program exec()ed by ssh-agent. This may involve creating a small
+wrapper script.
+
+Symlink Hostname invocation
+---------------------------
+
+This version of ssh no longer includes support for invoking ssh with the
+hostname as the name of the file run. People wanting this support should
+use the ssh-argv0 script.
+
+=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
+
+OTHER ISSUES
+============
+
+Authorization Forwarding
+------------------------
+
+Similarly, root on a remote server could make use of your ssh-agent
+(while you're logged into their machine) to obtain access to machines
+which trust your keys. This feature is therefore disabled by default.
+You should only re-enable it for those hosts (in your ~/.ssh/config or
+/etc/ssh/ssh_config) where you are confident that the remote machine
+is not a threat.
+
+Problems logging in with RSA authentication
+-------------------------------------------
+
+If you have trouble logging in with RSA authentication then the
+problem is probably caused by the fact that you have your home
+directory writable by group, as well as user (this is the default on
+Debian systems).
+
+Depending upon other settings on your system (i.e. other users being
+in your group) this could open a security hole, so you will need to
+make your home directory writable only by yourself. Run this command,
+as yourself:
+
+ chmod g-w ~/
+
+to remove group write permissions. If you use ssh-copy-id to install your
+keys, it does this for you.
+
+-L option of ssh nonfree
+------------------------
+
+non-free ssh supported the usage of the option -L to use a non privileged
+port for scp. This option will not be supported by scp from openssh.
+
+Please use instead scp -o "UsePrivilegedPort=no" as documented in the
+manpage to scp itself.
+
+Problem logging in because of TCP-Wrappers
+------------------------------------------
+
+ssh is compiled with support for tcp-wrappers. So if you can no longer
+log into your system, please check that /etc/hosts.allow and /etc/hosts.deny
+are configured so that ssh is not blocked.
+
+Kerberos support
+----------------
+
+ssh is now compiled with Kerberos support. Unfortunately, privilege
+separation is incompatible with parts of Kerberos support for protocol 2;
+you may need to run kinit after logging in.
+
+Interoperability between scp and the ssh.com SSH server
+-------------------------------------------------------
+
+In version 2 and greater of the commercial SSH server produced by SSH
+Communications Security, scp was changed to use SFTP (SSH2's file transfer
+protocol) instead of the traditional rcp-over-ssh, thereby breaking
+compatibility. The OpenSSH developers regard this as a bug in the ssh.com
+server, and do not currently intend to change OpenSSH's scp to match.
+
+Workarounds for this problem are to install scp1 on the server (scp2 will
+fall back to it), to use sftp, or to use some other transfer mechanism such
+as rsync-over-ssh or tar-over-ssh.
+
+Running sshd from inittab
+-------------------------
+
+Some people find it useful to run the sshd server from inittab, to make sure
+that it always stays running. To do this, stop sshd ('service ssh stop'),
+add the following line to /etc/inittab, and run 'telinit q':
+
+ ss:2345:respawn:/usr/sbin/sshd -D
+
+If you do this, note that you will need to stop sshd being started in the
+normal way ('update-rc.d ssh disable') and that you will need to restart
+this sshd manually on upgrades.
+
+Socket-based activation with systemd
+------------------------------------
+
+If you want to reconfigure systemd to listen on port 22 itself and launch
+sshd on connection (systemd-style socket activation), then you can run:
+
+ systemctl disable --now ssh.service
+ systemctl start ssh.socket
+
+To roll back this change, run:
+
+ systemctl stop ssh.socket
+ systemctl enable --now ssh.service
+
+Or if you want to make this change permanent:
+
+ systemctl enable ssh.socket
+
+This may be appropriate in environments where minimal footprint is critical
+(e.g. cloud guests).
+
+The provided ssh.socket unit file sets ListenStream=22. If you need to have
+it listen on a different address or port, then you will need to do this as
+follows (modifying ListenStream to match your requirements):
+
+ mkdir -p /etc/systemd/system/ssh.socket.d
+ cat >/etc/systemd/system/ssh.socket.d/listen.conf <<EOF
+ [Socket]
+ ListenStream=2222
+ EOF
+ systemctl daemon-reload
+
+See systemd.socket(5) for details.
+
+Terminating SSH sessions cleanly on shutdown/reboot with systemd
+----------------------------------------------------------------
+
+If you have libpam-systemd >= 230 installed (following openssh-server's
+Recommends) and "UsePAM yes" in sshd_config (the default configuration
+shipped by this package), then SSH sessions will be terminated cleanly when
+the server is shut down or rebooted.
+
+If either of these conditions does not hold, then you may find that SSH
+sessions hang silently when the server is shut down or rebooted. If you do
+not want to use PAM or configure it properly for whatever reason, then you
+can instead copy
+/usr/share/doc/openssh-server/examples/ssh-session-cleanup.service to
+/etc/systemd/system/ and run "systemctl enable ssh-session-cleanup.service".
+
+Non-systemd users may find /usr/lib/openssh/ssh-session-cleanup helpful if
+they have a similar problem, although at present there is no system
+integration for this for anything other than systemd.
+
+SSH protocol 1 server support removed
+-------------------------------------
+
+sshd(8) no longer supports the old SSH protocol 1, so all the configuration
+options related to it are now deprecated and should be removed from
+/etc/ssh/sshd_config. These are:
+
+ KeyRegenerationInterval
+ RSAAuthentication
+ RhostsRSAAuthentication
+ ServerKeyBits
+
+The Protocol option is also no longer needed, although it is silently
+ignored rather than deprecated.
+
+if-up hook removed
+------------------
+
+openssh-server previously shipped an if-up hook that restarted sshd when a
+network interface came up. This generally caused more problems than it
+solved: for instance, it means that sshd stops listening briefly while being
+restarted, which can cause problems in some environments, particularly
+automated tests.
+
+The only known situation where the if-up hook was useful was when
+sshd_config was changed to add ListenAddress entries for particular IP
+addresses, overriding the default of listening on all addresses, and the
+system is one that often roams between networks. In such a situation, it is
+better to remove ListenAddress entries from sshd_config (restoring it to the
+default behaviour) and instead use firewall rules to restrict incoming SSH
+connections to only the desired interfaces or addresses.
+
+For further discussion, see:
+
+ https://bugs.launchpad.net/bugs/1674330
+
+IPQoS defaults reverted to pre-7.8 values
+-----------------------------------------
+
+OpenSSH 7.8 changed the default IPQoS settings to use DSCP AF21 for
+interactive traffic and CS1 for bulk. This caused some problems with other
+software ("iptables -m tos" and VMware), so Debian's OpenSSH reverts this
+change for the time being.
+
+This is *temporary*, and we expect to come back into sync with upstream
+OpenSSH once those other issues have been fixed. If you want to restore the
+upstream default, add this to ssh_config and sshd_config:
+
+ IPQoS af21 cs1
+
+For further discussion, see:
+
+ https://bugs.debian.org/923879
+ https://bugs.debian.org/926229
+ https://bugs.launchpad.net/1822370
+
+--
+Matthew Vernon <matthew@debian.org>
+Colin Watson <cjwatson@debian.org>
diff --git a/debian/adjust-openssl-dependencies b/debian/adjust-openssl-dependencies
new file mode 100755
index 0000000..1cd7f29
--- /dev/null
+++ b/debian/adjust-openssl-dependencies
@@ -0,0 +1,36 @@
+#! /bin/sh
+# Attempt to tighten libssl dependencies to match the check in entropy.c.
+# Must be run after dpkg-shlibdeps.
+
+client=debian/openssh-client.substvars
+server=debian/openssh-server.substvars
+
+libssl_version="$(dpkg-query -W libssl-dev 2>/dev/null | cut -f2)"
+if [ -z "$libssl_version" ]; then
+ echo "Can't find libssl-dev version; leaving dependencies alone."
+ exit 0
+fi
+libssl_version="$(echo "$libssl_version" | sed 's/[a-z-].*//')"
+
+libssl_package="$(sed -n 's/.*[= ]\(libssl[0-9][a-z0-9+.-]*\).*/\1/p' "$client")"
+if [ "$libssl_package" ]; then
+ new_dep="$libssl_package (>= $libssl_version)"
+ sed -i "/^shlibs:Depends=/s/\$/, $new_dep/" "$client"
+ sed -i "/^shlibs:Depends=/s/\$/, $new_dep/" "$server"
+fi
+
+client_udeb=debian/openssh-client-udeb.substvars
+server_udeb=debian/openssh-server-udeb.substvars
+
+libcrypto_package="$(sed -n 's/.*[= ]\(libcrypto[0-9][a-z0-9+.-]*\).*/\1/p' "$client_udeb")"
+if [ "$libcrypto_package" ]; then
+ new_dep="$libcrypto_package (>= $libssl_version)"
+ if [ -e "$client_udeb" ]; then
+ sed -i "/^shlibs:Depends=/s/\$/, $new_dep/" "$client_udeb"
+ fi
+ if [ -e "$server_udeb" ]; then
+ sed -i "/^shlibs:Depends=/s/\$/, $new_dep/" "$server_udeb"
+ fi
+fi
+
+exit 0
diff --git a/debian/agent-launch b/debian/agent-launch
new file mode 100755
index 0000000..3b2abdb
--- /dev/null
+++ b/debian/agent-launch
@@ -0,0 +1,24 @@
+#!/bin/sh
+# helper script for launching ssh-agent, used by systemd unit
+set -e
+
+if [ ! -d "$XDG_RUNTIME_DIR" ]; then
+ # shellcheck disable=SC2016
+ echo 'This needs $XDG_RUNTIME_DIR to be set' >&2
+ exit 1
+fi
+
+if [ "$1" = start ]; then
+ if [ -z "$SSH_AUTH_SOCK" ] && grep -s -q '^use-ssh-agent$' /etc/X11/Xsession.options; then
+ S="$XDG_RUNTIME_DIR/openssh_agent"
+ dbus-update-activation-environment --verbose --systemd SSH_AUTH_SOCK="$S" SSH_AGENT_LAUNCHER=openssh
+ exec ssh-agent -D -a "$S"
+ fi
+elif [ "$1" = stop ]; then
+ if [ "$SSH_AGENT_LAUNCHER" = openssh ]; then
+ dbus-update-activation-environment --systemd SSH_AUTH_SOCK=
+ fi
+else
+ echo "Unknown command $1" >&2
+ exit 1
+fi
diff --git a/debian/changelog b/debian/changelog
new file mode 100644
index 0000000..aa1399c
--- /dev/null
+++ b/debian/changelog
@@ -0,0 +1,6888 @@
+openssh (1:9.2p1-2+deb12u2) bookworm-security; urgency=medium
+
+ * Cherry-pick from upstream:
+ - [CVE-2023-28531] ssh-add(1): when adding smartcard keys to
+ ssh-agent(1) with the per-hop destination constraints (ssh-add -h ...)
+ added in OpenSSH 8.9, a logic error prevented the constraints from
+ being communicated to the agent. This resulted in the keys being added
+ without constraints. The common cases of non-smartcard keys and keys
+ without destination constraints are unaffected. This problem was
+ reported by Luci Stanescu (closes: #1033166).
+ - [CVE-2023-48795] ssh(1), sshd(8): implement protocol extensions to
+ thwart the so-called "Terrapin attack" discovered by Fabian Bäumer,
+ Marcus Brinkmann and Jörg Schwenk. This attack allows a MITM to effect
+ a limited break of the integrity of the early encrypted SSH transport
+ protocol by sending extra messages prior to the commencement of
+ encryption, and deleting an equal number of consecutive messages
+ immediately after encryption starts. A peer SSH client/server would
+ not be able to detect that messages were deleted.
+ - [CVE-2023-51384] ssh-agent(1): when adding PKCS#11-hosted private keys
+ while specifying destination constraints, if the PKCS#11 token
+ returned multiple keys then only the first key had the constraints
+ applied. Use of regular private keys, FIDO tokens and unconstrained
+ keys are unaffected.
+ - [CVE-2023-51385] ssh(1): if an invalid user or hostname that contained
+ shell metacharacters was passed to ssh(1), and a ProxyCommand,
+ LocalCommand directive or "match exec" predicate referenced the user
+ or hostname via %u, %h or similar expansion token, then an attacker
+ who could supply arbitrary user/hostnames to ssh(1) could potentially
+ perform command injection depending on what quoting was present in the
+ user-supplied ssh_config(5) directive. ssh(1) now bans most shell
+ metacharacters from user and hostnames supplied via the command-line.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 19 Dec 2023 14:51:56 +0000
+
+openssh (1:9.2p1-2+deb12u1) bookworm; urgency=medium
+
+ * Cherry-pick from OpenSSH 9.3p2:
+ - [CVE-2023-38408] Fix a condition where specific libraries loaded via
+ ssh-agent(1)'s PKCS#11 support could be abused to achieve remote code
+ execution via a forwarded agent socket (closes: #1042460).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 23 Sep 2023 23:11:33 +0100
+
+openssh (1:9.2p1-2) unstable; urgency=medium
+
+ * Fix mistakenly-unreleased entry for 1:9.2p1-1 in debian/NEWS.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 08 Feb 2023 10:43:07 +0000
+
+openssh (1:9.2p1-1) unstable; urgency=medium
+
+ * Set "UsePAM yes" when running regression tests, to match our default
+ sshd configuration.
+ * Ignore Lintian error about depending on lsb-base for now, to avoid
+ problems with partial upgrades on non-default init systems.
+ * New upstream release (https://www.openssh.com/releasenotes.html#9.2p1):
+ - [SECURITY] sshd(8): fix a pre-authentication double-free memory fault
+ introduced in OpenSSH 9.1. This is not believed to be exploitable, and
+ it occurs in the unprivileged pre-auth process that is subject to
+ chroot(2) and is further sandboxed on most major platforms.
+ - [SECURITY] ssh(8): in OpenSSH releases after 8.7, the PermitRemoteOpen
+ option would ignore its first argument unless it was one of the
+ special keywords "any" or "none", causing the permission list to fail
+ open if only one permission was specified.
+ - [SECURITY] ssh(1): if the CanonicalizeHostname and
+ CanonicalizePermittedCNAMEs options were enabled, and the system/libc
+ resolver did not check that names in DNS responses were valid, then
+ use of these options could allow an attacker with control of DNS to
+ include invalid characters (possibly including wildcards) in names
+ added to known_hosts files when they were updated. These names would
+ still have to match the CanonicalizePermittedCNAMEs allow-list, so
+ practical exploitation appears unlikely.
+ - ssh(1): add a new EnableEscapeCommandline ssh_config(5) option that
+ controls whether the client-side ~C escape sequence that provides a
+ command-line is available. Among other things, the ~C command-line
+ could be used to add additional port-forwards at runtime. This option
+ defaults to "no", disabling the ~C command-line that was previously
+ enabled by default.
+ - sshd(8): add support for channel inactivity timeouts via a new
+ sshd_config(5) ChannelTimeout directive. This allows channels that
+ have not seen traffic in a configurable interval to be automatically
+ closed. Different timeouts may be applied to session, X11, agent and
+ TCP forwarding channels.
+ - sshd(8): add a sshd_config UnusedConnectionTimeout option to terminate
+ client connections that have no open channels for a length of time.
+ This complements the ChannelTimeout option above.
+ - sshd(8): add a -V (version) option to sshd like the ssh client has.
+ - ssh(1): add a "Host" line to the output of ssh -G showing the original
+ hostname argument. bz3343
+ - scp(1), sftp(1): add a -X option to both scp(1) and sftp(1) to allow
+ control over some SFTP protocol parameters: the copy buffer length and
+ the number of in-flight requests, both of which are used during
+ upload/download. Previously these could be controlled in sftp(1) only.
+ This makes them available in both SFTP protocol clients using the same
+ option character sequence.
+ - ssh-keyscan(1): allow scanning of complete CIDR address ranges, e.g.
+ "ssh-keyscan 192.168.0.0/24". If a CIDR range is passed, then it will
+ be expanded to all possible addresses in the range including the
+ all-0s and all-1s addresses.
+ - ssh(1): support dynamic remote port forwarding in escape
+ command-line's -R processing.
+ - ssh(1): when restoring non-blocking mode to stdio fds, restore exactly
+ the flags that ssh started with and don't just clobber them with zero,
+ as this could also remove the append flag from the set.
+ - ssh(1): avoid printf("%s", NULL) if using UserKnownHostsFile=none and
+ a hostkey in one of the system known hosts file changes.
+ - scp(1): switch scp from using pipes to a socket-pair for communication
+ with its ssh sub-processes, matching how sftp(1) operates.
+ - sshd(8): clear signal mask early in main(); sshd may have been started
+ with one or more signals masked (sigprocmask(2) is not cleared on
+ fork/exec) and this could interfere with various things, e.g. the
+ login grace timer. Execution environments that fail to clear the
+ signal mask before running sshd are clearly broken, but apparently
+ they do exist.
+ - ssh(1): warn if no host keys for hostbased auth can be loaded.
+ - sshd(8): Add server debugging for hostbased auth that is queued and
+ sent to the client after successful authentication, but also logged to
+ assist in diagnosis of HostbasedAuthentication problems.
+ - ssh(1): document use of the IdentityFile option as being usable to
+ list public keys as well as private keys.
+ - sshd(8): check for and disallow MaxStartups values less than or equal
+ to zero during config parsing, rather than failing later at runtime.
+ - ssh-keygen(1): fix parsing of hex cert expiry times specified on the
+ command-line when acting as a CA.
+ - scp(1): when scp(1) is using the SFTP protocol for transport (the
+ default), better match scp/rcp's handling of globs that don't match
+ the globbed characters but do match literally (e.g. trying to transfer
+ a file named "foo.[1]"). Previously scp(1) in SFTP mode would not
+ match these pathnames but legacy scp/rcp mode would.
+ - ssh-agent(1): document the "-O no-restrict-websafe" command-line
+ option.
+ - ssh(1): honour user's umask(2) if it is more restrictive then the ssh
+ default (022).
+ - sshd(8): allow writev(2) in the Linux seccomp sandbox. This seems to
+ be used by recent glibcs at least in some configurations during error
+ conditions.
+ - sshd(8): simplify handling of SSH_CONNECTION PAM env var, removing
+ global variable and checking the return value from pam_putenv.
+ - sshd(8): disable SANDBOX_SECCOMP_FILTER_DEBUG that was mistakenly
+ enabled during the OpenSSH 9.1 release cycle.
+ - sshd(8): defer PRNG seeding until after the initial closefrom(2) call.
+ PRNG seeding will initialize OpenSSL, and some engine providers (e.g.
+ Intel's QAT) will open descriptors for their own use that closefrom(2)
+ could clobber.
+ * debian/run-tests: Add a little more flexibility for debugging.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 08 Feb 2023 10:36:06 +0000
+
+openssh (1:9.1p1-2) unstable; urgency=medium
+
+ [ Christian Göttsche ]
+ * Do not copy SELinux security context in postinst.
+
+ [ Colin Watson ]
+ * Add missing ${misc:Depends} to Depends for openssh-client-udeb,
+ openssh-server-udeb.
+ * Use secure URI in Homepage field.
+ * Remove 2 obsolete maintscript entries in 2 files.
+ * Fix day-of-week for changelog entries 1:3.0.2p1-9, 1:3.0.2p1-2,
+ 1:3.0.1p1-1.
+ * Remove deprecated Encoding key from desktop file
+ debian/ssh-askpass-gnome.desktop.
+ * Update standards version to 4.6.2, no changes needed.
+ * debian/tests/regress: Adjust to cope with changes in adduser 3.130 (see
+ #625758).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 03 Jan 2023 11:57:19 +0000
+
+openssh (1:9.1p1-1) unstable; urgency=medium
+
+ [ Markus Teich ]
+ * Delete obsolete upstart configuration override.
+
+ [ Colin Watson ]
+ * Work around apparent dh-exec regressions (closes: #1016340).
+ * Don't install unnecessary *.lo files in openssh-tests.
+ * Update Lintian overrides to current syntax.
+ * Pass on compiler/linker flags when building debian/keygen-test.
+ * Remove obsolete and misleading rcp/rlogin/rsh alternatives, and stop
+ providing rsh-client (closes: #197037).
+ * Add sshd_config checksums for 1:8.2p1-1 and 1:8.7p1-1 to ucf reference
+ file.
+ * New upstream release (https://www.openssh.com/releasenotes.html#9.1p1,
+ closes: #1021585):
+ - ssh-keyscan(1): fix a one-byte overflow in SSH- banner processing.
+ - ssh-keygen(1): double free() in error path of file hashing step in
+ signing/verify code.
+ - ssh-keysign(8): double-free in error path introduced in openssh-8.9.
+ - ssh(1), sshd(8): SetEnv directives in ssh_config and sshd_config are
+ now first-match-wins to match other directives. Previously if an
+ environment variable was multiply specified the last set value would
+ have been used.
+ - ssh-keygen(8): ssh-keygen -A (generate all default host key types)
+ will no longer generate DSA keys, as these are insecure and have not
+ been used by default for some years.
+ - ssh(1), sshd(8): add a RequiredRSASize directive to set a minimum RSA
+ key length. Keys below this length will be ignored for user
+ authentication and for host authentication in sshd(8). ssh(1) will
+ terminate a connection if the server offers an RSA key that falls
+ below this limit, as the SSH protocol does not include the ability to
+ retry a failed key exchange.
+ - sftp-server(8): add a "users-groups-by-id@openssh.com" extension
+ request that allows the client to obtain user/group names that
+ correspond to a set of uids/gids.
+ - sftp(1): use "users-groups-by-id@openssh.com" sftp-server extension
+ (when available) to fill in user/group names for directory listings.
+ - sftp-server(8): support the "home-directory" extension request defined
+ in draft-ietf-secsh-filexfer-extensions-00. This overlaps a bit with
+ the existing "expand-path@openssh.com", but some other clients support
+ it.
+ - ssh-keygen(1), sshd(8): allow certificate validity intervals, sshsig
+ verification times and authorized_keys expiry-time options to accept
+ dates in the UTC time zone in addition to the default of interpreting
+ them in the system time zone. YYYYMMDD and YYMMDDHHMM[SS] dates/times
+ will be interpreted as UTC if suffixed with a 'Z' character. Also
+ allow certificate validity intervals to be specified in raw
+ seconds-since-epoch as hex value, e.g. -V 0x1234:0x4567890. This is
+ intended for use by regress tests and other tools that call ssh-keygen
+ as part of a CA workflow.
+ - sftp(1): allow arguments to the sftp -D option, e.g. sftp -D
+ "/usr/libexec/sftp-server -el debug3".
+ - ssh-keygen(1): allow the existing -U (use agent) flag to work with "-Y
+ sign" operations, where it will be interpreted to require that the
+ private keys is hosted in an agent.
+ - ssh-keygen(1): implement the "verify-required" certificate option.
+ This was already documented when support for user-verified FIDO keys
+ was added, but the ssh-keygen(1) code was missing.
+ - ssh-agent(1): hook up the restrict_websafe command-line flag;
+ previously the flag was accepted but never actually used.
+ - sftp(1): improve filename tab completions: never try to complete names
+ to non-existent commands, and better match the completion type (local
+ or remote filename) against the argument position being completed.
+ - ssh-keygen(1), ssh(1), ssh-agent(1): several fixes to FIDO key
+ handling, especially relating to keys that request user-verification.
+ These should reduce the number of unnecessary PIN prompts for keys
+ that support intrinsic user verification.
+ - ssh-keygen(1): when enrolling a FIDO resident key, check if a
+ credential with matching application and user ID strings already
+ exists and, if so, prompt the user for confirmation before overwriting
+ the credential.
+ - sshd(8): improve logging of errors when opening authorized_keys files.
+ - ssh(1): avoid multiplexing operations that could cause SIGPIPE from
+ causing the client to exit early.
+ - ssh_config(5), sshd_config(5): clarify that the RekeyLimit directive
+ applies to both transmitted and received data.
+ - ssh-keygen(1): avoid double fclose() in error path.
+ - sshd(8): log an error if pipe() fails while accepting a connection.
+ - ssh-keyscan(1): add missing *-sk types to ssh-keyscan manpage.
+ - sshd(8): ensure that authentication passwords are cleared from memory
+ in error paths.
+ - ssh(1), ssh-agent(1): avoid possibility of notifier code executing
+ kill(-1).
+ - ssh_config(5): note that the ProxyJump directive also accepts the same
+ tokens as ProxyCommand.
+ - scp(1): do not ftruncate(3) files early when in sftp mode. The
+ previous behaviour of unconditionally truncating the destination file
+ would cause "scp ~/foo localhost:foo" and the reverse "scp
+ localhost:foo ~/foo" to delete all the contents of their destination.
+ - ssh-keygen(1): improve error message when 'ssh-keygen -Y sign' is
+ unable to load a private key.
+ - sftp(1), scp(1): when performing operations that glob(3) a remote
+ path, ensure that the implicit working directory used to construct
+ that path escapes glob(3) characters. This prevents glob characters
+ from being processed in places they shouldn't, e.g. "cd /tmp/a*/",
+ "get *.txt" should have the get operation treat the path "/tmp/a*"
+ literally and not attempt to expand it (LP: #1483751).
+ - ssh(1), sshd(8): be stricter in which characters will be accepted in
+ specifying a mask length; allow only 0-9.
+ - ssh-keygen(1): avoid printing hash algorithm twice when dumping a KRL.
+ - ssh(1), sshd(8): continue running local I/O for open channels during
+ SSH transport rekeying. This should make ~-escapes work in the client
+ (e.g. to exit) if the connection happened to have stalled during a
+ rekey event.
+ - ssh(1), sshd(8): avoid potential poll() spin during rekeying.
+ - Further hardening for sshbuf internals: disallow "reparenting" a
+ hierarchical sshbuf and zero the entire buffer if reallocation fails.
+ - sshd(8): add AUDIT_ARCH_PPC to supported seccomp sandbox
+ architectures.
+ * Drop patch to work around https://twistedmatrix.com/trac/ticket/9765,
+ since the fix for that is in Debian testing.
+ * Rewrite gnome-ssh-askpass(1) manual page using mdoc macros, and flesh it
+ out a bit more.
+
+ [ Steve Langasek ]
+ * Support systemd socket activation. Migrate any existing inetd-style
+ socket activation to systemd socket activation.
+
+ [ Gioele Barabucci ]
+ * Remove ancient version constraints.
+ * d/openssh-server.{postinst,config}: get_config_option: Replace perl with
+ sed.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 14 Nov 2022 16:25:45 +0000
+
+openssh (1:9.0p1-1) unstable; urgency=medium
+
+ * New upstream release (https://www.openssh.com/releasenotes.html#9.0p1):
+ - scp(1): Use the SFTP protocol by default (closes: #144579, #204546,
+ #327019). This changes scp's quoting semantics by no longer performing
+ wildcard expansion using the remote shell, and (with some server
+ versions) no longer expanding ~user paths. The -O option is available
+ to use the old protocol. See NEWS.Debian for more details.
+ - ssh(1), sshd(8): use the hybrid Streamlined NTRU Prime + x25519 key
+ exchange method by default ("sntrup761x25519-sha512@openssh.com").
+ The NTRU algorithm is believed to resist attacks enabled by future
+ quantum computers and is paired with the X25519 ECDH key exchange (the
+ previous default) as a backstop against any weaknesses in NTRU Prime
+ that may be discovered in the future. The combination ensures that the
+ hybrid exchange offers at least as good security as the status quo.
+ - sftp-server(8): support the "copy-data" extension to allow server-
+ side copying of files/data, following the design in
+ draft-ietf-secsh-filexfer-extensions-00.
+ - sftp(1): add a "cp" command to allow the sftp client to perform
+ server-side file copies.
+ - ssh(1), sshd(8): upstream: fix poll(2) spin when a channel's output fd
+ closes without data in the channel buffer (closes: #1007822).
+ - sshd(8): pack pollfd array in server listen/accept loop. Could cause
+ the server to hang/spin when MaxStartups > RLIMIT_NOFILE.
+ - ssh-keygen(1): avoid NULL deref via the find-principals and
+ check-novalidate operations. bz3409 and GHPR307 respectively.
+ - scp(1): fix a memory leak in argument processing.
+ - sshd(8): don't try to resolve ListenAddress directives in the sshd
+ re-exec path. They are unused after re-exec and parsing errors
+ (possible for example if the host's network configuration changed)
+ could prevent connections from being accepted.
+ - sshd(8): when refusing a public key authentication request from a
+ client for using an unapproved or unsupported signature algorithm
+ include the algorithm name in the log message to make debugging
+ easier.
+ - ssh(1), sshd(8): Fix possible integer underflow in scan_scaled(3)
+ parsing of K/M/G/etc quantities.
+ - sshd(8): default to not using sandbox when cross compiling. On most
+ systems poll(2) does not work when the number of FDs is reduced with
+ setrlimit, so assume it doesn't when cross compiling and we can't run
+ the test.
+ * Remove obsolete FAQ, removed from openssh.com in 2016.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 09 Apr 2022 14:14:10 +0100
+
+openssh (1:8.9p1-3) unstable; urgency=medium
+
+ * Allow ppoll_time64 in seccomp filter (closes: #1006445).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 25 Feb 2022 23:30:49 +0000
+
+openssh (1:8.9p1-2) unstable; urgency=medium
+
+ * Improve detection of -fzero-call-used-regs=all support.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 24 Feb 2022 16:09:56 +0000
+
+openssh (1:8.9p1-1) unstable; urgency=medium
+
+ * New upstream release (https://www.openssh.com/releasenotes.html#8.9p1):
+ - sshd(8): fix an integer overflow in the user authentication path that,
+ in conjunction with other logic errors, could have yielded
+ unauthenticated access under difficult to exploit conditions.
+ - sshd(8), portable OpenSSH only: this release removes in-built support
+ for MD5-hashed passwords.
+ - ssh(1), sshd(8), ssh-add(1), ssh-agent(1): add a system for
+ restricting forwarding and use of keys added to ssh-agent(1).
+ - ssh(1), sshd(8): add the sntrup761x25519-sha512@openssh.com hybrid
+ ECDH/x25519 + Streamlined NTRU Prime post-quantum KEX to the default
+ KEXAlgorithms list (after the ECDH methods but before the prime-group
+ DH ones). The next release of OpenSSH is likely to make this key
+ exchange the default method.
+ - ssh-keygen(1): when downloading resident keys from a FIDO token, pass
+ back the user ID that was used when the key was created and append it
+ to the filename the key is written to (if it is not the default).
+ Avoids keys being clobbered if the user created multiple resident keys
+ with the same application string but different user IDs.
+ - ssh-keygen(1), ssh(1), ssh-agent(1): better handling for FIDO keys on
+ tokens that provide user verification (UV) on the device itself,
+ including biometric keys, avoiding unnecessary PIN prompts.
+ - ssh-keygen(1): add "ssh-keygen -Y match-principals" operation to
+ perform matching of principals names against an allowed signers file.
+ To be used towards a TOFU model for SSH signatures in git.
+ - ssh-add(1), ssh-agent(1): allow pin-required FIDO keys to be added to
+ ssh-agent(1). $SSH_ASKPASS will be used to request the PIN at
+ authentication time.
+ - ssh-keygen(1): allow selection of hash at sshsig signing time (either
+ sha512 (default) or sha256).
+ - ssh(1), sshd(8): read network data directly to the packet input buffer
+ instead indirectly via a small stack buffer. Provides a modest
+ performance improvement.
+ - ssh(1), sshd(8): read data directly to the channel input buffer,
+ providing a similar modest performance improvement.
+ - ssh(1): extend the PubkeyAuthentication configuration directive to
+ accept yes|no|unbound|host-bound to allow control over one of the
+ protocol extensions used to implement agent-restricted keys.
+ - sshd(8): document that CASignatureAlgorithms, ExposeAuthInfo and
+ PubkeyAuthOptions can be used in a Match block.
+ - sshd(8): fix possible string truncation when constructing paths to
+ .rhosts/.shosts files with very long user home directory names.
+ - ssh-keysign(1): unbreak for KEX algorithms that use SHA384/512
+ exchange hashes.
+ - ssh(1): don't put the TTY into raw mode when SessionType=none, avoids
+ ^C being unable to kill such a session.
+ - scp(1): fix some corner-case bugs in SFTP-mode handling of ~-prefixed
+ paths.
+ - ssh(1): unbreak hostbased auth using RSA keys. Allow ssh(1) to select
+ RSA keys when only RSA/SHA2 signature algorithms are configured (this
+ is the default case). Previously RSA keys were not being considered in
+ the default case.
+ - ssh-keysign(1): make ssh-keysign use the requested signature algorithm
+ and not the default for the key type. Part of unbreaking hostbased
+ auth for RSA/SHA2 keys.
+ - ssh(1): stricter UpdateHostkey signature verification logic on the
+ client-side. Require RSA/SHA2 signatures for RSA hostkeys except when
+ RSA/SHA1 was explicitly negotiated during initial KEX.
+ - ssh(1), sshd(8): fix signature algorithm selection logic for
+ UpdateHostkeys on the server side. The previous code tried to prefer
+ RSA/SHA2 for hostkey proofs of RSA keys, but missed some cases. This
+ will use RSA/SHA2 signatures for RSA keys if the client proposed these
+ algorithms in initial KEX.
+ - All: convert all uses of select(2)/pselect(2) to poll(2)/ppoll(2).
+ This includes the mainloops in ssh(1), ssh-agent(1), ssh-agent(1) and
+ sftp-server(8), as well as the sshd(8) listen loop and all other FD
+ read/writability checks. On platforms with missing or broken
+ poll(2)/ppoll(2) syscalls a select(2)-based compat shim is available.
+ - ssh-keygen(1): the "-Y find-principals" command was verifying key
+ validity when using ca certs but not with simple key lifetimes within
+ the allowed signers file.
+ - ssh-keygen(1): make sshsig verify-time argument parsing optional.
+ - sshd(8): fix truncation in rhosts/shosts path construction.
+ - ssh(1), ssh-agent(1): avoid xmalloc(0) for PKCS#11 keyid for ECDSA
+ keys (we already did this for RSA keys). Avoids fatal errors for
+ PKCS#11 libraries that return empty keyid, e.g. Microchip ATECC608B
+ "cryptoauthlib".
+ - ssh(1), ssh-agent(1): improve the testing of credentials against
+ inserted FIDO: ask the token whether a particular key belongs to it in
+ cases where the token supports on-token user-verification (e.g.
+ biometrics) rather than just assuming that it will accept it. Will
+ reduce spurious "Confirm user presence" notifications for key handles
+ that relate to FIDO keys that are not currently inserted in at least
+ some cases.
+ - ssh(1), sshd(8): correct value for IPTOS_DSCP_LE. It needs to allow
+ for the preceding two ECN bits.
+ - ssh-keygen(1): add missing -O option to usage() for the "-Y sign"
+ option.
+ - ssh-keygen(1): fix a NULL deref when using the find-principals
+ function, when matching an allowed_signers line that contains a
+ namespace restriction, but no restriction specified on the
+ command-line
+ - ssh-agent(1): fix memleak in process_extension().
+ - ssh(1): suppress "Connection to xxx closed" messages when LogLevel is
+ set to "error" or above.
+ - ssh(1), sshd(8): use correct zlib flags when inflate(3)-ing compressed
+ packet data.
+ - scp(1): when recursively transferring files in SFTP mode, create the
+ destination directory if it doesn't already exist to match scp(1) in
+ legacy RCP mode behaviour.
+ - scp(1): many improvements in error message consistency between scp(1)
+ in SFTP mode vs legacy RCP mode.
+ - sshd(8): fix potential race in SIGTERM handling.
+ - ssh(1), ssh(8): since DSA keys are deprecated, move them to the end of
+ the default list of public keys so that they will be tried last.
+ - ssh-keygen(1): allow 'ssh-keygen -Y find-principals' to match wildcard
+ principals in allowed_signers files.
+ - ssh(1), sshd(8): don't trust closefrom(2) on Linux. glibc's
+ implementation does not work in a chroot when the kernel does not have
+ close_range(2). It tries to read from /proc/self/fd and when that
+ fails dies with an assertion of sorts. Instead, call close_range(2)
+ directly from our compat code and fall back if that fails.
+ - Correct handling of exceptfds/POLLPRI in our select(2)-based
+ poll(2)/ppoll(2) compat implementation.
+ * Drop patch to work around https://twistedmatrix.com/trac/ticket/9515,
+ since the fix for that is in Debian stable.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 24 Feb 2022 11:06:15 +0000
+
+openssh (1:8.8p1-1) unstable; urgency=medium
+
+ * New upstream release (https://www.openssh.com/releasenotes.html#8.8p1,
+ closes: #996391):
+ - This release disables RSA signatures using the SHA-1 hash algorithm by
+ default. (Existing RSA keys may still be used and do not need to be
+ replaced; see NEWS.Debian if you have problems connecting to old SSH
+ servers.)
+ - ssh(1): allow the ssh_config(5) CanonicalizePermittedCNAMEs directive
+ to accept a "none" argument to specify the default behaviour.
+ - scp(1): when using the SFTP protocol, continue transferring files
+ after a transfer error occurs, better matching original scp/rcp
+ behaviour.
+ - ssh(1): fixed a number of memory leaks in multiplexing,
+ - ssh-keygen(1): avoid crash when using the -Y find-principals command.
+ - A number of documentation and manual improvements.
+ - ssh(1)/sshd(8): some fixes to the pselect(2) replacement compatibility
+ code.
+ * Work around missing RSA SHA-2 signature support in conch until the
+ upstream fix lands in Debian.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 15 Feb 2022 19:20:21 +0000
+
+openssh (1:8.7p1-4) unstable; urgency=medium
+
+ [ Daniel Baumann ]
+ * Fix typo in openssh-client.alternatives (closes: #1002803).
+
+ [ Colin Watson ]
+ * Further clarify socket activation instructions.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 29 Dec 2021 12:08:38 +0000
+
+openssh (1:8.7p1-3) unstable; urgency=medium
+
+ * Include unit test binaries in openssh-tests even if building with
+ DEB_BUILD_OPTIONS=nocheck.
+ * Install built version of sshd_config, with corrected PATH and PidFile.
+ * Upgrade to debhelper v13.
+ * debian/copyright: Use HTTPS in Source field.
+ * Update renamed Lintian tag name in Lintian override.
+ * debian/watch: Upgrade to version 4.
+ * Clarify instructions for using socket activation to avoid accidental
+ attempts to start the non-socket-activated service that can result in
+ systems without a running sshd (closes: #1001320).
+ * Remove maintainer script code for upgrades from before Debian 9.
+ * Make the sysvinit script provide "ssh" as well as "sshd".
+ * Set Rules-Requires-Root: no.
+ * Use dh_installalternatives.
+ * Simplify some debhelper overrides slightly.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 29 Dec 2021 01:12:00 +0000
+
+openssh (1:8.7p1-2) unstable; urgency=medium
+
+ * Backport from upstream:
+ - Avoid NULL deref in -Y find-principals (closes: #999593).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 13 Nov 2021 13:40:50 +0000
+
+openssh (1:8.7p1-1) unstable; urgency=medium
+
+ * debian/upstream/signing-key.asc: Update from upstream.
+ * New upstream release (https://www.openssh.com/releasenotes.html#8.7p1):
+ - scp(1): this release changes the behaviour of remote to remote copies
+ (e.g. "scp host-a:/path host-b:") to transfer through the local host
+ by default (closes: #734386, LP: #1462758). This was previously
+ available via the -3 flag. A -R flag has been added to select the old
+ behaviour.
+ - ssh(1)/sshd(8): both the client and server are now using a stricter
+ configuration file parser.
+ - ssh(1): when using SSHFP DNS records for host key verification, ssh(1)
+ will verify all matching records instead of just those with the
+ specific signature type requested.
+ - ssh-keygen(1): when generating a FIDO key and specifying an explicit
+ attestation challenge (using -Ochallenge), the challenge will now be
+ hashed by the builtin security key middleware.
+ - sshd(8): environment="..." directives in authorized_keys files are now
+ first-match-wins and limited to 1024 discrete environment variable
+ names.
+ - scp(1): experimental support for transfers using the SFTP protocol as
+ a replacement for the venerable SCP/RCP protocol that it has
+ traditionally used. SFTP offers more predictable filename handling and
+ does not require expansion of glob(3) patterns via the shell on the
+ remote side.
+ SFTP support may be enabled via a temporary scp -s flag. It is
+ intended for SFTP to become the default transfer mode in the near
+ future, at which time the -s flag will be removed. The -O flag exists
+ to force use of the original SCP/RCP protocol for cases where SFTP may
+ be unavailable or incompatible.
+ - sftp-server(8): add a protocol extension to support expansion of ~/
+ and ~user/ prefixed paths. This was added to support these paths when
+ used by scp(1) while in SFTP mode.
+ - ssh(1): add a ForkAfterAuthentication ssh_config(5) counterpart to the
+ ssh(1) -f flag. GHPR231
+ - ssh(1): add a StdinNull directive to ssh_config(5) that allows the
+ config file to do the same thing as -n does on the ssh(1) command-
+ line. GHPR231
+ - ssh(1): add a SessionType directive to ssh_config, allowing the
+ configuration file to offer equivalent control to the -N (no session)
+ and -s (subsystem) command-line flags (closes: #609122).
+ - ssh-keygen(1): allowed signers files used by ssh-keygen(1) signatures
+ now support listing key validity intervals alongside they key, and
+ ssh-keygen(1) can optionally check during signature verification
+ whether a specified time falls inside this interval. This feature is
+ intended for use by git to support signing and verifying objects using
+ ssh keys.
+ - ssh-keygen(8): support printing of the full public key in a sshsig
+ signature via a -Oprint-pubkey flag.
+ - ssh(1)/sshd(8): start time-based re-keying exactly on schedule in the
+ client and server mainloops. Previously the re-key timeout could
+ expire but re-keying would not start until a packet was sent or
+ received, causing a spin in select() if the connection was quiescent.
+ - ssh-keygen(1): avoid Y2038 problem in printing certificate validity
+ lifetimes. Dates past 2^31-1 seconds since epoch were displayed
+ incorrectly on some platforms.
+ - scp(1): allow spaces to appear in usernames for local to remote and
+ scp -3 remote to remote copies.
+ - ssh(1)/sshd(8): remove references to ChallengeResponseAuthentication
+ in favour of KbdInteractiveAuthentication. The former is what was in
+ SSHv1, the latter is what is in SSHv2 (RFC4256) and they were treated
+ as somewhat but not entirely equivalent. We retain the old name as a
+ deprecated alias so configuration files continue to work as well as a
+ reference in the man page for people looking for it.
+ - ssh(1)/ssh-add(1)/ssh-keygen(1): fix decoding of X.509 subject name
+ when extracting a key from a PKCS#11 certificate.
+ - ssh(1): restore blocking status on stdio fds before close. ssh(1)
+ needs file descriptors in non-blocking mode to operate but it was not
+ restoring the original state on exit. This could cause problems with
+ fds shared with other programs via the shell.
+ - ssh(1)/sshd(8): switch both client and server mainloops from select(3)
+ to pselect(3). Avoids race conditions where a signal may arrive
+ immediately before select(3) and not be processed until an event
+ fires.
+ - ssh(1): sessions started with ControlPersist were incorrectly
+ executing a shell when the -N (no shell) option was specified (closes:
+ #762633).
+ - ssh(1): check if IPQoS or TunnelDevice are already set before
+ overriding. Prevents values in config files from overriding values
+ supplied on the command line.
+ - ssh(1): fix debug message when finding a private key to match a
+ certificate being attempted for user authentication. Previously it
+ would print the certificate's path, whereas it was supposed to be
+ showing the private key's path.
+ - sshd(8): match host certificates against host public keys, not private
+ keys. Allows use of certificates with private keys held in a
+ ssh-agent.
+ - ssh(1): add a workaround for a bug in OpenSSH 7.4 sshd(8), which
+ allows RSA/SHA2 signatures for public key authentication but fails to
+ advertise this correctly via SSH2_MSG_EXT_INFO. This causes clients of
+ these server to incorrectly match PubkeyAcceptedAlgorithms and
+ potentially refuse to offer valid keys.
+ - sftp(1)/scp(1): degrade gracefully if a sftp-server offers the
+ limits@openssh.com extension but fails when the client tries to invoke
+ it.
+ - ssh(1): allow ssh_config SetEnv to override $TERM, which is otherwise
+ handled specially by the protocol. Useful in ~/.ssh/config to set TERM
+ to something generic (e.g. "xterm" instead of "xterm-256color") for
+ destinations that lack terminfo entries.
+ - sftp-server(8): the limits@openssh.com extension was incorrectly
+ marked as an operation that writes to the filesystem, which made it
+ unavailable in sftp-server read-only mode.
+ - ssh(1): fix SEGV in UpdateHostkeys debug() message, triggered when the
+ update removed more host keys than remain present.
+ - Many manual page fixes.
+ - sshd(8): handle GIDs > 2^31 in getgrouplist. When compiled in 32bit
+ mode, the getgrouplist implementation may fail for GIDs greater than
+ LONG_MAX.
+ - ssh(1): xstrdup environment variable used by ForwardAgent.
+ - sshd(8): don't sigdie() in signal handler in privsep child process;
+ this can end up causing sandbox violations.
+ * New upstream release (https://www.openssh.com/releasenotes.html#8.6p1):
+ - sftp-server(8): add a new limits@openssh.com protocol extension that
+ allows a client to discover various server limits, including maximum
+ packet size and maximum read/write length.
+ - sftp(1): use the new limits@openssh.com extension (when available) to
+ select better transfer lengths in the client.
+ - sshd(8): Add ModuliFile keyword to sshd_config to specify the location
+ of the "moduli" file containing the groups for DH-GEX.
+ - ssh_config(5), sshd_config(5): sync CASignatureAlgorithms lists in
+ manual pages with the current default.
+ - ssh(1): ensure that pkcs11_del_provider() is called before exit.
+ - ssh(1), sshd(8): fix problems in string->argv conversion. Multiple
+ backslashes were not being dequoted correctly and quoted space in the
+ middle of a string was being incorrectly split.
+ - ssh(1): return non-zero exit status when killed by signal.
+ - sftp-server(8): increase maximum SSH2_FXP_READ to match the maximum
+ packet size. Also handle zero-length reads that are not explicitly
+ banned by the spec.
+ - sshd(8): don't mistakenly exit on transient read errors on the network
+ socket (e.g. EINTR, EAGAIN).
+ - Create a dedicated contrib/gnome-ssk-askpass3.c source instead of
+ building it from the same file as used for GNOME2. Use the GNOME3
+ gdk_seat_grab() to manage keyboard/mouse/server grabs for better
+ compatibility with Wayland.
+ - sshd(8): soft-disallow the fstatat64 syscall in the Linux seccomp-bpf
+ sandbox.
+ * New upstream release (https://www.openssh.com/releasenotes.html#8.5p1):
+ - ssh(1), sshd(8): change the first-preference signature algorithm from
+ ECDSA to ED25519.
+ - ssh(1), sshd(8): set the TOS/DSCP specified in the configuration for
+ interactive use prior to TCP connect.
+ - ssh(1), sshd(8): remove the pre-standardization cipher
+ rijndael-cbc@lysator.liu.se.
+ - ssh(1), sshd(8): update/replace the experimental post-quantum hybrid
+ key exchange method based on Streamlined NTRU Prime coupled with
+ X25519.
+ - ssh(1): disable CheckHostIP by default. It provides insignificant
+ benefits while making key rotation significantly more difficult,
+ especially for hosts behind IP-based load-balancers (closes: #764027).
+ - ssh(1): enable UpdateHostkeys by default subject to some conservative
+ preconditions (closes: #875532):
+ + The key was matched in the UserKnownHostsFile (and not in the
+ GlobalKnownHostsFile).
+ + The same key does not exist under another name.
+ + A certificate host key is not in use.
+ + known_hosts contains no matching wildcard hostname pattern.
+ + VerifyHostKeyDNS is not enabled.
+ + The default UserKnownHostsFile is in use.
+ We expect some of these conditions will be modified or relaxed in
+ future.
+ - ssh(1), sshd(8): add a new LogVerbose configuration directive that
+ allows forcing maximum debug logging by file/function/line
+ pattern-lists.
+ - ssh(1): when prompting the user to accept a new hostkey, display any
+ other host names/addresses already associated with the key.
+ - ssh(1): allow UserKnownHostsFile=none to indicate that no known_hosts
+ file should be used to identify host keys.
+ - ssh(1): add a ssh_config KnownHostsCommand option that allows the
+ client to obtain known_hosts data from a command in addition to the
+ usual files.
+ - ssh(1): add a ssh_config PermitRemoteOpen option that allows the
+ client to restrict the destination when RemoteForward is used with
+ SOCKS.
+ - ssh(1): for FIDO keys, if a signature operation fails with a
+ "incorrect PIN" reason and no PIN was initially requested from the
+ user, then request a PIN and retry the operation. This supports some
+ biometric devices that fall back to requiring PIN when reading of the
+ biometric failed, and devices that require PINs for all hosted
+ credentials.
+ - sshd(8): implement client address-based rate-limiting via new
+ sshd_config(5) PerSourceMaxStartups and PerSourceNetBlockSize
+ directives that provide more fine-grained control on a per-origin
+ address basis than the global MaxStartups limit.
+ - ssh(1): Prefix keyboard interactive prompts with "(user@host)" to make
+ it easier to determine which connection they are associated with in
+ cases like scp -3, ProxyJump, etc. (closes: #343267).
+ - sshd(8): fix sshd_config SetEnv directives located inside Match
+ blocks.
+ - ssh(1): when requesting a FIDO token touch on stderr, inform the user
+ once the touch has been recorded.
+ - ssh(1): prevent integer overflow when ridiculously large
+ ConnectTimeout values are specified, capping the effective value (for
+ most platforms) at 24 days.
+ - ssh(1): consider the ECDSA key subtype when ordering host key
+ algorithms in the client.
+ - ssh(1), sshd(8): rename the PubkeyAcceptedKeyTypes keyword to
+ PubkeyAcceptedAlgorithms. The previous name incorrectly suggested that
+ it control allowed key algorithms, when this option actually specifies
+ the signature algorithms that are accepted. The previous name remains
+ available as an alias (closes: #933665).
+ - ssh(1), sshd(8): similarly, rename HostbasedKeyTypes (ssh) and
+ HostbasedAcceptedKeyTypes (sshd) to HostbasedAcceptedAlgorithms.
+ - sftp-server(8): add missing lsetstat@openssh.com documentation and
+ advertisement in the server's SSH2_FXP_VERSION hello packet.
+ - ssh(1), sshd(8): more strictly enforce KEX state-machine by banning
+ packet types once they are received. Fixes memleak caused by duplicate
+ SSH2_MSG_KEX_DH_GEX_REQUEST.
+ - sftp(1): allow the full range of UIDs/GIDs for chown/chgrp on 32bit
+ platforms instead of being limited by LONG_MAX.
+ - Minor man page fixes (capitalization, commas, etc.)
+ - sftp(1): when doing an sftp recursive upload or download of a
+ read-only directory, ensure that the directory is created with write
+ and execute permissions in the interim so that the transfer can
+ actually complete, then set the directory permission as the final
+ step.
+ - ssh-keygen(1): document the -Z, check the validity of its argument
+ earlier and provide a better error message if it's not correct.
+ - ssh(1): ignore comments at the end of config lines in ssh_config,
+ similar to what we already do for sshd_config.
+ - sshd_config(5): mention that DisableForwarding is valid in a
+ sshd_config Match block.
+ - sftp(1): fix incorrect sorting of "ls -ltr" under some circumstances.
+ - ssh(1), sshd(8): fix potential integer truncation of (unlikely)
+ timeout values.
+ - ssh(1): make hostbased authentication send the signature algorithm in
+ its SSH2_MSG_USERAUTH_REQUEST packets instead of the key type. This
+ make HostbasedAcceptedAlgorithms do what it is supposed to - filter on
+ signature algorithm and not key type.
+ - sshd(8): add a number of platform-specific syscalls to the Linux
+ seccomp-bpf sandbox.
+ - sshd(8): remove debug message from sigchld handler that could cause
+ deadlock on some platforms.
+ - Sync contrib/ssh-copy-id with upstream.
+ * Remove OpenBSD-specific rdomain references from sshd_config(5) (closes:
+ #998069).
+ * Define MAXHOSTNAMELEN on GNU/Hurd (thanks, Svante Signell; closes:
+ #997030).
+ * Build-depend on libelogind-dev as an alternative to libsystemd-dev on
+ Linux (thanks, Svante Signell; closes: #997035).
+ * Backport from upstream:
+ - CVE-2021-41617 (closes: #995130): sshd(8) from OpenSSH 6.2 through 8.7
+ failed to correctly initialise supplemental groups when executing an
+ AuthorizedKeysCommand or AuthorizedPrincipalsCommand, where a
+ AuthorizedKeysCommandUser or AuthorizedPrincipalsCommandUser directive
+ has been set to run the command as a different user. Instead these
+ commands would inherit the groups that sshd(8) was started with.
+ * Configure with ac_cv_func_closefrom=no to avoid an incompatibility with
+ glibc 2.34's fallback_closefrom function (thanks, William 'jawn-smith'
+ Wilson; LP: #1944621).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 06 Nov 2021 12:23:47 +0000
+
+openssh (1:8.4p1-6) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * Rename ssh group to _ssh (closes: #990456). It's only used by
+ ssh-agent.
+ * debian/tests/regress: Don't fail cleanup if haveged isn't running.
+ * Backport from upstream:
+ - Add includes.h to compat tests (closes: #992134, LP: #1939751).
+ * Use "command -v" in maintainer scripts rather than "which".
+
+ [ Athos Ribeiro ]
+ * d/systemd/ssh@.service: preserve the systemd managed runtime directory to
+ ensure parallel processes will not disrupt one another when halting
+ (LP: #1905285) (closes: #934663)
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 19 Aug 2021 11:04:01 +0100
+
+openssh (1:8.4p1-5) unstable; urgency=high
+
+ * CVE-2021-28041: Fix double free in ssh-agent(1) (closes: #984940).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 13 Mar 2021 09:59:40 +0000
+
+openssh (1:8.4p1-4) unstable; urgency=medium
+
+ * Avoid using libmd's <sha2.h> even if it's installed (closes: #982705).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 15 Feb 2021 10:25:17 +0000
+
+openssh (1:8.4p1-3) unstable; urgency=medium
+
+ * Backport from upstream:
+ - Fix `EOF: command not found` error in ssh-copy-id (closes: #975540).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 02 Dec 2020 10:32:23 +0000
+
+openssh (1:8.4p1-2) unstable; urgency=medium
+
+ * Revert incorrect upstream patch that claimed to fix the seccomp sandbox
+ on x32 but in fact broke it instead.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 26 Oct 2020 17:41:13 +0000
+
+openssh (1:8.4p1-1) unstable; urgency=medium
+
+ * New upstream release (https://www.openssh.com/txt/release-8.4):
+ - [SECURITY] ssh-agent(1): restrict ssh-agent from signing web
+ challenges for FIDO/U2F keys.
+ - [SECURITY] ssh-keygen(1): Enable FIDO 2.1 credProtect extension when
+ generating a FIDO resident key.
+ - ssh-keygen(1): the format of the attestation information optionally
+ recorded when a FIDO key is generated has changed. It now includes the
+ authenticator data needed to validate attestation signatures.
+ - The API between OpenSSH and the FIDO token middleware has changed and
+ the SSH_SK_VERSION_MAJOR version has been incremented as a result.
+ Third-party middleware libraries must support the current API version
+ (7) to work with OpenSSH 8.4.
+ - ssh(1), ssh-keygen(1): support for FIDO keys that require a PIN for
+ each use. These keys may be generated using ssh-keygen using a new
+ "verify-required" option. When a PIN-required key is used, the user
+ will be prompted for a PIN to complete the signature operation.
+ - sshd(8): authorized_keys now supports a new "verify-required" option
+ to require FIDO signatures assert that the token verified that the
+ user was present before making the signature. The FIDO protocol
+ supports multiple methods for user-verification, but currently OpenSSH
+ only supports PIN verification.
+ - sshd(8), ssh-keygen(1): add support for verifying FIDO webauthn
+ signatures. Webauthn is a standard for using FIDO keys in web
+ browsers. These signatures are a slightly different format to plain
+ FIDO signatures and thus require explicit support.
+ - ssh(1): allow some keywords to expand shell-style ${ENV} environment
+ variables. The supported keywords are CertificateFile, ControlPath,
+ IdentityAgent and IdentityFile, plus LocalForward and RemoteForward
+ when used for Unix domain socket paths.
+ - ssh(1), ssh-agent(1): allow some additional control over the use of
+ ssh-askpass via a new $SSH_ASKPASS_REQUIRE environment variable,
+ including forcibly enabling and disabling its use (closes: #368657).
+ - ssh(1): allow ssh_config(5)'s AddKeysToAgent keyword accept a time
+ limit for keys in addition to its current flag options. Time-limited
+ keys will automatically be removed from ssh-agent after their expiry
+ time has passed.
+ - scp(1), sftp(1): allow the -A flag to explicitly enable agent
+ forwarding in scp and sftp. The default remains to not forward an
+ agent, even when ssh_config enables it.
+ - ssh(1): add a '%k' TOKEN that expands to the effective HostKey of the
+ destination. This allows, e.g., keeping host keys in individual files
+ using "UserKnownHostsFile ~/.ssh/known_hosts.d/%k" (closes: #481250).
+ - ssh(1): add %-TOKEN, environment variable and tilde expansion to the
+ UserKnownHostsFile directive, allowing the path to be completed by the
+ configuration.
+ - ssh-keygen(1): allow "ssh-add -d -" to read keys to be deleted from
+ stdin.
+ - sshd(8): improve logging for MaxStartups connection throttling. sshd
+ will now log when it starts and stops throttling and periodically
+ while in this state.
+ - ssh(1), ssh-keygen(1): better support for multiple attached FIDO
+ tokens. In cases where OpenSSH cannot unambiguously determine which
+ token to direct a request to, the user is now required to select a
+ token by touching it. In cases of operations that require a PIN to be
+ verified, this avoids sending the wrong PIN to the wrong token and
+ incrementing the token's PIN failure counter (tokens effectively erase
+ their keys after too many PIN failures).
+ - sshd(8): fix Include before Match in sshd_config (LP: #1885990).
+ - ssh(1): close stdin/out/error when forking after authentication
+ completes ("ssh -f ...").
+ - ssh(1), sshd(8): limit the amount of channel input data buffered,
+ avoiding peers that advertise large windows but are slow to read from
+ causing high memory consumption.
+ - ssh-agent(1): handle multiple requests sent in a single write() to the
+ agent.
+ - sshd(8): allow sshd_config longer than 256k.
+ - sshd(8): avoid spurious "Unable to load host key" message when sshd
+ load a private key but no public counterpart.
+ - ssh(1): prefer the default hostkey algorithm list whenever we have a
+ hostkey that matches its best-preference algorithm.
+ - sshd(1): when ordering the hostkey algorithms to request from a
+ server, prefer certificate types if the known_hosts files contain a
+ key marked as a @cert-authority.
+ - ssh(1): perform host key fingerprint comparisons for the "Are you sure
+ you want to continue connecting (yes/no/[fingerprint])?" prompt with
+ case sensitivity.
+ - sshd(8): ensure that address/masklen mismatches in sshd_config yield
+ fatal errors at daemon start time rather than later when they are
+ evaluated.
+ - ssh-keygen(1): ensure that certificate extensions are lexically
+ sorted. Previously if the user specified a custom extension then the
+ everything would be in order except the custom ones.
+ - ssh(1): also compare username when checking for JumpHost loops.
+ - ssh-keygen(1): preserve group/world read permission on known_hosts
+ files across runs of "ssh-keygen -Rf /path". The old behaviour was to
+ remove all rights for group/other.
+ - ssh-keygen(1): Mention the [-a rounds] flag in the ssh-keygen manual
+ page and usage().
+ - sshd(8): explicitly construct path to ~/.ssh/rc rather than relying on
+ it being relative to the current directory, so that it can still be
+ found if the shell startup changes its directory.
+ - sshd(8): when redirecting sshd's log output to a file, undo this
+ redirection after the session child process is forked(). Fixes missing
+ log messages when using this feature under some circumstances.
+ - sshd(8): start ClientAliveInterval bookkeeping before first pass
+ through select() loop; fixed theoretical case where busy sshd may
+ ignore timeouts from client.
+ - ssh(1): only reset the ServerAliveInterval check when we receive
+ traffic from the server and ignore traffic from a port forwarding
+ client, preventing a client from keeping a connection alive when it
+ should be terminated.
+ - ssh-keygen(1): avoid spurious error message when ssh-keygen creates
+ files outside ~/.ssh.
+ - sftp-client(1): fix off-by-one error that caused sftp downloads to
+ make one more concurrent request that desired. This prevented using
+ sftp(1) in unpipelined request/response mode, which is useful when
+ debugging.
+ - ssh(1), sshd(8): handle EINTR in waitfd() and timeout_connect()
+ helpers.
+ - ssh(1), ssh-keygen(1): defer creation of ~/.ssh until we attempt to
+ write to it so we don't leave an empty .ssh directory when it's not
+ needed.
+ - ssh(1), sshd(8): fix multiplier when parsing time specifications when
+ handling seconds after other units.
+ - sshd(8): always send any PAM account messages. If the PAM account
+ stack returns any messages, always send them to the user and not just
+ if the check succeeds.
+ - gnome-ssh-askpass3: ensure the "close" button is not focused by
+ default for SSH_ASKPASS_PROMPT=none prompts. Avoids space/enter
+ accidentally dismissing FIDO touch notifications.
+ - gnome-ssh-askpass3: allow some control over textarea colour via
+ $GNOME_SSH_ASKPASS_FG_COLOR and $GNOME_SSH_ASKPASS_BG_COLOR
+ environment variables.
+ - Detect the Frankenstein monster of Linux/X32 and allow the sandbox to
+ function there.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 20 Oct 2020 14:15:17 +0100
+
+openssh (1:8.3p1-1) unstable; urgency=medium
+
+ * New upstream release (https://www.openssh.com/txt/release-8.3):
+ - [SECURITY] scp(1): when receiving files, scp(1) could become
+ desynchronised if a utimes(2) system call failed. This could allow
+ file contents to be interpreted as file metadata and thereby permit an
+ adversary to craft a file system that, when copied with scp(1) in a
+ configuration that caused utimes(2) to fail (e.g. under a SELinux
+ policy or syscall sandbox), transferred different file names and
+ contents to the actual file system layout.
+ - sftp(1): reject an argument of "-1" in the same way as ssh(1) and
+ scp(1) do instead of accepting and silently ignoring it.
+ - sshd(8): make IgnoreRhosts a tri-state option: "yes" to ignore
+ rhosts/shosts, "no" to allow rhosts/shosts or (new) "shosts-only" to
+ allow .shosts files but not .rhosts.
+ - sshd(8): allow the IgnoreRhosts directive to appear anywhere in a
+ sshd_config, not just before any Match blocks.
+ - ssh(1): add %TOKEN percent expansion for the LocalForward and
+ RemoteForward keywords when used for Unix domain socket forwarding.
+ - all: allow loading public keys from the unencrypted envelope of a
+ private key file if no corresponding public key file is present.
+ - ssh(1), sshd(8): prefer to use chacha20 from libcrypto where possible
+ instead of the (slower) portable C implementation included in OpenSSH.
+ - ssh-keygen(1): add ability to dump the contents of a binary key
+ revocation list via "ssh-keygen -lQf /path".
+ - ssh(1): fix IdentitiesOnly=yes to also apply to keys loaded from a
+ PKCS11Provider.
+ - ssh-keygen(1): avoid NULL dereference when trying to convert an
+ invalid RFC4716 private key.
+ - scp(1): when performing remote-to-remote copies using "scp -3", start
+ the second ssh(1) channel with BatchMode=yes enabled to avoid
+ confusing and non-deterministic ordering of prompts.
+ - ssh(1), ssh-keygen(1): when signing a challenge using a FIDO token,
+ perform hashing of the message to be signed in the middleware layer
+ rather than in OpenSSH code. This permits the use of security key
+ middlewares that perform the hashing implicitly, such as Windows
+ Hello.
+ - ssh(1): fix incorrect error message for "too many known hosts files."
+ - ssh(1): make failures when establishing "Tunnel" forwarding terminate
+ the connection when ExitOnForwardFailure is enabled.
+ - ssh-keygen(1): fix printing of fingerprints on private keys and add a
+ regression test for same.
+ - sshd(8): document order of checking AuthorizedKeysFile (first) and
+ AuthorizedKeysCommand (subsequently, if the file doesn't match).
+ - sshd(8): document that /etc/hosts.equiv and /etc/shosts.equiv are not
+ considered for HostbasedAuthentication when the target user is root.
+ - ssh(1), ssh-keygen(1): fix NULL dereference in private certificate key
+ parsing.
+ - ssh(1), sshd(8): more consistency between sets of %TOKENS are accepted
+ in various configuration options.
+ - ssh(1), ssh-keygen(1): improve error messages for some common PKCS#11
+ C_Login failure cases.
+ - ssh(1), sshd(8): make error messages for problems during SSH banner
+ exchange consistent with other SSH transport-layer error messages and
+ ensure they include the relevant IP addresses.
+ - ssh-keygen(1), ssh-add(1): when downloading FIDO2 resident keys from a
+ token, don't prompt for a PIN until the token has told us that it
+ needs one. Avoids double-prompting on devices that implement
+ on-device authentication (closes: #932071).
+ - sshd(8), ssh-keygen(1): no-touch-required FIDO certificate option
+ should be an extension, not a critical option.
+ - ssh(1), ssh-keygen(1), ssh-add(1): offer a better error message when
+ trying to use a FIDO key function and SecurityKeyProvider is empty.
+ - ssh-add(1), ssh-agent(8): ensure that a key lifetime fits within the
+ values allowed by the wire format (u32). Prevents integer wraparound
+ of the timeout values.
+ - ssh(1): detect and prevent trivial configuration loops when using
+ ProxyJump. bz#3057.
+ - On platforms that do not support setting process-wide routing domains
+ (all excepting OpenBSD at present), fail to accept a configuration
+ attempts to set one at process start time rather than fatally erroring
+ at run time.
+ - Fix theoretical infinite loop in the glob(3) replacement
+ implementation.
+ * Update GSSAPI key exchange patch from
+ https://github.com/openssh-gsskex/openssh-gsskex:
+ - Fix connection through ProxyJump in combination with "GSSAPITrustDNS
+ yes".
+ - Enable SHA2-based GSSAPI key exchange methods by default as RFC 8732
+ was published.
+ * Fix or suppress various shellcheck errors under debian/.
+ * Use AUTOPKGTEST_TMP rather than the deprecated ADTTMP.
+ * Apply upstream patch to fix the handling of Port directives after
+ Include (closes: #962035, LP: #1876320).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 07 Jun 2020 13:44:04 +0100
+
+openssh (1:8.2p1-4) unstable; urgency=medium
+
+ * Add /etc/ssh/ssh_config.d/ to openssh-client.
+ * Add /etc/ssh/sshd_config.d/ to openssh-server (closes: #952427).
+ * Install ssh-sk-helper even on non-Linux architectures, though it will
+ need an external middleware library in those cases.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 26 Feb 2020 10:55:07 +0000
+
+openssh (1:8.2p1-3) unstable; urgency=medium
+
+ * Reupload with -sa to work around confusion with 1:8.2p1-1 being in NEW.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 23 Feb 2020 13:30:01 +0000
+
+openssh (1:8.2p1-2) unstable; urgency=medium
+
+ * Move ssh-sk-helper into openssh-client rather than shipping it in a
+ separate package. The extra library dependencies are pretty small, so
+ it doesn't seem worth bloating the Packages file. Suggested by Bastian
+ Blank.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 23 Feb 2020 11:31:31 +0000
+
+openssh (1:8.2p1-1) unstable; urgency=medium
+
+ * New upstream release (https://www.openssh.com/txt/release-8.2, closes:
+ #951582):
+ - ssh(1), sshd(8), ssh-keygen(1): this release removes the "ssh-rsa"
+ (RSA/SHA1) algorithm from those accepted for certificate signatures
+ (i.e. the client and server CASignatureAlgorithms option) and will use
+ the rsa-sha2-512 signature algorithm by default when the ssh-keygen(1)
+ CA signs new certificates.
+ - ssh(1), sshd(8): Remove diffie-hellman-group14-sha1 from the default
+ key exchange proposal for both the client and server.
+ - ssh-keygen(1): The command-line options related to the generation and
+ screening of safe prime numbers used by the
+ diffie-hellman-group-exchange-* key exchange algorithms have changed.
+ Most options have been folded under the -O flag.
+ - sshd(8): The sshd listener process title visible to ps(1) has changed
+ to include information about the number of connections that are
+ currently attempting authentication and the limits configured by
+ MaxStartups.
+ - Add support for FIDO/U2F hardware authenticators.
+ - ssh-keygen(1): Add a "no-touch-required" option when generating
+ FIDO-hosted keys, that disables their default behaviour of requiring a
+ physical touch/tap on the token during authentication. Note: not all
+ tokens support disabling the touch requirement.
+ - sshd(8): Add a sshd_config PubkeyAuthOptions directive that collects
+ miscellaneous public key authentication-related options for sshd(8).
+ At present it supports only a single option "no-touch-required". This
+ causes sshd to skip its default check for FIDO/U2F keys that the
+ signature was authorised by a touch or press event on the token
+ hardware.
+ - ssh(1), sshd(8), ssh-keygen(1): Add a "no-touch-required" option for
+ authorized_keys and a similar extension for certificates. This option
+ disables the default requirement that FIDO key signatures attest that
+ the user touched their key to authorize them, mirroring the similar
+ PubkeyAuthOptions sshd_config option.
+ - ssh-keygen(1): Add support for the writing the FIDO attestation
+ information that is returned when new keys are generated via the "-O
+ write-attestation=/path" option. FIDO attestation certificates may be
+ used to verify that a FIDO key is hosted in trusted hardware. OpenSSH
+ does not currently make use of this information, beyond optionally
+ writing it to disk.
+ - Add support for FIDO2 resident keys.
+ - sshd(8): Add an Include sshd_config keyword that allows including
+ additional configuration files via glob(3) patterns (closes: #631189).
+ - ssh(1)/sshd(8): Make the LE (low effort) DSCP code point available via
+ the IPQoS directive.
+ - ssh(1): When AddKeysToAgent=yes is set and the key contains no
+ comment, add the key to the agent with the key's path as the comment.
+ - ssh-keygen(1), ssh-agent(1): Expose PKCS#11 key labels and X.509
+ subjects as key comments, rather than simply listing the PKCS#11
+ provider library path.
+ - ssh-keygen(1): Allow PEM export of DSA and ECDSA keys.
+ - sshd(8): When clients get denied by MaxStartups, send a notification
+ prior to the SSH2 protocol banner according to RFC4253 section 4.2
+ (closes: #275458).
+ - ssh(1), ssh-agent(1): When invoking the $SSH_ASKPASS prompt program,
+ pass a hint to the program to describe the type of desired prompt.
+ The possible values are "confirm" (indicating that a yes/no
+ confirmation dialog with no text entry should be shown), "none" (to
+ indicate an informational message only), or blank for the original
+ ssh-askpass behaviour of requesting a password/phrase.
+ - ssh(1): Allow forwarding a different agent socket to the path
+ specified by $SSH_AUTH_SOCK, by extending the existing ForwardAgent
+ option to accepting an explicit path or the name of an environment
+ variable in addition to yes/no.
+ - ssh-keygen(1): Add a new signature operations "find-principals" to
+ look up the principal associated with a signature from an
+ allowed-signers file.
+ - sshd(8): Expose the number of currently-authenticating connections
+ along with the MaxStartups limit in the process title visible to "ps".
+ - sshd(8): Make ClientAliveCountMax=0 have sensible semantics: it will
+ now disable connection killing entirely rather than the current
+ behaviour of instantly killing the connection after the first liveness
+ test regardless of success.
+ - sshd(8): Clarify order of AllowUsers / DenyUsers vs AllowGroups /
+ DenyGroups in the sshd(8) manual page.
+ - sshd(8): Better describe HashKnownHosts in the manual page.
+ - sshd(8): Clarify that that permitopen=/PermitOpen do no name or
+ address translation in the manual page.
+ - sshd(8): Allow the UpdateHostKeys feature to function when multiple
+ known_hosts files are in use. When updating host keys, ssh will now
+ search subsequent known_hosts files, but will add updated host keys to
+ the first specified file only.
+ - All: Replace all calls to signal(2) with a wrapper around
+ sigaction(2). This wrapper blocks all other signals during the
+ handler preventing races between handlers, and sets SA_RESTART which
+ should reduce the potential for short read/write operations.
+ - sftp(1): Fix a race condition in the SIGCHILD handler that could turn
+ in to a kill(-1).
+ - sshd(8): Fix a case where valid (but extremely large) SSH channel IDs
+ were being incorrectly rejected.
+ - ssh(1): When checking host key fingerprints as answers to new hostkey
+ prompts, ignore whitespace surrounding the fingerprint itself.
+ - All: Wait for file descriptors to be readable or writeable during
+ non-blocking connect, not just readable. Prevents a timeout when the
+ server doesn't immediately send a banner (e.g. multiplexers like
+ sslh).
+ - sshd_config(5): Document the sntrup4591761x25519-sha512@tinyssh.org
+ key exchange algorithm.
+ * Add more historical md5sums of /etc/ssh/sshd_config between 1:7.4p1-1
+ and 1:7.8p1-1 inclusive (closes: #951220).
+ * ssh(1): Explain that -Y is equivalent to -X in the default configuration
+ (closes: #951640).
+ * Include /etc/ssh/ssh_config.d/*.conf from /etc/ssh/ssh_config and
+ /etc/ssh/sshd_config.d/*.conf from /etc/ssh/sshd_config (closes:
+ #845315).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 21 Feb 2020 16:36:37 +0000
+
+openssh (1:8.1p1-5) unstable; urgency=medium
+
+ * Apply upstream patches to allow clock_nanosleep() and variants in the
+ seccomp sandbox, fixing failures with glibc 2.31.
+ * Apply upstream patch to deny (non-fatally) ipc in the seccomp sandbox,
+ fixing failures with OpenSSL 1.1.1d and Linux < 3.19 on some
+ architectures (closes: #946242).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 11 Jan 2020 23:55:03 +0000
+
+openssh (1:8.1p1-4) unstable; urgency=medium
+
+ * Apply upstream patch to stop using 2020 as a future date in regress
+ tests.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 09 Jan 2020 11:42:10 +0000
+
+openssh (1:8.1p1-3) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * Drop suggestion of rssh, since it's been removed (see
+ https://bugs.debian.org/923691).
+
+ [ Steve Langasek ]
+ * Don't build openssh-tests on Ubuntu i386 (closes: #948466).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 09 Jan 2020 00:29:58 +0000
+
+openssh (1:8.1p1-2) unstable; urgency=medium
+
+ * Drop "Allow flock and ipc syscall for s390 architecture" patch for now;
+ upstream has security concerns with it and it doesn't currently seem to
+ be needed.
+ * Mark openssh-sftp-server, openssh-tests, ssh, and ssh-askpass-gnome as
+ Multi-Arch: foreign; none of them provide any architecture-dependent
+ interfaces.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 11 Dec 2019 23:53:49 +0000
+
+openssh (1:8.1p1-1) unstable; urgency=medium
+
+ * New upstream release (https://www.openssh.com/txt/release-8.1):
+ - ssh(1), sshd(8), ssh-agent(1): Add protection for private keys at rest
+ in RAM against speculation and memory side-channel attacks like
+ Spectre, Meltdown and Rambleed. This release encrypts private keys
+ when they are not in use with a symmetric key that is derived from a
+ relatively large "prekey" consisting of random data (currently 16KB).
+ - ssh(1): Allow %n to be expanded in ProxyCommand strings.
+ - ssh(1), sshd(8): Allow prepending a list of algorithms to the default
+ set by starting the list with the '^' character, e.g.
+ "HostKeyAlgorithms ^ssh-ed25519".
+ - ssh-keygen(1): Add an experimental lightweight signature and
+ verification ability. Signatures may be made using regular ssh keys
+ held on disk or stored in a ssh-agent and verified against an
+ authorized_keys-like list of allowed keys. Signatures embed a
+ namespace that prevents confusion and attacks between different usage
+ domains (e.g. files vs email).
+ - ssh-keygen(1): Print key comment when extracting public key from a
+ private key.
+ - ssh-keygen(1): Accept the verbose flag when searching for host keys in
+ known hosts (i.e. "ssh-keygen -vF host") to print the matching host's
+ random-art signature too.
+ - All: Support PKCS8 as an optional format for storage of private keys
+ to disk. The OpenSSH native key format remains the default, but PKCS8
+ is a superior format to PEM if interoperability with non-OpenSSH
+ software is required, as it may use a less insecure key derivation
+ function than PEM's.
+ - ssh(1): If a PKCS#11 token returns no keys then try to login and
+ refetch them.
+ - ssh(1): Produce a useful error message if the user's shell is set
+ incorrectly during "match exec" processing.
+ - sftp(1): Allow the maximum uint32 value for the argument passed to -b
+ which allows better error messages from later validation.
+ - ssh-keyscan(1): Include SHA2-variant RSA key algorithms in KEX
+ proposal; allows ssh-keyscan to harvest keys from servers that disable
+ old SHA1 ssh-rsa.
+ - sftp(1): Print explicit "not modified" message if a file was requested
+ for resumed download but was considered already complete.
+ - sftp(1): Fix a typo and make <esc><right> move right to the closest
+ end of a word just like <esc><left> moves left to the closest
+ beginning of a word.
+ - sshd(8): Cap the number of permitopen/permitlisten directives allowed
+ to appear on a single authorized_keys line.
+ - All: Fix a number of memory leaks (one-off or on exit paths).
+ - ssh(1), sshd(8): Check for convtime() refusing to accept times that
+ resolve to LONG_MAX.
+ - ssh(1): Slightly more instructive error message when the user
+ specifies multiple -J options on the command-line (closes: #929669).
+ - ssh-agent(1): Process agent requests for RSA certificate private keys
+ using correct signature algorithm when requested.
+ - sftp(1): Check for user@host when parsing sftp target. This allows
+ user@[1.2.3.4] to work without a path.
+ - sshd(8): Enlarge format buffer size for certificate serial number so
+ the log message can record any 64-bit integer without truncation.
+ - sshd(8): For PermitOpen violations add the remote host and port to be
+ able to more easily ascertain the source of the request. Add the same
+ logging for PermitListen violations which were not previously logged
+ at all.
+ - scp(1), sftp(1): Use the correct POSIX format style for left
+ justification for the transfer progress meter.
+ - sshd(8): When examining a configuration using sshd -T, assume any
+ attribute not provided by -C does not match, which allows it to work
+ when sshd_config contains a Match directive with or without -C.
+ - ssh(1), ssh-keygen(1): Downgrade PKCS#11 "provider returned no slots"
+ warning from log level error to debug. This is common when attempting
+ to enumerate keys on smartcard readers with no cards plugged in.
+ - ssh(1), ssh-keygen(1): Do not unconditionally log in to PKCS#11
+ tokens. Avoids spurious PIN prompts for keys not selected for
+ authentication in ssh(1) and when listing public keys available in a
+ token using ssh-keygen(1).
+ - ssh(1), sshd(8): Fix typo that prevented detection of Linux VRF.
+ - sshd(8): In the Linux seccomp-bpf sandbox, allow mprotect(2) with
+ PROT_(READ|WRITE|NONE) only. This syscall is used by some hardened
+ heap allocators.
+ - sshd(8): In the Linux seccomp-bpf sandbox, allow the s390-specific
+ ioctl for ECC hardware support.
+ * Re-enable hardening on hppa, since the corresponding GCC bug is
+ apparently fixed.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 10 Oct 2019 10:23:19 +0100
+
+openssh (1:8.0p1-7) unstable; urgency=medium
+
+ [ Daniel Kahn Gillmor ]
+ * runit: Correct typo in comment.
+
+ [ Colin Watson ]
+ * Apply upstream patch to deny (non-fatally) shmget/shmat/shmdt in preauth
+ privsep child, coping with changes in OpenSSL 1.1.1d that broke OpenSSH
+ on Linux kernels before 3.19 (closes: #941663).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 05 Oct 2019 22:41:11 +0100
+
+openssh (1:8.0p1-6) unstable; urgency=medium
+
+ * Only run dh_runit on openssh-server (closes: #935936).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 28 Aug 2019 10:53:18 +0100
+
+openssh (1:8.0p1-5) unstable; urgency=medium
+
+ [ Lorenzo Puliti ]
+ * Add a runscript for runit (closes: #933999).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 27 Aug 2019 15:18:54 +0100
+
+openssh (1:8.0p1-4) unstable; urgency=medium
+
+ * Use debhelper-compat instead of debian/compat.
+ * debian/*.apport:
+ - Remove #! lines.
+ - Avoid star imports.
+ - Fix flake8 errors.
+ * Run regression tests against the Python 3 version of Twisted Conch.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 03 Aug 2019 13:33:24 +0100
+
+openssh (1:8.0p1-3) unstable; urgency=medium
+
+ * Upload to unstable.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 08 Jul 2019 17:19:37 +0100
+
+openssh (1:8.0p1-2) experimental; urgency=medium
+
+ * Fix interop tests for recent regress changes.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 14 Jun 2019 14:32:12 +0100
+
+openssh (1:8.0p1-1) experimental; urgency=medium
+
+ * New upstream release (https://www.openssh.com/txt/release-8.0, closes:
+ #927792):
+ - ssh(1), ssh-agent(1), ssh-add(1): Add support for ECDSA keys in
+ PKCS#11 tokens (LP: #1665695).
+ - ssh(1), sshd(8): Add experimental quantum-computing resistant key
+ exchange method, based on a combination of Streamlined NTRU Prime
+ 4591^761 and X25519.
+ - ssh-keygen(1): Increase the default RSA key size to 3072 bits,
+ following NIST Special Publication 800-57's guidance for a 128-bit
+ equivalent symmetric security level (LP: #1445625).
+ - ssh(1): Allow "PKCS11Provider=none" to override later instances of the
+ PKCS11Provider directive in ssh_config.
+ - sshd(8): Add a log message for situations where a connection is
+ dropped for attempting to run a command but a sshd_config
+ ForceCommand=internal-sftp restriction is in effect.
+ - ssh(1): When prompting whether to record a new host key, accept the
+ key fingerprint as a synonym for "yes". This allows the user to paste
+ a fingerprint obtained out of band at the prompt and have the client
+ do the comparison for you.
+ - ssh-keygen(1): When signing multiple certificates on a single
+ command-line invocation, allow automatically incrementing the
+ certificate serial number.
+ - scp(1), sftp(1): Accept -J option as an alias to ProxyJump on the scp
+ and sftp command-lines.
+ - ssh-agent(1), ssh-pkcs11-helper(8), ssh-add(1): Accept "-v"
+ command-line flags to increase the verbosity of output; pass verbose
+ flags though to subprocesses, such as ssh-pkcs11-helper started from
+ ssh-agent.
+ - ssh-add(1): Add a "-T" option to allowing testing whether keys in an
+ agent are usable by performing a signature and a verification.
+ - sftp-server(8): Add a "lsetstat@openssh.com" protocol extension that
+ replicates the functionality of the existing SSH2_FXP_SETSTAT
+ operation but does not follow symlinks.
+ - sftp(1): Add "-h" flag to chown/chgrp/chmod commands to request they
+ do not follow symlinks.
+ - sshd(8): Expose $SSH_CONNECTION in the PAM environment. This makes
+ the connection 4-tuple available to PAM modules that wish to use it in
+ decision-making.
+ - sshd(8): Add a ssh_config "Match final" predicate. Matches in same
+ pass as "Match canonical" but doesn't require hostname
+ canonicalisation be enabled.
+ - sftp(1): Support a prefix of '@' to suppress echo of sftp batch
+ commands.
+ - ssh-keygen(1): When printing certificate contents using "ssh-keygen
+ -Lf /path/certificate", include the algorithm that the CA used to sign
+ the cert.
+ - sshd(8): Fix authentication failures when sshd_config contains
+ "AuthenticationMethods any" inside a Match block that overrides a more
+ restrictive default.
+ - sshd(8): Avoid sending duplicate keepalives when ClientAliveCount is
+ enabled.
+ - sshd(8): Fix two race conditions related to SIGHUP daemon restart.
+ Remnant file descriptors in recently-forked child processes could
+ block the parent sshd's attempt to listen(2) to the configured
+ addresses. Also, the restarting parent sshd could exit before any
+ child processes that were awaiting their re-execution state had
+ completed reading it, leaving them in a fallback path.
+ - ssh(1): Fix stdout potentially being redirected to /dev/null when
+ ProxyCommand=- was in use.
+ - sshd(8): Avoid sending SIGPIPE to child processes if they attempt to
+ write to stderr after their parent processes have exited.
+ - ssh(1): Fix bad interaction between the ssh_config ConnectTimeout and
+ ConnectionAttempts directives - connection attempts after the first
+ were ignoring the requested timeout (LP: #1798049).
+ - ssh-keyscan(1): Return a non-zero exit status if no keys were found
+ (closes: #374980, LP: #1661745).
+ - scp(1): Sanitize scp filenames to allow UTF-8 characters without
+ terminal control sequences.
+ - sshd(8): Fix confusion between ClientAliveInterval and time-based
+ RekeyLimit that could cause connections to be incorrectly closed.
+ - ssh(1), ssh-add(1): Correct some bugs in PKCS#11 token PIN handling at
+ initial token login. The attempt to read the PIN could be skipped in
+ some cases, particularly on devices with integrated PIN readers. This
+ would lead to an inability to retrieve keys from these tokens.
+ - ssh(1), ssh-add(1): Support keys on PKCS#11 tokens that set the
+ CKA_ALWAYS_AUTHENTICATE flag by requring a fresh login after the
+ C_SignInit operation.
+ - ssh(1): Improve documentation for ProxyJump/-J, clarifying that local
+ configuration does not apply to jump hosts.
+ - ssh-keygen(1): Clarify manual - ssh-keygen -e only writes public keys,
+ not private.
+ - ssh(1), sshd(8): be more strict in processing protocol banners,
+ allowing \r characters only immediately before \n.
+ - Various: fix a number of memory leaks.
+ - scp(1), sftp(1): fix calculation of initial bandwidth limits. Account
+ for bytes written before the timer starts and adjust the schedule on
+ which recalculations are performed. Avoids an initial burst of
+ traffic and yields more accurate bandwidth limits.
+ - sshd(8): Only consider the ext-info-c extension during the initial key
+ eschange. It shouldn't be sent in subsequent ones, but if it is
+ present we should ignore it. This prevents sshd from sending a
+ SSH_MSG_EXT_INFO for REKEX for these buggy clients.
+ - ssh-keygen(1): Clarify manual that ssh-keygen -F (find host in
+ authorized_keys) and -R (remove host from authorized_keys) options may
+ accept either a bare hostname or a [hostname]:port combo.
+ - ssh(1): Don't attempt to connect to empty SSH_AUTH_SOCK.
+ - sshd(8): Silence error messages when sshd fails to load some of the
+ default host keys. Failure to load an explicitly-configured hostkey
+ is still an error, and failure to load any host key is still fatal.
+ - ssh(1): Redirect stderr of ProxyCommands to /dev/null when ssh is
+ started with ControlPersist; prevents random ProxyCommand output from
+ interfering with session output.
+ - ssh(1): The ssh client was keeping a redundant ssh-agent socket
+ (leftover from authentication) around for the life of the connection.
+ - sshd(8): Fix bug in HostbasedAcceptedKeyTypes and
+ PubkeyAcceptedKeyTypes options. If only RSA-SHA2 signature types were
+ specified, then authentication would always fail for RSA keys as the
+ monitor checks only the base key (not the signature algorithm) type
+ against *AcceptedKeyTypes.
+ - ssh(1): Request correct signature types from ssh-agent when
+ certificate keys and RSA-SHA2 signatures are in use.
+ - sshd(8): Don't set $MAIL if UsePAM=yes as PAM typically specifies the
+ user environment if it's enabled (closes: #189920, #532754).
+ * Mostly resynced GSSAPI key exchange patch with Fedora. Major changes:
+ - Support selection of GSSAPI key exchange algorithms.
+ - Support GSSAPI key exchange methods with DH and SHA2.
+ - Support GSSAPI key exchange using ECDH and SHA2.
+ - Make sure the Kerberos tickets are cleaned up with the user context.
+ - Enable gssapi-keyex authentication without gssapi-with-mic.
+ - Allow querying for GSSAPI key exchange algorithms from ssh (-Q
+ kex-gss).
+ * Apply upstream patch to fix the utimensat regression tests when not
+ using the compatibility implementation.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 09 Jun 2019 22:47:27 +0100
+
+openssh (1:7.9p1-10) unstable; urgency=medium
+
+ * Temporarily revert IPQoS defaults to pre-7.8 values until issues with
+ "iptables -m tos" and VMware have been fixed (closes: #923879, #926229;
+ LP: #1822370).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 08 Apr 2019 11:13:04 +0100
+
+openssh (1:7.9p1-9) unstable; urgency=medium
+
+ * Apply upstream patch to make scp handle shell-style brace expansions
+ when checking that filenames sent by the server match what the client
+ requested (closes: #923486).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 01 Mar 2019 12:23:36 +0000
+
+openssh (1:7.9p1-8) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * Apply upstream patch to fix bug in HostbasedAcceptedKeyTypes and
+ PubkeyAcceptedKeyTypes options in the case where only RSA-SHA2 signature
+ types were specified.
+ * Apply upstream patch to request RSA-SHA2 signatures for
+ rsa-sha2-{256|512}-cert-v01@openssh.com cert algorithms (closes:
+ #923419).
+ * Move moduli(5) manual page to openssh-server to go with /etc/ssh/moduli;
+ forgotten in 1:7.9p1-5.
+
+ [ Dominik George ]
+ * Correctly handle conffile move to openssh-server (closes: #919344).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 28 Feb 2019 19:31:49 +0000
+
+openssh (1:7.9p1-7) unstable; urgency=medium
+
+ * Recommend "default-logind | logind | libpam-systemd" rather than just
+ libpam-systemd (closes: #923199). (I've retained libpam-systemd as an
+ alternative for a while to avoid backporting accidents, although it can
+ be removed later.)
+ * Pass "--exec /usr/sbin/sshd" to start-stop-daemon on stop as well as
+ start and pass "--chuid 0:0" on start, to avoid problems with non-root
+ groups leaking into the ownership of /run/sshd.pid (closes: #922365).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 26 Feb 2019 15:13:23 +0000
+
+openssh (1:7.9p1-6) unstable; urgency=medium
+
+ * CVE-2019-6109: Apply upstream patches to sanitize scp filenames via
+ snmprintf (closes: #793412).
+ * CVE-2019-6111: Apply upstream patch to check in scp client that
+ filenames sent during remote->local directory copies satisfy the
+ wildcard specified by the user.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 08 Feb 2019 16:26:35 +0000
+
+openssh (1:7.9p1-5) unstable; urgency=high
+
+ * Move /etc/ssh/moduli to openssh-server, since it's reasonably large and
+ only used by sshd (closes: #858050).
+ * Drop obsolete alternate build-dependency on libssl1.0-dev (closes:
+ #917342).
+ * CVE-2018-20685: Apply upstream scp patch to disallow empty incoming
+ filename or ones that refer to the current directory (closes: #919101).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 13 Jan 2019 11:22:45 +0000
+
+openssh (1:7.9p1-4) unstable; urgency=medium
+
+ * Fix Ubuntu detection in debian/rules, since the documentation comment
+ for dpkg_vendor_derives_from is wrong (thanks, Jeremy Bicha; see
+ #913816).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 16 Nov 2018 11:27:28 +0000
+
+openssh (1:7.9p1-3) unstable; urgency=medium
+
+ * Be more specific about what files to install in openssh-tests, to avoid
+ installing a symlink into the build tree.
+ * Re-export debian/upstream/signing-key.asc without extra signatures.
+ * Restore direct test dependencies on openssl, putty-tools, and
+ python-twisted-conch; these are really only indirect dependencies via
+ openssh-tests, but including them means that this package will be
+ retested when they change.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 15 Nov 2018 01:30:56 +0000
+
+openssh (1:7.9p1-2) unstable; urgency=medium
+
+ * Add GitLab CI configuration.
+ * Make the autopkgtest create /run/sshd if it doesn't already exist.
+ * Drop "set -x" verbosity from the autopkgtest; I think we can do without
+ this in most cases nowadays.
+ * Add an openssh-tests binary package containing enough files to run the
+ upstream regression tests. This allows autopkgtest to run more
+ efficiently, as it doesn't have to build part of the source tree again.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 14 Nov 2018 15:55:48 +0000
+
+openssh (1:7.9p1-1) unstable; urgency=medium
+
+ * New upstream release (https://www.openssh.com/txt/release-7.9):
+ - ssh(1), sshd(8): allow most port numbers to be specified using service
+ names from getservbyname(3) (typically /etc/services; closes:
+ #177406).
+ - ssh(1): allow the IdentityAgent configuration directive to accept
+ environment variable names. This supports the use of multiple agent
+ sockets without needing to use fixed paths.
+ - sshd(8): support signalling sessions via the SSH protocol. A limited
+ subset of signals is supported and only for login or command sessions
+ (i.e. not subsystems) that were not subject to a forced command via
+ authorized_keys or sshd_config.
+ - ssh(1): support "ssh -Q sig" to list supported signature options.
+ Also "ssh -Q help" to show the full set of supported queries.
+ - ssh(1), sshd(8): add a CASignatureAlgorithms option for the client and
+ server configs to allow control over which signature formats are
+ allowed for CAs to sign certificates. For example, this allows
+ banning CAs that sign certificates using the RSA-SHA1 signature
+ algorithm.
+ - sshd(8), ssh-keygen(1): allow key revocation lists (KRLs) to revoke
+ keys specified by SHA256 hash.
+ - ssh-keygen(1): allow creation of key revocation lists directly from
+ base64-encoded SHA256 fingerprints. This supports revoking keys using
+ only the information contained in sshd(8) authentication log messages.
+ - ssh(1), ssh-keygen(1): avoid spurious "invalid format" errors when
+ attempting to load PEM private keys while using an incorrect
+ passphrase.
+ - sshd(8): when a channel closed message is received from a client,
+ close the stderr file descriptor at the same time stdout is closed.
+ This avoids stuck processes if they were waiting for stderr to close
+ and were insensitive to stdin/out closing (closes: #844494).
+ - ssh(1): allow ForwardX11Timeout=0 to disable the untrusted X11
+ forwarding timeout and support X11 forwarding indefinitely.
+ Previously the behaviour of ForwardX11Timeout=0 was undefined.
+ - sshd(8): when compiled with GSSAPI support, cache supported method
+ OIDs regardless of whether GSSAPI authentication is enabled in the
+ main section of sshd_config. This avoids sandbox violations if GSSAPI
+ authentication was later enabled in a Match block.
+ - sshd(8): do not fail closed when configured with a text key revocation
+ list that contains a too-short key.
+ - ssh(1): treat connections with ProxyJump specified the same as ones
+ with a ProxyCommand set with regards to hostname canonicalisation
+ (i.e. don't try to canonicalise the hostname unless
+ CanonicalizeHostname is set to 'always').
+ - ssh(1): fix regression in OpenSSH 7.8 that could prevent public-key
+ authentication using certificates hosted in a ssh-agent(1) or against
+ sshd(8) from OpenSSH <7.8 (LP: #1790963).
+ - All: support building against the openssl-1.1 API (releases 1.1.0g and
+ later). The openssl-1.0 API will remain supported at least until
+ OpenSSL terminates security patch support for that API version
+ (closes: #828475).
+ - sshd(8): allow the futex(2) syscall in the Linux seccomp sandbox;
+ apparently required by some glibc/OpenSSL combinations.
+ * Remove dh_builddeb override to use xz compression; this has been the
+ default since dpkg 1.17.0.
+ * Simplify debian/rules using /usr/share/dpkg/default.mk.
+ * Remove /etc/network/if-up.d/openssh-server, as it causes more problems
+ than it solves (thanks, Christian Ehrhardt, Andreas Hasenack, and David
+ Britton; closes: #789532, LP: #1037738, #1674330, #1718227). Add an
+ "if-up hook removed" section to README.Debian documenting the corner
+ case that may need configuration adjustments.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 21 Oct 2018 10:39:24 +0100
+
+openssh (1:7.8p1-1) unstable; urgency=medium
+
+ * New upstream release (https://www.openssh.com/txt/release-7.8, closes:
+ #907534):
+ - ssh-keygen(1): Write OpenSSH format private keys by default instead of
+ using OpenSSL's PEM format (closes: #905407). The OpenSSH format,
+ supported in OpenSSH releases since 2014 and described in the
+ PROTOCOL.key file in the source distribution, offers substantially
+ better protection against offline password guessing and supports key
+ comments in private keys. If necessary, it is possible to write old
+ PEM-style keys by adding "-m PEM" to ssh-keygen's arguments when
+ generating or updating a key.
+ - sshd(8): Remove internal support for S/Key multiple factor
+ authentication. S/Key may still be used via PAM or BSD auth.
+ - ssh(1): Remove vestigial support for running ssh(1) as setuid. This
+ used to be required for hostbased authentication and the (long gone)
+ rhosts-style authentication, but has not been necessary for a long
+ time. Attempting to execute ssh as a setuid binary, or with uid !=
+ effective uid will now yield a fatal error at runtime.
+ - sshd(8): The semantics of PubkeyAcceptedKeyTypes and the similar
+ HostbasedAcceptedKeyTypes options have changed. These now specify
+ signature algorithms that are accepted for their respective
+ authentication mechanism, where previously they specified accepted key
+ types. This distinction matters when using the RSA/SHA2 signature
+ algorithms "rsa-sha2-256", "rsa-sha2-512" and their certificate
+ counterparts. Configurations that override these options but omit
+ these algorithm names may cause unexpected authentication failures (no
+ action is required for configurations that accept the default for
+ these options).
+ - sshd(8): The precedence of session environment variables has changed.
+ ~/.ssh/environment and environment="..." options in authorized_keys
+ files can no longer override SSH_* variables set implicitly by sshd.
+ - ssh(1)/sshd(8): The default IPQoS used by ssh/sshd has changed. They
+ will now use DSCP AF21 for interactive traffic and CS1 for bulk. For
+ a detailed rationale, please see the commit message:
+ https://cvsweb.openbsd.org/src/usr.bin/ssh/readconf.c#rev1.284
+ - ssh(1)/sshd(8): Add new signature algorithms "rsa-sha2-256-cert-
+ v01@openssh.com" and "rsa-sha2-512-cert-v01@openssh.com" to explicitly
+ force use of RSA/SHA2 signatures in authentication.
+ - sshd(8): Extend the PermitUserEnvironment option to accept a whitelist
+ of environment variable names in addition to global "yes" or "no"
+ settings.
+ - sshd(8): Add a PermitListen directive to sshd_config(5) and a
+ corresponding permitlisten= authorized_keys option that control which
+ listen addresses and port numbers may be used by remote forwarding
+ (ssh -R ...).
+ - sshd(8): Add some countermeasures against timing attacks used for
+ account validation/enumeration. sshd will enforce a minimum time or
+ each failed authentication attempt consisting of a global 5ms minimum
+ plus an additional per-user 0-4ms delay derived from a host secret.
+ - sshd(8): Add a SetEnv directive to allow an administrator to
+ explicitly specify environment variables in sshd_config. Variables
+ set by SetEnv override the default and client-specified environment.
+ - ssh(1): Add a SetEnv directive to request that the server sets an
+ environment variable in the session. Similar to the existing SendEnv
+ option, these variables are set subject to server configuration.
+ - ssh(1): Allow "SendEnv -PATTERN" to clear environment variables
+ previously marked for sending to the server (closes: #573316).
+ - ssh(1)/sshd(8): Make UID available as a %-expansion everywhere that
+ the username is available currently.
+ - ssh(1): Allow setting ProxyJump=none to disable ProxyJump
+ functionality.
+ - sshd(8): Avoid observable differences in request parsing that could be
+ used to determine whether a target user is valid.
+ - ssh(1)/sshd(8): Fix some memory leaks.
+ - ssh(1): Fix a pwent clobber (introduced in openssh-7.7) that could
+ occur during key loading, manifesting as crash on some platforms.
+ - sshd_config(5): Clarify documentation for AuthenticationMethods
+ option.
+ - ssh(1): Ensure that the public key algorithm sent in a public key
+ SSH_MSG_USERAUTH_REQUEST matches the content of the signature blob.
+ Previously, these could be inconsistent when a legacy or non-OpenSSH
+ ssh-agent returned a RSA/SHA1 signature when asked to make a RSA/SHA2
+ signature.
+ - sshd(8): Fix failures to read authorized_keys caused by faulty
+ supplemental group caching.
+ - scp(1): Apply umask to directories, fixing potential mkdir/chmod race
+ when copying directory trees.
+ - ssh-keygen(1): Return correct exit code when searching for and hashing
+ known_hosts entries in a single operation.
+ - ssh(1): Prefer the ssh binary pointed to via argv[0] to $PATH when
+ re-executing ssh for ProxyJump.
+ - sshd(8): Do not ban PTY allocation when a sshd session is restricted
+ because the user password is expired as it breaks password change
+ dialog.
+ - ssh(1)/sshd(8): Fix error reporting from select() failures.
+ - ssh(1): Improve documentation for -w (tunnel) flag, emphasising that
+ -w implicitly sets Tunnel=point-to-point.
+ - ssh-agent(1): Implement EMFILE mitigation for ssh-agent. ssh-agent
+ will no longer spin when its file descriptor limit is exceeded.
+ - ssh(1)/sshd(8): Disable SSH2_MSG_DEBUG messages for Twisted Conch
+ clients. Twisted Conch versions that lack a version number in their
+ identification strings will mishandle these messages when running on
+ Python 2.x (https://twistedmatrix.com/trac/ticket/9422).
+ - sftp(1): Notify user immediately when underlying ssh process dies
+ expectedly.
+ - ssh(1)/sshd(8): Fix tunnel forwarding; regression in 7.7 release.
+ - ssh-agent(1): Don't kill ssh-agent's listening socket entirely if it
+ fails to accept(2) a connection.
+ - ssh(1): Add some missing options in the configuration dump output (ssh
+ -G).
+ - sshd(8): Expose details of completed authentication to PAM auth
+ modules via SSH_AUTH_INFO_0 in the PAM environment.
+ * Switch debian/watch to HTTPS.
+ * Temporarily work around https://twistedmatrix.com/trac/ticket/9515 in
+ regression tests.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 30 Aug 2018 15:35:27 +0100
+
+openssh (1:7.7p1-4) unstable; urgency=high
+
+ * CVE-2018-15473: Apply upstream patch to delay bailout for invalid
+ authenticating user until after the packet containing the request has
+ been fully parsed (closes: #906236).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 17 Aug 2018 14:09:32 +0100
+
+openssh (1:7.7p1-3) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * Adjust git-dpm tagging configuration.
+ * Remove no-longer-used Lintian overrides from openssh-server and ssh.
+ * Add Documentation keys to ssh-agent.service, ssh.service, and
+ ssh@.service.
+
+ [ Juri Grabowski ]
+ * Add rescue.target with ssh support.
+
+ [ Christian Ehrhardt ]
+ * Fix unintentional restriction of authorized keys environment options
+ to be alphanumeric (closes: #903474, LP: #1771011).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 10 Jul 2018 16:07:16 +0100
+
+openssh (1:7.7p1-2) unstable; urgency=medium
+
+ * Fix parsing of DebianBanner option (closes: #894730).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 04 Apr 2018 00:47:29 +0100
+
+openssh (1:7.7p1-1) unstable; urgency=medium
+
+ * New upstream release (https://www.openssh.com/txt/release-7.7):
+ - ssh(1)/sshd(8): Drop compatibility support for some very old SSH
+ implementations, including ssh.com <=2.* and OpenSSH <= 3.*. These
+ versions were all released in or before 2001 and predate the final SSH
+ RFCs. The support in question isn't necessary for RFC-compliant SSH
+ implementations.
+ - Add experimental support for PQC XMSS keys (Extended Hash-Based
+ Signatures).
+ - sshd(8): Add an "rdomain" criterion for the sshd_config Match keyword
+ to allow conditional configuration that depends on which routing
+ domain a connection was received on.
+ - sshd_config(5): Add an optional rdomain qualifier to the ListenAddress
+ directive to allow listening on different routing domains.
+ - sshd(8): Add "expiry-time" option for authorized_keys files to allow
+ for expiring keys.
+ - ssh(1): Add a BindInterface option to allow binding the outgoing
+ connection to an interface's address (basically a more usable
+ BindAddress; closes: #289592).
+ - ssh(1): Expose device allocated for tun/tap forwarding via a new %T
+ expansion for LocalCommand. This allows LocalCommand to be used to
+ prepare the interface.
+ - sshd(8): Expose the device allocated for tun/tap forwarding via a new
+ SSH_TUNNEL environment variable. This allows automatic setup of the
+ interface and surrounding network configuration automatically on the
+ server.
+ - ssh(1)/scp(1)/sftp(1): Add URI support to ssh, sftp and scp, e.g.
+ ssh://user@host or sftp://user@host/path. Additional connection
+ parameters described in draft-ietf-secsh-scp-sftp-ssh-uri-04 are not
+ implemented since the ssh fingerprint format in the draft uses the
+ deprecated MD5 hash with no way to specify any other algorithm.
+ - ssh-keygen(1): Allow certificate validity intervals that specify only
+ a start or stop time (instead of both or neither).
+ - sftp(1): Allow "cd" and "lcd" commands with no explicit path argument.
+ lcd will change to the local user's home directory as usual. cd will
+ change to the starting directory for session (because the protocol
+ offers no way to obtain the remote user's home directory).
+ - sshd(8): When doing a config test with sshd -T, only require the
+ attributes that are actually used in Match criteria rather than (an
+ incomplete list of) all criteria.
+ - ssh(1)/sshd(8): More strictly check signature types during key
+ exchange against what was negotiated. Prevents downgrade of RSA
+ signatures made with SHA-256/512 to SHA-1.
+ - sshd(8): Fix support for client that advertise a protocol version of
+ "1.99" (indicating that they are prepared to accept both SSHv1 and
+ SSHv2). This was broken in OpenSSH 7.6 during the removal of SSHv1
+ support.
+ - ssh(1): Warn when the agent returns a ssh-rsa (SHA1) signature when a
+ rsa-sha2-256/512 signature was requested. This condition is possible
+ when an old or non-OpenSSH agent is in use.
+ - ssh-agent(1): Fix regression introduced in 7.6 that caused ssh-agent
+ to fatally exit if presented an invalid signature request message.
+ - sshd_config(5): Accept yes/no flag options case-insensitively, as has
+ been the case in ssh_config(5) for a long time (LP: #1656557).
+ - ssh(1): Improve error reporting for failures during connection. Under
+ some circumstances misleading errors were being shown.
+ - ssh-keyscan(1): Add -D option to allow printing of results directly in
+ SSHFP format.
+ - ssh(1): Compatibility fix for some servers that erroneously drop the
+ connection when the IUTF8 (RFC8160) option is sent.
+ - scp(1): Disable RemoteCommand and RequestTTY in the ssh session
+ started by scp (sftp was already doing this).
+ - ssh-keygen(1): Refuse to create a certificate with an unusable number
+ of principals.
+ - ssh-keygen(1): Fatally exit if ssh-keygen is unable to write all the
+ public key during key generation. Previously it would silently ignore
+ errors writing the comment and terminating newline.
+ - ssh(1): Do not modify hostname arguments that are addresses by
+ automatically forcing them to lower-case. Instead canonicalise them
+ jo resolve ambiguities (e.g. ::0001 => ::1) before they are matched
+ against known_hosts.
+ - ssh(1): Don't accept junk after "yes" or "no" responses to hostkey
+ prompts.
+ - sftp(1): Have sftp print a warning about shell cleanliness when
+ decoding the first packet fails, which is usually caused by shells
+ polluting stdout of non-interactive startups.
+ - ssh(1)/sshd(8): Switch timers in packet code from using wall-clock
+ time to monotonic time, allowing the packet layer to better function
+ over a clock step and avoiding possible integer overflows during
+ steps.
+ - sshd(8): Correctly detect MIPS ABI in use at configure time. Fixes
+ sandbox violations on some environments.
+ - Build and link with "retpoline" flags when available to mitigate the
+ "branch target injection" style (variant 2) of the Spectre
+ branch-prediction vulnerability.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 03 Apr 2018 12:40:24 +0100
+
+openssh (1:7.6p1-5) unstable; urgency=medium
+
+ * Explicitly build-depend on pkg-config, rather than implicitly
+ build-depending on it via libgtk-3-dev (thanks, Aurelien Jarno; closes:
+ #894558).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 01 Apr 2018 21:37:19 +0100
+
+openssh (1:7.6p1-4) unstable; urgency=medium
+
+ * Move VCS to salsa.debian.org.
+ * Add a preseeding-only openssh-server/password-authentication debconf
+ template that can be used to disable password authentication (closes:
+ #878945).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 10 Feb 2018 02:31:46 +0000
+
+openssh (1:7.6p1-3) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * Remove the decade-old ssh-krb5 transitional package; upgrades of
+ openssh-server will preserve existing configuration, and new
+ installations should just enable GSSAPIAuthentication and
+ GSSAPIKeyExchange in sshd_config (closes: #878626).
+ * Support the "noudeb" build profile.
+ * Fix putty-transfer regression test.
+
+ [ Anders Kaseorg ]
+ * debian/systemd/ssh-agent.service: Add missing dbus dependency.
+
+ [ Jason Duerstock ]
+ * Add a "pkg.openssh.nognome" build profile, which disables building the
+ ssh-askpass-gnome binary package and avoids the build-dependency on
+ libgtk-3-dev (closes: #883819).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 16 Jan 2018 17:41:08 +0000
+
+openssh (1:7.6p1-2) unstable; urgency=medium
+
+ * Apply upstream patch to fix PermitOpen argument handling.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 07 Oct 2017 13:44:13 +0100
+
+openssh (1:7.6p1-1) unstable; urgency=medium
+
+ * New upstream release (https://www.openssh.com/txt/release-7.6):
+ - CVE-2017-15906: sftp-server(8): In read-only mode, sftp-server was
+ incorrectly permitting creation of zero-length files. Reported by
+ Michal Zalewski.
+ - ssh(1): Delete SSH protocol version 1 support, associated
+ configuration options and documentation (LP: #1584321).
+ - ssh(1)/sshd(8): Remove support for the hmac-ripemd160 MAC.
+ - ssh(1)/sshd(8): Remove support for the arcfour, blowfish and CAST
+ ciphers.
+ - Refuse RSA keys <1024 bits in length and improve reporting for keys
+ that do not meet this requirement.
+ - ssh(1): Do not offer CBC ciphers by default.
+ - ssh(1): Add RemoteCommand option to specify a command in the ssh
+ config file instead of giving it on the client's command line. This
+ allows the configuration file to specify the command that will be
+ executed on the remote host.
+ - sshd(8): Add ExposeAuthInfo option that enables writing details of the
+ authentication methods used (including public keys where applicable)
+ to a file that is exposed via a $SSH_USER_AUTH environment variable in
+ the subsequent session.
+ - ssh(1): Add support for reverse dynamic forwarding. In this mode, ssh
+ will act as a SOCKS4/5 proxy and forward connections to destinations
+ requested by the remote SOCKS client. This mode is requested using
+ extended syntax for the -R and RemoteForward options and, because it
+ is implemented solely at the client, does not require the server be
+ updated to be supported.
+ - sshd(8): Allow LogLevel directive in sshd_config Match blocks.
+ - ssh-keygen(1): Allow inclusion of arbitrary string or flag certificate
+ extensions and critical options.
+ - ssh-keygen(1): Allow ssh-keygen to use a key held in ssh-agent as a CA
+ when signing certificates.
+ - ssh(1)/sshd(8): Allow IPQoS=none in ssh/sshd to not set an explicit
+ ToS/DSCP value and just use the operating system default.
+ - ssh-add(1): Add -q option to make ssh-add quiet on success.
+ - ssh(1): Expand the StrictHostKeyChecking option with two new settings.
+ The first "accept-new" will automatically accept hitherto-unseen keys
+ but will refuse connections for changed or invalid hostkeys. This is
+ a safer subset of the current behaviour of StrictHostKeyChecking=no.
+ The second setting "off", is a synonym for the current behaviour of
+ StrictHostKeyChecking=no: accept new host keys, and continue
+ connection for hosts with incorrect hostkeys. A future release will
+ change the meaning of StrictHostKeyChecking=no to the behaviour of
+ "accept-new".
+ - ssh(1): Add SyslogFacility option to ssh(1) matching the equivalent
+ option in sshd(8).
+ - ssh(1): Use HostKeyAlias if specified instead of hostname for matching
+ host certificate principal names.
+ - sftp(1): Implement sorting for globbed ls.
+ - ssh(1): Add a user@host prefix to client's "Permission denied"
+ messages, useful in particular when using "stacked" connections (e.g.
+ ssh -J) where it's not clear which host is denying.
+ - ssh(1): Accept unknown EXT_INFO extension values that contain \0
+ characters. These are legal, but would previously cause fatal
+ connection errors if received.
+ - sftp(1): Print '?' instead of incorrect link count (that the protocol
+ doesn't provide) for remote listings.
+ - ssh(1): Return failure rather than fatal() for more cases during
+ session multiplexing negotiations. Causes the session to fall back to
+ a non-mux connection if they occur.
+ - ssh(1): Mention that the server may send debug messages to explain
+ public key authentication problems under some circumstances.
+ - Translate OpenSSL error codes to better report incorrect passphrase
+ errors when loading private keys.
+ - sshd(8): Adjust compatibility patterns for WinSCP to correctly
+ identify versions that implement only the legacy DH group exchange
+ scheme (closes: #877800).
+ - ssh(1): Print the "Killed by signal 1" message only at LogLevel
+ verbose so that it is not shown at the default level; prevents it from
+ appearing during ssh -J and equivalent ProxyCommand configs.
+ - ssh-keygen(1): When generating all hostkeys (ssh-keygen -A), clobber
+ existing keys if they exist but are zero length. Zero-length keys
+ could previously be made if ssh-keygen failed or was interrupted part
+ way through generating them.
+ - ssh-keyscan(1): Avoid double-close() on file descriptors.
+ - sshd(8): Avoid reliance on shared use of pointers shared between
+ monitor and child sshd processes.
+ - sshd_config(8): Document available AuthenticationMethods.
+ - ssh(1): Avoid truncation in some login prompts.
+ - ssh(1): Make "--" before the hostname terminate argument processing
+ after the hostname too (closes: #873201).
+ - ssh-keygen(1): Switch from aes256-cbc to aes256-ctr for encrypting
+ new-style private keys.
+ - ssh(1): Warn and do not attempt to use keys when the public and
+ private halves do not match.
+ - sftp(1): Don't print verbose error message when ssh disconnects from
+ under sftp.
+ - sshd(8): Fix keepalive scheduling problem: prevent activity on a
+ forwarded port from preventing the keepalive from being sent.
+ - sshd(8): When started without root privileges, don't require the
+ privilege separation user or path to exist.
+ - ssh(1)/sshd(8): Correctness fix for channels implementation: accept
+ channel IDs greater than 0x7FFFFFFF.
+ - sshd(8): Expose list of completed authentication methods to PAM via
+ the SSH_AUTH_INFO_0 PAM environment variable.
+ - ssh(1)/sshd(8): Fix several problems in the tun/tap forwarding code,
+ mostly to do with host/network byte order confusion.
+ - sshd(8): Avoid Linux seccomp violations on ppc64le over the socketcall
+ syscall.
+ * Build-depend on debhelper (>= 9.20160709~) rather than dh-systemd.
+ * Change priorities of ssh and ssh-krb5 binary packages to optional, since
+ "Priority: extra" is now deprecated.
+ * Use HTTPS form of copyright-format URL.
+ * Adjust "Running sshd from inittab" instructions in README.Debian to
+ recommend using service(8) rather than calling the init script directly.
+ * Policy version 4.1.0.
+ * Adjust "Per-connection sshd instances with systemd" instructions in
+ README.Debian to recommend using a drop-in file rather than copying and
+ modifying the ssh.socket unit file.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 06 Oct 2017 12:36:48 +0100
+
+openssh (1:7.5p1-10) unstable; urgency=medium
+
+ * Tell haveged to create the pid file we expect.
+ * Give up and use systemctl to start haveged if running under systemd;
+ this shouldn't be necessary, but I can't seem to get things working in
+ the Ubuntu autopkgtest environment otherwise.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 01 Sep 2017 11:17:19 +0100
+
+openssh (1:7.5p1-9) unstable; urgency=medium
+
+ * Run debian/tests/regress with "set -x".
+ * Run haveged without "-w 1024", as setting the low water mark doesn't
+ seem possible in all autopkgtest virtualisation environments.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 31 Aug 2017 13:23:04 +0100
+
+openssh (1:7.5p1-8) unstable; urgency=medium
+
+ * Drop openssh-client-ssh1, now built by a separate source package.
+ * Run haveged during autopkgtests to ensure that they have enough entropy
+ for key generation (LP: #1712921).
+ * Apply patches from https://bugzilla.mindrot.org/show_bug.cgi?id=2752 to
+ allow some extra syscalls for crypto cards on s390x (LP: #1686618).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 28 Aug 2017 12:16:35 +0100
+
+openssh (1:7.5p1-7) unstable; urgency=medium
+
+ * Fix spelling of RuntimeDirectoryMode (closes: #872976).
+ * Add RuntimeDirectory and RuntimeDirectoryMode to ssh@.service as well as
+ ssh.service (closes: #872978).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 23 Aug 2017 12:12:59 +0100
+
+openssh (1:7.5p1-6) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * Test configuration before starting or reloading sshd under systemd
+ (closes: #865770).
+ * Create /run/sshd under systemd using RuntimeDirectory rather than
+ tmpfiles.d (thanks, Dmitry Smirnov; closes: #864190).
+
+ [ Dimitri John Ledkov ]
+ * Drop upstart system and user jobs (closes: #872851).
+
+ [ Chris Lamb ]
+ * Quote IP address in suggested "ssh-keygen -f" calls (closes: #872643).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 23 Aug 2017 01:41:06 +0100
+
+openssh (1:7.5p1-5) unstable; urgency=medium
+
+ * Upload to unstable.
+ * Fix syntax error in debian/copyright.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 18 Jun 2017 12:08:42 +0100
+
+openssh (1:7.5p1-4) experimental; urgency=medium
+
+ * Drop README.Debian section on privilege separation, as it's no longer
+ optional.
+ * Only call "initctl set-env" from agent-launch if $UPSTART_SESSION is set
+ (LP: #1689299).
+ * Fix incoming compression statistics (thanks, Russell Coker; closes:
+ #797964).
+ * Relicense debian/* under a two-clause BSD licence for bidirectional
+ compatibility with upstream, with permission from Matthew Vernon and
+ others.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 06 Jun 2017 15:17:58 +0100
+
+openssh (1:7.5p1-3) experimental; urgency=medium
+
+ * Fix debian/adjust-openssl-dependencies to account for preferring
+ libssl1.0-dev.
+ * Adjust OpenSSL dependencies for openssh-client-ssh1 too.
+ * Fix purge failure when /etc/ssh has already somehow been removed
+ (LP: #1682817).
+ * Ensure that /etc/ssh exists before trying to create /etc/ssh/sshd_config
+ (LP: #1685022).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 02 May 2017 13:51:27 +0100
+
+openssh (1:7.5p1-2) experimental; urgency=medium
+
+ * Add missing header on Linux/s390.
+ * Fix syntax error on Linux/X32.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 02 Apr 2017 13:20:11 +0100
+
+openssh (1:7.5p1-1) experimental; urgency=medium
+
+ * New upstream release (https://www.openssh.com/txt/release-7.5):
+ - SECURITY: ssh(1), sshd(8): Fix weakness in CBC padding oracle
+ countermeasures that allowed a variant of the attack fixed in OpenSSH
+ 7.3 to proceed. Note that the OpenSSH client disables CBC ciphers by
+ default, sshd offers them as lowest-preference options and will remove
+ them by default entirely in the next release.
+ - This release deprecates the sshd_config UsePrivilegeSeparation option,
+ thereby making privilege separation mandatory (closes: #407754).
+ - The format of several log messages emitted by the packet code has
+ changed to include additional information about the user and their
+ authentication state. Software that monitors ssh/sshd logs may need
+ to account for these changes.
+ - ssh(1), sshd(8): Support "=-" syntax to easily remove methods from
+ algorithm lists, e.g. Ciphers=-*cbc.
+ - sshd(1): Fix NULL dereference crash when key exchange start messages
+ are sent out of sequence.
+ - ssh(1), sshd(8): Allow form-feed characters to appear in configuration
+ files.
+ - sshd(8): Fix regression in OpenSSH 7.4 support for the server-sig-algs
+ extension, where SHA2 RSA signature methods were not being correctly
+ advertised.
+ - ssh(1), ssh-keygen(1): Fix a number of case-sensitivity bugs in
+ known_hosts processing.
+ - ssh(1): Allow ssh to use certificates accompanied by a private key
+ file but no corresponding plain *.pub public key.
+ - ssh(1): When updating hostkeys using the UpdateHostKeys option, accept
+ RSA keys if HostkeyAlgorithms contains any RSA keytype. Previously,
+ ssh could ignore RSA keys when only the ssh-rsa-sha2-* methods were
+ enabled in HostkeyAlgorithms and not the old ssh-rsa method.
+ - ssh(1): Detect and report excessively long configuration file lines.
+ - Merge a number of fixes found by Coverity and reported via Redhat and
+ FreeBSD. Includes fixes for some memory and file descriptor leaks in
+ error paths.
+ - ssh(1), sshd(8): When logging long messages to stderr, don't truncate
+ "\r\n" if the length of the message exceeds the buffer.
+ - ssh(1): Fully quote [host]:port in generated ProxyJump/-J command-
+ line; avoid confusion over IPv6 addresses and shells that treat square
+ bracket characters specially.
+ - Fix various fallout and sharp edges caused by removing SSH protocol 1
+ support from the server, including the server banner string being
+ incorrectly terminated with only \n (instead of \r\n), confusing error
+ messages from ssh-keyscan, and a segfault in sshd if protocol v.1 was
+ enabled for the client and sshd_config contained references to legacy
+ keys.
+ - ssh(1), sshd(8): Free fd_set on connection timeout.
+ - sftp(1): Fix division by zero crash in "df" output when server returns
+ zero total filesystem blocks/inodes.
+ - ssh(1), ssh-add(1), ssh-keygen(1), sshd(8): Translate OpenSSL errors
+ encountered during key loading to more meaningful error codes.
+ - ssh-keygen(1): Sanitise escape sequences in key comments sent to
+ printf but preserve valid UTF-8 when the locale supports it.
+ - ssh(1), sshd(8): Return reason for port forwarding failures where
+ feasible rather than always "administratively prohibited".
+ - sshd(8): Fix deadlock when AuthorizedKeysCommand or
+ AuthorizedPrincipalsCommand produces a lot of output and a key is
+ matched early.
+ - ssh(1): Fix typo in ~C error message for bad port forward
+ cancellation.
+ - ssh(1): Show a useful error message when included config files can't
+ be opened.
+ - sshd_config(5): Repair accidentally-deleted mention of %k token in
+ AuthorizedKeysCommand.
+ - sshd(8): Remove vestiges of previously removed LOGIN_PROGRAM.
+ - ssh-agent(1): Relax PKCS#11 whitelist to include libexec and common
+ 32-bit compatibility library directories.
+ - sftp-client(1): Fix non-exploitable integer overflow in SSH2_FXP_NAME
+ response handling.
+ - ssh-agent(1): Fix regression in 7.4 of deleting PKCS#11-hosted keys.
+ It was not possible to delete them except by specifying their full
+ physical path.
+ - sshd(8): Avoid sandbox errors for Linux S390 systems using an ICA
+ crypto coprocessor.
+ - sshd(8): Fix non-exploitable weakness in seccomp-bpf sandbox arg
+ inspection.
+ - ssh-keygen(1), ssh(1), sftp(1): Fix output truncation for various that
+ contain non-printable characters where the codeset in use is ASCII.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 02 Apr 2017 02:58:01 +0100
+
+openssh (1:7.4p1-11) unstable; urgency=medium
+
+ * Fix incoming compression statistics (thanks, Russell Coker; closes:
+ #797964).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 06 Jun 2017 15:03:48 +0100
+
+openssh (1:7.4p1-10) unstable; urgency=medium
+
+ * Move privilege separation directory and PID file from /var/run/ to /run/
+ (closes: #760422, #856825).
+ * Unbreak Unix domain socket forwarding for root (closes: #858252).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 30 Mar 2017 11:19:04 +0100
+
+openssh (1:7.4p1-9) unstable; urgency=medium
+
+ * Fix null pointer dereference in ssh-keygen; this fixes an autopkgtest
+ regression introduced in 1:7.4p1-8.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 16 Mar 2017 13:43:15 +0000
+
+openssh (1:7.4p1-8) unstable; urgency=medium
+
+ * Fix ssh-keygen -H accidentally corrupting known_hosts that contained
+ already-hashed entries (closes: #851734, LP: #1668093).
+ * Fix ssh-keyscan to correctly hash hosts with a port number (closes:
+ #857736, LP: #1670745).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 14 Mar 2017 13:49:14 +0000
+
+openssh (1:7.4p1-7) unstable; urgency=medium
+
+ * Don't set "PermitRootLogin yes" on fresh installations (regression
+ introduced in 1:7.4p1-1; closes: #852781).
+ * Restore reading authorized_keys2 by default. Upstream seems to intend
+ to gradually phase this out, so don't assume that this will remain the
+ default forever. However, we were late in adopting the upstream
+ sshd_config changes, so it makes sense to extend the grace period
+ (closes: #852320).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 05 Mar 2017 02:12:42 +0000
+
+openssh (1:7.4p1-6) unstable; urgency=medium
+
+ * Remove temporary file on exit from postinst (closes: #850275).
+ * Remove LOGIN_PROGRAM and LOGIN_NO_ENDOPT definitions, since UseLogin is
+ gone.
+ * Document sshd_config changes that may be needed following the removal of
+ protocol 1 support from sshd (closes: #851573).
+ * Remove ssh_host_dsa_key from HostKey default (closes: #850614).
+ * Fix rekeying failure with GSSAPI key exchange (thanks, Harald Barth;
+ closes: #819361, LP: #1608965).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 16 Jan 2017 15:11:10 +0000
+
+openssh (1:7.4p1-5) unstable; urgency=medium
+
+ * Create mux socket for regression tests in a temporary directory.
+ * Work around clock_gettime kernel bug on Linux x32 (closes: #849923).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 03 Jan 2017 14:43:28 +0000
+
+openssh (1:7.4p1-4) unstable; urgency=medium
+
+ * Run regression tests inside annotate-output to try to diagnose timeout
+ issues.
+ * Make integrity tests more robust against timeouts in the case where the
+ first test in a series for a given MAC happens to modify the low bytes
+ of a packet length.
+ * Fix race conditions in forwarding tests.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 02 Jan 2017 19:37:23 +0000
+
+openssh (1:7.4p1-3) unstable; urgency=medium
+
+ * Revert attempted hack around regress/forwarding.sh test failure, since
+ it doesn't seem to help.
+ * Run regression tests using 'sh -x' to try to get more information about
+ failures.
+ * Dump some useful log files if regression tests fail.
+ * Tweak regression test setup to cope with the case where some of the
+ source directory is unreadable by the openssh-tests user.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 31 Dec 2016 02:48:17 +0000
+
+openssh (1:7.4p1-2) unstable; urgency=medium
+
+ * Attempt to hack around regress/forwarding.sh test failure in some
+ environments.
+ * Avoid calling into Kerberos libraries from ssh_gssapi_server_mechanisms
+ in the privsep monitor.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 29 Dec 2016 12:02:12 +0000
+
+openssh (1:7.4p1-1) unstable; urgency=medium
+
+ * New upstream release (http://www.openssh.com/txt/release-7.4):
+ - ssh(1): Remove 3des-cbc from the client's default proposal. 64-bit
+ block ciphers are not safe in 2016 and we don't want to wait until
+ attacks like SWEET32 are extended to SSH. As 3des-cbc was the only
+ mandatory cipher in the SSH RFCs, this may cause problems connecting
+ to older devices using the default configuration, but it's highly
+ likely that such devices already need explicit configuration for key
+ exchange and hostkey algorithms already anyway.
+ - sshd(8): When a forced-command appears in both a certificate and an
+ authorized keys/principals command= restriction, sshd will now refuse
+ to accept the certificate unless they are identical. The previous
+ (documented) behaviour of having the certificate forced-command
+ override the other could be a bit confusing and error-prone.
+ - sshd(8): Remove the UseLogin configuration directive and support for
+ having /bin/login manage login sessions.
+ - CVE-2016-10009: ssh-agent(1): Will now refuse to load PKCS#11 modules
+ from paths outside a trusted whitelist (run-time configurable).
+ Requests to load modules could be passed via agent forwarding and an
+ attacker could attempt to load a hostile PKCS#11 module across the
+ forwarded agent channel: PKCS#11 modules are shared libraries, so this
+ would result in code execution on the system running the ssh-agent if
+ the attacker has control of the forwarded agent-socket (on the host
+ running the sshd server) and the ability to write to the filesystem of
+ the host running ssh-agent (usually the host running the ssh client)
+ (closes: #848714).
+ - CVE-2016-10010: sshd(8): When privilege separation is disabled,
+ forwarded Unix-domain sockets would be created by sshd(8) with the
+ privileges of 'root' instead of the authenticated user. This release
+ refuses Unix-domain socket forwarding when privilege separation is
+ disabled (Privilege separation has been enabled by default for 14
+ years) (closes: #848715).
+ - CVE-2016-10011: sshd(8): Avoid theoretical leak of host private key
+ material to privilege-separated child processes via realloc() when
+ reading keys. No such leak was observed in practice for normal-sized
+ keys, nor does a leak to the child processes directly expose key
+ material to unprivileged users (closes: #848716).
+ - CVE-2016-10012: sshd(8): The shared memory manager used by
+ pre-authentication compression support had a bounds checks that could
+ be elided by some optimising compilers. Additionally, this memory
+ manager was incorrectly accessible when pre-authentication compression
+ was disabled. This could potentially allow attacks against the
+ privileged monitor process from the sandboxed privilege-separation
+ process (a compromise of the latter would be required first). This
+ release removes support for pre-authentication compression from
+ sshd(8) (closes: #848717).
+ - SECURITY: sshd(8): Validate address ranges for AllowUser and DenyUsers
+ directives at configuration load time and refuse to accept invalid
+ ones. It was previously possible to specify invalid CIDR address
+ ranges (e.g. user@127.1.2.3/55) and these would always match, possibly
+ resulting in granting access where it was not intended.
+ - ssh(1): Add a proxy multiplexing mode to ssh(1) inspired by the
+ version in PuTTY by Simon Tatham. This allows a multiplexing client
+ to communicate with the master process using a subset of the SSH
+ packet and channels protocol over a Unix-domain socket, with the main
+ process acting as a proxy that translates channel IDs, etc. This
+ allows multiplexing mode to run on systems that lack file-descriptor
+ passing (used by current multiplexing code) and potentially, in
+ conjunction with Unix-domain socket forwarding, with the client and
+ multiplexing master process on different machines. Multiplexing proxy
+ mode may be invoked using "ssh -O proxy ...".
+ - sshd(8): Add a sshd_config DisableForwarding option that disables X11,
+ agent, TCP, tunnel and Unix domain socket forwarding, as well as
+ anything else we might implement in the future. Like the 'restrict'
+ authorized_keys flag, this is intended to be a simple and future-proof
+ way of restricting an account.
+ - sshd(8), ssh(1): Support the "curve25519-sha256" key exchange method.
+ This is identical to the currently-supported method named
+ "curve25519-sha256@libssh.org".
+ - sshd(8): Improve handling of SIGHUP by checking to see if sshd is
+ already daemonised at startup and skipping the call to daemon(3) if it
+ is. This ensures that a SIGHUP restart of sshd(8) will retain the
+ same process-ID as the initial execution. sshd(8) will also now
+ unlink the PidFile prior to SIGHUP restart and re-create it after a
+ successful restart, rather than leaving a stale file in the case of a
+ configuration error.
+ - sshd(8): Allow ClientAliveInterval and ClientAliveCountMax directives
+ to appear in sshd_config Match blocks.
+ - sshd(8): Add %-escapes to AuthorizedPrincipalsCommand to match those
+ supported by AuthorizedKeysCommand (key, key type, fingerprint, etc.)
+ and a few more to provide access to the contents of the certificate
+ being offered.
+ - ssh(1): Allow IdentityFile to successfully load and use certificates
+ that have no corresponding bare public key.
+ - ssh(1): Fix public key authentication when multiple authentication is
+ in use and publickey is not just the first method attempted.
+ - ssh(1): Improve reporting when attempting to load keys from PKCS#11
+ tokens with fewer useless log messages and more detail in debug
+ messages.
+ - ssh(1): When tearing down ControlMaster connections, don't pollute
+ stderr when LogLevel=quiet.
+ - sftp(1): On ^Z wait for underlying ssh(1) to suspend before suspending
+ sftp(1) to ensure that ssh(1) restores the terminal mode correctly if
+ suspended during a password prompt.
+ - ssh(1): Avoid busy-wait when ssh(1) is suspended during a password
+ prompt (LP: #1646813).
+ - ssh(1), sshd(8): Correctly report errors during sending of ext-info
+ messages.
+ - sshd(8): Fix NULL-deref crash if sshd(8) received an out-of-sequence
+ NEWKEYS message.
+ - sshd(8): Correct list of supported signature algorithms sent in the
+ server-sig-algs extension.
+ - sshd(8): Fix sending ext_info message if privsep is disabled.
+ - sshd(8): More strictly enforce the expected ordering of privilege
+ separation monitor calls used for authentication and allow them only
+ when their respective authentication methods are enabled in the
+ configuration.
+ - sshd_config(5): Use 2001:db8::/32, the official IPv6 subnet for
+ configuration examples.
+ - On environments configured with Turkish locales, fall back to the
+ C/POSIX locale to avoid errors in configuration parsing caused by that
+ locale's unique handling of the letters 'i' and 'I' (LP: #1638338).
+ - contrib: Add a gnome-ssh-askpass3 with GTK+3 support.
+ - sshd(8): Improve PRNG reseeding across privilege separation and force
+ libcrypto to obtain a high-quality seed before chroot or sandboxing.
+ * Apply "wrap-and-sort -at -f debian/control -f debian/tests/control".
+ * Remove entries related to protocol 1 from the default sshd_config
+ generated on new installations.
+ * Remove some advice related to protocol 1 from README.Debian.
+ * Start handling /etc/ssh/sshd_config using ucf. The immediate motivation
+ for this is to deal with deprecations of options related to protocol 1,
+ but something like this has been needed for a long time (closes:
+ #419574, #848089):
+ - sshd_config is now a slightly-patched version of upstream's, and only
+ contains non-default settings (closes: #147201).
+ - I've included as many historical md5sums of default versions of
+ sshd_config as I could reconstruct from version control, but I'm sure
+ I've missed some.
+ - Explicitly synchronise the debconf database with the current
+ configuration file state in openssh-server.config, to ensure that the
+ PermitRootLogin setting is properly preserved.
+ - UsePrivilegeSeparation now defaults to the stronger "sandbox" rather
+ than "yes", per upstream.
+ * Remove redundant "GSSAPIDelegateCredentials no" from ssh_config (already
+ the upstream default), and document that setting ServerAliveInterval to
+ 300 by default if BatchMode is set is Debian-specific (closes: #765630).
+ * Build gnome-ssh-askpass with GTK+ 3 (LP: #801187).
+ * When running regression tests under autopkgtest, use a non-root user
+ with passwordless sudo.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 27 Dec 2016 18:01:46 +0000
+
+openssh (1:7.3p1-5) unstable; urgency=medium
+
+ * debian/tests/control: Add dependency on openssl, required by the PuTTY
+ interoperability tests.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 03 Dec 2016 03:43:21 +0000
+
+openssh (1:7.3p1-4) unstable; urgency=medium
+
+ * Adjust Build-Depends further to avoid considering libssl-dev >= 1.1.0~
+ as sufficient.
+ * Move build directories under debian/.
+ * Remove the non-upstream .gitignore file and add the relevant entries to
+ debian/.gitignore, in order to make the source tree more
+ dgit-compatible.
+ * Build all upstream regression test binaries using the new
+ "regress-binaries" target.
+ * Fix and enable PuTTY interoperability tests under autopkgtest.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 02 Dec 2016 20:49:30 +0000
+
+openssh (1:7.3p1-3) unstable; urgency=medium
+
+ * Avoid building with OpenSSL 1.1 for now (see #828475).
+ * Add a missing License line to debian/copyright.
+ * Policy version 3.9.8: no changes required.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 05 Nov 2016 15:37:15 +0000
+
+openssh (1:7.3p1-2) unstable; urgency=high
+
+ * Rewrite debian/copyright using copyright-format 1.0.
+ * CVE-2016-8858: Unregister the KEXINIT handler after message has been
+ received (closes: #841884).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 24 Oct 2016 11:18:00 +0100
+
+openssh (1:7.3p1-1) unstable; urgency=medium
+
+ * New upstream release (http://www.openssh.com/txt/release-7.3):
+ - SECURITY: sshd(8): Mitigate a potential denial-of-service attack
+ against the system's crypt(3) function via sshd(8). An attacker could
+ send very long passwords that would cause excessive CPU use in
+ crypt(3). sshd(8) now refuses to accept password authentication
+ requests of length greater than 1024 characters.
+ - SECURITY: ssh(1), sshd(8): Fix observable timing weakness in the CBC
+ padding oracle countermeasures. Note that CBC ciphers are disabled by
+ default and only included for legacy compatibility.
+ - SECURITY: ssh(1), sshd(8): Improve operation ordering of MAC
+ verification for Encrypt-then-MAC (EtM) mode transport MAC algorithms
+ to verify the MAC before decrypting any ciphertext. This removes the
+ possibility of timing differences leaking facts about the plaintext,
+ though no such leakage has been observed.
+ - ssh(1): Add a ProxyJump option and corresponding -J command-line flag
+ to allow simplified indirection through a one or more SSH bastions or
+ "jump hosts".
+ - ssh(1): Add an IdentityAgent option to allow specifying specific agent
+ sockets instead of accepting one from the environment.
+ - ssh(1): Allow ExitOnForwardFailure and ClearAllForwardings to be
+ optionally overridden when using ssh -W.
+ - ssh(1), sshd(8): Implement support for the IUTF8 terminal mode as per
+ draft-sgtatham-secsh-iutf8-00 (closes: #337041, LP: #394570).
+ - ssh(1), sshd(8): Add support for additional fixed Diffie-Hellman 2K,
+ 4K and 8K groups from draft-ietf-curdle-ssh-kex-sha2-03.
+ - ssh-keygen(1), ssh(1), sshd(8): Support SHA256 and SHA512 RSA
+ signatures in certificates.
+ - ssh(1): Add an Include directive for ssh_config(5) files (closes:
+ #536031).
+ - ssh(1): Permit UTF-8 characters in pre-authentication banners sent
+ from the server.
+ - ssh(1), sshd(8): Reduce the syslog level of some relatively common
+ protocol events from LOG_CRIT.
+ - sshd(8): Refuse AuthenticationMethods="" in configurations and accept
+ AuthenticationMethods=any for the default behaviour of not requiring
+ multiple authentication.
+ - sshd(8): Remove obsolete and misleading "POSSIBLE BREAK-IN ATTEMPT!"
+ message when forward and reverse DNS don't match.
+ - ssh(1): Deduplicate LocalForward and RemoteForward entries to fix
+ failures when both ExitOnForwardFailure and hostname canonicalisation
+ are enabled.
+ - sshd(8): Remove fallback from moduli to obsolete "primes" file that
+ was deprecated in 2001 (LP: #1528251).
+ - sshd_config(5): Correct description of UseDNS: it affects ssh hostname
+ processing for authorized_keys, not known_hosts.
+ - sshd(8): Send ClientAliveInterval pings when a time-based RekeyLimit
+ is set; previously keepalive packets were not being sent.
+ - sshd(8): Whitelist more architectures to enable the seccomp-bpf
+ sandbox.
+ - scp(1): Respect the local user's LC_CTYPE locale (closes: #396295).
+ - Take character display widths into account for the progressmeter
+ (closes: #407088).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 07 Aug 2016 22:45:26 +0100
+
+openssh (1:7.2p2-8) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * Stop enabling ssh-session-cleanup.service by default; instead, ship it
+ as an example and add a section to README.Debian. libpam-systemd >= 230
+ and "UsePAM yes" should take care of the original problem for most
+ systemd users (thanks, Michael Biebl; closes: #832155).
+
+ [ Martin Pitt ]
+ * Add debian/agent-launch: Helper script for conditionally starting the SSH
+ agent in the user session. Use it in ssh-agent.user-session.upstart.
+ * Add systemd user unit for graphical sessions that use systemd. Override
+ the corresponding upstart job in that case (closes: #832445).
+ * debian/openssh-server.if-up: Don't block on a finished reload of
+ openssh.service, to avoid deadlocking with restarting networking.
+ (closes: #832557, LP: #1584393)
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 29 Jul 2016 02:51:32 +0100
+
+openssh (1:7.2p2-7) unstable; urgency=medium
+
+ * Don't stop the ssh-session-cleanup service on upgrade (closes: #832155).
+ This may cause SSH sessions to be killed on upgrade to *this* version if
+ you had previously installed 1:7.2p2-6. Sorry! If your session is
+ killed, you can recover using "dpkg --unpack" on this openssh-server
+ .deb, followed by "dpkg --configure -a".
+ * Recommend libpam-systemd from openssh-server. It's a much better
+ solution than the above for systemd users, but I'm wary of depending on
+ it in case I cause an assortment of exciting dependency problems on
+ upgrade for non-systemd users.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 23 Jul 2016 11:46:33 +0100
+
+openssh (1:7.2p2-6) unstable; urgency=medium
+
+ * debian/watch: Switch to HTTP (thanks, Nicholas Luedtke; closes:
+ #822997).
+ * Copy summary of supported SFTP protocol versions from upstream's
+ PROTOCOL file into the openssh-sftp-server package description (closes:
+ #766887).
+ * Set SSH_PROGRAM=/usr/bin/ssh1 when building openssh-client-ssh1 so that
+ scp1 works (reported by Olivier MATZ).
+ * Retroactively add a NEWS.Debian entry for the UseDNS change in 6.9 (see
+ LP #1588457).
+ * CVE-2016-6210: Mitigate user enumeration via covert timing channel
+ (closes: #831902).
+ * Backport upstream patch to close ControlPersist background process
+ stderr when not in debug mode or when logging to a file or syslog
+ (closes: #714526).
+ * Add a session cleanup script and a systemd unit file to trigger it,
+ which serves to terminate SSH sessions cleanly if systemd doesn't do
+ that itself, often because libpam-systemd is not installed (thanks,
+ Vivek Das Mohapatra, Tom Hutter, and others; closes: #751636).
+ * Stop generating DSA host keys by default (thanks, Santiago Vila; closes:
+ #823827).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 22 Jul 2016 17:06:19 +0100
+
+openssh (1:7.2p2-5) unstable; urgency=medium
+
+ * Backport upstream patch to unbreak authentication using lone certificate
+ keys in ssh-agent: when attempting pubkey auth with a certificate, if no
+ separate private key is found among the keys then try with the
+ certificate key itself (thanks, Paul Querna; LP: #1575961).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 28 Apr 2016 01:52:01 +0100
+
+openssh (1:7.2p2-4) unstable; urgency=medium
+
+ * Drop dependency on libnss-files-udeb (closes: #819686).
+ * Policy version 3.9.7: no changes required.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 15 Apr 2016 16:40:07 +0100
+
+openssh (1:7.2p2-3) unstable; urgency=high
+
+ * Change all openssh.org references to openssh.com (closes: #819213).
+ * CVE-2015-8325: Ignore PAM environment vars when UseLogin=yes.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 13 Apr 2016 16:42:28 +0100
+
+openssh (1:7.2p2-2) unstable; urgency=medium
+
+ * Fix kexgss_server to cope with DH_GRP_MIN/DH_GRP_MAX being stricter on
+ the server end than the client (thanks, Damien Miller; closes: #817870,
+ LP: #1558576).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 21 Mar 2016 12:08:55 +0000
+
+openssh (1:7.2p2-1) unstable; urgency=high
+
+ * New upstream release (http://www.openssh.com/txt/release-7.2p2):
+ - CVE-2016-3115: sshd(8): Sanitise X11 authentication credentials to
+ avoid xauth command injection when X11Forwarding is enabled
+ (http://www.openssh.com/txt/x11fwd.adv).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 10 Mar 2016 13:04:29 +0000
+
+openssh (1:7.2p1-1) unstable; urgency=medium
+
+ * New upstream release (http://www.openssh.com/txt/release-7.2):
+ - This release disables a number of legacy cryptographic algorithms by
+ default in ssh:
+ + Several ciphers blowfish-cbc, cast128-cbc, all arcfour variants and
+ the rijndael-cbc aliases for AES.
+ + MD5-based and truncated HMAC algorithms.
+ These algorithms are already disabled by default in sshd.
+ - ssh(1), sshd(8): Remove unfinished and unused roaming code (was
+ already forcibly disabled in OpenSSH 7.1p2).
+ - ssh(1): Eliminate fallback from untrusted X11 forwarding to trusted
+ forwarding when the X server disables the SECURITY extension.
+ - ssh(1), sshd(8): Increase the minimum modulus size supported for
+ diffie-hellman-group-exchange to 2048 bits.
+ - sshd(8): Pre-auth sandboxing is now enabled by default (previous
+ releases enabled it for new installations via sshd_config).
+ - all: Add support for RSA signatures using SHA-256/512 hash algorithms
+ based on draft-rsa-dsa-sha2-256-03.txt and draft-ssh-ext-info-04.txt.
+ - ssh(1): Add an AddKeysToAgent client option which can be set to 'yes',
+ 'no', 'ask', or 'confirm', and defaults to 'no'. When enabled, a
+ private key that is used during authentication will be added to
+ ssh-agent if it is running (with confirmation enabled if set to
+ 'confirm').
+ - sshd(8): Add a new authorized_keys option "restrict" that includes all
+ current and future key restrictions (no-*-forwarding, etc.). Also add
+ permissive versions of the existing restrictions, e.g. "no-pty" ->
+ "pty". This simplifies the task of setting up restricted keys and
+ ensures they are maximally-restricted, regardless of any permissions
+ we might implement in the future.
+ - ssh(1): Add ssh_config CertificateFile option to explicitly list
+ certificates.
+ - ssh-keygen(1): Allow ssh-keygen to change the key comment for all
+ supported formats (closes: #811125).
+ - ssh-keygen(1): Allow fingerprinting from standard input, e.g.
+ "ssh-keygen -lf -" (closes: #509058).
+ - ssh-keygen(1): Allow fingerprinting multiple public keys in a file,
+ e.g. "ssh-keygen -lf ~/.ssh/authorized_keys".
+ - sshd(8): Support "none" as an argument for sshd_config Foreground and
+ ChrootDirectory. Useful inside Match blocks to override a global
+ default.
+ - ssh-keygen(1): Support multiple certificates (one per line) and
+ reading from standard input (using "-f -") for "ssh-keygen -L"
+ - ssh-keyscan(1): Add "ssh-keyscan -c ..." flag to allow fetching
+ certificates instead of plain keys.
+ - ssh(1): Better handle anchored FQDNs (e.g. 'cvs.openbsd.org.') in
+ hostname canonicalisation - treat them as already canonical and remove
+ the trailing '.' before matching ssh_config.
+ - sftp(1): Existing destination directories should not terminate
+ recursive uploads (regression in OpenSSH 6.8; LP: #1553378).
+ * Use HTTPS for Vcs-* URLs, and link to cgit rather than gitweb.
+ * Restore slogin symlinks for compatibility, although they were removed
+ upstream.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 08 Mar 2016 11:47:20 +0000
+
+openssh (1:7.1p2-2) unstable; urgency=medium
+
+ * Remove protocol 1 host key generation from openssh-server.postinst
+ (closes: #811265).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 17 Jan 2016 14:10:19 +0000
+
+openssh (1:7.1p2-1) unstable; urgency=high
+
+ * New upstream release (http://www.openssh.com/txt/release-7.1p2):
+ - CVE-2016-0777, CVE-2016-0778: Disable experimental client-side support
+ for roaming, which could be tricked by a malicious server into leaking
+ client memory to the server, including private client user keys; this
+ information leak is restricted to connections to malicious or
+ compromised servers (closes: #810984).
+ - SECURITY: Fix an out of-bound read access in the packet handling code.
+ Reported by Ben Hawkes.
+ - Further use of explicit_bzero has been added in various buffer
+ handling code paths to guard against compilers aggressively doing
+ dead-store removal.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 14 Jan 2016 15:28:03 +0000
+
+openssh (1:7.1p1-6) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * Remove explicit "XS-Testsuite: autopkgtest" from debian/control;
+ dpkg-source now figures that out automatically based on the existence of
+ debian/tests/control.
+ * Allow authenticating as root using gssapi-keyex even with
+ "PermitRootLogin prohibit-password" (closes: #809695).
+ * Shuffle PROPOSAL_KEX_ALGS mangling for GSSAPI key exchange a little
+ later in ssh_kex2 so that it's actually effective (closes: #809696).
+
+ [ Michael Biebl ]
+ * Don't call sd_notify when sshd is re-execed (closes: #809035).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 04 Jan 2016 15:09:10 +0000
+
+openssh (1:7.1p1-5) unstable; urgency=medium
+
+ [ Michael Biebl ]
+ * Add systemd readiness notification support (closes: #778913).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 21 Dec 2015 22:10:07 +0000
+
+openssh (1:7.1p1-4) unstable; urgency=medium
+
+ * Backport upstream patch to unbreak connections with peers that set
+ first_kex_follows (LP: #1526357).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 15 Dec 2015 15:40:18 +0000
+
+openssh (1:7.1p1-3) unstable; urgency=medium
+
+ * Drop priority of openssh-client-ssh1 to extra (closes: #807518).
+ * Redirect regression test input from /dev/zero, since otherwise conch
+ will immediately send EOF.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 10 Dec 2015 15:12:10 +0000
+
+openssh (1:7.1p1-2) unstable; urgency=medium
+
+ * Really enable conch interoperability tests under autopkgtest.
+ * Drop SSH1 keepalive patch. Now that SSH1 is disabled at compile-time,
+ it's been rejected upstream and there isn't much point carrying it any
+ more.
+ * Add NEWS.Debian documenting cryptographic changes in OpenSSH 7.0
+ (closes: #806962).
+ * Add an openssh-client-ssh1 binary package for people who need to connect
+ to outdated SSH1-only servers (closes: #807107).
+ * Update "Subsystem sftp" path in example sshd_config (closes: #691004,
+ LP: #1437005).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 08 Dec 2015 15:33:08 +0000
+
+openssh (1:7.1p1-1) unstable; urgency=medium
+
+ * New upstream release (http://www.openssh.com/txt/release-7.0, closes:
+ #785190):
+ - Support for the legacy SSH version 1 protocol is disabled by default
+ at compile time.
+ - Support for the 1024-bit diffie-hellman-group1-sha1 key exchange is
+ disabled by default at run-time. It may be re-enabled using the
+ instructions at http://www.openssh.com/legacy.html
+ - Support for ssh-dss, ssh-dss-cert-* host and user keys is disabled by
+ default at run-time. These may be re-enabled using the instructions
+ at http://www.openssh.com/legacy.html
+ - Support for the legacy v00 cert format has been removed.
+ - The default for the sshd_config(5) PermitRootLogin option has changed
+ from "yes" to "prohibit-password".
+ - PermitRootLogin=without-password/prohibit-password now bans all
+ interactive authentication methods, allowing only public-key,
+ hostbased and GSSAPI authentication (previously it permitted
+ keyboard-interactive and password-less authentication if those were
+ enabled).
+ - ssh_config(5): Add PubkeyAcceptedKeyTypes option to control which
+ public key types are available for user authentication.
+ - sshd_config(5): Add HostKeyAlgorithms option to control which public
+ key types are offered for host authentications.
+ - ssh(1), sshd(8): Extend Ciphers, MACs, KexAlgorithms,
+ HostKeyAlgorithms, PubkeyAcceptedKeyTypes and HostbasedKeyTypes
+ options to allow appending to the default set of algorithms instead of
+ replacing it. Options may now be prefixed with a '+' to append to the
+ default, e.g. "HostKeyAlgorithms=+ssh-dss".
+ - sshd_config(5): PermitRootLogin now accepts an argument of
+ 'prohibit-password' as a less-ambiguous synonym of 'without-
+ password'.
+ - ssh(1), sshd(8): Add compatability workarounds for Cisco and more
+ PuTTY versions.
+ - Fix some omissions and errors in the PROTOCOL and PROTOCOL.mux
+ documentation relating to Unix domain socket forwarding.
+ - ssh(1): Improve the ssh(1) manual page to include a better description
+ of Unix domain socket forwarding (closes: #779068).
+ - ssh(1), ssh-agent(1): Skip uninitialised PKCS#11 slots, fixing
+ failures to load keys when they are present.
+ - ssh(1), ssh-agent(1): Do not ignore PKCS#11 hosted keys that wth empty
+ CKA_ID.
+ - sshd(8): Clarify documentation for UseDNS option.
+ - Check realpath(3) behaviour matches what sftp-server requires and use
+ a replacement if necessary.
+ * New upstream release (http://www.openssh.com/txt/release-7.1):
+ - sshd(8): OpenSSH 7.0 contained a logic error in PermitRootLogin=
+ prohibit-password/without-password that could, depending on
+ compile-time configuration, permit password authentication to root
+ while preventing other forms of authentication. This problem was
+ reported by Mantas Mikulenas.
+ - ssh(1), sshd(8): Add compatibility workarounds for FuTTY.
+ - ssh(1), sshd(8): Refine compatibility workarounds for WinSCP.
+ - Fix a number of memory faults (double-free, free of uninitialised
+ memory, etc) in ssh(1) and ssh-keygen(1). Reported by Mateusz
+ Kocielski.
+ * Change "PermitRootLogin without-password" to the new preferred spelling
+ of "PermitRootLogin prohibit-password" in sshd_config, and update
+ documentation to reflect the new upstream default.
+ * Enable conch interoperability tests under autopkgtest.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 02 Dec 2015 20:18:35 +0000
+
+openssh (1:6.9p1-3) unstable; urgency=medium
+
+ * ssh_config(5): Fix markup errors in description of GSSAPITrustDns
+ (closes: #799271).
+ * Fix dh_install and dh_fixperms overrides to work properly with an
+ architecture-independent-only build (closes: #806090).
+ * Do much less work in architecture-independent-only builds.
+ * Drop ConsoleKit session registration patch; it was only ever enabled for
+ Ubuntu, which no longer needs it (LP: #1334916, #1502045).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 24 Nov 2015 22:48:53 +0000
+
+openssh (1:6.9p1-2) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * mention-ssh-keygen-on-keychange.patch: Move example ssh-keygen
+ invocation onto a separate line to make it easier to copy and paste
+ (LP: #1491532).
+
+ [ Tyler Hicks ]
+ * Build with audit support on Linux (closes: #797727, LP: #1478087).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 10 Sep 2015 12:26:11 +0100
+
+openssh (1:6.9p1-1) unstable; urgency=medium
+
+ * New upstream release (http://www.openssh.com/txt/release-6.8):
+ - sshd(8): UseDNS now defaults to 'no'. Configurations that match
+ against the client host name (via sshd_config or authorized_keys) may
+ need to re-enable it or convert to matching against addresses.
+ - Add FingerprintHash option to ssh(1) and sshd(8), and equivalent
+ command-line flags to the other tools to control algorithm used for
+ key fingerprints. The default changes from MD5 to SHA256 and format
+ from hex to base64.
+ Fingerprints now have the hash algorithm prepended. An example of the
+ new format: SHA256:mVPwvezndPv/ARoIadVY98vAC0g+P/5633yTC4d/wXE
+ Please note that visual host keys will also be different.
+ - ssh(1), sshd(8): Experimental host key rotation support. Add a
+ protocol extension for a server to inform a client of all its
+ available host keys after authentication has completed. The client
+ may record the keys in known_hosts, allowing it to upgrade to better
+ host key algorithms and a server to gracefully rotate its keys.
+ The client side of this is controlled by a UpdateHostkeys config
+ option (default off).
+ - ssh(1): Add a ssh_config HostbasedKeyType option to control which host
+ public key types are tried during host-based authentication.
+ - ssh(1), sshd(8): Fix connection-killing host key mismatch errors when
+ sshd offers multiple ECDSA keys of different lengths.
+ - ssh(1): When host name canonicalisation is enabled, try to parse host
+ names as addresses before looking them up for canonicalisation. Fixes
+ bz#2074 and avoids needless DNS lookups in some cases.
+ - ssh(1), ssh-keysign(8): Make ed25519 keys work for host based
+ authentication.
+ - sshd(8): SSH protocol v.1 workaround for the Meyer, et al,
+ Bleichenbacher Side Channel Attack. Fake up a bignum key before RSA
+ decryption.
+ - sshd(8): Remember which public keys have been used for authentication
+ and refuse to accept previously-used keys. This allows
+ AuthenticationMethods=publickey,publickey to require that users
+ authenticate using two _different_ public keys.
+ - sshd(8): add sshd_config HostbasedAcceptedKeyTypes and
+ PubkeyAcceptedKeyTypes options to allow sshd to control what public
+ key types will be accepted (closes: #481133). Currently defaults to
+ all.
+ - sshd(8): Don't count partial authentication success as a failure
+ against MaxAuthTries.
+ - ssh(1): Add RevokedHostKeys option for the client to allow text-file
+ or KRL-based revocation of host keys.
+ - ssh-keygen(1), sshd(8): Permit KRLs that revoke certificates by serial
+ number or key ID without scoping to a particular CA.
+ - ssh(1): Add a "Match canonical" criteria that allows ssh_config Match
+ blocks to trigger only in the second config pass.
+ - ssh(1): Add a -G option to ssh that causes it to parse its
+ configuration and dump the result to stdout, similar to "sshd -T".
+ - ssh(1): Allow Match criteria to be negated. E.g. "Match !host".
+ - ssh-keyscan(1): ssh-keyscan has been made much more robust against
+ servers that hang or violate the SSH protocol (closes: #241119).
+ - ssh(1), ssh-keygen(1): Fix regression bz#2306: Key path names were
+ being lost as comment fields (closes: #787776).
+ - ssh(1): Allow ssh_config Port options set in the second config parse
+ phase to be applied (they were being ignored; closes: #774369).
+ - ssh(1): Tweak config re-parsing with host canonicalisation - make the
+ second pass through the config files always run when host name
+ canonicalisation is enabled (and not whenever the host name changes)
+ - ssh(1): Fix passing of wildcard forward bind addresses when connection
+ multiplexing is in use.
+ - ssh-keygen(1): Fix broken private key conversion from non-OpenSSH
+ formats.
+ - ssh-keygen(1): Fix KRL generation bug when multiple CAs are in use.
+ * New upstream release (http://www.openssh.com/txt/release-6.9):
+ - CVE-2015-5352: ssh(1): When forwarding X11 connections with
+ ForwardX11Trusted=no, connections made after ForwardX11Timeout expired
+ could be permitted and no longer subject to XSECURITY restrictions
+ because of an ineffective timeout check in ssh(1) coupled with "fail
+ open" behaviour in the X11 server when clients attempted connections
+ with expired credentials (closes: #790798). This problem was reported
+ by Jann Horn.
+ - SECURITY: ssh-agent(1): Fix weakness of agent locking (ssh-add -x) to
+ password guessing by implementing an increasing failure delay, storing
+ a salted hash of the password rather than the password itself and
+ using a timing-safe comparison function for verifying unlock attempts.
+ This problem was reported by Ryan Castellucci.
+ - sshd(8): Support admin-specified arguments to AuthorizedKeysCommand
+ (closes: #740494).
+ - sshd(8): Add AuthorizedPrincipalsCommand that allows retrieving
+ authorized principals information from a subprocess rather than a
+ file.
+ - ssh(1), ssh-add(1): Support PKCS#11 devices with external PIN entry
+ devices.
+ - ssh-keygen(1): Support "ssh-keygen -lF hostname" to search known_hosts
+ and print key hashes rather than full keys.
+ - ssh-agent(1): Add -D flag to leave ssh-agent in foreground without
+ enabling debug mode.
+ - ssh(1), sshd(8): Deprecate legacy SSH2_MSG_KEX_DH_GEX_REQUEST_OLD
+ message and do not try to use it against some 3rd-party SSH
+ implementations that use it (older PuTTY, WinSCP).
+ - ssh(1), sshd(8): Cap DH-GEX group size at 4Kbits for Cisco
+ implementations as some would fail when attempting to use group sizes
+ >4K (closes: #740307, LP: #1287222).
+ - ssh(1): Fix out-of-bound read in EscapeChar configuration option
+ parsing.
+ - sshd(8): Fix application of PermitTunnel, LoginGraceTime,
+ AuthenticationMethods and StreamLocalBindMask options in Match blocks.
+ - ssh(1), sshd(8): Improve disconnection message on TCP reset.
+ - ssh(1): Remove failed remote forwards established by multiplexing from
+ the list of active forwards.
+ - sshd(8): Make parsing of authorized_keys "environment=" options
+ independent of PermitUserEnv being enabled.
+ - sshd(8): Fix post-auth crash with permitopen=none (closes: #778807).
+ - ssh(1), ssh-add(1), ssh-keygen(1): Allow new-format private keys to be
+ encrypted with AEAD ciphers.
+ - ssh(1): Allow ListenAddress, Port and AddressFamily configuration
+ options to appear in any order.
+ - sshd(8): Check for and reject missing arguments for VersionAddendum
+ and ForceCommand.
+ - ssh(1), sshd(8): Don't treat unknown certificate extensions as fatal.
+ - ssh-keygen(1): Make stdout and stderr output consistent.
+ - ssh(1): Mention missing DISPLAY environment in debug log when X11
+ forwarding requested.
+ - sshd(8): Correctly record login when UseLogin is set.
+ - sshd(8): Add some missing options to sshd -T output and fix output of
+ VersionAddendum and HostCertificate.
+ - Document and improve consistency of options that accept a "none"
+ argument: TrustedUserCAKeys, RevokedKeys, AuthorizedPrincipalsFile.
+ - ssh(1): Include remote username in debug output.
+ - sshd(8): Avoid compatibility problem with some versions of Tera Term,
+ which would crash when they received the hostkeys notification message
+ (hostkeys-00@openssh.com).
+ - sshd(8): Mention ssh-keygen -E as useful when comparing legacy MD5
+ host key fingerprints.
+ - ssh(1): Clarify pseudo-terminal request behaviour and make manual
+ language consistent.
+ - ssh(1): Document that the TERM environment variable is not subject to
+ SendEnv and AcceptEnv; bz#2386
+ - sshd(8): Format UsePAM setting when using sshd -T (closes: #767648).
+ - moduli(5): Update DH-GEX moduli (closes: #787037).
+ * There are some things I want to fix before upgrading to 7.0p1, though I
+ intend to do that soon. In the meantime, backport some patches, mainly
+ to fix security issues:
+ - SECURITY: sshd(8): OpenSSH 6.8 and 6.9 incorrectly set TTYs to be
+ world-writable. Local attackers may be able to write arbitrary
+ messages to logged-in users, including terminal escape sequences.
+ Reported by Nikolay Edigaryev.
+ - SECURITY: sshd(8): Fixed a privilege separation weakness related to
+ PAM support. Attackers who could successfully compromise the
+ pre-authentication process for remote code execution and who had valid
+ credentials on the host could impersonate other users. Reported by
+ Moritz Jodeit.
+ - SECURITY: sshd(8): Fixed a use-after-free bug related to PAM support
+ that was reachable by attackers who could compromise the
+ pre-authentication process for remote code execution (closes:
+ #795711). Also reported by Moritz Jodeit.
+ - CVE-2015-5600: sshd(8): Fix circumvention of MaxAuthTries using
+ keyboard-interactive authentication (closes: #793616). By specifying
+ a long, repeating keyboard-interactive "devices" string, an attacker
+ could request the same authentication method be tried thousands of
+ times in a single pass. The LoginGraceTime timeout in sshd(8) and any
+ authentication failure delays implemented by the authentication
+ mechanism itself were still applied. Found by Kingcope.
+ - Let principals-command.sh work for noexec /var/run.
+ * Thanks to Jakub Jelen of Red Hat for Fedora's rebased version of the
+ GSSAPI key exchange patch.
+ * Document the Debian-specific change to the default value of
+ ForwardX11Trusted in ssh(1) (closes: #781469).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 20 Aug 2015 10:38:58 +0100
+
+openssh (1:6.7p1-6) unstable; urgency=medium
+
+ [ Martin Pitt ]
+ * openssh-server.postinst: Quiesce "Unable to connect to Upstart" error
+ message from initctl if upstart is installed, but not the current init
+ system. (LP: #1440070)
+ * openssh-server.postinst: Fix version comparisons of upgrade adjustments
+ to not apply to fresh installs.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 19 Apr 2015 14:32:43 +0100
+
+openssh (1:6.7p1-5) unstable; urgency=medium
+
+ * Revert change from previous upload, which causes far more trouble than
+ it is worth (closes: #780797):
+ - Send/accept only specific known LC_* variables, rather than using a
+ wildcard.
+ * Add a NEWS.Debian entry documenting this reversion, as it is too
+ difficult to undo the sshd_config change automatically without
+ compounding the problem of (arguably) overwriting user configuration.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 22 Mar 2015 23:20:56 +0000
+
+openssh (1:6.7p1-4) unstable; urgency=medium
+
+ * Send/accept only specific known LC_* variables, rather than using a
+ wildcard (closes: #765633).
+ * Document interactions between ListenAddress/Port and ssh.socket in
+ README.Debian (closes: #764842).
+ * Debconf translations:
+ - Brazilian Portuguese (thanks, José de Figueiredo; closes: #771859).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 18 Mar 2015 15:34:13 +0000
+
+openssh (1:6.7p1-3) unstable; urgency=medium
+
+ * Debconf translations:
+ - Dutch (thanks, Frans Spiesschaert; closes: #765851).
+ * Assume that dpkg-statoverride exists and drop the test for an obsolete
+ compatibility path.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 03 Nov 2014 20:29:52 +0000
+
+openssh (1:6.7p1-2) unstable; urgency=medium
+
+ * debian/tests/control: Drop isolation-container, since the tests run on a
+ high port. They're still not guaranteed to run correctly in an schroot,
+ but may manage to work, so this lets the tests at least try to run on
+ ci.debian.net.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 10 Oct 2014 10:47:19 +0100
+
+openssh (1:6.7p1-1) unstable; urgency=medium
+
+ * New upstream release (http://www.openssh.com/txt/release-6.7):
+ - sshd(8): The default set of ciphers and MACs has been altered to
+ remove unsafe algorithms. In particular, CBC ciphers and arcfour* are
+ disabled by default. The full set of algorithms remains available if
+ configured explicitly via the Ciphers and MACs sshd_config options.
+ - ssh(1), sshd(8): Add support for Unix domain socket forwarding. A
+ remote TCP port may be forwarded to a local Unix domain socket and
+ vice versa or both ends may be a Unix domain socket (closes: #236718).
+ - ssh(1), ssh-keygen(1): Add support for SSHFP DNS records for ED25519
+ key types.
+ - sftp(1): Allow resumption of interrupted uploads.
+ - ssh(1): When rekeying, skip file/DNS lookups of the hostkey if it is
+ the same as the one sent during initial key exchange.
+ - sshd(8): Allow explicit ::1 and 127.0.0.1 forwarding bind addresses
+ when GatewayPorts=no; allows client to choose address family.
+ - sshd(8): Add a sshd_config PermitUserRC option to control whether
+ ~/.ssh/rc is executed, mirroring the no-user-rc authorized_keys
+ option.
+ - ssh(1): Add a %C escape sequence for LocalCommand and ControlPath that
+ expands to a unique identifier based on a hash of the tuple of (local
+ host, remote user, hostname, port). Helps avoid exceeding miserly
+ pathname limits for Unix domain sockets in multiplexing control paths.
+ - sshd(8): Make the "Too many authentication failures" message include
+ the user, source address, port and protocol in a format similar to the
+ authentication success / failure messages.
+ - Use CLOCK_BOOTTIME in preference to CLOCK_MONOTONIC when it is
+ available. It considers time spent suspended, thereby ensuring
+ timeouts (e.g. for expiring agent keys) fire correctly (closes:
+ #734553).
+ - Use prctl() to prevent sftp-server from accessing
+ /proc/self/{mem,maps}.
+ * Restore TCP wrappers support, removed upstream in 6.7. It is true that
+ dropping this reduces preauth attack surface in sshd. On the other
+ hand, this support seems to be quite widely used, and abruptly dropping
+ it (from the perspective of users who don't read openssh-unix-dev) could
+ easily cause more serious problems in practice. It's not entirely clear
+ what the right long-term answer for Debian is, but it at least probably
+ doesn't involve dropping this feature shortly before a freeze.
+ * Replace patch to disable OpenSSL version check with an updated version
+ of Kurt Roeckx's patch from #732940 to just avoid checking the status
+ field.
+ * Build-depend on a new enough dpkg-dev for dpkg-buildflags, rather than
+ simply a new enough dpkg.
+ * Simplify debian/rules using /usr/share/dpkg/buildflags.mk.
+ * Use Package-Type rather than XC-Package-Type, now that it is an official
+ field.
+ * Run a subset of the upstream regression test suite at package build
+ time, and the rest of it under autopkgtest.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 09 Oct 2014 14:05:56 +0100
+
+openssh (1:6.6p1-8) unstable; urgency=medium
+
+ * Make the if-up hook use "reload" rather than "restart" if the system was
+ booted using systemd (closes: #756547).
+ * Show fingerprints of new keys after creating them in the postinst
+ (closes: #762128).
+ * Policy version 3.9.6: no changes required.
+ * Don't link /usr/share/doc/ssh to openssh-client, as this is not safe
+ between Architecture: all and Architecture: any binary packages (closes:
+ #763375).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 03 Oct 2014 12:23:57 +0100
+
+openssh (1:6.6p1-7) unstable; urgency=medium
+
+ * Make sure that DEB_HOST_ARCH is set, even when invoking debian/rules
+ directly.
+ * Use dh-exec to simplify override_dh_install target.
+ * Remove several unnecessary entries in debian/*.dirs.
+ * Pass noupdate to the second call to pam_motd, not the first (thanks, Ken
+ T Takusagawa; closes: #757059).
+ * Debconf translations:
+ - Turkish (thanks, Mert Dirik; closes: #756757).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 05 Aug 2014 09:10:04 +0100
+
+openssh (1:6.6p1-6) unstable; urgency=medium
+
+ * Upgrade to debhelper v9.
+ * Only use pam_keyinit on Linux architectures (closes: #747245).
+ * Make get_config_option more robust against trailing whitespace (thanks,
+ LaMont Jones).
+ * Debconf translations:
+ - Czech (thanks, Michal Šimůnek; closes: #751419).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 28 Jun 2014 14:50:04 +0100
+
+openssh (1:6.6p1-5) unstable; urgency=medium
+
+ * Force ssh-agent Upstart job to use sh syntax regardless of the user's
+ shell (thanks, Steffen Stempel; LP: #1312928).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 01 May 2014 16:27:53 +0100
+
+openssh (1:6.6p1-4) unstable; urgency=medium
+
+ * Debconf translations:
+ - Spanish (thanks, Matías Bellone; closes: #744867).
+ * Apply upstream-recommended patch to fix bignum encoding for
+ curve25519-sha256@libssh.org, fixing occasional key exchange failures.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 21 Apr 2014 21:29:53 +0100
+
+openssh (1:6.6p1-3) unstable; urgency=medium
+
+ * Debconf translations:
+ - French (thanks, Étienne Gilli; closes: #743242).
+ * Never signal the service supervisor with SIGSTOP more than once, to
+ prevent a hang on re-exec (thanks, Robie Basak; LP: #1306877).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 14 Apr 2014 12:11:50 +0100
+
+openssh (1:6.6p1-2) unstable; urgency=medium
+
+ * If no root password is set, then switch to "PermitRootLogin
+ without-password" without asking (LP: #1300127).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 31 Mar 2014 12:20:46 +0100
+
+openssh (1:6.6p1-1) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * Apply various warning-suppression and regression-test fixes to
+ gssapi.patch from Damien Miller.
+ * New upstream release (http://www.openssh.com/txt/release-6.6,
+ LP: #1298280):
+ - CVE-2014-2532: sshd(8): when using environment passing with an
+ sshd_config(5) AcceptEnv pattern with a wildcard, OpenSSH prior to 6.6
+ could be tricked into accepting any environment variable that contains
+ the characters before the wildcard character.
+ * Re-enable btmp logging, as its permissions were fixed a long time ago in
+ response to #370050 (closes: #341883).
+ * Change to "PermitRootLogin without-password" for new installations, and
+ ask a debconf question when upgrading systems with "PermitRootLogin yes"
+ from previous versions (closes: #298138).
+ * Debconf translations:
+ - Danish (thanks, Joe Hansen).
+ - Portuguese (thanks, Américo Monteiro).
+ - Russian (thanks, Yuri Kozlov; closes: #742308).
+ - Swedish (thanks, Andreas Rönnquist).
+ - Japanese (thanks, victory).
+ - German (thanks, Stephan Beck; closes: #742541).
+ - Italian (thanks, Beatrice Torracca).
+ * Don't start ssh-agent from the Upstart user session job if something
+ like Xsession has already done so (based on work by Bruno Vasselle;
+ LP: #1244736).
+
+ [ Matthew Vernon ]
+ * CVE-2014-2653: Fix failure to check SSHFP records if server presents a
+ certificate (bug reported by me, patch by upstream's Damien Miller;
+ thanks also to Mark Wooding for his help in fixing this) (Closes:
+ #742513)
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 28 Mar 2014 18:04:41 +0000
+
+openssh (1:6.5p1-6) unstable; urgency=medium
+
+ * Fix Breaks/Replaces versions of openssh-sftp-server on openssh-server
+ (thanks, Axel Beckert).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 06 Mar 2014 16:18:44 +0000
+
+openssh (1:6.5p1-5) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * Add Alias=sshd.service to systemd ssh.service file, to match "Provides:
+ sshd" in the sysvinit script (thanks, Michael Biebl).
+ * Add Before=ssh.service to systemd ssh.socket file, since otherwise
+ nothing guarantees that ssh.service has stopped before ssh.socket starts
+ (thanks, Uoti Urpala).
+
+ [ Axel Beckert ]
+ * Split sftp-server into its own package to allow it to also be used by
+ other SSH server implementations like dropbear (closes: #504290).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 05 Mar 2014 13:53:08 +0000
+
+openssh (1:6.5p1-4) unstable; urgency=medium
+
+ * Configure --without-hardening on hppa, to work around
+ http://gcc.gnu.org/bugzilla/show_bug.cgi?id=60155 (closes: #738798).
+ * Amend "Running sshd from inittab" instructions in README.Debian to
+ recommend 'update-rc.d ssh disable', rather than manual removal of rc*.d
+ symlinks that won't work with dependency-based sysv-rc.
+ * Remove code related to non-dependency-based sysv-rc ordering, since that
+ is no longer supported.
+ * Apply patch from https://bugzilla.mindrot.org/show_bug.cgi?id=2200 to
+ fix getsockname errors when using "ssh -W" (closes: #738693).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 15 Feb 2014 02:19:36 +0000
+
+openssh (1:6.5p1-3) unstable; urgency=medium
+
+ * Clarify socket activation mode in README.Debian, as suggested by Uoti
+ Urpala.
+ * Stop claiming that "Protocol 2" is a Debian-specific default; this has
+ been upstream's default since 5.4p1.
+ * Avoid stdout noise from which(1) on purge of openssh-client.
+ * Fix sysvinit->systemd transition code to cope with still-running
+ sysvinit jobs being considered active by systemd (thanks, Uoti Urpala
+ and Michael Biebl).
+ * Bump guard version for sysvinit->systemd transition to 1:6.5p1-3; we may
+ have got it wrong before, and it's fairly harmless to repeat it.
+ * Remove tests for whether /dev/null is a character device from the
+ Upstart job and the systemd service files; it's there to avoid a
+ confusing failure mode in daemon(), but with modern init systems we use
+ the -D option to suppress daemonisation anyway.
+ * Refer to /usr/share/common-licenses/GPL-2 in debian/copyright (for the
+ Debian patch) rather than plain GPL.
+ * Drop some very old Conflicts and Replaces (ssh (<< 1:3.8.1p1-9),
+ rsh-client (<< 0.16.1-1), ssh-krb5 (<< 1:4.3p2-7), ssh-nonfree (<< 2),
+ and openssh-client (<< 1:3.8.1p1-11)). These all relate to pre-etch
+ versions, for which we no longer have maintainer script code, and per
+ policy they would have to become Breaks nowadays anyway.
+ * Policy version 3.9.5.
+ * Drop unnecessary -1 in zlib1g Build-Depends version.
+ * Tweak dh_systemd_enable invocations to avoid lots of error noise.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 12 Feb 2014 13:10:08 +0000
+
+openssh (1:6.5p1-2) unstable; urgency=medium
+
+ * Only enable ssh.service for systemd, not both ssh.service and
+ ssh.socket. Thanks to Michael Biebl for spotting this.
+ * Backport upstream patch to unbreak case-sensitive matching of ssh_config
+ (closes: #738619).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 11 Feb 2014 11:28:35 +0000
+
+openssh (1:6.5p1-1) unstable; urgency=medium
+
+ * New upstream release (http://www.openssh.com/txt/release-6.5,
+ LP: #1275068):
+ - ssh(1): Add support for client-side hostname canonicalisation using a
+ set of DNS suffixes and rules in ssh_config(5). This allows
+ unqualified names to be canonicalised to fully-qualified domain names
+ to eliminate ambiguity when looking up keys in known_hosts or checking
+ host certificate names (closes: #115286).
+ * Switch to git; adjust Vcs-* fields.
+ * Convert to git-dpm, and drop source package documentation associated
+ with the old bzr/quilt patch handling workflow.
+ * Drop ssh-vulnkey and the associated ssh/ssh-add/sshd integration code,
+ leaving only basic configuration file compatibility, since it has been
+ nearly six years since the original vulnerability and this code is not
+ likely to be of much value any more (closes: #481853, #570651). See
+ https://lists.debian.org/debian-devel/2013/09/msg00240.html for my full
+ reasoning.
+ * Add OpenPGP signature checking configuration to watch file (thanks,
+ Daniel Kahn Gillmor; closes: #732441).
+ * Add the pam_keyinit session module, to create a new session keyring on
+ login (closes: #734816).
+ * Incorporate default path changes from shadow 1:4.0.18.1-8, removing
+ /usr/bin/X11 (closes: #644521).
+ * Generate ED25519 host keys on fresh installations. Upgraders who wish
+ to add such host keys should manually add 'HostKey
+ /etc/ssh/ssh_host_ed25519_key' to /etc/ssh/sshd_config and run
+ 'ssh-keygen -q -f /etc/ssh/ssh_host_ed25519_key -N "" -t ed25519'.
+ * Drop long-obsolete "SSH now uses protocol 2 by default" section from
+ README.Debian.
+ * Add systemd support (thanks, Sven Joachim; closes: #676830).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 10 Feb 2014 14:58:26 +0000
+
+openssh (1:6.4p1-2) unstable; urgency=high
+
+ * Increase ServerKeyBits value in package-generated sshd_config to 1024
+ (closes: #727622, LP: #1244272).
+ * Restore patch to disable OpenSSL version check (closes: #732940).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 23 Dec 2013 10:44:04 +0000
+
+openssh (1:6.4p1-1) unstable; urgency=high
+
+ * New upstream release. Important changes:
+ - 6.3/6.3p1 (http://www.openssh.com/txt/release-6.3):
+ + sftp(1): add support for resuming partial downloads using the
+ "reget" command and on the sftp commandline or on the "get"
+ commandline using the "-a" (append) option (closes: #158590).
+ + ssh(1): add an "IgnoreUnknown" configuration option to selectively
+ suppress errors arising from unknown configuration directives
+ (closes: #436052).
+ + sftp(1): update progressmeter when data is acknowledged, not when
+ it's sent (partially addresses #708372).
+ + ssh(1): do not fatally exit when attempting to cleanup multiplexing-
+ created channels that are incompletely opened (closes: #651357).
+ - 6.4/6.4p1 (http://www.openssh.com/txt/release-6.4):
+ + CVE-2013-4548: sshd(8): fix a memory corruption problem triggered
+ during rekeying when an AES-GCM cipher is selected (closes:
+ #729029). Full details of the vulnerability are available at:
+ http://www.openssh.com/txt/gcmrekey.adv
+ * When running under Upstart, only consider the daemon started once it is
+ ready to accept connections (by raising SIGSTOP at that point and using
+ "expect stop").
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 09 Nov 2013 18:24:16 +0000
+
+openssh (1:6.2p2-6) unstable; urgency=low
+
+ * Update config.guess and config.sub automatically at build time.
+ dh_autoreconf does not take care of that by default because openssh does
+ not use automake.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 02 Jul 2013 22:54:49 +0100
+
+openssh (1:6.2p2-5) unstable; urgency=low
+
+ [ Colin Watson ]
+ * Document consequences of ssh-agent being setgid in ssh-agent(1); see
+ #711623.
+ * Use 'set -e' rather than '#! /bin/sh -e' in maintainer scripts and
+ ssh-argv0.
+
+ [ Yolanda Robla ]
+ * debian/rules: Include real distribution in SSH_EXTRAVERSION instead of
+ hardcoding Debian (LP: #1195342).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 27 Jun 2013 15:24:14 +0100
+
+openssh (1:6.2p2-4) unstable; urgency=low
+
+ * Fix non-portable shell in ssh-copy-id (closes: #711162).
+ * Rebuild against debhelper 9.20130604 with fixed dependencies for
+ invoke-rc.d and Upstart jobs (closes: #711159, #711364).
+ * Set SELinux context on private host keys as well as public host keys
+ (closes: #687436).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 06 Jun 2013 17:06:31 +0100
+
+openssh (1:6.2p2-3) unstable; urgency=low
+
+ * If the running init daemon is Upstart, then, on the first upgrade to
+ this version, check whether sysvinit is still managing sshd; if so,
+ manually stop it so that it can be restarted under upstart. We do this
+ near the end of the postinst, so it shouldn't result in any appreciable
+ extra window where sshd is not running during upgrade.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 22 May 2013 17:42:10 +0100
+
+openssh (1:6.2p2-2) unstable; urgency=low
+
+ * Change start condition of Upstart job to be just the standard "runlevel
+ [2345]", rather than "filesystem or runlevel [2345]"; the latter makes
+ it unreasonably difficult to ensure that urandom starts before ssh, and
+ is not really necessary since one of static-network-up and failsafe-boot
+ is guaranteed to happen and will trigger entry to the default runlevel,
+ and we don't care about ssh starting before the network (LP: #1098299).
+ * Drop conffile handling for direct upgrades from pre-split ssh package;
+ this was originally added in 1:4.3p2-7 / 1:4.3p2-8, and contained a
+ truly ghastly hack around a misbehaviour in sarge's dpkg. Since this is
+ now four Debian releases ago, we can afford to drop this and simplify
+ the packaging.
+ * Remove ssh/use_old_init_script, which was a workaround for a very old
+ bug in /etc/init.d/ssh. If anyone has ignored this for >10 years then
+ they aren't going to be convinced now (closes: #214182).
+ * Remove support for upgrading directly from ssh-nonfree.
+ * Remove lots of maintainer script support for direct upgrades from
+ pre-etch (three releases before current stable).
+ * Add #DEBHELPER# tokens to openssh-client.postinst and
+ openssh-server.postinst.
+ * Replace old manual conffile handling code with dpkg-maintscript-helper,
+ via dh_installdeb.
+ * Switch to new unified layout for Upstart jobs as documented in
+ https://wiki.ubuntu.com/UpstartCompatibleInitScripts: the init script
+ checks for a running Upstart, and we now let dh_installinit handle most
+ of the heavy lifting in maintainer scripts. Ubuntu users should be
+ essentially unaffected except that sshd may no longer start
+ automatically in chroots if the running Upstart predates 0.9.0; but the
+ main goal is simply not to break when openssh-server is installed in a
+ chroot.
+ * Remove the check for vulnerable host keys; this was first added five
+ years ago, and everyone should have upgraded through a version that
+ applied these checks by now. The ssh-vulnkey tool and the blacklisting
+ support in sshd are still here, at least for the moment.
+ * This removes the last of our uses of debconf (closes: #221531).
+ * Use the pam_loginuid session module (thanks, Laurent Bigonville; closes:
+ #677440, LP: #1067779).
+ * Bracket our session stack with calls to pam_selinux close/open (thanks,
+ Laurent Bigonville; closes: #679458).
+ * Fix dh_builddeb invocation so that we really use xz compression for
+ binary packages, as intended since 1:6.1p1-2.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 22 May 2013 09:07:42 +0100
+
+openssh (1:6.2p2-1) unstable; urgency=low
+
+ * New upstream release (http://www.openssh.com/txt/release-6.2p2):
+ - Only warn for missing identity files that were explicitly specified
+ (closes: #708275).
+ - Fix bug in contributed contrib/ssh-copy-id script that could result in
+ "rm *" being called on mktemp failure (closes: #708419).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 16 May 2013 14:05:06 +0100
+
+openssh (1:6.2p1-3) unstable; urgency=low
+
+ * Renumber Debian-specific additions to enum monitor_reqtype so that they
+ fit within a single byte (thanks, Jason Conti; LP: #1179202).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 13 May 2013 10:56:04 +0100
+
+openssh (1:6.2p1-2) unstable; urgency=low
+
+ * Fix build failure on Ubuntu:
+ - Include openbsd-compat/sys-queue.h from consolekit.c.
+ - Fix consolekit mismerges in monitor.c and monitor_wrap.c.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 09 May 2013 09:45:57 +0100
+
+openssh (1:6.2p1-1) unstable; urgency=low
+
+ * New upstream release (http://www.openssh.com/txt/release-6.2).
+ - Add support for multiple required authentication in SSH protocol 2 via
+ an AuthenticationMethods option (closes: #195716).
+ - Fix Sophie Germain formula in moduli(5) (closes: #698612).
+ - Update ssh-copy-id to Phil Hands' greatly revised version (closes:
+ #99785, #322228, #620428; LP: #518883, #835901, #1074798).
+ * Use dh-autoreconf.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 07 May 2013 11:48:16 +0100
+
+openssh (1:6.1p1-4) experimental; urgency=low
+
+ [ Gunnar Hjalmarsson ]
+ * debian/openssh-server.sshd.pam: Explicitly state that ~/.pam_environment
+ should be read, and move the pam_env calls from "auth" to "session" so
+ that it's also read when $HOME is encrypted (LP: #952185).
+
+ [ Stéphane Graber ]
+ * Add ssh-agent upstart user job. This implements something similar to
+ the 90x11-common_ssh-agent Xsession script. That is, start ssh-agent
+ and set the appropriate environment variables (closes: #703906).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 25 Mar 2013 16:58:04 +0000
+
+openssh (1:6.1p1-3) experimental; urgency=low
+
+ * Give ssh and ssh-krb5 versioned dependencies on openssh-client and
+ openssh-server, to try to reduce confusion when people run 'apt-get
+ install ssh' or similar and expect that to upgrade everything relevant.
+ * CVE-2010-5107: Improve DoS resistance by changing default of MaxStartups
+ to 10:30:100 (closes: #700102).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 08 Feb 2013 21:07:31 +0000
+
+openssh (1:6.1p1-2) experimental; urgency=low
+
+ * Use xz compression for binary packages.
+ * Merge from Ubuntu:
+ - Add support for registering ConsoleKit sessions on login. (This is
+ currently enabled only when building for Ubuntu.)
+ - Drop openssh-blacklist and openssh-blacklist-extra to Suggests. It's
+ been long enough since the relevant vulnerability that we shouldn't
+ need these installed by default nowadays.
+ - Add an Upstart job (not currently used by default in Debian).
+ - Add mention of ssh-keygen in ssh connect warning (Scott Moser).
+ - Install apport hooks.
+ * Only build with -j if DEB_BUILD_OPTIONS=parallel=* is used (closes:
+ #694282).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 26 Nov 2012 16:39:07 +0000
+
+openssh (1:6.1p1-1) experimental; urgency=low
+
+ * New upstream release (http://www.openssh.com/txt/release-6.1).
+ - Enable pre-auth sandboxing by default for new installs.
+ - Allow "PermitOpen none" to refuse all port-forwarding requests
+ (closes: #543683).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 07 Sep 2012 00:22:44 +0100
+
+openssh (1:6.0p1-3) unstable; urgency=low
+
+ * debconf template translations:
+ - Add Indonesian (thanks, Andika Triwidada; closes: #681670).
+ * Call restorecon on copied ~/.ssh/authorized_keys if possible, since some
+ SELinux policies require this (closes: #658675).
+ * Add ncurses-term to openssh-server's Recommends, since it's often needed
+ to support unusual terminal emulators on clients (closes: #675362).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 24 Aug 2012 06:55:36 +0100
+
+openssh (1:6.0p1-2) unstable; urgency=low
+
+ * Tighten libssl1.0.0 and libcrypto1.0.0-udeb dependencies to the current
+ "fix" version at build time (closes: #678661).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 24 Jun 2012 12:16:06 +0100
+
+openssh (1:6.0p1-1) unstable; urgency=low
+
+ [ Roger Leigh ]
+ * Display dynamic part of MOTD from /run/motd.dynamic, if it exists
+ (closes: #669699).
+
+ [ Colin Watson ]
+ * Update OpenSSH FAQ to revision 1.113, fixing missing line break (closes:
+ #669667).
+ * New upstream release (closes: #671010,
+ http://www.openssh.com/txt/release-6.0).
+ - Fix IPQoS not being set on non-mapped v4-in-v6 addressed connections
+ (closes: #643312, #650512, #671075).
+ - Add a new privilege separation sandbox implementation for Linux's new
+ seccomp sandbox, automatically enabled on platforms that support it.
+ (Note: privilege separation sandboxing is still experimental.)
+ * Fix a bashism in configure's seccomp_filter check.
+ * Add a sandbox fallback mechanism, so that behaviour on Linux depends on
+ whether the running system's kernel has seccomp_filter support, not the
+ build system's kernel (forwarded upstream as
+ https://bugzilla.mindrot.org/show_bug.cgi?id=2011).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 26 May 2012 13:48:14 +0100
+
+openssh (1:5.9p1-5) unstable; urgency=low
+
+ * Use dpkg-buildflags, including for hardening support; drop use of
+ hardening-includes.
+ * Fix cross-building:
+ - Allow using a cross-architecture pkg-config.
+ - Pass default LDFLAGS to contrib/Makefile.
+ - Allow dh_strip to strip gnome-ssh-askpass, rather than calling
+ 'install -s'.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 02 Apr 2012 11:20:33 +0100
+
+openssh (1:5.9p1-4) unstable; urgency=low
+
+ * Disable OpenSSL version check again, as its SONAME is sufficient
+ nowadays (closes: #664383).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 19 Mar 2012 11:06:30 +0000
+
+openssh (1:5.9p1-3) unstable; urgency=low
+
+ * debconf template translations:
+ - Update Polish (thanks, Michał Kułach; closes: #659829).
+ * Ignore errors writing to console in init script (closes: #546743).
+ * Move ssh-krb5 to Section: oldlibs.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 24 Feb 2012 08:56:18 +0000
+
+openssh (1:5.9p1-2) unstable; urgency=low
+
+ * Mark openssh-client and openssh-server as Multi-Arch: foreign.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 09 Nov 2011 02:06:48 +0000
+
+openssh (1:5.9p1-1) unstable; urgency=low
+
+ * New upstream release (http://www.openssh.com/txt/release-5.9).
+ - Introduce sandboxing of the pre-auth privsep child using an optional
+ sshd_config(5) "UsePrivilegeSeparation=sandbox" mode that enables
+ mandatory restrictions on the syscalls the privsep child can perform.
+ - Add new SHA256-based HMAC transport integrity modes from
+ http://www.ietf.org/id/draft-dbider-sha2-mac-for-ssh-02.txt.
+ - The pre-authentication sshd(8) privilege separation slave process now
+ logs via a socket shared with the master process, avoiding the need to
+ maintain /dev/log inside the chroot (closes: #75043, #429243,
+ #599240).
+ - ssh(1) now warns when a server refuses X11 forwarding (closes:
+ #504757).
+ - sshd_config(5)'s AuthorizedKeysFile now accepts multiple paths,
+ separated by whitespace (closes: #76312). The authorized_keys2
+ fallback is deprecated but documented (closes: #560156).
+ - ssh(1) and sshd(8): set IPv6 traffic class from IPQoS, as well as IPv4
+ ToS/DSCP (closes: #498297).
+ - ssh-add(1) now accepts keys piped from standard input. E.g. "ssh-add
+ - < /path/to/key" (closes: #229124).
+ - Clean up lost-passphrase text in ssh-keygen(1) (closes: #444691).
+ - Say "required" rather than "recommended" in unprotected-private-key
+ warning (LP: #663455).
+ * Update OpenSSH FAQ to revision 1.112.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 07 Sep 2011 23:46:00 +0100
+
+openssh (1:5.8p1-7) unstable; urgency=low
+
+ * Only recommend ssh-import-id when built on Ubuntu (closes: #635887).
+ * Use 'dpkg-vendor --derives-from Ubuntu' to detect Ubuntu systems rather
+ than 'lsb_release -is' so that Ubuntu derivatives behave the same way as
+ Ubuntu itself.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 29 Jul 2011 14:27:52 +0100
+
+openssh (1:5.8p1-6) unstable; urgency=low
+
+ * openssh-client and openssh-server Suggests: monkeysphere.
+ * Quieten logs when multiple from= restrictions are used in different
+ authorized_keys lines for the same key; it's still not ideal, but at
+ least you'll only get one log entry per key (closes: #630606).
+ * Merge from Ubuntu (Dustin Kirkland):
+ - openssh-server Recommends: ssh-import-id (no-op in Debian since that
+ package doesn't exist there, but this reduces the Ubuntu delta).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 28 Jul 2011 17:10:18 +0100
+
+openssh (1:5.8p1-5) unstable; urgency=low
+
+ * Drop openssh-server's dependency on openssh-blacklist to a
+ recommendation (closes: #622604).
+ * Update Vcs-* fields and README.source for Alioth changes.
+ * Backport from upstream:
+ - Make hostbased auth with ECDSA keys work correctly (closes: #633368).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 24 Jul 2011 11:06:47 +0100
+
+openssh (1:5.8p1-4) unstable; urgency=low
+
+ * Drop hardcoded dependencies on libssl0.9.8 and libcrypto0.9.8-udeb,
+ since the required minimum versions are rather old now anyway and
+ openssl has bumped its SONAME (thanks, Julien Cristau; closes: #620828).
+ * Remove unreachable code from openssh-server.postinst.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 04 Apr 2011 15:56:18 +0100
+
+openssh (1:5.8p1-3) unstable; urgency=low
+
+ * Correct ssh-keygen instruction in the changelog for 1:5.7p1-1 (thanks,
+ Joel Stanley).
+ * Allow ssh-add to read from FIFOs (thanks, Daniel Kahn Gillmor; closes:
+ #614897).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 18 Mar 2011 16:42:42 +0000
+
+openssh (1:5.8p1-2) unstable; urgency=low
+
+ * Upload to unstable.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 08 Feb 2011 10:59:17 +0000
+
+openssh (1:5.8p1-1) experimental; urgency=low
+
+ * New upstream release (http://www.openssh.com/txt/release-5.8):
+ - Fix stack information leak in legacy certificate signing
+ (http://www.openssh.com/txt/legacy-cert.adv).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 05 Feb 2011 11:13:11 +0000
+
+openssh (1:5.7p1-2) experimental; urgency=low
+
+ * Fix crash in ssh_selinux_setfscreatecon when SELinux is disabled
+ (LP: #708571).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 27 Jan 2011 12:14:17 +0000
+
+openssh (1:5.7p1-1) experimental; urgency=low
+
+ * New upstream release (http://www.openssh.com/txt/release-5.7):
+ - Implement Elliptic Curve Cryptography modes for key exchange (ECDH)
+ and host/user keys (ECDSA) as specified by RFC5656. ECDH and ECDSA
+ offer better performance than plain DH and DSA at the same equivalent
+ symmetric key length, as well as much shorter keys.
+ - sftp(1)/sftp-server(8): add a protocol extension to support a hard
+ link operation. It is available through the "ln" command in the
+ client. The old "ln" behaviour of creating a symlink is available
+ using its "-s" option or through the preexisting "symlink" command.
+ - scp(1): Add a new -3 option to scp: Copies between two remote hosts
+ are transferred through the local host (closes: #508613).
+ - ssh(1): "atomically" create the listening mux socket by binding it on
+ a temporary name and then linking it into position after listen() has
+ succeeded. This allows the mux clients to determine that the server
+ socket is either ready or stale without races (closes: #454784).
+ Stale server sockets are now automatically removed (closes: #523250).
+ - ssh(1): install a SIGCHLD handler to reap expired child process
+ (closes: #594687).
+ - ssh(1)/ssh-agent(1): honour $TMPDIR for client xauth and ssh-agent
+ temporary directories (closes: #357469, although only if you arrange
+ for ssh-agent to actually see $TMPDIR since the setgid bit will cause
+ it to be stripped off).
+ * Update to current GSSAPI patch from
+ http://www.sxw.org.uk/computing/patches/openssh-5.7p1-gsskex-all-20110125.patch:
+ - Add GSSAPIServerIdentity option.
+ * Generate ECDSA host keys on fresh installations. Upgraders who wish to
+ add such host keys should manually add 'HostKey
+ /etc/ssh/ssh_host_ecdsa_key' to /etc/ssh/sshd_config and run 'ssh-keygen
+ -q -f /etc/ssh/ssh_host_ecdsa_key -N "" -t ecdsa'.
+ * Build-depend on libssl-dev (>= 0.9.8g) to ensure sufficient ECC support.
+ * Backport SELinux build fix from CVS.
+ * Rearrange selinux-role.patch so that it links properly given this
+ SELinux build fix.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 26 Jan 2011 23:48:02 +0000
+
+openssh (1:5.6p1-3) experimental; urgency=low
+
+ * Drop override for desktop-file-but-no-dh_desktop-call, which Lintian no
+ longer issues.
+ * Merge 1:5.5p1-6.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 30 Dec 2010 11:48:00 +0000
+
+openssh (1:5.6p1-2) experimental; urgency=low
+
+ * Backport upstream patch to install a SIGCHLD handler to reap expired ssh
+ child processes, preventing lots of zombies when using ControlPersist
+ (closes: #594687).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 26 Oct 2010 14:46:40 +0100
+
+openssh (1:5.6p1-1) experimental; urgency=low
+
+ * New upstream release (http://www.openssh.com/txt/release-5.6):
+ - Added a ControlPersist option to ssh_config(5) that automatically
+ starts a background ssh(1) multiplex master when connecting. This
+ connection can stay alive indefinitely, or can be set to automatically
+ close after a user-specified duration of inactivity (closes: #335697,
+ #350898, #454787, #500573, #550262).
+ - Support AuthorizedKeysFile, AuthorizedPrincipalsFile,
+ HostbasedUsesNameFromPacketOnly, and PermitTunnel in sshd_config(5)
+ Match blocks (closes: #549858).
+ - sftp(1): fix ls in working directories that contain globbing
+ characters in their pathnames (LP: #530714).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 24 Aug 2010 00:37:54 +0100
+
+openssh (1:5.5p1-6) unstable; urgency=low
+
+ * Touch /var/run/sshd/.placeholder in the preinst so that /var/run/sshd,
+ which is intentionally no longer shipped in the openssh-server package
+ due to /var/run often being a temporary directory, is not removed on
+ upgrade (closes: #575582).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 26 Dec 2010 18:09:29 +0000
+
+openssh (1:5.5p1-5) unstable; urgency=low
+
+ * Use an architecture wildcard for libselinux1-dev (closes: #591740).
+ * debconf template translations:
+ - Update Danish (thanks, Joe Hansen; closes: #592800).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 23 Aug 2010 22:59:03 +0100
+
+openssh (1:5.5p1-4) unstable; urgency=low
+
+ [ Sebastian Andrzej Siewior ]
+ * Add powerpcspe to architecture list for libselinux1-dev build-dependency
+ (closes: #579843).
+
+ [ Colin Watson ]
+ * Allow ~/.ssh/authorized_keys and other secure files to be
+ group-writable, provided that the group in question contains only the
+ file's owner; this extends a patch previously applied to ~/.ssh/config
+ (closes: #581919).
+ * Check primary group memberships as well as supplementary group
+ memberships, and only allow group-writability by groups with exactly one
+ member, as zero-member groups are typically used by setgid binaries
+ rather than being user-private groups (closes: #581697).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 22 May 2010 23:37:20 +0100
+
+openssh (1:5.5p1-3) unstable; urgency=low
+
+ * Discard error messages while checking whether rsh, rlogin, and rcp
+ alternatives exist (closes: #579285).
+ * Drop IDEA key check; I don't think it works properly any more due to
+ textual changes in error output, it's only relevant for direct upgrades
+ from truly ancient versions, and it breaks upgrades if
+ /etc/ssh/ssh_host_key can't be loaded (closes: #579570).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 28 Apr 2010 22:12:47 +0100
+
+openssh (1:5.5p1-2) unstable; urgency=low
+
+ * Use dh_installinit -n, since our maintainer scripts already handle this
+ more carefully (thanks, Julien Cristau).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 17 Apr 2010 12:55:56 +0100
+
+openssh (1:5.5p1-1) unstable; urgency=low
+
+ * New upstream release:
+ - Unbreak sshd_config's AuthorizedKeysFile option for $HOME-relative
+ paths.
+ - Include a language tag when sending a protocol 2 disconnection
+ message.
+ - Make logging of certificates used for user authentication more clear
+ and consistent between CAs specified using TrustedUserCAKeys and
+ authorized_keys.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 16 Apr 2010 10:27:30 +0100
+
+openssh (1:5.4p1-2) unstable; urgency=low
+
+ * Borrow patch from Fedora to add DNSSEC support: if glibc 2.11 is
+ installed, the host key is published in an SSHFP RR secured with DNSSEC,
+ and VerifyHostKeyDNS=yes, then ssh will no longer prompt for host key
+ verification (closes: #572049).
+ * Convert to dh(1), and use dh_installdocs --link-doc.
+ * Drop lpia support, since Ubuntu no longer supports this architecture.
+ * Use dh_install more effectively.
+ * Add a NEWS.Debian entry about changes in smartcard support relative to
+ previous unofficial builds (closes: #231472).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 10 Apr 2010 01:08:59 +0100
+
+openssh (1:5.4p1-1) unstable; urgency=low
+
+ * New upstream release (LP: #535029).
+ - After a transition period of about 10 years, this release disables SSH
+ protocol 1 by default. Clients and servers that need to use the
+ legacy protocol must explicitly enable it in ssh_config / sshd_config
+ or on the command-line.
+ - Remove the libsectok/OpenSC-based smartcard code and add support for
+ PKCS#11 tokens. This support is enabled by default in the Debian
+ packaging, since it now doesn't involve additional library
+ dependencies (closes: #231472, LP: #16918).
+ - Add support for certificate authentication of users and hosts using a
+ new, minimal OpenSSH certificate format (closes: #482806).
+ - Added a 'netcat mode' to ssh(1): "ssh -W host:port ...".
+ - Add the ability to revoke keys in sshd(8) and ssh(1). (For the Debian
+ package, this overlaps with the key blacklisting facility added in
+ openssh 1:4.7p1-9, but with different file formats and slightly
+ different scopes; for the moment, I've roughly merged the two.)
+ - Various multiplexing improvements, including support for requesting
+ port-forwardings via the multiplex protocol (closes: #360151).
+ - Allow setting an explicit umask on the sftp-server(8) commandline to
+ override whatever default the user has (closes: #496843).
+ - Many sftp client improvements, including tab-completion, more options,
+ and recursive transfer support for get/put (LP: #33378). The old
+ mget/mput commands never worked properly and have been removed
+ (closes: #270399, #428082).
+ - Do not prompt for a passphrase if we fail to open a keyfile, and log
+ the reason why the open failed to debug (closes: #431538).
+ - Prevent sftp from crashing when given a "-" without a command. Also,
+ allow whitespace to follow a "-" (closes: #531561).
+
+ * Fix 'debian/rules quilt-setup' to avoid writing .orig files if some
+ patches apply with offsets.
+ * Include debian/ssh-askpass-gnome.png in the Debian tarball now that
+ we're using a source format that permits this, rather than messing
+ around with uudecode.
+ * Drop compatibility with the old gssapi mechanism used in ssh-krb5 <<
+ 3.8.1p1-1. Simon Wilkinson refused this patch since the old gssapi
+ mechanism was removed due to a serious security hole, and since these
+ versions of ssh-krb5 are no longer security-supported by Debian I don't
+ think there's any point keeping client compatibility for them.
+ * Fix substitution of ETC_PAM_D_SSH, following the rename in 1:4.7p1-4.
+ * Hardcode the location of xauth to /usr/bin/xauth rather than
+ /usr/bin/X11/xauth (thanks, Aron Griffis; closes: #575725, LP: #8440).
+ xauth no longer depends on x11-common, so we're no longer guaranteed to
+ have the /usr/bin/X11 symlink available. I was taking advantage of the
+ /usr/bin/X11 symlink to smooth X's move to /usr/bin, but this is far
+ enough in the past now that it's probably safe to just use /usr/bin.
+ * Remove SSHD_OOM_ADJUST configuration. sshd now unconditionally makes
+ itself non-OOM-killable, and doesn't require configuration to avoid log
+ spam in virtualisation containers (closes: #555625).
+ * Drop Debian-specific removal of OpenSSL version check. Upstream ignores
+ the two patchlevel nybbles now, which is sufficient to address the
+ original reason this change was introduced, and it appears that any
+ change in the major/minor/fix nybbles would involve a new libssl package
+ name. (We'd still lose if the status nybble were ever changed, but that
+ would mean somebody had packaged a development/beta version rather than
+ a proper release, which doesn't appear to be normal practice.)
+ * Drop most of our "LogLevel SILENT" (-qq) patch. This was originally
+ introduced to match the behaviour of non-free SSH, in which -q does not
+ suppress fatal errors, but matching the behaviour of OpenSSH upstream is
+ much more important nowadays. We no longer document that -q does not
+ suppress fatal errors (closes: #280609). Migrate "LogLevel SILENT" to
+ "LogLevel QUIET" in sshd_config on upgrade.
+ * Policy version 3.8.4:
+ - Add a Homepage field.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 06 Apr 2010 22:38:31 +0100
+
+openssh (1:5.3p1-3) unstable; urgency=low
+
+ * Convert to source format 3.0 (quilt).
+ * Update README.source to match, and add a 'quilt-setup' target to
+ debian/rules for the benefit of those checking out the package from
+ revision control.
+ * All patches are now maintained separately and tagged according to DEP-3.
+ * Add GSSAPIStoreCredentialsOnRekey to 'sshd -T' configuration dump.
+ * Remove documentation of building for Debian 3.0 in README.Debian.
+ Support for this was removed in 1:4.7p1-2.
+ * Remove obsolete header from README.Debian dating from when people
+ expected non-free SSH.
+ * Update copyright years for GSSAPI patch.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 28 Feb 2010 01:35:53 +0000
+
+openssh (1:5.3p1-2) unstable; urgency=low
+
+ * Link with -Wl,--as-needed (closes: #560155).
+ * Install upstream sshd_config as an example (closes: #415008).
+ * Use dh_lintian.
+ * Honour DEB_BUILD_OPTIONS=nocheck.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 22 Feb 2010 12:43:24 +0000
+
+openssh (1:5.3p1-1) unstable; urgency=low
+
+ * New upstream release.
+ * Update to GSSAPI patch from
+ http://www.sxw.org.uk/computing/patches/openssh-5.3p1-gsskex-all-20100124.patch.
+ * Backport from upstream:
+ - Do not fall back to adding keys without constraints (ssh-add -c / -t
+ ...) when the agent refuses the constrained add request. This was a
+ useful migration measure back in 2002 when constraints were new, but
+ just adds risk now (LP: #209447).
+ * Drop change from 1:3.8p1-3 to avoid setresuid() and setresgid() system
+ calls. This only applied to Linux 2.2, which it's no longer feasible to
+ run anyway (see 1:5.2p1-2 changelog).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 26 Jan 2010 11:55:29 +0000
+
+openssh (1:5.2p1-2) unstable; urgency=low
+
+ [ Colin Watson ]
+ * Backport from upstream:
+ - After sshd receives a SIGHUP, ignore subsequent HUPs while sshd
+ re-execs itself. Prevents two HUPs in quick succession from resulting
+ in sshd dying (LP: #497781).
+ - Output a debug if we can't open an existing keyfile (LP: #505301).
+ * Use host compiler for ssh-askpass-gnome when cross-compiling.
+ * Don't run tests when cross-compiling.
+ * Drop change from 1:3.6.1p2-5 to disable cmsg_type check for file
+ descriptor passing when running on Linux 2.0. The previous stable
+ release of Debian dropped support for Linux 2.4, let alone 2.0, so this
+ very likely has no remaining users depending on it.
+
+ [ Kees Cook ]
+ * Implement DebianBanner server configuration flag that can be set to "no"
+ to allow sshd to run without the Debian-specific extra version in the
+ initial protocol handshake (closes: #562048).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 16 Jan 2010 01:28:58 +0000
+
+openssh (1:5.2p1-1) unstable; urgency=low
+
+ * New upstream release (closes: #536182). Yes, I know 5.3p1 has been out
+ for a while, but there's no GSSAPI patch available for it yet.
+ - Change the default cipher order to prefer the AES CTR modes and the
+ revised "arcfour256" mode to CBC mode ciphers that are susceptible to
+ CPNI-957037 "Plaintext Recovery Attack Against SSH".
+ - Add countermeasures to mitigate CPNI-957037-style attacks against the
+ SSH protocol's use of CBC-mode ciphers. Upon detection of an invalid
+ packet length or Message Authentication Code, ssh/sshd will continue
+ reading up to the maximum supported packet length rather than
+ immediately terminating the connection. This eliminates most of the
+ known differences in behaviour that leaked information about the
+ plaintext of injected data which formed the basis of this attack
+ (closes: #506115, LP: #379329).
+ - ForceCommand directive now accepts commandline arguments for the
+ internal-sftp server (closes: #524423, LP: #362511).
+ - Add AllowAgentForwarding to available Match keywords list (closes:
+ #540623).
+ - Make ssh(1) send the correct channel number for
+ SSH2_MSG_CHANNEL_SUCCESS and SSH2_MSG_CHANNEL_FAILURE messages to
+ avoid triggering 'Non-public channel' error messages on sshd(8) in
+ openssh-5.1.
+ - Avoid printing 'Non-public channel' warnings in sshd(8), since the
+ ssh(1) has sent incorrect channel numbers since ~2004 (this reverts a
+ behaviour introduced in openssh-5.1; closes: #496017).
+ - Disable nonfunctional ssh(1) ~C escape handler in multiplex slave
+ connections (closes: #507541).
+ - Fix "whitepsace" typo in ssh_config(5) (closes: #514313, LP: #303835).
+ * Update to GSSAPI patch from
+ http://www.sxw.org.uk/computing/patches/openssh-5.2p1-gsskex-all-20090726.patch,
+ including cascading credentials support (LP: #416958).
+ * Use x11.pc when compiling/linking gnome-ssh-askpass2 (closes: #555951).
+ * Moved to bzr.debian.org; add Vcs-Bzr and Vcs-Browser control fields.
+ * Add debian/README.source with instructions on bzr handling.
+ * Make ChrootDirectory work with SELinux (thanks, Russell Coker; closes:
+ #556644).
+ * Initialise sc to NULL in ssh_selinux_getctxbyname (thanks, Václav Ovsík;
+ closes: #498684).
+ * Don't duplicate backslashes when displaying server banner (thanks,
+ Michał Górny; closes: #505378, LP: #425346).
+ * Use hardening-includes for hardening logic (thanks, Kees Cook; closes:
+ #561887).
+ * Update OpenSSH FAQ to revision 1.110.
+ * Remove ssh/new_config, only needed for direct upgrades from potato which
+ are no longer particularly feasible anyway (closes: #420682).
+ * Cope with insserv reordering of init script links.
+ * Remove init script stop link in rc1, as killprocs handles it already.
+ * Adjust short descriptions to avoid relying on previous experience with
+ rsh, based on suggestions from Reuben Thomas (closes: #512198).
+ * Remove manual page references to login.conf, which aren't applicable on
+ non-BSD systems (closes: #154434).
+ * Remove/adjust manual page references to BSD-specific /etc/rc (closes:
+ #513417).
+ * Refer to sshd_config(5) rather than sshd(8) in postinst-written
+ /etc/ssh/sshd_config, and add UsePAM commentary from upstream-shipped
+ configuration file (closes: #415008, although unfortunately this will
+ only be conveniently visible on new installations).
+ * Include URL to OpenBSD's ssl(8) in ssh(1), since I don't see a better
+ source for the same information among Debian's manual pages (closes:
+ #530692, LP: #456660).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 04 Jan 2010 13:23:35 +0000
+
+openssh (1:5.1p1-8) unstable; urgency=low
+
+ * Build with just -fPIC on mips/mipsel, not -fPIE as well (thanks, LIU Qi;
+ closes: #538313).
+ * Build-depend on libselinux1-dev on sh4 too (thanks, Nobuhiro Iwamatsu;
+ closes: #547103).
+ * Fix grammar in if-up script (closes: #549128).
+ * Pass $SSHD_OPTS when checking configuration too (thanks, "sobtwmxt";
+ closes: #548662).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 05 Oct 2009 13:30:49 +0100
+
+openssh (1:5.1p1-7) unstable; urgency=low
+
+ * Update config.guess and config.sub from autotools-dev 20090611.1
+ (closes: #538301).
+ * Set umask to 022 in the init script as well as postinsts (closes:
+ #539030).
+ * Add ${misc:Depends} to keep Lintian happy.
+ * Use 'which' rather than 'type' in maintainer scripts.
+ * Upgrade to debhelper v7.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 31 Jul 2009 16:28:10 +0100
+
+openssh (1:5.1p1-6) unstable; urgency=low
+
+ * Open /proc/self/oom_adj with O_RDONLY or O_WRONLY as necessary, rather
+ than O_RDWR.
+ * Disable OOM adjustment for vserver/OpenVZ (thanks, Karl Chen; closes:
+ #511771).
+ * Add ufw integration (thanks, Didier Roche; see
+ https://wiki.ubuntu.com/UbuntuFirewall#Integrating%20UFW%20with%20Packages;
+ LP: #261884).
+ * Add a comment above PermitRootLogin in sshd_config pointing to
+ README.Debian.
+ * Check if delgroup is present in openssh-client.postrm (closes: #530501).
+ * Build with -fPIC on mips/mipsel (thanks, Luk Claes; closes: #531942).
+ * Remove /var/run/sshd from openssh-server package; it will be created at
+ run-time before starting the server.
+ * Use invoke-rc.d in openssh-server's if-up script.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 05 Jun 2009 11:56:03 +0100
+
+openssh (1:5.1p1-5) unstable; urgency=low
+
+ * Backport from upstream CVS (Markus Friedl):
+ - packet_disconnect() on padding error, too. Should reduce the success
+ probability for the CPNI-957037 Plaintext Recovery Attack to 2^-18.
+ * Check that /var/run/sshd.pid exists and that the process ID listed there
+ corresponds to sshd before running '/etc/init.d/ssh reload' from if-up
+ script; SIGHUP is racy if called at boot before sshd has a chance to
+ install its signal handler, but fortunately the pid file is written
+ after that which lets us avoid the race (closes: #502444).
+ * While the above is a valuable sanity-check, it turns out that it doesn't
+ really fix the bug (thanks to Kevin Price for testing), so for the
+ meantime we'll just use '/etc/init.d/ssh restart', even though it is
+ unfortunately heavyweight.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 14 Jan 2009 00:34:08 +0000
+
+openssh (1:5.1p1-4) unstable; urgency=low
+
+ * ssh-copy-id: Strip trailing colons from hostname (closes: #226172,
+ LP: #249706; thanks to Karl Goetz for nudging this along; forwarded
+ upstream as https://bugzilla.mindrot.org/show_bug.cgi?id=1530).
+ * Backport from upstream CVS (Markus Friedl):
+ - Only send eow and no-more-sessions requests to openssh 5 and newer;
+ fixes interop problems with broken ssh v2 implementations (closes:
+ #495917).
+ * Fix double-free when failing to parse a forwarding specification given
+ using ~C (closes: #505330; forwarded upstream as
+ https://bugzilla.mindrot.org/show_bug.cgi?id=1539).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 23 Nov 2008 14:46:10 +0000
+
+openssh (1:5.1p1-3) unstable; urgency=low
+
+ * Remove unnecessary ssh-vulnkey output in non-verbose mode when no
+ compromised or unknown keys were found (closes: #496495).
+ * Configure with --disable-strip; dh_strip will deal with stripping
+ binaries and will honour DEB_BUILD_OPTIONS (thanks, Bernhard R. Link;
+ closes: #498681).
+ * Fix handling of zero-length server banners (thanks, Tomas Mraz; closes:
+ #497026).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 30 Sep 2008 23:09:58 +0100
+
+openssh (1:5.1p1-2) unstable; urgency=low
+
+ * Look for $SHELL on the path when executing ProxyCommands or
+ LocalCommands (closes: #492728).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 29 Jul 2008 15:31:25 +0100
+
+openssh (1:5.1p1-1) unstable; urgency=low
+
+ * New upstream release (closes: #474301). Important changes not previously
+ backported to 4.7p1:
+ - 4.9/4.9p1 (http://www.openssh.com/txt/release-4.9):
+ + Added chroot(2) support for sshd(8), controlled by a new option
+ "ChrootDirectory" (closes: #139047, LP: #24777).
+ + Linked sftp-server(8) into sshd(8). The internal sftp server is used
+ when the command "internal-sftp" is specified in a Subsystem or
+ ForceCommand declaration. When used with ChrootDirectory, the
+ internal sftp server requires no special configuration of files
+ inside the chroot environment.
+ + Added a protocol extension method "posix-rename@openssh.com" for
+ sftp-server(8) to perform POSIX atomic rename() operations; sftp(1)
+ prefers this if available (closes: #308561).
+ + Removed the fixed limit of 100 file handles in sftp-server(8).
+ + ssh(8) will now skip generation of SSH protocol 1 ephemeral server
+ keys when in inetd mode and protocol 2 connections are negotiated.
+ This speeds up protocol 2 connections to inetd-mode servers that
+ also allow Protocol 1.
+ + Accept the PermitRootLogin directive in a sshd_config(5) Match
+ block. Allows for, e.g. permitting root only from the local network.
+ + Reworked sftp(1) argument splitting and escaping to be more
+ internally consistent (i.e. between sftp commands) and more
+ consistent with sh(1). Please note that this will change the
+ interpretation of some quoted strings, especially those with
+ embedded backslash escape sequences.
+ + Support "Banner=none" in sshd_config(5) to disable sending of a
+ pre-login banner (e.g. in a Match block).
+ + ssh(1) ProxyCommands are now executed with $SHELL rather than
+ /bin/sh.
+ + ssh(1)'s ConnectTimeout option is now applied to both the TCP
+ connection and the SSH banner exchange (previously it just covered
+ the TCP connection). This allows callers of ssh(1) to better detect
+ and deal with stuck servers that accept a TCP connection but don't
+ progress the protocol, and also makes ConnectTimeout useful for
+ connections via a ProxyCommand.
+ + scp(1) incorrectly reported "stalled" on slow copies (closes:
+ #140828).
+ + scp(1) date underflow for timestamps before epoch.
+ + ssh(1) used the obsolete SIG DNS RRtype for host keys in DNS,
+ instead of the current standard RRSIG.
+ + Correctly drain ACKs when a sftp(1) upload write fails midway,
+ avoids a fatal() exit from what should be a recoverable condition.
+ + Fixed ssh-keygen(1) selective host key hashing (i.e. "ssh-keygen -HF
+ hostname") to not include any IP address in the data to be hashed.
+ + Make ssh(1) skip listening on the IPv6 wildcard address when a
+ binding address of 0.0.0.0 is used against an old SSH server that
+ does not support the RFC4254 syntax for wildcard bind addresses.
+ + Enable IPV6_V6ONLY socket option on sshd(8) listen socket, as is
+ already done for X11/TCP forwarding sockets (closes: #439661).
+ + Fix FD leak that could hang a ssh(1) connection multiplexing master.
+ + Make ssh(1) -q option documentation consistent with reality.
+ + Fixed sshd(8) PAM support not calling pam_session_close(), or
+ failing to call it with root privileges (closes: #372680).
+ + Fix activation of OpenSSL engine support when requested in configure
+ (LP: #119295).
+ + Cache SELinux status earlier so we know if it's enabled after a
+ chroot (LP: #237557).
+ - 5.1/5.1p1 (http://www.openssh.com/txt/release-5.1):
+ + Introduce experimental SSH Fingerprint ASCII Visualisation to ssh(1)
+ and ssh-keygen(1). Visual fingerprint display is controlled by a new
+ ssh_config(5) option "VisualHostKey". The intent is to render SSH
+ host keys in a visual form that is amenable to easy recall and
+ rejection of changed host keys.
+ + sshd_config(5) now supports CIDR address/masklen matching in "Match
+ address" blocks, with a fallback to classic wildcard matching.
+ + sshd(8) now supports CIDR matching in ~/.ssh/authorized_keys
+ from="..." restrictions, also with a fallback to classic wildcard
+ matching.
+ + Added an extended test mode (-T) to sshd(8) to request that it write
+ its effective configuration to stdout and exit. Extended test mode
+ also supports the specification of connection parameters (username,
+ source address and hostname) to test the application of
+ sshd_config(5) Match rules.
+ + ssh(1) now prints the number of bytes transferred and the overall
+ connection throughput for SSH protocol 2 sessions when in verbose
+ mode (previously these statistics were displayed for protocol 1
+ connections only).
+ + sftp-server(8) now supports extension methods statvfs@openssh.com
+ and fstatvfs@openssh.com that implement statvfs(2)-like operations.
+ + sftp(1) now has a "df" command to the sftp client that uses the
+ statvfs@openssh.com to produce a df(1)-like display of filesystem
+ space and inode utilisation (requires statvfs@openssh.com support on
+ the server).
+ + Added a MaxSessions option to sshd_config(5) to allow control of the
+ number of multiplexed sessions supported over a single TCP
+ connection. This allows increasing the number of allowed sessions
+ above the previous default of 10, disabling connection multiplexing
+ (MaxSessions=1) or disallowing login/shell/subsystem sessions
+ entirely (MaxSessions=0).
+ + Added a no-more-sessions@openssh.com global request extension that
+ is sent from ssh(1) to sshd(8) when the client knows that it will
+ never request another session (i.e. when session multiplexing is
+ disabled). This allows a server to disallow further session requests
+ and terminate the session in cases where the client has been
+ hijacked.
+ + ssh-keygen(1) now supports the use of the -l option in combination
+ with -F to search for a host in ~/.ssh/known_hosts and display its
+ fingerprint.
+ + ssh-keyscan(1) now defaults to "rsa" (protocol 2) keys, instead of
+ "rsa1" (LP: #129794).
+ + Added an AllowAgentForwarding option to sshd_config(8) to control
+ whether authentication agent forwarding is permitted. Note that this
+ is a loose control, as a client may install their own unofficial
+ forwarder.
+ + ssh(1) and sshd(8): avoid unnecessary malloc/copy/free when
+ receiving network data, resulting in a ~10% speedup.
+ + ssh(1) and sshd(8) will now try additional addresses when connecting
+ to a port forward destination whose DNS name resolves to more than
+ one address. The previous behaviour was to try the only first
+ address and give up if that failed.
+ + ssh(1) and sshd(8) now support signalling that channels are
+ half-closed for writing, through a channel protocol extension
+ notification "eow@openssh.com". This allows propagation of closed
+ file descriptors, so that commands such as "ssh -2 localhost od
+ /bin/ls | true" do not send unnecessary data over the wire.
+ + sshd(8): increased the default size of ssh protocol 1 ephemeral keys
+ from 768 to 1024 bits.
+ + When ssh(1) has been requested to fork after authentication ("ssh
+ -f") with ExitOnForwardFailure enabled, delay the fork until after
+ replies for any -R forwards have been seen. Allows for robust
+ detection of -R forward failure when using -f.
+ + "Match group" blocks in sshd_config(5) now support negation of
+ groups. E.g. "Match group staff,!guests".
+ + sftp(1) and sftp-server(8) now allow chmod-like operations to set
+ set[ug]id/sticky bits.
+ + The MaxAuthTries option is now permitted in sshd_config(5) match
+ blocks.
+ + Multiplexed ssh(1) sessions now support a subset of the ~ escapes
+ that are available to a primary connection.
+ + ssh(1) connection multiplexing will now fall back to creating a new
+ connection in most error cases (closes: #352830).
+ + Make ssh(1) deal more gracefully with channel requests that fail.
+ Previously it would optimistically assume that requests would always
+ succeed, which could cause hangs if they did not (e.g. when the
+ server runs out of file descriptors).
+ + ssh(1) now reports multiplexing errors via the multiplex slave's
+ stderr where possible (subject to LogLevel in the mux master).
+ + Fixed an UMAC alignment problem that manifested on Itanium
+ platforms.
+ * Remove our local version of moduli(5) now that there's one upstream.
+ * Say "GTK+" rather than "GTK" in ssh-askpass-gnome's description.
+ * Add lintian overrides for empty /usr/share/doc/openssh-client
+ directories in openssh-server and ssh (necessary due to being symlink
+ targets).
+ * Merge from Ubuntu:
+ - Add 'status' action to openssh-server init script, requiring lsb-base
+ (>= 3.2-13) (thanks, Dustin Kirkland).
+ * debconf template translations:
+ - Update Korean (thanks, Sunjae Park; closes: #484821).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 25 Jul 2008 10:45:08 +0100
+
+openssh (1:4.7p1-13) unstable; urgency=low
+
+ * Add some helpful advice to the end of ssh-vulnkey's output if there are
+ unknown or compromised keys (thanks, Dan Jacobson; closes: #483756).
+ * Check compromised key blacklist in ssh or ssh-add, as well as in the
+ server (LP: #232391). To override the blacklist check in ssh
+ temporarily, use 'ssh -o UseBlacklistedKeys=yes'; there is no override
+ for the blacklist check in ssh-add.
+ * Add cross-references to ssh-vulnkey(1) to ssh(1), ssh-add(1),
+ ssh-keygen(1), and sshd(8) (closes: #484451).
+ * Change openssh-client-udeb's Installer-Menu-Item from 99900 to 99999
+ (thanks, Frans Pop).
+ * Drop openssh-client-udeb isinstallable hack, as main-menu (>= 1.26) now
+ takes care of that (thanks, Frans Pop; closes: #484404).
+ * Update DEB_BUILD_OPTIONS parsing code from policy 3.8.0.
+ * Add documentation on removing openssh-blacklist locally (see #484269).
+ * Clarify documentation of SSHD_OOM_ADJUST, and make setting it to the
+ empty string actually skip adjustment as intended (closes: #487325).
+ * Remove empty /usr/share/applications directory in ssh-askpass-gnome.
+ * debconf template translations:
+ - Update Romanian (thanks, Cătălin Feștilă; closes: #485415).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 21 Jul 2008 12:18:28 +0100
+
+openssh (1:4.7p1-12) unstable; urgency=low
+
+ * Fill in CVE identifier for ssh-vulnkey bug fixed in 1:4.7p1-10.
+ * Refactor rejection of blacklisted user keys into a single
+ reject_blacklisted_key function in auth.c (thanks, Dmitry V. Levin).
+ * Fix memory leak of blacklisted host keys (thanks, Dmitry V. Levin).
+ * debconf template translations:
+ - Update Dutch (thanks, Bart Cornelis; closes: #483004).
+ - Update Brazilian Portuguese (thanks, Eder L. Marques; closes:
+ #483142).
+ - Update Slovak (thanks, Ivan Masár; closes: #483517).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 29 May 2008 21:41:29 +0100
+
+openssh (1:4.7p1-11) unstable; urgency=low
+
+ * Make init script depend on $syslog, and fix some other dependency
+ glitches (thanks, Petter Reinholdtsen; closes: #481018).
+ * Remove 0 and 6 from Default-Stop in init script (thanks, Kel Modderman;
+ closes: #481151).
+ * Restore OOM killer adjustment for child processes (thanks, Vaclav Ovsik;
+ closes: #480020).
+ * Allow building with heimdal-dev (LP: #125805).
+
+ * Check RSA1 keys without the need for a separate blacklist. Thanks to
+ Simon Tatham for the idea.
+ * Generate two keys with the PID forced to the same value and test that
+ they differ, to defend against recurrences of the recent Debian OpenSSL
+ vulnerability.
+ * Recommend openssh-blacklist from openssh-client (closes: #481187).
+ * Recommend openssh-blacklist-extra from openssh-client and
+ openssh-server.
+ * Make ssh-vulnkey report the file name and line number for each key
+ (thanks, Heiko Schlittermann and Christopher Perry; closes: #481398).
+ * Check for blacklists in /usr/share/ssh/ as well as /etc/ssh/ (see
+ #481283).
+ * Log IP addresses of hosts attempting to use blacklisted keys (closes:
+ #481721).
+ * Incorporate various ssh-vulnkey suggestions from Hugh Daniel:
+ - Add -v (verbose) option, and don't print output for keys that have a
+ blacklist file but that are not listed unless in verbose mode.
+ - Move exit status documentation to a separate section.
+ - Document key status descriptions.
+ - Add key type to output.
+ - Fix error output if ssh-vulnkey fails to read key files, with the
+ exception of host keys unless -a was given.
+ - In verbose mode, output the name of each file examined.
+ * Handle leading IP addresses in ssh-vulnkey input (LP: #230497).
+ * Fix various ssh-vulnkey problems pointed out by Solar Designer:
+ - Fix some buffer handling inconsistencies.
+ - Use xasprintf to build user key file names, avoiding truncation
+ problems.
+ - Drop to the user's UID when reading user keys with -a.
+ - Use EUID rather than UID when run with no file names and without -a.
+ - Reword "Unknown (no blacklist information)" to "Unknown (blacklist
+ file not installed)".
+
+ * Fix typo in ssh/vulnerable_host_keys message (thanks, Esko Arajärvi).
+ * debconf template translations:
+ - Update Finnish (thanks, Esko Arajärvi; closes: #481530).
+ - Update French (thanks, Christian Perrier; closes: #481576).
+ - Update Norwegian Bokmål (thanks, Bjørn Steensrud; closes: #481591).
+ - Update Galician (thanks, Jacobo Tarrio; closes: #481596).
+ - Update Japanese (thanks, Kenshi Muto; closes: #481621).
+ - Update Czech (thanks, Miroslav Kure; closes: #481624).
+ - Update German (thanks, Helge Kreutzmann; closes: #481676).
+ - Update Portuguese (thanks, Ricardo Silva; closes: #481781).
+ - Update Basque (thanks, Piarres Beobide; closes: #481836).
+ - Update Bulgarian (thanks, Damyan Ivanov; closes: #481870).
+ - Update Vietnamese (thanks, Clytie Siddall; closes: #481876).
+ - Update Spanish (thanks, Javier Fernandez-Sanguino Peña; closes:
+ #482341).
+ - Update Turkish (thanks, Mert Dirik; closes: #482548).
+ - Update Russian (thanks, Yuri Kozlov; closes: #482887).
+ - Update Swedish (thanks, Martin Bagge; closes: #482464).
+ - Update Italian (thanks, Luca Monducci; closes: #482808).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 26 May 2008 12:21:39 +0100
+
+openssh (1:4.7p1-10) unstable; urgency=low
+
+ * Add a FILES section to ssh-vulnkey(1) (thanks, Hugh Daniel).
+ * CVE-2008-2285: ssh-vulnkey handles options in authorized_keys
+ (LP: #230029), and treats # as introducing a comment even if it is
+ preceded by whitespace.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 14 May 2008 12:35:05 +0100
+
+openssh (1:4.7p1-9) unstable; urgency=critical
+
+ * Fill in CVE identifier for security vulnerability fixed in 1:4.7p1-8.
+ * Mitigate OpenSSL security vulnerability (CVE-2008-0166):
+ - Add key blacklisting support. Keys listed in
+ /etc/ssh/blacklist.TYPE-LENGTH will be rejected for authentication by
+ sshd, unless "PermitBlacklistedKeys yes" is set in
+ /etc/ssh/sshd_config.
+ - Add a new program, ssh-vulnkey, which can be used to check keys
+ against these blacklists.
+ - Depend on openssh-blacklist.
+ - Force dependencies on libssl0.9.8 / libcrypto0.9.8-udeb to at least
+ 0.9.8g-9.
+ - Automatically regenerate known-compromised host keys, with a
+ critical-priority debconf note. (I regret that there was no time to
+ gather translations.)
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 13 May 2008 12:33:38 +0100
+
+openssh (1:4.7p1-8) unstable; urgency=high
+
+ * Fill in CVE identifier for security vulnerability fixed in 1:4.7p1-5.
+ * Rename KeepAlive to TCPKeepAlive in sshd_config, cleaning up from old
+ configurations (LP: #211400).
+ * Tweak scp's reporting of filenames in verbose mode to be a bit less
+ confusing with spaces (thanks, Nicolas Valcárcel; LP: #89945).
+ * Backport from 4.9p1:
+ - CVE-2008-1657: Ignore ~/.ssh/rc if a sshd_config ForceCommand is
+ specified.
+ - Add no-user-rc authorized_keys option to disable execution of
+ ~/.ssh/rc.
+ * Backport from Simon Wilkinson's GSSAPI key exchange patch for 5.0p1:
+ - Add code to actually implement GSSAPIStrictAcceptorCheck, which had
+ somehow been omitted from a previous version of this patch (closes:
+ #474246).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 06 Apr 2008 12:34:19 +0100
+
+openssh (1:4.7p1-7) unstable; urgency=low
+
+ * Ignore errors writing to oom_adj (closes: #473573).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 31 Mar 2008 16:24:44 +0100
+
+openssh (1:4.7p1-6) unstable; urgency=low
+
+ * Disable the Linux kernel's OOM-killer for the sshd parent; tweak
+ SSHD_OOM_ADJUST in /etc/default/ssh to change this (closes: #341767).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 30 Mar 2008 21:14:12 +0100
+
+openssh (1:4.7p1-5) unstable; urgency=low
+
+ * Recommends: xauth rather than Suggests: xbase-clients.
+ * Document in ssh(1) that '-S none' disables connection sharing
+ (closes: #471437).
+ * Patch from Red Hat / Fedora:
+ - CVE-2008-1483: Don't use X11 forwarding port which can't be bound on
+ all address families, preventing hijacking of X11 forwarding by
+ unprivileged users when both IPv4 and IPv6 are configured (closes:
+ #463011).
+ * Use printf rather than echo -en (a bashism) in openssh-server.config and
+ openssh-server.preinst.
+ * debconf template translations:
+ - Update Finnish (thanks, Esko Arajärvi; closes: #468563).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 22 Mar 2008 12:37:00 +0000
+
+openssh (1:4.7p1-4) unstable; urgency=low
+
+ [ Caleb Case ]
+ * Fix configure detection of getseuserbyname and
+ get_default_context_with_level (closes: #465614, LP: #188136).
+
+ [ Colin Watson ]
+ * Include the autogenerated debian/copyright in the source package.
+ * Move /etc/pam.d/ssh to /etc/pam.d/sshd, allowing us to stop defining
+ SSHD_PAM_SERVICE (closes: #255870).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 13 Feb 2008 18:18:52 +0000
+
+openssh (1:4.7p1-3) unstable; urgency=low
+
+ * Improve grammar of ssh-askpass-gnome description.
+ * Backport from upstream:
+ - Use the correct packet maximum sizes for remote port and agent
+ forwarding. Prevents the server from killing the connection if too
+ much data is queued and an excessively large packet gets sent
+ (https://bugzilla.mindrot.org/show_bug.cgi?id=1360).
+ * Allow passing temporary daemon parameters on the init script's command
+ line, e.g. '/etc/init.d/ssh start "-o PermitRootLogin=yes"' (thanks,
+ Marc Haber; closes: #458547).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 01 Feb 2008 21:59:59 +0000
+
+openssh (1:4.7p1-2) unstable; urgency=low
+
+ * Adjust many relative links in faq.html to point to
+ http://www.openssh.com/ (thanks, Dan Jacobson; mentioned in #459807).
+ * Pass --with-mantype=doc to configure rather than build-depending on
+ groff (closes: #460121).
+ * Add armel to architecture list for libselinux1-dev build-dependency
+ (closes: #460136).
+ * Drop source-compatibility with Debian 3.0:
+ - Remove support for building with GNOME 1. This allows simplification
+ of our GNOME build-dependencies (see #460136).
+ - Remove hacks to support the old PAM configuration scheme.
+ - Remove compatibility for building without po-debconf.
+ * Build-depend on libgtk2.0-dev rather than libgnomeui-dev. As far as I
+ can see, the GTK2 version of ssh-askpass-gnome has never required
+ libgnomeui-dev.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 11 Jan 2008 00:14:10 +0000
+
+openssh (1:4.7p1-1) unstable; urgency=low
+
+ * New upstream release (closes: #453367).
+ - CVE-2007-4752: Prevent ssh(1) from using a trusted X11 cookie if
+ creation of an untrusted cookie fails; found and fixed by Jan Pechanec
+ (closes: #444738).
+ - sshd(8) in new installations defaults to SSH Protocol 2 only. Existing
+ installations are unchanged.
+ - The SSH channel window size has been increased, and both ssh(1)
+ sshd(8) now send window updates more aggressively. These improves
+ performance on high-BDP (Bandwidth Delay Product) networks.
+ - ssh(1) and sshd(8) now preserve MAC contexts between packets, which
+ saves 2 hash calls per packet and results in 12-16% speedup for
+ arcfour256/hmac-md5.
+ - A new MAC algorithm has been added, UMAC-64 (RFC4418) as
+ "umac-64@openssh.com". UMAC-64 has been measured to be approximately
+ 20% faster than HMAC-MD5.
+ - Failure to establish a ssh(1) TunnelForward is now treated as a fatal
+ error when the ExitOnForwardFailure option is set.
+ - ssh(1) returns a sensible exit status if the control master goes away
+ without passing the full exit status.
+ - When using a ProxyCommand in ssh(1), set the outgoing hostname with
+ gethostname(2), allowing hostbased authentication to work.
+ - Make scp(1) skip FIFOs rather than hanging (closes: #246774).
+ - Encode non-printing characters in scp(1) filenames. These could cause
+ copies to be aborted with a "protocol error".
+ - Handle SIGINT in sshd(8) privilege separation child process to ensure
+ that wtmp and lastlog records are correctly updated.
+ - Report GSSAPI mechanism in errors, for libraries that support multiple
+ mechanisms.
+ - Improve documentation for ssh-add(1)'s -d option.
+ - Rearrange and tidy GSSAPI code, removing server-only code being linked
+ into the client.
+ - Delay execution of ssh(1)'s LocalCommand until after all forwardings
+ have been established.
+ - In scp(1), do not truncate non-regular files.
+ - Improve exit message from ControlMaster clients.
+ - Prevent sftp-server(8) from reading until it runs out of buffer space,
+ whereupon it would exit with a fatal error (closes: #365541).
+ - pam_end() was not being called if authentication failed
+ (closes: #405041).
+ - Manual page datestamps updated (closes: #433181).
+ * Install the OpenSSH FAQ in /usr/share/doc/openssh-client.
+ - Includes documentation on copying files with colons using scp
+ (closes: #303453).
+ * Create /var/run/sshd on start even if /etc/ssh/sshd_not_to_be_run exists
+ (closes: #453285).
+ * Fix "overriden" typo in ssh(1) (thanks, A. Costa; closes: #390699).
+ * Refactor debian/rules configure and make invocations to make development
+ easier.
+ * Remove the hideously old /etc/ssh/primes on upgrade (closes: #123013).
+ * Update moduli(5) to revision 1.11 from OpenBSD CVS.
+ * Document the non-default options we set as standard in ssh_config(5) and
+ sshd_config(5) (closes: #327886, #345628).
+ * Recode LICENCE to UTF-8 when concatenating it to debian/copyright.
+ * Override desktop-file-but-no-dh_desktop-call lintian warning; the
+ .desktop file is intentionally not installed (see 1:3.8.1p1-10).
+ * Update copyright dates for Kerberos patch in debian/copyright.head.
+ * Policy version 3.7.3: no changes required.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 24 Dec 2007 16:43:02 +0000
+
+openssh (1:4.6p1-7) unstable; urgency=low
+
+ * Don't build PIE executables on m68k (closes: #451192).
+ * Use autotools-dev's recommended configure --build and --host options.
+ * Adjust README.Debian to suggest mailing debian-ssh@lists.debian.org
+ rather than Matthew.
+ * Check whether deluser exists in postrm (closes: #454085).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 03 Dec 2007 11:11:02 +0000
+
+openssh (1:4.6p1-6) unstable; urgency=low
+
+ * Remove blank line between head comment and first template in
+ debian/openssh-server.templates.master; apparently it confuses some
+ versions of debconf.
+ * Install authorized_keys(5) as a symlink to sshd(8) (thanks, Tomas
+ Pospisek; closes: #441817).
+ * Discard error output from dpkg-query in preinsts, in case the ssh
+ metapackage is not installed.
+ * Fix sshd/inittab advice in README.Debian to account for rc.d movement
+ (closes: #450632).
+ * Suppress error from debian/rules if lsb-release is not installed.
+ * Don't ignore errors from 'make -C contrib clean'.
+ * Adjust categories in ssh-askpass-gnome.desktop to comply with the
+ Desktop Menu Specification.
+ * debconf template translations:
+ - Add Slovak (thanks, Ivan Masár; closes: #441690).
+ - Update Brazilian Portuguese (thanks, Eder L. Marques;
+ closes: #447145).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 12 Nov 2007 11:47:28 +0000
+
+openssh (1:4.6p1-5) unstable; urgency=low
+
+ * Identify ssh as a metapackage rather than a transitional package. It's
+ still useful as a quick way to install both the client and the server.
+ * ssh-copy-id now checks the exit status of ssh-add -L (thanks, Adeodato
+ Simó; closes: #221675).
+ * ssh-copy-id no longer prints the output of expr (thanks, Peter
+ Eisentraut; closes: #291534).
+ * ssh-copy-id defaults to ~/.ssh/id_rsa.pub rather than
+ ~/.ssh/identity.pub, in line with ssh-keygen (thanks, Greg Norris;
+ closes: #234627).
+ * Build-depend on libselinux1-dev on lpia.
+ * openssh-client Suggests: keychain.
+ * debconf template translations:
+ - Update Catalan (thanks, Jordà Polo; closes: #431970).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 30 Jul 2007 09:34:38 +0100
+
+openssh (1:4.6p1-4) unstable; urgency=low
+
+ * Don't build PIE executables on hppa, as they crash.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 05 Jul 2007 11:06:54 +0100
+
+openssh (1:4.6p1-3) unstable; urgency=low
+
+ * Only build PIE executables on Linux and NetBSD (closes: #430455).
+ * Fix broken switch fallthrough when SELinux is running in permissive mode
+ (closes: #430838).
+ * Document that HashKnownHosts may break tab-completion (closes: #430154).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 29 Jun 2007 07:15:38 +0100
+
+openssh (1:4.6p1-2) unstable; urgency=low
+
+ * Fix ordering of SYSLOG_LEVEL_QUIET and SYSLOG_LEVEL_FATAL.
+ * Clarify that 'ssh -q -q' still prints errors caused by bad arguments
+ (i.e. before the logging system is initialised).
+ * Suppress "Connection to <host> closed" and "Connection to master closed"
+ messages at loglevel SILENT (thanks, Jaap Eldering; closes: #409788).
+ * Suppress "Pseudo-terminal will not be allocated because stdin is not a
+ terminal" message at loglevels QUIET and SILENT (closes: #366814).
+ * Document the SILENT loglevel in sftp-server(8), ssh_config(5), and
+ sshd_config(5).
+ * Add try-restart action to init script.
+ * Add /etc/network/if-up.d/openssh-server to restart sshd when new
+ interfaces appear (LP: #103436).
+ * Backport from upstream:
+ - Move C/R -> kbdint special case to after the defaults have been
+ loaded, which makes ChallengeResponse default to yes again. This was
+ broken by the Match changes and not fixed properly subsequently
+ (closes: #428968).
+ - Silence spurious error messages from hang-on-exit fix
+ (http://bugzilla.mindrot.org/show_bug.cgi?id=1306, closes: #429531).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 20 Jun 2007 11:52:44 +0100
+
+openssh (1:4.6p1-1) unstable; urgency=low
+
+ * New upstream release (closes: #395507, #397961, #420035). Important
+ changes not previously backported to 4.3p2:
+ - 4.4/4.4p1 (http://www.openssh.com/txt/release-4.4):
+ + On portable OpenSSH, fix a GSSAPI authentication abort that could be
+ used to determine the validity of usernames on some platforms.
+ + Implemented conditional configuration in sshd_config(5) using the
+ "Match" directive. This allows some configuration options to be
+ selectively overridden if specific criteria (based on user, group,
+ hostname and/or address) are met. So far a useful subset of
+ post-authentication options are supported and more are expected to
+ be added in future releases.
+ + Add support for Diffie-Hellman group exchange key agreement with a
+ final hash of SHA256.
+ + Added a "ForceCommand" directive to sshd_config(5). Similar to the
+ command="..." option accepted in ~/.ssh/authorized_keys, this forces
+ the execution of the specified command regardless of what the user
+ requested. This is very useful in conjunction with the new "Match"
+ option.
+ + Add a "PermitOpen" directive to sshd_config(5). This mirrors the
+ permitopen="..." authorized_keys option, allowing fine-grained
+ control over the port-forwardings that a user is allowed to
+ establish.
+ + Add optional logging of transactions to sftp-server(8).
+ + ssh(1) will now record port numbers for hosts stored in
+ ~/.ssh/known_hosts when a non-standard port has been requested
+ (closes: #50612).
+ + Add an "ExitOnForwardFailure" option to cause ssh(1) to exit (with a
+ non-zero exit code) when requested port forwardings could not be
+ established.
+ + Extend sshd_config(5) "SubSystem" declarations to allow the
+ specification of command-line arguments.
+ + Replacement of all integer overflow susceptible invocations of
+ malloc(3) and realloc(3) with overflow-checking equivalents.
+ + Many manpage fixes and improvements.
+ + Add optional support for OpenSSL hardware accelerators (engines),
+ enabled using the --with-ssl-engine configure option.
+ + Tokens in configuration files may be double-quoted in order to
+ contain spaces (closes: #319639).
+ + Move a debug() call out of a SIGCHLD handler, fixing a hang when the
+ session exits very quickly (closes: #307890).
+ + Fix some incorrect buffer allocation calculations (closes: #410599).
+ + ssh-add doesn't ask for a passphrase if key file permissions are too
+ liberal (closes: #103677).
+ + Likewise, ssh doesn't ask either (closes: #99675).
+ - 4.6/4.6p1 (http://www.openssh.com/txt/release-4.6):
+ + sshd now allows the enabling and disabling of authentication methods
+ on a per user, group, host and network basis via the Match directive
+ in sshd_config.
+ + Fixed an inconsistent check for a terminal when displaying scp
+ progress meter (closes: #257524).
+ + Fix "hang on exit" when background processes are running at the time
+ of exit on a ttyful/login session (closes: #88337).
+ * Update to current GSSAPI patch from
+ http://www.sxw.org.uk/computing/patches/openssh-4.6p1-gsskex-20070312.patch;
+ install ChangeLog.gssapi.
+ * Build the .deb --with-ssl-engine (closes: #408027, LP: #119295).
+ * Use LSB functions in init scripts, and add an LSB-style header (partly
+ from Ubuntu and partly thanks to Christian Perrier; closes: #389038).
+ * Move init script start links to S16, move rc1 stop link to K84, and
+ remove rc0 and rc6 stop links altogether (the last part from Ubuntu;
+ closes: #122188).
+ * Emit a slightly more informative message from the init script if
+ /dev/null has somehow become not a character device (closes: #369964).
+ * Belatedly build-depend on zlib1g-dev (>= 1:1.2.3-1) (closes: #333447).
+ * Merge from Ubuntu:
+ - Build position-independent executables (only for debs, not for udebs)
+ to take advantage of address space layout randomisation.
+ - If building on Ubuntu, add /sbin, /usr/sbin, and /usr/local/sbin to
+ the default path.
+ * Use ${binary:Version} rather than ${Source-Version} in openssh-server ->
+ openssh-client dependency.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 13 Jun 2007 00:28:26 +0100
+
+openssh (1:4.3p2-11) unstable; urgency=low
+
+ * It's been four and a half years now since I took over as "temporary"
+ maintainer, so the Maintainer field is getting a bit inaccurate. Set
+ Maintainer to debian-ssh@lists.debian.org and leave Matthew and myself
+ as Uploaders.
+ * Use dpkg-query to fetch conffile md5sums rather than parsing
+ /var/lib/dpkg/status directly.
+ * openssh-client Suggests: libpam-ssh (closes: #427840).
+ * Use 'start-stop-daemon --oknodo' so that openssh-server's init script
+ exits successfully if sshd is already running (closes: #426858).
+
+ * Apply results of debconf templates and package descriptions review by
+ debian-l10n-english (closes: #420107, #420742).
+ * debconf template translations:
+ - Update Dutch (thanks, Machteld de Kok; closes: #419260).
+ - Update Norwegian Bokmål (thanks, Bjørn Steensrud; closes: #420630).
+ - Update Galician (thanks, Jacobo Tarrio; closes: #420635).
+ - Update Spanish (thanks, Javier Fernández-Sanguino Peña;
+ closes: #420651).
+ - Update Swedish (thanks, Daniel Nylander; closes: #420663).
+ - Add Bulgarian (thanks, Damyan Ivanov; closes: #420703).
+ - Add Tamil (thanks, Tirumurti Vasudevan; closes: #420739).
+ - Update German (thanks, Helge Kreutzmann; closes: #420743).
+ - Update Japanese (thanks, Kenshi Muto; closes: #420946).
+ - Add Basque (thanks, Piarres Beobide; closes: #421238).
+ - Update Italian (thanks, Luca Monducci; closes: #421348).
+ - Update Czech (thanks, Miroslav Kure; closes: #421484).
+ - Update Romanian (thanks, Igor Stirbu; closes: #421760).
+ - Update Russian (thanks, Yuriy Talakan' and Sergey Alyoshin;
+ closes: #420862).
+ - Update Dutch (thanks, Bart Cornelis; closes: #422767).
+ - Update Portuguese (thanks, Ricardo Silva; closes: #423112).
+ - Update French (thanks, Christian Perrier).
+ - Add Korean (thanks, Sunjae Park; closes: #424008).
+ - Update Vietnamese (thanks, Clytie Siddall; closes: #426991).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 10 Jun 2007 08:59:42 +0100
+
+openssh (1:4.3p2-10) unstable; urgency=low
+
+ * Multiply openssh-client-udeb's Installer-Menu-Item by 100.
+ * Increase MAX_SESSIONS to 64.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 10 Apr 2007 19:17:20 +0100
+
+openssh (1:4.3p2-9) unstable; urgency=high
+
+ [ Russ Allbery ]
+ * Fix GSSAPIKeyExchange configuration file handling logic in ssh-krb5
+ (closes: #404863).
+ * Fix uncommenting of GSSAPI options by ssh-krb5 (closes: #407766).
+
+ [ Colin Watson ]
+ * debconf template translations:
+ - Add Norwegian Bokmål (thanks, Bjørn Steensrud; closes: #412330).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 5 Mar 2007 16:13:50 +0000
+
+openssh (1:4.3p2-8) unstable; urgency=medium
+
+ [ Vincent Untz ]
+ * Give the ssh-askpass-gnome window a default icon; remove unnecessary
+ icon extension from .desktop file (closes:
+ https://launchpad.net/bugs/27152).
+
+ [ Colin Watson ]
+ * Drop versioning on ssh/ssh-krb5 Replaces, as otherwise it isn't
+ sufficient to replace conffiles (closes: #402804).
+ * Make GSSAPICleanupCreds a compatibility alias for
+ GSSAPICleanupCredentials. Mark GSSUseSessionCCache and
+ GSSAPIUseSessionCredCache as known-but-unsupported options, and migrate
+ away from them on upgrade.
+ * It turns out that the people who told me that removing a conffile in the
+ preinst was sufficient to have dpkg replace it without prompting when
+ moving a conffile between packages were very much mistaken. As far as I
+ can tell, the only way to do this reliably is to write out the desired
+ new text of the conffile in the preinst. This is gross, and requires
+ shipping the text of all conffiles in the preinst too, but there's
+ nothing for it. Fortunately this nonsense is only required for smooth
+ upgrades from sarge.
+ * debconf template translations:
+ - Add Romanian (thanks, Stan Ioan-Eugen; closes: #403528).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 23 Dec 2006 18:38:33 +0000
+
+openssh (1:4.3p2-7) unstable; urgency=medium
+
+ [ Colin Watson ]
+ * Ignore errors from usermod when changing sshd's shell, since it will
+ fail if the sshd user is not local (closes: #398436).
+ * Remove version control tags from /etc/ssh/moduli and /etc/ssh/ssh_config
+ to avoid unnecessary conffile resolution steps for administrators
+ (thanks, Jari Aalto; closes: #335259).
+ * Fix quoting error in configure.ac and regenerate configure (thanks, Ben
+ Pfaff; closes: #391248).
+ * When installing openssh-client or openssh-server from scratch, remove
+ any unchanged conffiles from the pre-split ssh package to work around a
+ bug in sarge's dpkg (thanks, Justin Pryzby and others; closes: #335276).
+
+ [ Russ Allbery ]
+ * Create transitional ssh-krb5 package which enables GSSAPI configuration
+ in sshd_config (closes: #390986).
+ * Default client to attempting GSSAPI authentication.
+ * Remove obsolete GSSAPINoMICAuthentication from sshd_config if it's
+ found.
+ * Add ssh -K option, the converse of -k, to enable GSSAPI credential
+ delegation (closes: #401483).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 6 Dec 2006 23:00:49 +0000
+
+openssh (1:4.3p2-6) unstable; urgency=low
+
+ * Acknowledge NMU (thanks, Manoj; closes: #394795).
+ * Backport from 4.5p1:
+ - Fix a bug in the sshd privilege separation monitor that weakened its
+ verification of successful authentication. This bug is not known to be
+ exploitable in the absence of additional vulnerabilities.
+ * openssh-server Suggests: molly-guard (closes: #395473).
+ * debconf template translations:
+ - Update German (thanks, Helge Kreutzmann; closes: #395947).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 15 Nov 2006 00:07:32 +0000
+
+openssh (1:4.3p2-5.1) unstable; urgency=low
+
+ * NMU to update SELinux patch, bringing it in line with current selinux
+ releases. The patch for this NMU is simply the Bug#394795 patch,
+ and no other changes. (closes: #394795)
+
+ -- Manoj Srivastava <srivasta@debian.org> Mon, 23 Oct 2006 14:11:24 -0500
+
+openssh (1:4.3p2-5) unstable; urgency=low
+
+ * Remove ssh/insecure_telnetd check altogether (closes: #391081).
+ * debconf template translations:
+ - Update Danish (thanks, Claus Hindsgaul; closes: #390612).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 5 Oct 2006 09:04:19 +0100
+
+openssh (1:4.3p2-4) unstable; urgency=high
+
+ * Backport from 4.4p1 (since I don't have an updated version of the GSSAPI
+ patch yet):
+ - CVE-2006-4924: Fix a pre-authentication denial of service found by
+ Tavis Ormandy, that would cause sshd(8) to spin until the login grace
+ time expired (closes: #389995).
+ - CVE-2006-5051: Fix an unsafe signal hander reported by Mark Dowd. The
+ signal handler was vulnerable to a race condition that could be
+ exploited to perform a pre-authentication denial of service. On
+ portable OpenSSH, this vulnerability could theoretically lead to
+ pre-authentication remote code execution if GSSAPI authentication is
+ enabled, but the likelihood of successful exploitation appears remote.
+
+ * Read /etc/default/locale as well as /etc/environment (thanks, Raphaël
+ Hertzog; closes: #369395).
+ * Remove no-longer-used ssh/insecure_rshd debconf template.
+ * Make ssh/insecure_telnetd Type: error (closes: #388946).
+
+ * debconf template translations:
+ - Update Portuguese (thanks, Rui Branco; closes: #381942).
+ - Update Spanish (thanks, Javier Fernández-Sanguino Peña;
+ closes: #382966).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 29 Sep 2006 16:28:24 +0100
+
+openssh (1:4.3p2-3) unstable; urgency=low
+
+ * Document KeepAlive->TCPKeepAlive renaming in sshd_config(5) (closes:
+ https://launchpad.net/bugs/50702).
+ * Change sshd user's shell to /usr/sbin/nologin (closes: #366541).
+ Introduces dependency on passwd for usermod.
+ * debconf template translations:
+ - Update French (thanks, Denis Barbier; closes: #368503).
+ - Update Dutch (thanks, Bart Cornelis; closes: #375100).
+ - Update Japanese (thanks, Kenshi Muto; closes: #379950).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 27 Jul 2006 00:12:36 +0100
+
+openssh (1:4.3p2-2) unstable; urgency=low
+
+ * Include commented-out pam_access example in /etc/pam.d/ssh.
+ * On '/etc/init.d/ssh restart', create /var/run/sshd before checking the
+ server configuration, as otherwise 'sshd -t' will complain about the
+ lack of /var/run/sshd (closes: https://launchpad.net/bugs/45234).
+ * debconf template translations:
+ - Update Russian (thanks, Yuriy Talakan'; closes: #367143).
+ - Update Czech (thanks, Miroslav Kure; closes: #367161).
+ - Update Italian (thanks, Luca Monducci; closes: #367186).
+ - Update Galician (thanks, Jacobo Tarrio; closes: #367318).
+ - Update Swedish (thanks, Daniel Nylander; closes: #367971).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 19 May 2006 09:14:27 +0100
+
+openssh (1:4.3p2-1) unstable; urgency=low
+
+ * New upstream release (closes: #361032).
+ - CVE-2006-0225: scp (as does rcp, on which it is based) invoked a
+ subshell to perform local to local, and remote to remote copy
+ operations. This subshell exposed filenames to shell expansion twice;
+ allowing a local attacker to create filenames containing shell
+ metacharacters that, if matched by a wildcard, could lead to execution
+ of attacker-specified commands with the privilege of the user running
+ scp (closes: #349645).
+ - Add support for tunneling arbitrary network packets over a connection
+ between an OpenSSH client and server via tun(4) virtual network
+ interfaces. This allows the use of OpenSSH (4.3+) to create a true VPN
+ between the client and server providing real network connectivity at
+ layer 2 or 3. This feature is experimental.
+ - Reduce default key length for new DSA keys generated by ssh-keygen
+ back to 1024 bits. DSA is not specified for longer lengths and does
+ not fully benefit from simply making keys longer. As per FIPS 186-2
+ Change Notice 1, ssh-keygen will refuse to generate a new DSA key
+ smaller or larger than 1024 bits.
+ - Fixed X forwarding failing to start when the X11 client is executed in
+ background at the time of session exit.
+ - Change ssh-keygen to generate a protocol 2 RSA key when invoked
+ without arguments (closes: #114894).
+ - Fix timing variance for valid vs. invalid accounts when attempting
+ Kerberos authentication.
+ - Ensure that ssh always returns code 255 on internal error
+ (closes: #259865).
+ - Cleanup wtmp files on SIGTERM when not using privsep.
+ - Set SO_REUSEADDR on X11 listeners to avoid problems caused by
+ lingering sockets from previous session (X11 applications can
+ sometimes not connect to 127.0.0.1:60xx) (closes:
+ https://launchpad.net/bugs/25528).
+ - Ensure that fds 0, 1 and 2 are always attached in all programs, by
+ duping /dev/null to them if necessary.
+ - Xauth list invocation had bogus "." argument.
+ - Remove internal assumptions on key exchange hash algorithm and output
+ length, preparing OpenSSH for KEX methods with alternate hashes.
+ - Ignore junk sent by a server before it sends the "SSH-" banner.
+ - Many manual page improvements.
+ - Lots of cleanups, including fixes to memory leaks on error paths and
+ possible crashes.
+ * Update to current GSSAPI patch from
+ http://www.sxw.org.uk/computing/patches/openssh-4.3p2-gsskex-20060223.patch
+ (closes: #352042).
+ * debian/rules: Resynchronise CFLAGS with that generated by configure.
+ * Restore pam_nologin to /etc/pam.d/ssh; sshd no longer checks this itself
+ when PAM is enabled, but relies on PAM to do it.
+ * Rename KeepAlive to TCPKeepAlive in default sshd_config
+ (closes: #349896).
+ * Rephrase ssh/new_config and ssh/encrypted_host_key_but_no_keygen debconf
+ templates to make boolean short descriptions end with a question mark
+ and to avoid use of the first person.
+ * Ship README.tun.
+ * Policy version 3.7.2: no changes required.
+ * debconf template translations:
+ - Update Italian (thanks, Luca Monducci; closes: #360348).
+ - Add Galician (thanks, Jacobo Tarrio; closes: #361220).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 12 May 2006 12:48:24 +0100
+
+openssh (1:4.2p1-8) unstable; urgency=low
+
+ [ Frans Pop ]
+ * Use udeb support introduced in debhelper 4.2.0 (available in sarge)
+ rather than constructing udebs by steam.
+ * Require debhelper 5.0.22, which generates correct shared library
+ dependencies for udebs (closes: #360068). This build-dependency can be
+ ignored if building on sarge.
+
+ [ Colin Watson ]
+ * Switch to debhelper compatibility level 4, since we now require
+ debhelper 4 even on sarge anyway for udeb support.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 31 Mar 2006 09:44:55 +0100
+
+openssh (1:4.2p1-7) unstable; urgency=low
+
+ * I accidentally applied the default $PATH change in 1:4.2p1-6 to the udeb
+ rather than the deb. Fixed.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 1 Mar 2006 16:19:00 +0000
+
+openssh (1:4.2p1-6) unstable; urgency=low
+
+ * Sync default values of $PATH from shadow 1:4.0.12-6, adding /usr/bin/X11
+ to the normal and superuser paths and /usr/games to the normal path.
+ * When the client receives a signal, don't fatal() with "Killed by signal
+ %d." (which produces unhelpful noise on stderr and causes confusion for
+ users of some applications that wrap ssh); instead, generate a debug
+ message and exit with the traditional status (closes: #313371).
+ * debconf template translations:
+ - Add Swedish (thanks, Daniel Nylander; closes: #333133).
+ - Update Spanish (thanks, Javier Fernández-Sanguino Peña;
+ closes: #341371).
+ - Correct erroneously-changed Last-Translator headers in Greek and
+ Spanish translations.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 20 Feb 2006 16:50:55 +0000
+
+openssh (1:4.2p1-5) unstable; urgency=low
+
+ * Add a CVE name to the 1:4.0p1-1 changelog entry.
+ * Build-depend on libselinux1-dev on armeb.
+ * Only send GSSAPI proposal if GSSAPIAuthentication is enabled.
+ * Build-depend on libssl-dev (>= 0.9.8-1) to cope with surprise OpenSSL
+ transition, since otherwise who knows what the buildds will do. If
+ you're building openssh yourself, you can safely ignore this and use an
+ older libssl-dev.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 7 Oct 2005 12:23:42 +0100
+
+openssh (1:4.2p1-4) unstable; urgency=low
+
+ * Initialise token to GSS_C_EMPTY_BUFFER in ssh_gssapi_check_mechanism
+ (closes: #328606).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 16 Sep 2005 12:50:16 +0100
+
+openssh (1:4.2p1-3) unstable; urgency=low
+
+ * Add prototype for ssh_gssapi_server_mechanisms (closes: #328372).
+ * Interoperate with ssh-krb5 << 3.8.1p1-1 servers, which used a slightly
+ different version of the gssapi authentication method (thanks, Aaron M.
+ Ucko; closes: #328388).
+ * Explicitly tell po2debconf to use the 'popular' output encoding, so that
+ the woody-compatibility hack works even with po-debconf 0.9.0.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 15 Sep 2005 09:28:21 +0100
+
+openssh (1:4.2p1-2) unstable; urgency=low
+
+ * Annotate 1:4.2p1-1 changelog with CVE references.
+ * Add remaining pieces of Kerberos support (closes: #152657, #275472):
+ - Add GSSAPI key exchange support from
+ http://www.sxw.org.uk/computing/patches/openssh.html (thanks, Stephen
+ Frost).
+ - Build-depend on libkrb5-dev and configure --with-kerberos5=/usr.
+ - openssh-client and openssh-server replace ssh-krb5.
+ - Update commented-out Kerberos/GSSAPI options in default sshd_config.
+ - Fix HAVE_GSSAPI_KRB5_H/HAVE_GSSAPI_GSSAPI_KRB5_H typos in
+ gss-serv-krb5.c.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 14 Sep 2005 18:28:49 +0100
+
+openssh (1:4.2p1-1) unstable; urgency=low
+
+ * New upstream release.
+ - SECURITY (CAN-2005-2797): Fix a bug introduced in OpenSSH 4.0 that
+ caused GatewayPorts to be incorrectly activated for dynamic ("-D")
+ port forwardings when no listen address was explicitly specified
+ (closes: #326065).
+ - SECURITY (CAN-2005-2798): Fix improper delegation of GSSAPI
+ credentials. This code is only built in openssh-krb5, not openssh, but
+ I mention the CVE reference here anyway for completeness.
+ - Add a new compression method ("Compression delayed") that delays zlib
+ compression until after authentication, eliminating the risk of zlib
+ vulnerabilities being exploited by unauthenticated users. Note that
+ users of OpenSSH versions earlier than 3.5 will need to disable
+ compression on the client or set "Compression yes" (losing this
+ security benefit) on the server.
+ - Increase the default size of new RSA/DSA keys generated by ssh-keygen
+ from 1024 to 2048 bits (closes: #181162).
+ - Many bugfixes and improvements to connection multiplexing.
+ - Don't pretend to accept $HOME (closes: #208648).
+ * debian/rules: Resynchronise CFLAGS with that generated by configure.
+ * openssh-client and openssh-server conflict with pre-split ssh to avoid
+ problems when ssh is left un-upgraded (closes: #324695).
+ * Set X11Forwarding to yes in the default sshd_config (new installs only).
+ At least when X11UseLocalhost is turned on, which is the default, the
+ security risks of using X11 forwarding are risks to the client, not to
+ the server (closes: #320104).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 14 Sep 2005 15:16:14 +0100
+
+openssh (1:4.1p1-7) unstable; urgency=low
+
+ * Do the IDEA host key check on a temporary file to avoid altering
+ /etc/ssh/ssh_host_key itself (closes: #312312).
+ * Work around the ssh-askpass alternative somehow ending up in manual mode
+ pointing to the obsolete /usr/lib/ssh/gnome-ssh-askpass.
+ * Add GNU/kFreeBSD support (thanks, Aurelien Jarno; closes: #318113).
+ * Fix XSIish uses of 'test' in openssh-server.preinst.
+ * Policy version 3.6.2: no changes required.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 2 Sep 2005 16:18:11 +0100
+
+openssh (1:4.1p1-6) unstable; urgency=low
+
+ * Fix one-character typo that meant the binaries in openssh-client and
+ openssh-server got recompiled with the wrong options during
+ 'debian/rules install' (closes: #317088, #317238, #317241).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 7 Jul 2005 10:56:16 +0100
+
+openssh (1:4.1p1-5) unstable; urgency=low
+
+ * Build-depend on libselinux1-dev on ppc64 too (closes: #314625).
+ * Drop priority of ssh to extra to match the override file.
+ * Make /usr/share/doc/openssh-server and /usr/share/doc/ssh symlinks to
+ /usr/share/doc/openssh-client (closes: #314745).
+ * Ship README.dns (closes: #284874).
+ * Disable btmp logging, since Debian's /var/log/btmp has inappropriate
+ permissions (closes: #314956).
+ * Allow ~/.ssh/config to be group-writable, provided that the group in
+ question contains only the file's owner (closes: #314347).
+ * debconf template translations:
+ - Update Brazilian Portuguese (thanks, André Luís Lopes;
+ closes: #315477).
+ - Add Vietnamese (thanks, Clytie Siddall; closes: #316636).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 3 Jul 2005 17:08:08 +0100
+
+openssh (1:4.1p1-4) unstable; urgency=low
+
+ * openssh-client and openssh-server conflict with ssh-krb5, as ssh-krb5
+ only conflicts with ssh (closes: #312475).
+ * SELinux support (thanks, Manoj Srivastava; closes: #308555):
+ - Added SELinux capability, and turned it on be default. Added
+ restorecon calls in preinst and postinst (should not matter if the
+ machine is not SELinux aware). By and large, the changes made should
+ have no effect unless the rules file calls --with-selinux; and even
+ then there should be no performance hit for machines not actively
+ running SELinux.
+ - Modified the preinst and postinst to call restorecon to set the
+ security context for the generated public key files.
+ - Added a comment to /etc/pam.d/ssh to indicate that an SELinux system
+ may want to also include pam_selinux.so.
+ * Re-enable ssh-askpass-gnome on the Hurd, now that its build-dependencies
+ are available.
+ * Restore /usr/lib/sftp-server temporarily, as a symlink to
+ /usr/lib/openssh/sftp-server (closes: #312891).
+ * Switch to debhelper compatibility level 3, since 2 is deprecated.
+ * debconf template translations:
+ - Update German (thanks, Jens Seidel; closes: #313949).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 17 Jun 2005 14:20:20 +0100
+
+openssh (1:4.1p1-3) unstable; urgency=low
+
+ * Upload to unstable.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 6 Jun 2005 22:28:33 +0100
+
+openssh (1:4.1p1-2) experimental; urgency=low
+
+ * Drop debconf support for allowing SSH protocol 1, which is discouraged
+ and has not been the default since openssh 1:3.0.1p1-1. Users who need
+ this should edit sshd_config instead (closes: #147212).
+ * Since ssh-keysign isn't used by default (you need to set
+ EnableSSHKeysign to "yes" in /etc/ssh/ssh_config), having a debconf
+ question to ask whether it should be setuid is overkill, and the
+ question text had got out of date anyway. Remove this question, ship
+ ssh-keysign setuid in openssh-client.deb, and set a statoverride if the
+ debconf question was previously set to false.
+ * Add lintian overrides for the above (setuid-binary,
+ no-debconf-templates).
+ * Fix picky lintian errors about slogin symlinks.
+ * Fix DEB_HOST_ARCH_OS/DEB_HOST_GNU_SYSTEM compatibility handling.
+ * Apply Linux 2.2 workaround (see #239999) only on Linux.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 2 Jun 2005 00:55:58 +0100
+
+openssh (1:4.1p1-1) experimental; urgency=low
+
+ * New upstream release.
+ - Normalise socket addresses returned by get_remote_hostname(), fixing
+ 4-in-6 mapping issues with AllowUsers et al (closes: #192234).
+ * Take upstream's hint and disable the unsupported USE_POSIX_THREADS
+ (closes: #295757, #308868, and possibly others; may open other bugs).
+ Use PAM password authentication to avoid #278394. In future I may
+ provide two sets of binaries built with and without this option, since
+ it seems I can't win.
+ * Disable ChallengeResponseAuthentication in new installations, returning
+ to PasswordAuthentication by default, since it now supports PAM and
+ apparently works better with a non-threaded sshd (closes: #247521).
+ * openssh-server Suggests: rssh (closes: #233012).
+ * Change libexecdir to /usr/lib/openssh, and fix up various alternatives
+ and configuration files to match (closes: #87900, #151321).
+ * Fix up very old sshd_config files that refer to /usr/libexec/sftp-server
+ (closes: #141979).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 31 May 2005 01:33:33 +0100
+
+openssh (1:4.0p1-1) experimental; urgency=low
+
+ * New upstream release.
+ - Port-forwarding specifications now take optional bind addresses, and
+ the server allows client-specified bind addresses for remote port
+ forwardings when configured with "GatewayPorts clientspecified"
+ (closes: #87253, #192206).
+ - ssh and ssh-keyscan now support hashing of known_hosts files for
+ improved privacy (CAN-2005-2666). ssh-keygen has new options for
+ managing known_hosts files, which understand hashing.
+ - sftp supports command history and editing support using libedit
+ (closes: #287013).
+ - Have scp and sftp wait for the spawned ssh to exit before they exit
+ themselves, allowing ssh to restore terminal modes (closes: #257130).
+ - Improved the handling of bad data in authorized_keys files,
+ eliminating fatal errors on corrupt or very large keys; e.g. linefeeds
+ in keys only produce errors in auth.log now (closes: #220726).
+ - Add "command mode" to ssh connection multiplexing (closes: #303452).
+ - Mention $HOME/.hushlogin in sshd(8) FILES section (closes: #163933).
+ * Make gnome-ssh-askpass stay above other windows (thanks, Liyang HU;
+ closes: #296487).
+ * Remove obsolete and unnecessary ssh/forward_warning debconf note.
+ * Hurd build fixes (although sshd still doesn't work):
+ - Restore X forwarding fix from #102991, lost somewhere along the way.
+ - Link with -lcrypt.
+ - Link with -lpthread rather than -pthread.
+ - Don't build ssh-askpass-gnome on the Hurd, until GNOME is available to
+ satisfy build-dependencies.
+ * Drop workaround for #242462 on amd64; it's been fixed properly upstream.
+ * Enable HashKnownHosts by default. This only affects new entries; use
+ 'ssh-keygen -H' to convert an entire known_hosts file to hashed format.
+ * Note in ssh_config(5) that the SetupTimeOut option is Debian-specific
+ (closes: #307069).
+ * debconf template translations:
+ - Update Czech (thanks, Miroslav Kure; closes: #298744).
+ - Update Finnish (thanks, Matti Pöllä; closes: #303787).
+ - Synchronise Spanish with sarge branch (thanks, Javier
+ Fernández-Sanguino Peña; closes: #298536).
+ - Add Ukrainian (thanks, Eugeniy Meshcheryakov; closes: #301852).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 26 May 2005 11:23:18 +0100
+
+openssh (1:3.9p1-3) experimental; urgency=low
+
+ * Explain how to run sshd from inittab in README.Debian (closes: #147360).
+ * Add debian/watch file.
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 18 Feb 2005 00:20:16 +0000
+
+openssh (1:3.9p1-2) experimental; urgency=low
+
+ * Remove pam_nologin from /etc/pam.d/ssh, as sshd's built-in support
+ appears to be sufficient and more useful (closes: #162996).
+ * Depend on debconf | debconf-2.0.
+ * Drop LoginGraceTime back to the upstream default of two minutes on new
+ installs (closes: #289573).
+ * debconf template translations from Ubuntu bug #1232:
+ - Update Greek (thanks, Logiotatidis George).
+ - Update Spanish (thanks, Santiago Erquicia).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 15 Jan 2005 12:37:54 +0000
+
+openssh (1:3.9p1-1) experimental; urgency=low
+
+ * New upstream release.
+ - PAM password authentication implemented again (closes: #238699,
+ #242119).
+ - Implemented the ability to pass selected environment variables between
+ the client and the server.
+ - Fix ssh-keyscan breakage when remote server doesn't speak SSH protocol
+ (closes: #228828).
+ - Fix res_query detection (closes: #242462).
+ - 'ssh -c' documentation improved (closes: #265627).
+ * Pass LANG and LC_* environment variables from the client by default, and
+ accept them to the server by default in new installs, although not on
+ upgrade (closes: #264024).
+ * Build ssh in binary-indep, not binary-arch (thanks, LaMont Jones).
+ * Expand on openssh-client package description (closes: #273831).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 4 Jan 2005 14:18:31 +0000
+
+openssh (1:3.8.1p1-14) experimental; urgency=low
+
+ * We use DH_COMPAT=2, so build-depend on debhelper (>= 2).
+ * Fix timing information leak allowing discovery of invalid usernames in
+ PAM keyboard-interactive authentication (backported from a patch by
+ Darren Tucker; closes: #281595).
+ * Make sure that there's a delay in PAM keyboard-interactive
+ authentication when PermitRootLogin is not set to yes and the correct
+ root password is entered (closes: #248747).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 28 Nov 2004 18:09:37 +0000
+
+openssh (1:3.8.1p1-13) experimental; urgency=low
+
+ * Enable threading for PAM, on Sam Hartman's advice (closes: #278394).
+ * debconf template translations:
+ - Update Dutch (thanks, cobaco; closes: #278715).
+ * Correct README.Debian's ForwardX11Trusted description (closes: #280190).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 12 Nov 2004 12:03:13 +0000
+
+openssh (1:3.8.1p1-12) experimental; urgency=low
+
+ * Preserve /etc/ssh/sshd_config ownership/permissions (closes: #276754).
+ * Shorten the version string from the form "OpenSSH_3.8.1p1 Debian
+ 1:3.8.1p1-8.sarge.1" to "OpenSSH_3.8.1p1 Debian-8.sarge.1", as some SSH
+ implementations apparently have problems with the long version string.
+ This is of course a bug in those implementations, but since the extent
+ of the problem is unknown it's best to play safe (closes: #275731).
+ * debconf template translations:
+ - Add Finnish (thanks, Matti Pöllä; closes: #265339).
+ - Update Danish (thanks, Morten Brix Pedersen; closes: #275895).
+ - Update French (thanks, Denis Barbier; closes: #276703).
+ - Update Japanese (thanks, Kenshi Muto; closes: #277438).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 24 Oct 2004 19:21:17 +0100
+
+openssh (1:3.8.1p1-11) experimental; urgency=high
+
+ * Move sshd_config(5) to openssh-server, where it belongs.
+ * If PasswordAuthentication is disabled, then offer to disable
+ ChallengeResponseAuthentication too. The current PAM code will attempt
+ password-style authentication if ChallengeResponseAuthentication is
+ enabled (closes: #250369).
+ * This will ask a question of anyone who installed fresh with 1:3.8p1-2 or
+ later and then upgraded. Sorry about that ... for this reason, the
+ default answer is to leave ChallengeResponseAuthentication enabled.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 6 Oct 2004 14:28:20 +0100
+
+openssh (1:3.8.1p1-10) experimental; urgency=low
+
+ * Don't install the ssh-askpass-gnome .desktop file by default; I've had
+ too many GNOME people tell me it's the wrong thing to be doing. I've
+ left it in /usr/share/doc/ssh-askpass-gnome/examples/ for now.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 25 Aug 2004 18:18:14 +0100
+
+openssh (1:3.8.1p1-9) experimental; urgency=low
+
+ * Split the ssh binary package into openssh-client and openssh-server
+ (closes: #39741). openssh-server depends on openssh-client for some
+ common functionality; it didn't seem worth creating yet another package
+ for this. openssh-client is priority standard, openssh-server optional.
+ * New transitional ssh package, priority optional, depending on
+ openssh-client and openssh-server. May be removed once nothing depends
+ on it.
+ * When upgrading from ssh to openssh-{client,server}, it's very difficult
+ for the maintainer scripts to find out what version we're upgrading from
+ without dodgy dpkg hackery. I've therefore taken the opportunity to move
+ a couple of debconf notes into NEWS files, namely ssh/ssh2_keys_merged
+ and ssh/user_environment_tell.
+ * Add a heuristic to try to make sure the sshd_config upgrade to >= 3.7
+ happens even though we don't know what version we're upgrading from.
+ * Remove /etc/ssh/sshd_not_to_be_run on purge of openssh-server. For now
+ (until sarge+2) it's still honoured to avoid breaking existing
+ configurations, but the right approach is now to remove the
+ openssh-server package if you don't want to run the server. Add a NEWS
+ item to that effect.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 2 Aug 2004 20:48:54 +0100
+
+openssh (1:3.8.1p1-8.sarge.4) unstable; urgency=high
+
+ * Fix timing information leak allowing discovery of invalid usernames in
+ PAM keyboard-interactive authentication (backported from a patch by
+ Darren Tucker; closes: #281595).
+ * Make sure that there's a delay in PAM keyboard-interactive
+ authentication when PermitRootLogin is not set to yes and the correct
+ root password is entered (closes: #248747).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 28 Nov 2004 12:37:16 +0000
+
+openssh (1:3.8.1p1-8.sarge.3) unstable; urgency=low
+
+ * Enable threading for PAM, on Sam Hartman's advice (closes: #278394).
+ * debconf template translations:
+ - Update Dutch (thanks, cobaco; closes: #278715).
+ * Correct README.Debian's ForwardX11Trusted description (closes: #280190).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 12 Nov 2004 10:31:12 +0000
+
+openssh (1:3.8.1p1-8.sarge.2) unstable; urgency=low
+
+ * Preserve /etc/ssh/sshd_config ownership/permissions (closes: #276754).
+ * Shorten the version string from the form "OpenSSH_3.8.1p1 Debian
+ 1:3.8.1p1-8.sarge.1" to "OpenSSH_3.8.1p1 Debian-8.sarge.1", as some SSH
+ implementations apparently have problems with the long version string.
+ This is of course a bug in those implementations, but since the extent
+ of the problem is unknown it's best to play safe (closes: #275731).
+ * debconf template translations:
+ - Add Finnish (thanks, Matti Pöllä; closes: #265339).
+ - Update Danish (thanks, Morten Brix Pedersen; closes: #275895).
+ - Update French (thanks, Denis Barbier; closes: #276703).
+ - Update Japanese (thanks, Kenshi Muto; closes: #277438).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 24 Oct 2004 17:57:14 +0100
+
+openssh (1:3.8.1p1-8.sarge.1) unstable; urgency=high
+
+ * If PasswordAuthentication is disabled, then offer to disable
+ ChallengeResponseAuthentication too. The current PAM code will attempt
+ password-style authentication if ChallengeResponseAuthentication is
+ enabled (closes: #250369).
+ * This will ask a question of anyone who installed fresh with 1:3.8p1-2 or
+ later and then upgraded. Sorry about that ... for this reason, the
+ default answer is to leave ChallengeResponseAuthentication enabled.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 6 Oct 2004 14:21:55 +0100
+
+openssh (1:3.8.1p1-8) unstable; urgency=high
+
+ * Matthew Vernon:
+ - Add a GPL exception to the licensing terms of the Debian patch
+ (closes: #211644).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 29 Jul 2004 13:28:47 +0100
+
+openssh (1:3.8.1p1-7) unstable; urgency=low
+
+ * Re-enable shadow password support in openssh-server-udeb, at Bastian
+ Blank's request (closes: #260800).
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 22 Jul 2004 10:56:06 +0100
+
+openssh (1:3.8.1p1-6) unstable; urgency=low
+
+ * Implement hack in
+ http://lists.debian.org/debian-boot/2004/07/msg01207.html to get
+ openssh-client-udeb to show up as a retrievable debian-installer
+ component.
+ * Generate host keys in postinst only if the relevant HostKey directives
+ are found in sshd_config (closes: #87946).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 21 Jul 2004 15:14:46 +0100
+
+openssh (1:3.8.1p1-5) unstable; urgency=medium
+
+ * Update German debconf template translation (thanks, Helge Kreutzmann;
+ closes: #252226).
+ * Remove Suggests: dnsutils, as it was only needed for
+ make-ssh-known-hosts (#93265), which has been replaced by ssh-keyscan.
+ * Disable shadow password support in openssh-server-udeb.
+ * Fix non-portable shell constructs in maintainer scripts, Makefile, and
+ ssh-copy-id (thanks, David Weinehall; closes: #258517).
+ * Apply patch from Darren Tucker to make the PAM authentication SIGCHLD
+ handler kill the PAM thread if its waitpid() call returns 0, as well as
+ the previous check for -1 (closes: #252676).
+ * Add scp and sftp to openssh-client-udeb. It might not be very 'u' any
+ more; oh well.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 10 Jul 2004 13:57:27 +0100
+
+openssh (1:3.8.1p1-4) unstable; urgency=medium
+
+ * Kill off PAM thread if privsep slave dies (closes: #248125).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 28 May 2004 17:58:45 -0300
+
+openssh (1:3.8.1p1-3) unstable; urgency=low
+
+ * Add ssh-keygen to openssh-server-udeb.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 20 May 2004 16:31:52 +0100
+
+openssh (1:3.8.1p1-2) unstable; urgency=low
+
+ * Add Catalan debconf template translation (thanks, Aleix Badia i Bosch;
+ closes: #248748).
+ * openssh-client-udeb and openssh-server-udeb depend on libnss-files-udeb
+ (not yet uploaded).
+ * Restore ssh-askpass-gnome binary, lost by mistake.
+ * Don't link against libnsl in udeb builds.
+
+ -- Colin Watson <cjwatson@debian.org> Thu, 20 May 2004 11:15:58 +0100
+
+openssh (1:3.8.1p1-1) unstable; urgency=low
+
+ * New upstream release.
+ - Use a longer buffer for tty names in utmp (closes: #247538).
+ * Make sure there's a newline at the end of sshd_config before adding
+ 'UsePAM yes' (closes: #244829).
+ * Generate a new .orig.tar.gz without RFC.nroff, and remove
+ /usr/share/doc/ssh/RFC.gz (closes: #211640). It isn't DFSG-free and only
+ documents the obsolete SSH1 protocol, not to mention that it was never a
+ real RFC but only an Internet-Draft. It's available from
+ http://www.free.lp.se/bamse/draft-ylonen-ssh-protocol-00.txt if you want
+ it for some reason.
+ * Add openssh-client-udeb and openssh-server-udeb binary packages for use
+ in debian-installer. They still need libnss_files to be supplied in udeb
+ form by glibc.
+ * Work around lack of res_query weak alias in libresolv on amd64 (see
+ #242462, awaiting real fix upstream).
+ * Fix grammar in sshd(8) (closes: #238753).
+ * Add .desktop file and icon for ssh-askpass-gnome (closes: #232333).
+ * Update Polish debconf template translation (thanks, Emil Nowak;
+ closes: #242808).
+ * Add Turkish debconf template translation (thanks, Recai Oktaş;
+ closes: #246068).
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 11 May 2004 23:38:10 +0100
+
+openssh (1:3.8p1-3) unstable; urgency=low
+
+ * Remove deprecated ReverseMappingCheck option from newly generated
+ sshd_config files (closes: #239987).
+ * Build everything apart from contrib in a subdirectory, to allow for
+ multiple builds.
+ * Some older kernels are missing setresuid() and setresgid(), so don't try
+ to use them. setreuid() and setregid() will do well enough for our
+ purposes (closes: #239999).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 5 Apr 2004 21:23:43 +0100
+
+openssh (1:3.8p1-2) unstable; urgency=medium
+
+ * Disable PasswordAuthentication for new installations (closes: #236810).
+ * Turn off the new ForwardX11Trusted by default, returning to the
+ semantics of 3.7 and earlier, since it seems immature and causes far too
+ many problems with existing setups. See README.Debian for details
+ (closes: #237021).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 10 Mar 2004 10:33:07 +0000
+
+openssh (1:3.8p1-1) unstable; urgency=low
+
+ * New upstream release (closes: #232281):
+ - New PAM implementation based on that in FreeBSD. This runs PAM session
+ modules before dropping privileges (closes: #132681, #150968).
+ - Since PAM session modules are run as root, we can turn pam_limits back
+ on by default, and it no longer spits out "Operation not permitted" to
+ syslog (closes: #171673).
+ - Password expiry works again (closes: #153235).
+ - 'ssh -q' suppresses login banner (closes: #134589).
+ - sshd doesn't lie to PAM about invalid usernames (closes: #157078).
+ - ssh-add prints key comment on each prompt (closes: #181869).
+ - Punctuation formatting fixed in man pages (closes: #191131).
+ - EnableSSHKeysign documented in ssh_config(5) (closes: #224457).
+ * Add 'UsePAM yes' to /etc/ssh/sshd_config on upgrade from versions older
+ than this, to maintain the standard Debian sshd configuration.
+ * Comment out PAMAuthenticationViaKbdInt and RhostsAuthentication in
+ sshd_config on upgrade. Neither option is supported any more.
+ * Privilege separation and PAM are now properly supported together, so
+ remove both debconf questions related to them and simply set it
+ unconditionally in newly generated sshd_config files (closes: #228838).
+ * ServerAliveInterval implemented upstream, so ProtocolKeepAlives is now a
+ compatibility alias. The semantics differ slightly, though; see
+ ssh_config(5) for details.
+ * Implement SSH1 support for ServerAliveInterval using SSH_MSG_IGNORE. As
+ documented in ssh_config(5), it's not as good as the SSH2 version.
+ * Remove -fno-builtin-log, -DHAVE_MMAP_ANON_SHARED, and
+ -D__FILE_OFFSET_BITS=64 compiler options, which are no longer necessary.
+ * Update config.guess and config.sub from autotools-dev 20040105.1.
+ * Darren Tucker:
+ - Reset signal status when starting pam auth thread, prevent hanging
+ during PAM keyboard-interactive authentications.
+ - Fix a non-security-critical segfault in PAM authentication.
+ * Add debconf template translations:
+ - Greek (thanks, Konstantinos Margaritis; closes: #232843).
+ - Italian (thanks, Renato Gini; closes: #234777).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 6 Mar 2004 18:43:44 +0000
+
+openssh (1:3.6.1p2-12) unstable; urgency=low
+
+ * Update Spanish debconf template translation (thanks, Javier
+ Fernández-Sanguino Peña; closes: #228242).
+ * Add debconf template translations:
+ - Czech (thanks, Miroslav Kure; closes: #230110).
+ - Simplified Chinese (thanks, Hiei Xu; closes: #230726).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 11 Feb 2004 09:37:57 +0000
+
+openssh (1:3.6.1p2-11) unstable; urgency=low
+
+ * Comment out pam_limits in default configuration, for now at least
+ (closes: #198254).
+ * Use invoke-rc.d (if it exists) to run the init script.
+ * Backport format string bug fix in sshconnect.c (closes: #225238).
+ * ssh-copy-id exits if ssh fails (closes: #215252).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 4 Jan 2004 18:59:21 +0000
+
+openssh (1:3.6.1p2-10) unstable; urgency=low
+
+ * Use --retry in init script when restarting rather than sleeping, to make
+ sure the old process is dead (thanks, Herbert Xu; closes: #212117).
+ Depend on dpkg (>= 1.9.0) for start-stop-daemon's --retry option.
+ * Update debconf template translations:
+ - Brazilian Portuguese (thanks, Andre Luis Lopes; closes: #219844).
+ - Danish (thanks, Morten Brix Pedersen; closes: #217964).
+ - Japanese (thanks, Kenshi Muto; closes: #212497).
+ - Russian (thanks, Ilgiz Kalmetev).
+ - Spanish (thanks, Carlos Valdivia Yagüe; closes: #211832).
+ * Add Dutch debconf template translation (thanks, cobaco;
+ closes: #215372).
+ * Update config.guess and config.sub from autotools-dev 20031007.1
+ (closes: #217696).
+ * Implement New World Order for PAM configuration, including
+ /etc/pam.d/common-* from /etc/pam.d/ssh (closes: #212959).
+ - To backport this release to woody, you need to set DEB_BUILD_SSH_WOODY
+ in your environment. See README.Debian.
+ * Add more commentary to /etc/pam.d/ssh.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 16 Nov 2003 01:14:16 +0000
+
+openssh (1:3.6.1p2-9) unstable; urgency=high
+
+ * Merge even more buffer allocation fixes from upstream (CAN-2003-0682;
+ closes: #211434).
+
+ -- Colin Watson <cjwatson@debian.org> Fri, 19 Sep 2003 10:25:25 +0100
+
+openssh (1:3.6.1p2-8) unstable; urgency=high
+
+ * Merge more buffer allocation fixes from new upstream version 3.7.1p1
+ (closes: #211324).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 17 Sep 2003 03:07:19 +0100
+
+openssh (1:3.6.1p2-7) unstable; urgency=high
+
+ * Update debconf template translations:
+ - French (thanks, Christian Perrier; closes: #208801).
+ - Japanese (thanks, Kenshi Muto; closes: #210380).
+ * Some small improvements to the English templates courtesy of Christian
+ Perrier. I've manually unfuzzied a few translations where it was
+ obvious, on Christian's advice, but the others will have to be updated.
+ * Document how to generate an RSA1 host key (closes: #141703).
+ * Incorporate NMU fix for early buffer expansion vulnerability,
+ CAN-2003-0693 (closes: #211205). Thanks to Michael Stone.
+
+ -- Colin Watson <cjwatson@debian.org> Tue, 16 Sep 2003 14:32:28 +0100
+
+openssh (1:3.6.1p2-6.0) unstable; urgency=high
+
+ * SECURITY: fix for CAN-2003-0693, buffer allocation error
+
+ -- Michael Stone <mstone@debian.org> Tue, 16 Sep 2003 08:27:07 -0400
+
+openssh (1:3.6.1p2-6) unstable; urgency=medium
+
+ * Use a more CVS-friendly means of setting SSH_VERSION.
+ * Update Brazilian Portuguese debconf template translation (thanks, Andre
+ Luis Lopes; closes: #208036).
+ * Don't run 'sshd -t' in init script if the server isn't to be run
+ (closes: #197576).
+ * Fix login delay, spurious auth.log entry, and PermitRootLogin
+ information leakage due to PAM issues with upstream's recent security
+ update (thanks, Darren Tucker; closes: #99168, #192207, #193546).
+ * Policy version 3.6.1: recode this changelog to UTF-8.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 3 Sep 2003 19:14:02 +0100
+
+openssh (1:3.6.1p2-5) unstable; urgency=low
+
+ * Disable cmsg_type check for file descriptor passing when running on
+ Linux 2.0 (closes: #150976). Remove comments about non-functional
+ privilege separation on 2.0 from ssh/privsep_ask and ssh/privsep_tell
+ debconf questions and from README.Debian, since it should all now work.
+ * Fix "defails" typo in generated sshd_config (closes: #206484).
+ * Backport upstream patch to strip trailing whitespace (including
+ newlines) from configuration directives (closes: #192079).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 27 Aug 2003 02:19:57 +0100
+
+openssh (1:3.6.1p2-4) unstable; urgency=low
+
+ * getent can get just one key; no need to use grep (thanks, James Troup).
+ * Move /usr/local/bin to the front of the default path, following
+ /etc/login.defs (closes: #201150).
+ * Remove specifics of problematic countries from package description
+ (closes: #197040).
+ * Update Spanish debconf template translation (thanks, Carlos Valdivia
+ Yagüe; closes: #198456).
+ * Backport upstream patch to pass monitor signals through to child
+ (closes: #164797).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 27 Jul 2003 17:31:15 +0100
+
+openssh (1:3.6.1p2-3) unstable; urgency=low
+
+ * Update French debconf template translation (thanks, Christian Perrier;
+ closes: #194323).
+ * Version the adduser dependency for --no-create-home (closes: #195756).
+ * Add a version of moduli(5), namely revision 1.7 of
+ http://www.openbsd.org/cgi-bin/cvsweb/src/share/man/man5/moduli.5 with
+ '/etc/moduli' changed to '/etc/ssh/moduli' throughout (closes: #196061).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 9 Jun 2003 02:51:35 +0100
+
+openssh (1:3.6.1p2-2) unstable; urgency=low
+
+ * Force /etc/default/ssh to be non-executable, since dpkg apparently
+ doesn't deal with permissions changes on conffiles (closes: #192966).
+ * Use debconf 0.5's seen flag rather than the deprecated isdefault.
+ * Add GPL location to copyright file.
+ * Remove debian/postinst.old.
+ * Switch to po-debconf, with some careful manual use of po2debconf to
+ ensure that the source package continues to build smoothly on woody
+ (closes: #183986).
+ * Update debconf template translations:
+ - Brazilian Portugese (thanks, Andre Luis Lopes; see #183986).
+ - Japanese (thanks, Tomohiro KUBOTA; closes: #192429).
+ * Compile with -fno-builtin-log for now, otherwise gcc-3.3 complains
+ "log.h:59: warning: conflicting types for built-in function `log'". The
+ OpenSSH log() function has been renamed in upstream CVS.
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 19 May 2003 01:52:38 +0100
+
+openssh (1:3.6.1p2-1) unstable; urgency=medium
+
+ * New upstream release, including fix for PAM user-discovery security hole
+ (closes: #191681).
+ * Fix ChallengeResponseAuthentication default in generated sshd_config
+ (closes: #106037).
+ * Put newlines after full stops in man page documentation for
+ ProtocolKeepAlives and SetupTimeOut.
+ * Policy version 3.5.9: support DEB_BUILD_OPTIONS=noopt, build
+ gnome-ssh-askpass with -g and -Wall flags.
+ * Really ask ssh/new_config debconf question before trying to fetch its
+ value (closes: #188721).
+ * On purge, remove only the files we know about in /etc/ssh rather than
+ the whole thing, and remove the directory if that leaves it empty
+ (closes: #176679).
+ * ssh has depended on debconf for some time now with no complaints, so:
+ - Simplify the postinst by relying on debconf being present. (The absent
+ case was buggy anyway.)
+ - Get rid of "if you have not installed debconf" text in README.Debian,
+ and generally update the "/usr/bin/ssh not SUID" entry.
+ * More README.Debian work:
+ - Reorganize into "UPGRADE ISSUES" and "OTHER ISSUES", in an effort to
+ make it easier for people to find the former. The upgrade issues
+ should probably be sorted by version somehow.
+ - Document X11UseLocalhost under "X11 Forwarding" (closes: #150913).
+ * Fix setting of IP flags for interactive sessions (upstream bug #541).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 5 May 2003 17:47:40 +0100
+
+openssh (1:3.6.1p1-1) unstable; urgency=low
+
+ * New upstream release (thanks, Laurence J. Lane).
+ * debian/control: ssh-askpass-gnome is now Section: gnome, following the
+ override file.
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 2 Apr 2003 00:51:02 +0100
+
+openssh (1:3.6p1-1) unstable; urgency=low
+
+ * New upstream release.
+ - Workaround applied upstream for a bug in the interaction of glibc's
+ getaddrinfo() with the Linux 2.2 kernel (closes: #155814).
+ - As such, it should now be safe to remove --with-ipv4-default, so
+ starting sshd with -6 is no longer necessary (closes: #79861 and lots
+ of other merged bugs).
+ - ssh-copy-id prints usage when run without arguments (closes: #71376).
+ - scp exits 1 if ssh fails (closes: #138400).
+ - sshd writes to utmp's ut_addr_v6 field in IPv6 mode (closes: #167867).
+ - 'ssh-add -c' causes ssh-agent to ask the user each time a key is used
+ (closes: #109795).
+ * Install /etc/default/ssh non-executable (closes: #185537).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 31 Mar 2003 23:00:59 +0100
+
+openssh (1:3.5p1-5) unstable; urgency=low
+
+ * Add /etc/default/ssh (closes: #161049).
+ * Run the init script under 'set -e' (closes: #175010).
+ * Change the default superuser path to include /sbin, /usr/sbin, and
+ /usr/local/sbin (closes: #128235, #151267). Using login.defs would be
+ nice, but that belongs to another package. Without a defined API to
+ retrieve its settings, parsing it is off-limits.
+ * Build ssh-askpass-gnome with GNOME 2. The source package should still
+ support building on stable with GNOME 1, using the alternate
+ libgnome-dev build-dependency (thanks, Colin Walters; closes: #167582).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 9 Mar 2003 20:12:10 +0000
+
+openssh (1:3.5p1-4) unstable; urgency=low
+
+ * Point rlogin and rcp alternatives at slogin and scp respectively rather
+ than ssh (closes: #121103, #151666). Fix alternative removal to match;
+ previously it was completely wrong anyway.
+ * Find out whether /etc/ssh/sshd_not_to_be_run exists and set the debconf
+ question's default using that information, rather than using debconf as
+ a registry. Other solutions may be better in the long run, but this is
+ at least correct (thanks, Matthew Woodcraft; closes: #84725).
+ * Stop using pam_lastlog, as it doesn't currently work well as a session
+ module when privilege separation is enabled; it can usually read
+ /var/log/lastlog but can't write to it. Instead, just use sshd's
+ built-in support, already enabled by default (closes: #151297, #169938).
+ * Use 'ssh-keygen -q' rather than redirecting output to /dev/null.
+ * Add a "this may take some time" warning when creating host keys on
+ installation (part of #110094).
+ * When restarting via the init script, check for sshd_not_to_be_run after
+ stopping sshd (idea from Tomas Pospisek; closes: #149850).
+ * Append /usr/sbin:/sbin to the init script's $PATH, just in case of
+ strangeness (closes: #115138).
+ * Fix a dpkg-statoverride call to redirect stdout to /dev/null, not
+ stderr.
+ * Correct copyright file typo: "orignal" -> "original" (closes: #176490).
+ * Rebuild with libssl0.9.7 (closes: #176983).
+ * We're up to policy version 3.5.6. DEB_BUILD_OPTIONS stuff still needs to
+ be looked at.
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 18 Jan 2003 01:37:23 +0000
+
+openssh (1:3.5p1-3) unstable; urgency=low
+
+ * Happy new year!
+ * Use getent rather than id to find out whether the sshd user exists
+ (closes: #150974).
+ * Remove some duplication from the postinst's ssh-keysign setuid code.
+ * Replace db_text with db_input throughout debian/config. (db_text has
+ been a compatibility wrapper since debconf 0.1.5.)
+ * Warn about PermitUserEnvironment on upgrade (closes: #167895).
+ * Use 'make install-nokeys', and disable unused debhelper commands,
+ thereby forward-porting the last pieces of Zack Weinberg's patch
+ (closes: #68341).
+ * Move the man page for gnome-ssh-askpass from the ssh package to
+ ssh-askpass-gnome (closes: #174449).
+ * Build with -DLOGIN_NO_ENDOPT, since Debian's /bin/login doesn't accept
+ '--' to terminate the list of options (closes: #171554).
+ * Add Jonathan Amery's ssh-argv0 script (closes: #111341).
+ * Update Danish debconf template (thanks, Morten Brix Pedersen;
+ closes: #174757).
+ * Document setgid ssh-agent's effect on certain environment variables in
+ README.Debian (closes: #167974).
+ * Document interoperability problems between scp and ssh.com's server in
+ README.Debian, and suggest some workarounds (closes: #174662).
+
+ -- Colin Watson <cjwatson@debian.org> Wed, 1 Jan 2003 14:18:30 +0000
+
+openssh (1:3.5p1-2) unstable; urgency=low
+
+ * Mention in the ssh package description that it provides both ssh and
+ sshd (closes: #99680).
+ * Create a system group for ssh-agent, not a user group (closes: #167669).
+
+ -- Colin Watson <cjwatson@debian.org> Mon, 4 Nov 2002 13:43:53 +0000
+
+openssh (1:3.5p1-1) unstable; urgency=low
+
+ * New upstream release.
+ - Fixes typo in ssh-add usage (closes: #152239).
+ - Fixes 'PermitRootLogin forced-commands-only' (closes: #166184).
+ - ~/.ssh/environment and environment= options in ~/.ssh/authorized_keys
+ are deprecated for security reasons and will eventually go away. For
+ now they can be re-enabled by setting 'PermitUserEnvironment yes' in
+ sshd_config.
+ - ssh-agent is installed setgid to prevent ptrace() attacks. The group
+ actually doesn't matter, as it drops privileges immediately, but to
+ avoid confusion the postinst creates a new 'ssh' group for it.
+ * Obsolete patches:
+ - Solar Designer's privsep+compression patch for Linux 2.2 (see
+ 1:3.3p1-0.0woody1).
+ - Hostbased auth ssh-keysign backport (see 1:3.4p1-4).
+
+ * Remove duplicated phrase in ssh_config(5) (closes: #152404).
+ * Source the debconf confmodule at the top of the postrm rather than at
+ the bottom, to avoid making future non-idempotency problems worse (see
+ #151035).
+ * Debconf templates:
+ - Add Polish (thanks, Grzegorz Kusnierz).
+ - Update French (thanks, Denis Barbier; closes: #132509).
+ - Update Spanish (thanks, Carlos Valdivia Yagüe; closes: #164716).
+ * Write a man page for gnome-ssh-askpass, and link it to ssh-askpass.1 if
+ this is the selected ssh-askpass alternative (closes: #67775).
+
+ -- Colin Watson <cjwatson@debian.org> Sat, 26 Oct 2002 19:41:51 +0100
+
+openssh (1:3.4p1-4) unstable; urgency=low
+
+ * Allow ssh-krb5 in ssh-askpass-gnome's dependencies (closes: #129532).
+ * Restore Russia to list of countries where encryption is problematic (see
+ #148951 and http://www.average.org/freecrypto/).
+ * Drop ssh-askpass-gnome's priority to optional, per the override file.
+ * Drop the PAM special case for hurd-i386 (closes: #99157).
+ * s/dile/idle/ in ssh_config(5) (closes: #118331).
+ * Note in README.Debian that you need xauth from xbase-clients on the
+ server for X11 forwarding (closes: #140269).
+ * Use correct path to upstream README in copyright file (closes: #146037).
+ * Document the units for ProtocolKeepAlives (closes: #159479).
+ * Backport upstream patch to fix hostbased auth (closes: #117114).
+ * Add -g to CFLAGS.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 13 Oct 2002 18:58:53 +0100
+
+openssh (1:3.4p1-3) unstable; urgency=low
+
+ * Add myself to Uploaders: and begin acting as temporary maintainer, at
+ Matthew's request. (Normal service will resume in some months' time.)
+ * Add sharutils to Build-Depends (closes: #138465).
+ * Stop creating the /usr/doc/ssh symlink.
+
+ * Fix some debconf template typos (closes: #160358).
+ * Split debconf templates into one file per language.
+ * Add debconf template translations:
+ - Brazilian Portuguese (thanks, Andre Luis Lopes; closes: #106173).
+ - Danish (thanks, Claus Hindsgaul; closes: #126607).
+ - Japanese (thanks, Tomohiro KUBOTA; closes: #137427).
+ - Russian (thanks, Ilgiz Kalmetev; closes: #136610).
+ - Spanish (thanks, Carlos Valdivia Yagüe; closes: #129041).
+ * Update debconf template translations:
+ - French (thanks, Igor Genibel; closes: #151361).
+ - German (thanks, Axel Noetzold; closes: #147069).
+ * Some of these translations are fuzzy. Please send updates.
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 13 Oct 2002 14:09:57 +0100
+
+openssh (1:3.4p1-2) unstable; urgency=high
+
+ * Get a security-fixed version into unstable
+ * Also tidy README.Debian up a little
+
+ -- Matthew Vernon <matthew@debian.org> Fri, 28 Jun 2002 17:20:59 +0100
+
+openssh (1:3.4p1-1) testing; urgency=high
+
+ * Extend my tendrils back into this package (Closes: #150915, #151098)
+ * thanks to the security team for their work
+ * no thanks to ISS/Theo de Raadt for their handling of these bugs
+ * save old sshd_configs to sshd_config.dpkg-old when auto-generating a
+ new one
+ * tell/ask the user about PriviledgeSeparation
+ * /etc/init.d/ssh run will now create the chroot empty dir if necessary
+ * Remove our previous statoverride on /usr/bin/ssh (only for people
+ upgrading from a version where we'd put one in ourselves!)
+ * Stop slandering Russia, since someone asked so nicely (Closes: #148951)
+ * Reduce the sleep time in /etc/init.d/ssh during a restart
+
+ -- Matthew Vernon <matthew@debian.org> Fri, 28 Jun 2002 15:52:10 +0100
+
+openssh (1:3.4p1-0.0woody1) testing-security; urgency=high
+
+ * NMU by the security team.
+ * New upstream version
+
+ -- Michael Stone <mstone@debian.org> Wed, 26 Jun 2002 15:40:38 -0400
+
+openssh (1:3.3p1-0.0woody4) testing-security; urgency=high
+
+ * NMU by the security team.
+ * fix error when /etc/ssh/sshd_config exists on new install
+ * check that user doesn't exist before running adduser
+ * use openssl internal random unconditionally
+
+ -- Michael Stone <mstone@debian.org> Tue, 25 Jun 2002 19:44:39 -0400
+
+openssh (1:3.3p1-0.0woody3) testing-security; urgency=high
+
+ * NMU by the security team.
+ * use correct home directory when sshd user is created
+
+ -- Michael Stone <mstone@debian.org> Tue, 25 Jun 2002 08:59:50 -0400
+
+openssh (1:3.3p1-0.0woody2) testing-security; urgency=high
+
+ * NMU by the security team.
+ * Fix rsa1 key creation (Closes: #150949)
+ * don't fail if sshd user removal fails
+ * depends: on adduser (Closes: #150907)
+
+ -- Michael Stone <mstone@debian.org> Tue, 25 Jun 2002 08:59:50 -0400
+
+openssh (1:3.3p1-0.0woody1) testing-security; urgency=high
+
+ * NMU by the security team.
+ * New upstream version.
+ - Enable privilege separation by default.
+ * Include patch from Solar Designer for privilege separation and
+ compression on 2.2.x kernels.
+ * Remove --disable-suid-ssh from configure.
+ * Support setuid ssh-keysign binary instead of setuid ssh client.
+ * Check sshd configuration before restarting.
+
+ -- Daniel Jacobowitz <dan@debian.org> Mon, 24 Jun 2002 13:43:44 -0400
+
+openssh (1:3.0.2p1-9) unstable; urgency=high
+
+ * Thanks to those who NMUd
+ * The only change in this version is to debian/control - I've removed
+ the bit that says you can't export it from the US - it would look
+ pretty daft to say this about a package in main! Also, it's now OK
+ to use crypto in France, so I've edited that comment slightly
+ * Correct a path in README.Debian too (Closes: #138634)
+
+ -- Matthew Vernon <matthew@debian.org> Thu, 04 Apr 2002 09:52:59 +0100
+
+openssh (1:3.0.2p1-8.3) unstable; urgency=medium
+
+ * NMU
+ * Really set urgency to medium this time (oops)
+ * Fix priority to standard per override while I'm at it
+
+ -- Aaron M. Ucko <ucko@debian.org> Sun, 24 Mar 2002 09:00:08 -0500
+
+openssh (1:3.0.2p1-8.2) unstable; urgency=low
+
+ * NMU with maintainer's permission
+ * Prepare for upcoming ssh-nonfree transitional packages per
+ <http://lists.debian.org/debian-ssh/2002/debian-ssh-200203/msg00008.html>
+ * Urgency medium because it would really be good to get this into woody
+ before it releases
+ * Fix sections to match override file
+ * Reissued due to clash with non-US -> main move
+
+ -- Aaron M. Ucko <ucko@debian.org> Sat, 23 Mar 2002 21:21:52 -0500
+
+openssh (1:3.0.2p1-8.1) unstable; urgency=low
+
+ * NMU
+ * Move from non-US to mani
+
+ -- LaMont Jones <lamont@debian.org> Thu, 21 Mar 2002 09:33:50 -0700
+
+openssh (1:3.0.2p1-8) unstable; urgency=critical
+
+ * Security fix - patch from upstream (Closes: #137209, #137210)
+ * Undo the changes in the unreleased -7, since they appear to break
+ things here. Accordingly, the code change is minimal, and I'm
+ happy to get it into testing ASAP
+
+ -- Matthew Vernon <matthew@debian.org> Thu, 7 Mar 2002 14:25:23 +0000
+
+openssh (1:3.0.2p1-7) unstable; urgency=high
+
+ * Build to support IPv6 and IPv4 by default again
+
+ -- Matthew Vernon <matthew@debian.org> Sat, 2 Mar 2002 00:25:05 +0000
+
+openssh (1:3.0.2p1-6) unstable; urgency=high
+
+ * Correct error in the clean target (Closes: #130868)
+
+ -- Matthew Vernon <matthew@debian.org> Sat, 26 Jan 2002 00:32:00 +0000
+
+openssh (1:3.0.2p1-5) unstable; urgency=medium
+
+ * Include the Debian version in our identification, to make it easier to
+ audit networks for patched versions in future
+
+ -- Matthew Vernon <matthew@debian.org> Mon, 21 Jan 2002 17:16:10 +0000
+
+openssh (1:3.0.2p1-4) unstable; urgency=medium
+
+ * If we're asked to not run sshd, stop any running sshd's first
+ (Closes: #129327)
+
+ -- Matthew Vernon <matthew@debian.org> Wed, 16 Jan 2002 21:24:16 +0000
+
+openssh (1:3.0.2p1-3) unstable; urgency=high
+
+ * Fix /etc/pam.d/ssh to not set $MAIL (Closes: #128913)
+ * Remove extra debconf suggestion (Closes: #128094)
+ * Mmm. speedy bug-fixing :-)
+
+ -- Matthew Vernon <matthew@debian.org> Sat, 12 Jan 2002 17:23:58 +0000
+
+openssh (1:3.0.2p1-2) unstable; urgency=high
+
+ * Fix postinst to not automatically overwrite sshd_config (!)
+ (Closes: #127842, #127867)
+ * Add section in README.Debian about the PermitRootLogin setting
+
+ -- Matthew Vernon <matthew@debian.org> Sun, 05 Jan 2003 05:26:30 +0000
+
+openssh (1:3.0.2p1-1) unstable; urgency=high
+
+ * Incorporate fix from Colin's NMU
+ * New upstream version (fixes the bug Wichert fixed) (Closes: #124035)
+ * Capitalise IETF (Closes: #125379)
+ * Refer to the correct sftp-server location (Closes: #126854, #126224)
+ * Do what we're asked re SetUID ssh (Closes: #124065, #124154, #123247)
+ * Ask people upgrading from potato if they want a new conffile
+ (Closes: #125642)
+ * Fix a typo in postinst (Closes: #122192, #122410, #123440)
+ * Frob the default config a little (Closes: #122284, #125827, #125696,
+ #123854)
+ * Make /etc/init.d/ssh be more clear about ssh not running (Closes:
+ #123552)
+ * Fix typo in templates file (Closes: #123411)
+
+ -- Matthew Vernon <matthew@debian.org> Fri, 4 Jan 2002 16:01:52 +0000
+
+openssh (1:3.0.1p1-1.2) unstable; urgency=high
+
+ * Non-maintainer upload
+ * Prevent local users from passing environment variables to the login
+ process when UseLogin is enabled
+
+ -- Wichert Akkerman <wakkerma@debian.org> Mon, 3 Dec 2001 19:34:45 +0100
+
+openssh (1:3.0.1p1-1.1) unstable; urgency=low
+
+ * Non-maintainer upload, at Matthew's request.
+ * Remove sa_restorer assignment to fix compilation on alpha, hppa, and
+ ia64 (closes: #122086).
+
+ -- Colin Watson <cjwatson@debian.org> Sun, 2 Dec 2001 18:54:16 +0000
+
+openssh (1:3.0.1p1-1) unstable; urgency=high
+
+ * New upstream version (Closes: #113646, #113513, #114707, #118564)
+ * Building with a libc that works (!) (Closes: #115228)
+ * Patches forward-ported are -1/-2 options for scp, the improvement to
+ 'waiting for forwarded connections to terminate...'
+ * Fix /etc/init.d/ssh to stop sshd properly (Closes: #115228)
+ * /etc/ssh/sshd_config is no longer a conffile but generated in the postinst
+ * Remove suidregister leftover from postrm
+ * Mention key we are making in the postinst
+ * Default to not enable SSH protocol 1 support, since protocol 2 is
+ much safer anyway.
+ * New version of the vpn-fixes patch, from Ian Jackson
+ * New handling of -q, and added new -qq option; thanks to Jon Amery
+ * Experimental smartcard support not enabled, since I have no way of
+ testing it.
+
+ -- Matthew Vernon <matthew@debian.org> Wed, 28 Nov 2001 17:43:01 +0000
+
+openssh (1:2.9p2-6) unstable; urgency=low
+
+ * check for correct file in /etc/init.d/ssh (Closes: #110876)
+ * correct location of version 2 keys in ssh.1 (Closes: #110439)
+ * call update-alternatives --quiet (Closes: #103314)
+ * hack ssh-copy-id to chmod go-w (Closes: #95551)
+ * TEMPORARY fix to provide largefile support using a -D in the cflags
+ line. long-term, upstream will patch the autoconf stuff
+ (Closes: #106809, #111849)
+ * remove /etc/rc references in ssh-keygen.1 (Closes: #68350)
+ * scp.1 patch from Adam McKenna to document -r properly (Closes: #76054)
+ * Check for files containing a newline character (Closes: #111692)
+
+ -- Matthew Vernon <matthew@debian.org> Thu, 13 Sep 2001 16:47:36 +0100
+
+openssh (1:2.9p2-5) unstable; urgency=high
+
+ * Thanks to all the bug-fixers who helped!
+ * remove sa_restorer assignment (Closes: #102837)
+ * patch from Peter Benie to DTRT wrt X forwarding if the server refuses
+ us access (Closes: #48297)
+ * patch from upstream CVS to fix port forwarding (Closes: #107132)
+ * patch from Jonathan Amery to document ssh-keygen behaviour
+ (Closes:#106643, #107512)
+ * patch to postinst from Jonathan Amery (Closes: #106411)
+ * patch to manpage from Jonathan Amery (Closes: #107364)
+ * patch from Matthew Vernon to make -q emit fatal errors as that is the
+ documented behaviour (Closes: #64347)
+ * patch from Ian Jackson to cause us to destroy a file when we scp it
+ onto itself, rather than dumping bits of our memory into it, which was
+ a security hole (see #51955)
+ * patch from Jonathan Amery to document lack of Kerberos support
+ (Closes: #103726)
+ * patch from Matthew Vernon to make the 'waiting for connections to
+ terminate' message more helpful (Closes: #50308)
+
+ -- Matthew Vernon <matthew@debian.org> Thu, 23 Aug 2001 02:14:09 +0100
+
+openssh (1:2.9p2-4) unstable; urgency=high
+
+ * Today's build of ssh is strawberry flavoured
+ * Patch from mhp to reduce length of time sshd is stopped for (Closes: #106176)
+ * Tidy up debconf template (Closes: #106152)
+ * If called non-setuid, then setgid()'s failure should not be fatal (see
+ #105854)
+
+ -- Matthew Vernon <matthew@debian.org> Sun, 22 Jul 2001 14:19:43 +0100
+
+openssh (1:2.9p2-3) unstable; urgency=low
+
+ * Patch from yours truly to add -1 and -2 options to scp (Closes: #106061)
+ * Improve the IdentityFile section in the man page (Closes: #106038)
+
+ -- Matthew Vernon <matthew@debian.org> Sat, 21 Jul 2001 14:47:27 +0100
+
+openssh (1:2.9p2-2) unstable; urgency=low
+
+ * Document the protocol version 2 and IPV6 changes (Closes: #105845, #105868)
+ * Make PrintLastLog 'no' by default (Closes: #105893)
+
+ -- Matthew Vernon <matthew@debian.org> Thu, 19 Jul 2001 18:36:41 +0100
+
+openssh (1:2.9p2-1) unstable; urgency=low
+
+ * new (several..) upstream version (Closes: #96726, #81856, #96335)
+ * Hopefully, this will close some other bugs too
+
+ -- Matthew Vernon <matthew@debian.org> Tue, 17 Jul 2001 19:41:58 +0100
+
+openssh (1:2.5.2p2-3) unstable; urgency=low
+
+ * Taking Over this package
+ * Patches from Robert Bihlmeyer for the Hurd (Closes: #102991)
+ * Put PermitRootLogin back to yes (Closes: #67334, #67371, #78274)
+ * Don't fiddle with conf-files any more (Closes: #69501)
+
+ -- Matthew Vernon <matthew@debian.org> Tue, 03 Jul 2001 02:58:13 +0100
+
+openssh (1:2.5.2p2-2.2) unstable; urgency=low
+
+ * NMU
+ * Include Hurd compatibility patches from Robert Bihlmeyer (Closes: #76033)
+ * Patch from Richard Kettlewell for protocolkeepalives (Closes: #99273)
+ * Patch from Matthew Vernon for BannerTimeOut, batchmode, and
+ documentation for protocolkeepalives. Makes ssh more generally useful
+ for scripting uses (Closes: #82877, #99275)
+ * Set a umask, so ourpidfile isn't world-writable (closes: #100012,
+ #98286, #97391)
+
+ -- Matthew Vernon <matthew@debian.org> Thu, 28 Jun 2001 23:15:42 +0100
+
+openssh (1:2.5.2p2-2.1) unstable; urgency=low
+
+ * NMU
+ * Remove duplicate Build-Depends for libssl096-dev and change it to
+ depend on libssl-dev instaed. Also adding in virtual | real package
+ style build-deps. (Closes: #93793, #75228)
+ * Removing add-log entry (Closes: #79266)
+ * This was a pam bug from a while back (Closes: #86908, #88457, #86843)
+ * pam build-dep already exists (Closes: #93683)
+ * libgnome-dev build-dep already exists (Closes: #93694)
+ * No longer in non-free (Closes: #85401)
+ * Adding in fr debconf translations (Closes: #83783)
+ * Already suggests xbase-clients (Closes: #79741)
+ * No need to suggest libpam-pwdb anymore (Closes: #81658)
+ * Providing rsh-client (Closes: #79437)
+ * hurd patch was already applied (Closes: #76033)
+ * default set to no (Closes: #73682)
+ * Adding in a suggests for dnsutils (Closes: #93265)
+ * postinst bugs fixed (Closes: #88057, #88066, #88196, #88405, #88612)
+ (Closes: #88774, #88196, #89556, #90123, #90228, #90833, #87814, #85465)
+ * Adding in debconf dependency
+
+ -- Ivan E. Moore II <rkrusty@debian.org> Mon, 16 Apr 2001 14:11:04 +0100
+
+openssh (1:2.5.2p2-2) unstable; urgency=high
+
+ * disable the OpenSSL version check in entropy.c
+ (closes: #93581, #93588, #93590, #93614, #93619, #93635, #93648)
+
+ -- Philip Hands <phil@uk.alcove.com> Wed, 11 Apr 2001 20:30:04 +0100
+
+openssh (1:2.5.2p2-1) unstable; urgency=low
+
+ * New upstream release
+ * removed make-ssh-known-hosts, since ssh-keyscan does that job (closes: #86069, #87748)
+ * fix double space indent in german templates (closes: #89493)
+ * make postinst check for ssh_host_rsa_key
+ * get rid of the last of the misguided debian/rules NMU debris :-/
+
+ -- Philip Hands <phil@hands.com> Sat, 24 Mar 2001 20:59:33 +0000
+
+openssh (1:2.5.1p2-2) unstable; urgency=low
+
+ * rebuild with new debhelper (closes: #89558, #89536, #90225)
+ * fix broken dpkg-statoverride test in postinst
+ (closes: #89612, #90474, #90460, #89605)
+ * NMU bug fixed but not closed in last upload (closes: #88206)
+
+ -- Philip Hands <phil@hands.com> Fri, 23 Mar 2001 16:11:33 +0000
+
+openssh (1:2.5.1p2-1) unstable; urgency=high
+
+ * New upstream release
+ * fix typo in postinst (closes: #88110)
+ * revert to setting PAM service name in debian/rules, backing out last
+ NMU, which also (closes: #88101)
+ * restore the pam lastlog/motd lines, lost during the NMUs, and sshd_config
+ * restore printlastlog option patch
+ * revert to using debhelper, which had been partially disabled in NMUs
+
+ -- Philip Hands <phil@hands.com> Tue, 13 Mar 2001 01:41:34 +0000
+
+openssh (1:2.5.1p1-1.8) unstable; urgency=high
+
+ * And now the old pam-bug s/sshd/ssh in ssh.c is also fixed
+
+ -- Christian Kurz <shorty@debian.org> Thu, 1 Mar 2001 19:48:01 +0100
+
+openssh (1:2.5.1p1-1.7) unstable; urgency=high
+
+ * And now we mark the correct binary as setuid, when a user requested
+ to install it setuid.
+
+ -- Christian Kurz <shorty@debian.org> Thu, 1 Mar 2001 07:19:56 +0100
+
+openssh (1:2.5.1p1-1.6) unstable; urgency=high
+
+ * Fixes postinst to handle overrides that are already there. Damn, I
+ should have noticed the bug earlier.
+
+ -- Christian Kurz <shorty@debian.org> Wed, 28 Feb 2001 22:35:00 +0100
+
+openssh (1:2.5.1p1-1.5) unstable; urgency=high
+
+ * Rebuild ssh with pam-support.
+
+ -- Christian Kurz <shorty@debian.org> Mon, 26 Feb 2001 21:55:51 +0100
+
+openssh (1:2.5.1p1-1.4) unstable; urgency=low
+
+ * Added Build-Depends on libssl096-dev.
+ * Fixed sshd_config file to disallow root logins again.
+
+ -- Christian Kurz <shorty@debian.org> Sun, 25 Feb 2001 20:03:55 +0100
+
+openssh (1:2.5.1p1-1.3) unstable; urgency=low
+
+ * Fixed missing manpages for sftp.1 and ssh-keyscan.1
+ * Made package policy 3.5.2 compliant.
+
+ -- Christian Kurz <shorty@debian.org> Sun, 25 Feb 2001 15:46:26 +0100
+
+openssh (1:2.5.1p1-1.2) unstable; urgency=low
+
+ * Added Conflict with sftp, since we now provide our own sftp-client.
+ * Added a fix for our broken dpkg-statoverride call in the
+ 2.3.0p1-13.
+ * Fixed some config pathes in the comments of sshd_config.
+ * Removed ssh-key-exchange-vulnerability-patch since it's not needed
+ anymore because upstream included the fix.
+
+ -- Christian Kurz <shorty@debian.org> Sun, 25 Feb 2001 13:46:58 +0100
+
+openssh (1:2.5.1p1-1.1) unstable; urgency=high
+
+ * Another NMU to get the new upstream version 2.5.1p1 into
+ unstable. (Closes: #87123)
+ * Corrected postinst to mark ssh as setuid. (Closes: #86391, #85766)
+ * Key Exchange patch is already included by upstream. (Closes: #86015)
+ * Upgrading should be possible now. (Closes: #85525, #85523)
+ * Added --disable-suid-ssh as compile option, so ssh won't get installed
+ suid per default.
+ * Fixed postinst to run dpkg-statoverride only, when dpkg-statoverride
+ is available and the mode of the binary should be 4755. And also added
+ suggestion for a newer dpkg.
+ (Closes: #85734, #85741, #86876)
+ * sftp and ssh-keyscan will also be included from now on. (Closes: #79994)
+ * scp now understands spaces in filenames (Closes: #53783, #58958,
+ #66723)
+ * ssh-keygen now supports showing DSA fingerprints. (Closes: #68623)
+ * ssh doesn' t show motd anymore when switch -t is used. (Closes #69035)
+ * ssh supports the usage of other dsa keys via the ssh command line
+ options. (Closes: #81250)
+ * Documentation in sshd_config fixed. (Closes: #81088)
+ * primes file included by upstream and included now. (Closes: #82101)
+ * scp now allows dots in the username. (Closes: #82477)
+ * Spelling error in ssh-copy-id.1 corrected by upstream. (Closes: #78124)
+
+ -- Christian Kurz <shorty@debian.org> Sun, 25 Feb 2001 10:06:08 +0100
+
+openssh (1:2.3.0p1-1.13) unstable; urgency=low
+
+ * Config should now also be fixed with this hopefully last NMU.
+
+ -- Christian Kurz <shorty@debian.org> Sat, 10 Feb 2001 22:56:36 +0100
+
+openssh (1:2.3.0p1-1.12) unstable; urgency=high
+
+ * Added suggest for xbase-clients to control-file. (Closes #85227)
+ * Applied patch from Markus Friedl to fix a vulnerability in
+ the rsa keyexchange.
+ * Fixed position of horizontal line. (Closes: #83613)
+ * Fixed hopefully the grep problem in the config-file. (Closes: #78802)
+ * Converted package from suidregister to dpkg-statoverride.
+
+ -- Christian Kurz <shorty@debian.org> Fri, 9 Feb 2001 19:43:55 +0100
+
+openssh (1:2.3.0p1-1.11) unstable; urgency=medium
+
+ * Fixed some typos in the german translation of the debconf
+ template.
+
+ -- Christian Kurz <shorty@debian.org> Wed, 24 Jan 2001 18:22:38 +0100
+
+openssh (1:2.3.0p1-1.10) unstable; urgency=medium
+
+ * Fixed double printing of motd. (Closes: #82618)
+
+ -- Christian Kurz <shorty@debian.org> Tue, 23 Jan 2001 21:03:43 +0100
+
+openssh (1:2.3.0p1-1.9) unstable; urgency=high
+
+ * And the next NMU which includes the patch from Andrew Bartlett
+ and Markus Friedl to fix the root privileges handling of openssh.
+ (Closes: #82657)
+
+ -- Christian Kurz <shorty@debian.org> Wed, 17 Jan 2001 22:20:54 +0100
+
+openssh (1:2.3.0p1-1.8) unstable; urgency=high
+
+ * Applied fix from Ryan Murray to allow building on other architectures
+ since the hurd patch was wrong. (Closes: #82471)
+
+ -- Christian Kurz <shorty@debian.org> Tue, 16 Jan 2001 22:45:51 +0100
+
+openssh (1:2.3.0p1-1.7) unstable; urgency=medium
+
+ * Fixed another typo on sshd_config
+
+ -- Christian Kurz <shorty@debian.org> Sun, 14 Jan 2001 19:01:31 +0100
+
+openssh (1:2.3.0p1-1.6) unstable; urgency=high
+
+ * Added Build-Dependency on groff (Closes: #81886)
+ * Added Build-Depencency on debhelper (Closes: #82072)
+ * Fixed entry for known_hosts in sshd_config (Closes: #82096)
+
+ -- Christian Kurz <shorty@debian.org> Thu, 11 Jan 2001 23:08:16 +0100
+
+openssh (1:2.3.0p1-1.5) unstable; urgency=high
+
+ * Fixed now also the problem with sshd used as default ipv4 and
+ didn't use IPv6. This should be now fixed.
+
+ -- Christian Kurz <shorty@debian.org> Thu, 11 Jan 2001 21:25:55 +0100
+
+openssh (1:2.3.0p1-1.4) unstable; urgency=high
+
+ * Fixed buggy entry in postinst.
+
+ -- Christian Kurz <shorty@debian.org> Wed, 10 Jan 2001 23:12:16 +0100
+
+openssh (1:2.3.0p1-1.3) unstable; urgency=high
+
+ * After finishing the rewrite of the rules-file I had to notice that
+ the manpage installation was broken. This should now work again.
+
+ -- Christian Kurz <shorty@debian.org> Wed, 10 Jan 2001 22:11:59 +0100
+
+openssh (1:2.3.0p1-1.2) unstable; urgency=high
+
+ * Fixed the screwed up build-dependency.
+ * Removed --with-ipv4-default to support ipv6.
+ * Changed makefile to use /etc/pam.d/ssh instead of /etc/pam.d/sshd.
+ * Fixed location to sftp-server in config.
+ * Since debian still relies on /etc/pam.d/ssh instead of moving to
+ /etc/pam.d/sshd, I had to hack ssh.h to get ssh to use this name.
+ * Fixed path to host key in sshd_config.
+
+ -- Christian Kurz <shorty@debian.org> Wed, 10 Jan 2001 08:23:47 +0100
+
+openssh (1:2.3.0p1-1.1) unstable; urgency=medium
+
+ * NMU with permission of Phil Hands.
+ * New upstream release
+ * Update Build-Depends to point to new libssl096.
+ * This upstream release doesn't leak any information depending
+ on the setting of PermitRootLogin (Closes: #59933)
+ * New upstream release contains fix against forcing a client to
+ do X/agent forwarding (Closes: #76788)
+ * Changed template to contain correct path to the documentation
+ (Closes: #67245)
+ * Added --with-4in6 switch as compile option into debian/rules.
+ * Added --with-ipv4-default as compile option into debian/rules.
+ (Closes: #75037)
+ * Changed default path to also contain /usr/local/bin and
+ /usr/X11R6/bin (Closes: #62472,#54567,#62810)
+ * Changed path to sftp-server in sshd_config to match the
+ our package (Closes: #68347)
+ * Replaced OpenBSDh with OpenBSD in the init-script.
+ * Changed location to original source in copyright.head
+ * Changed behaviour of init-script when invoked with the option
+ restart (Closes: #68706,#72560)
+ * Added a note about -L option of scp to README.Debian
+ * ssh won't print now the motd if invoked with -t option
+ (Closes: #59933)
+ * RFC.nroff.gz get's now converted into RFC.gz. (Closes: #63867)
+ * Added a note about tcp-wrapper support to README.Debian
+ (Closes: #72807,#22190)
+ * Removed two unneeded options from building process.
+ * Added sshd.pam into debian dir and install it.
+ * Commented out unnecessary call to dh_installinfo.
+ * Added a line to sshd.pam so that limits will be paid attention
+ to (Closes: #66904)
+ * Restart Option has a Timeout of 10 seconds (Closes: 51264)
+ * scp won't override files anymore (Closes: 51955)
+ * Removed pam_lastlog module, so that the lastlog is now printed
+ only once (Closes: #71742, #68335, #69592, #71495, #77781)
+ * If password is expired, openssh now forces the user to change it.
+ (Closes: #51747)
+ * scp should now have no more problems with shell-init-files that
+ produces ouput (Closes: #56280,#59873)
+ * ssh now prints the motd correctly (Closes: #66926)
+ * ssh upgrade should disable ssh daemon only if users has choosen
+ to do so (Closes: #67478)
+ * ssh can now be installed suid (Closes: #70879)
+ * Modified debian/rules to support hurd.
+
+ -- Christian Kurz <shorty@debian.org> Wed, 27 Dec 2000 20:06:57 +0100
+
+openssh (1:2.2.0p1-1.1) unstable; urgency=medium
+
+ * Non-Maintainer Upload
+ * Check for new returns in the new libc
+ (closes: #72803, #74393, #72797, #71307, #71702)
+ * Link against libssl095a (closes: #66304)
+ * Correct check for PermitRootLogin (closes: #69448)
+
+ -- Ryan Murray <rmurray@debian.org> Wed, 18 Oct 2000 00:48:18 -0700
+
+openssh (1:2.2.0p1-1) unstable; urgency=low
+
+ * New upstream release
+
+ -- Philip Hands <phil@hands.com> Mon, 11 Sep 2000 14:49:43 +0100
+
+openssh (1:2.1.1p4-3) unstable; urgency=low
+
+ * add rsh alternatives
+ * add -S option to scp (using Tommi Virtanen's patch) (closes: #63097)
+ * do the IPV4_DEFAULT thing properly this time
+
+ -- Philip Hands <phil@hands.com> Fri, 11 Aug 2000 18:14:37 +0100
+
+openssh (1:2.1.1p4-2) unstable; urgency=low
+
+ * reinstate manpage .out patch from 1:1.2.3
+ * fix typo in postinst
+ * only compile ssh with IPV4_DEFAULT
+ * apply James Troup's patch to add a -o option to scp and updated manpage
+
+ -- Philip Hands <phil@hands.com> Sun, 30 Jul 2000 00:12:49 +0100
+
+openssh (1:2.1.1p4-1) unstable; urgency=low
+
+ * New upstream release
+
+ -- Philip Hands <phil@hands.com> Sat, 29 Jul 2000 14:46:16 +0100
+
+openssh (1:1.2.3-10) unstable; urgency=low
+
+ * add version to libpam-modules dependency, because old versions of
+ pam_motd make it impossible to log in.
+
+ -- Philip Hands <phil@hands.com> Sat, 29 Jul 2000 13:28:22 +0100
+
+openssh (1:1.2.3-9) frozen unstable; urgency=low
+
+ * force location of /usr/bin/X11/xauth
+ (closes: #64424, #66437, #66859) *RC*
+ * typos in config (closes: #66779, #66780)
+ * sshd_not_to_be_run could be assumed to be true, in error, if the config
+ script died in an unusual way --- I've reversed this (closes: #66335)
+ * Apply Zack Weinberg <zack@wolery.cumb.org>'s patch to ssh-askpass-ptk
+ (closes: #65981)
+ * change default for PermitRootLogin to "no" (closes: #66406)
+
+ -- Philip Hands <phil@hands.com> Tue, 11 Jul 2000 20:51:18 +0100
+
+openssh (1:1.2.3-8) frozen unstable; urgency=low
+
+ * get rid of Provides: rsh-server (this will mean that rstartd
+ will need to change it's depends to deal with #63948, which I'm
+ reopening) (closes: #66257)
+ Given that this is also a trivial change, and is a reversal of a
+ change that was mistakenly made after the freeze, I think this should
+ also go into frozen.
+
+ -- Philip Hands <phil@hands.com> Wed, 28 Jun 2000 03:26:30 +0100
+
+openssh (1:1.2.3-7) frozen unstable; urgency=low
+
+ * check if debconf is installed before calling db_stop in postinst.
+ This is required to allow ssh to be installed when debconf is not
+ wanted, which probably makes it an RC upload (hopefully the last of
+ too many).
+
+ -- Philip Hands <phil@hands.com> Wed, 28 Jun 2000 03:19:47 +0100
+
+openssh (1:1.2.3-6) frozen unstable; urgency=low
+
+ * fixed depressing little bug involving a line wrap looking like
+ a blank line in the templates file *RC*
+ (closes: #66090, #66078, #66083, #66182)
+
+ -- Philip Hands <phil@hands.com> Mon, 26 Jun 2000 00:45:05 +0100
+
+openssh (1:1.2.3-5) frozen unstable; urgency=low
+
+ * add code to prevent UseLogin exploit, although I think our PAM
+ conditional code breaks UseLogin in a way that protects us from this
+ exploit anyway. ;-) (closes: #65495) *RC*
+ * Apply Zack Weinberg <zack@wolery.cumb.org>'s patch to fix keyboard
+ grab vulnerability in ssh-askpass-gnome (closes: #64795) *RC*
+ * stop redirection of sshd's file descriptors (introduced in 1:1.2.3-3)
+ and use db_stop in the postinst to solve that problem instead
+ (closes: #65104)
+ * add Provides: rsh-server to ssh (closes: #63948)
+ * provide config option not to run sshd
+
+ -- Philip Hands <phil@hands.com> Mon, 12 Jun 2000 23:05:11 +0100
+
+openssh (1:1.2.3-4) frozen unstable; urgency=low
+
+ * fixes #63436 which is *RC*
+ * add 10 second pause in init.d restart (closes: #63844)
+ * get rid of noenv in PAM mail line (closes: #63856)
+ * fix host key path in make-ssh-known-hosts (closes: #63713)
+ * change wording of SUID template (closes: #62788, #63436)
+
+ -- Philip Hands <phil@hands.com> Sat, 27 May 2000 11:18:06 +0100
+
+openssh (1:1.2.3-3) frozen unstable; urgency=low
+
+ * redirect sshd's file descriptors to /dev/null in init to
+ prevent debconf from locking up during installation
+ ** grave bug just submited by me **
+
+ -- Philip Hands <phil@hands.com> Thu, 20 Apr 2000 17:10:59 +0100
+
+openssh (1:1.2.3-2) frozen unstable; urgency=low
+
+ * allow user to select SUID status of /usr/bin/ssh (closes: 62462) ** RC **
+ * suggest debconf
+ * conflict with debconf{,-tiny} (<<0.2.17) so I can clean up the preinst
+
+ -- Philip Hands <phil@hands.com> Wed, 19 Apr 2000 17:49:15 +0100
+
+openssh (1:1.2.3-1) frozen unstable; urgency=low
+
+ * New upstream release
+ * patch sshd to create extra xauth key required for localhost
+ (closes: #49944) *** RC ***
+ * FallbacktoRsh now defaults to ``no'' to match impression
+ given in sshd_config
+ * stop setting suid bit on ssh (closes: #58711, #58558)
+ This breaks Rhosts authentication (which nobody uses) and allows
+ the LD_PRELOAD trick to get socks working, so seems like a net benefit.
+
+ -- Philip Hands <phil@hands.com> Thu, 13 Apr 2000 20:01:54 +0100
+
+openssh (1:1.2.2-1.4) frozen unstable; urgency=low
+
+ * Recompile for frozen, contains fix for RC bug.
+
+ -- Tommi Virtanen <tv@debian.org> Tue, 29 Feb 2000 22:14:58 +0200
+
+openssh (1:1.2.2-1.3) unstable; urgency=low
+
+ * Integrated man page addition for PrintLastLog.
+ This bug was filed on "openssh", and I ended up
+ creating my own patch for this (closes: #59054)
+ * Improved error message when ssh_exchange_identification
+ gets EOF (closes: #58904)
+ * Fixed typo (your -> you're) in debian/preinst.
+ * Added else-clauses to config to make this upgradepath possible:
+ oldssh -> openssh preinst fails due to upgrade_to_openssh=false
+ -> ssh-nonfree -> openssh. Without these, debconf remembered
+ the old answer, config didn't force asking it, and preinst always
+ aborted (closes: #56596, #57782)
+ * Moved setting upgrade_to_openssh isdefault flag to the place
+ where preinst would abort. This means no double question to most
+ users, people who currently suffer from "can't upgrade" may need
+ to run apt-get install ssh twice. Did not do the same for
+ use_old_init_script, as the situation is a bit different, and
+ less common (closes: #54010, #56224)
+ * Check for existance of ssh-keygen before attempting to use it in
+ preinst, added warning for non-existant ssh-keygen in config. This
+ happens when the old ssh is removed (say, due to ssh-nonfree getting
+ installed).
+
+ -- Tommi Virtanen <tv@debian.org> Sun, 27 Feb 2000 21:36:43 +0200
+
+openssh (1:1.2.2-1.2) frozen unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Added configuration option PrintLastLog, default off due to PAM
+ (closes: #54007, #55042)
+ * ssh-askpass-{gnome,ptk} now provide ssh-askpass, making ssh's
+ Suggests: line more accurate. Also closing related bugs fixed
+ earlier, when default ssh-askpass moved to /usr/bin.
+ (closes: #52403, #54741, #50607, #52298, #50967, #51661)
+ * Patched to call vhangup, with autoconf detection and all
+ (closes: #55379)
+ * Added --with-ipv4-default workaround to a glibc bug causing
+ slow DNS lookups, as per UPGRADING. Use -6 to really use
+ IPv6 addresses. (closes: #57891, #58744, #58713, #57970)
+ * Added noenv to PAM pam_mail line. Thanks to Ben Collins.
+ (closes: #58429)
+ * Added the UPGRADING file to the package.
+ * Added frozen to the changelog line and recompiled before
+ package was installed into the archive.
+
+ -- Tommi Virtanen <tv@debian.org> Fri, 25 Feb 2000 22:08:57 +0200
+
+openssh (1:1.2.2-1.1) frozen unstable; urgency=low
+
+ * Non-maintainer upload.
+ * Integrated scp pipe buffer patch from Ben Collins
+ <benc@debian.org>, should now work even if reading
+ a pipe gives less than fstat st_blksize bytes.
+ Should now work on Alpha and Sparc Linux (closes: #53697, #52071)
+ * Made ssh depend on libssl09 (>= 0.9.4-3) (closes: #51393)
+ * Integrated patch from Ben Collins <benc@debian.org>
+ to do full shadow account locking and expiration
+ checking (closes: #58165, #51747)
+
+ -- Tommi Virtanen <tv@debian.org> Tue, 22 Feb 2000 20:46:12 +0200
+
+openssh (1:1.2.2-1) frozen unstable; urgency=medium
+
+ * New upstream release (closes: #56870, #56346)
+ * built against new libesd (closes: #56805)
+ * add Colin Watson <cjw44@cam.ac.uk> =NULL patch
+ (closes: #49902, #54894)
+ * use socketpairs as suggested by Andrew Tridgell to eliminate rsync
+ (and other) lockups
+ * patch SSHD_PAM_SERVICE back into auth-pam.c, again :-/
+ (closes: #49902, #55872, #56959)
+ * uncoment the * line in ssh_config (closes: #56444)
+
+ * #54894 & #49902 are release critical, so this should go in frozen
+
+ -- Philip Hands <phil@hands.com> Wed, 9 Feb 2000 04:52:04 +0000
+
+openssh (1:1.2.1pre24-1) unstable; urgency=low
+
+ * New upstream release
+
+ -- Philip Hands <phil@hands.com> Fri, 31 Dec 1999 02:47:24 +0000
+
+openssh (1:1.2.1pre23-1) unstable; urgency=low
+
+ * New upstream release
+ * excape ? in /etc/init.d/ssh (closes: #53269)
+
+ -- Philip Hands <phil@hands.com> Wed, 29 Dec 1999 16:50:46 +0000
+
+openssh (1:1.2pre17-1) unstable; urgency=low
+
+ * New upstream release
+
+ -- Philip Hands <phil@hands.com> Thu, 9 Dec 1999 16:50:40 +0000
+
+openssh (1:1.2pre16-1) unstable; urgency=low
+
+ * New upstream release
+ * upstream release (1.2pre14) (closes: #50299)
+ * make ssh depend on libwrap0 (>= 7.6-1.1) (closes: #50973, #50776)
+ * dispose of grep -q broken pipe message in config script (closes: #50855)
+ * add make-ssh-known-hosts (closes: #50660)
+ * add -i option to ssh-copy-id (closes: #50657)
+ * add check for *LK* in password, indicating a locked account
+
+ -- Philip Hands <phil@hands.com> Wed, 8 Dec 1999 22:59:38 +0000
+
+openssh (1:1.2pre13-1) unstable; urgency=low
+
+ * New upstream release
+ * make sshd.c use SSHD_PAM_SERVICE and define it as "ssh" in debian/rules
+ * remove duplicate line in /etc/pam.d/ssh (closes: #50310)
+ * mention ssh -A option in ssh.1 & ssh_config
+ * enable forwarding to localhost in default ssh_config (closes: #50373)
+ * tweak preinst to deal with debconf being `unpacked'
+ * use --with-tcp-wrappers (closes: #49545)
+
+ -- Philip Hands <phil@hands.com> Sat, 20 Nov 1999 14:20:04 +0000
+
+openssh (1:1.2pre11-2) unstable; urgency=low
+
+ * oops, just realised that I forgot to strip out the unpleasant
+ fiddling mentioned below (which turned not to be a fix anyway)
+
+ -- Philip Hands <phil@hands.com> Mon, 15 Nov 1999 01:35:23 +0000
+
+openssh (1:1.2pre11-1) unstable; urgency=low
+
+ * New upstream release (closes: #49722)
+ * add 2>/dev/null to dispose of spurious message casused by grep -q
+ (closes: #49876, #49604)
+ * fix typo in debian/control (closes: #49841)
+ * Do some unpleasant fiddling with upgraded keys in the preinst, which
+ should make the keylength problem go away. (closes: #49676)
+ * make pam_start in sshd use ``ssh'' as the service name (closes: #49956)
+ * If /etc/ssh/NOSERVER exist, stop sshd from starting (closes: #47107)
+ * apply Ben Collins <bcollins@debian.org>'s shadow patch
+ * disable lastlogin and motd printing if using pam (closes: #49957)
+ * add ssh-copy-id script and manpage
+
+ -- Philip Hands <phil@hands.com> Fri, 12 Nov 1999 01:03:38 +0000
+
+openssh (1:1.2pre9-1) unstable; urgency=low
+
+ * New upstream release
+ * apply Chip Salzenberg <chip@valinux.com>'s SO_REUSEADDR patch
+ to channels.c, to make forwarded ports instantly reusable
+ * replace Pre-Depend: debconf with some check code in preinst
+ * make the ssh-add ssh-askpass failure message more helpful
+ * fix the ssh-agent getopts bug (closes: #49426)
+ * fixed typo on Suggests: line (closes: #49704, #49571)
+ * tidy up ssh package description (closes: #49642)
+ * make ssh suid (closes: #49635)
+ * in preinst upgrade code, ensure ssh_host_keys is mode 600 (closes: #49606)
+ * disable agent forwarding by default, for the similar reasons as
+ X forwarding (closes: #49586)
+
+ -- Philip Hands <phil@hands.com> Tue, 9 Nov 1999 09:57:47 +0000
+
+openssh (1:1.2pre7-4) unstable; urgency=low
+
+ * predepend on debconf (>= 0.2.17) should now allow preinst questions
+
+ -- Philip Hands <phil@hands.com> Sat, 6 Nov 1999 10:31:06 +0000
+
+openssh (1:1.2pre7-3) unstable; urgency=low
+
+ * add ssh-askpass package using Tommi Virtanen's perl-tk script
+ * add ssh-preconfig package cludge
+ * add usage hints to ssh-agent.1
+
+ -- Philip Hands <phil@hands.com> Fri, 5 Nov 1999 00:38:33 +0000
+
+openssh (1:1.2pre7-2) unstable; urgency=low
+
+ * use pam patch from Ben Collins <bcollins@debian.org>
+ * add slogin symlink to Makefile.in
+ * change /usr/bin/login to LOGIN_PROGRAM define of /bin/login
+ * sort out debconf usage
+ * patch from Tommi Virtanen <tv@debian.org>'s makes ssh-add use ssh-askpass
+
+ -- Philip Hands <phil@hands.com> Thu, 4 Nov 1999 11:08:54 +0000
+
+openssh (1:1.2pre7-1) unstable; urgency=low
+
+ * New upstream release
+
+ -- Philip Hands <phil@hands.com> Tue, 2 Nov 1999 21:02:37 +0000
+
+openssh (1:1.2.0.pre6db1-2) unstable; urgency=low
+
+ * change the binary package name to ssh (the non-free branch of ssh has
+ been renamed to ssh-nonfree)
+ * make pam file comply with Debian standards
+ * use an epoch to make sure openssh supercedes ssh-nonfree
+
+ -- Philip Hands <phil@hands.com> Sat, 30 Oct 1999 16:26:05 +0100
+
+openssh (1.2pre6db1-1) unstable; urgency=low
+
+ * New upstream source
+ * sshd accepts logins now!
+
+ -- Dan Brosemer <odin@linuxfreak.com> Fri, 29 Oct 1999 11:13:38 -0500
+
+openssh (1.2.0.19991028-1) unstable; urgency=low
+
+ * New upstream source
+ * Added test for -lnsl to configure script
+
+ -- Dan Brosemer <odin@linuxfreak.com> Thu, 28 Oct 1999 18:52:09 -0500
+
+openssh (1.2.0.19991027-3) unstable; urgency=low
+
+ * Initial release
+
+ -- Dan Brosemer <odin@linuxfreak.com> Wed, 27 Oct 1999 19:39:46 -0500
diff --git a/debian/clean b/debian/clean
new file mode 100644
index 0000000..fcd68b7
--- /dev/null
+++ b/debian/clean
@@ -0,0 +1,2 @@
+config.log
+debian/openssh-server.sshd.pam
diff --git a/debian/control b/debian/control
new file mode 100644
index 0000000..f3ed979
--- /dev/null
+++ b/debian/control
@@ -0,0 +1,234 @@
+Source: openssh
+Section: net
+Priority: standard
+Maintainer: Debian OpenSSH Maintainers <debian-ssh@lists.debian.org>
+Build-Depends: debhelper (>= 13.1~),
+ debhelper-compat (= 13),
+ dh-exec,
+ dh-runit (>= 2.8.8),
+ libaudit-dev [linux-any],
+ libedit-dev,
+ libfido2-dev (>= 1.5.0) [linux-any],
+ libgtk-3-dev <!pkg.openssh.nognome>,
+ libkrb5-dev | heimdal-dev,
+ libpam0g-dev | libpam-dev,
+ libselinux1-dev [linux-any],
+ libssl-dev (>= 1.1.0g),
+ libsystemd-dev [linux-any] | libelogind-dev [linux-any],
+ libwrap0-dev | libwrap-dev,
+ pkg-config,
+ zlib1g-dev,
+Standards-Version: 4.6.2
+Uploaders: Colin Watson <cjwatson@debian.org>,
+ Matthew Vernon <matthew@debian.org>,
+Homepage: https://www.openssh.com/
+Vcs-Git: https://salsa.debian.org/ssh-team/openssh.git
+Vcs-Browser: https://salsa.debian.org/ssh-team/openssh
+Rules-Requires-Root: no
+
+Package: openssh-client
+Architecture: any
+Depends: adduser,
+ passwd,
+ ${misc:Depends},
+ ${shlibs:Depends},
+Recommends: xauth,
+Conflicts: sftp,
+Breaks: openssh-sk-helper
+Replaces: openssh-sk-helper,
+ ssh,
+ ssh-krb5,
+Suggests: keychain,
+ libpam-ssh,
+ monkeysphere,
+ ssh-askpass,
+Provides: ssh-client,
+Multi-Arch: foreign
+Description: secure shell (SSH) client, for secure access to remote machines
+ This is the portable version of OpenSSH, a free implementation of
+ the Secure Shell protocol as specified by the IETF secsh working
+ group.
+ .
+ Ssh (Secure Shell) is a program for logging into a remote machine
+ and for executing commands on a remote machine.
+ It provides secure encrypted communications between two untrusted
+ hosts over an insecure network. X11 connections and arbitrary TCP/IP
+ ports can also be forwarded over the secure channel.
+ It can be used to provide applications with a secure communication
+ channel.
+ .
+ This package provides the ssh, scp and sftp clients, the ssh-agent
+ and ssh-add programs to make public key authentication more convenient,
+ and the ssh-keygen, ssh-keyscan, ssh-copy-id and ssh-argv0 utilities.
+ .
+ In some countries it may be illegal to use any encryption at all
+ without a special permit.
+ .
+ ssh replaces the insecure rsh, rcp and rlogin programs, which are
+ obsolete for most purposes.
+
+Package: openssh-server
+Priority: optional
+Architecture: any
+Pre-Depends: ${misc:Pre-Depends},
+Depends: adduser,
+ libpam-modules,
+ libpam-runtime,
+ lsb-base,
+ openssh-client (= ${binary:Version}),
+ openssh-sftp-server,
+ procps,
+ ucf,
+ ${misc:Depends},
+ ${shlibs:Depends},
+Recommends: default-logind | logind | libpam-systemd,
+ ncurses-term,
+ xauth,
+ ${openssh-server:Recommends},
+Conflicts: sftp,
+ ssh-socks,
+ ssh2,
+Replaces: openssh-client (<< 1:7.9p1-8),
+ ssh,
+ ssh-krb5,
+Breaks: ${runit:Breaks},
+Suggests: molly-guard,
+ monkeysphere,
+ ssh-askpass,
+ ufw,
+Provides: ssh-server,
+Multi-Arch: foreign
+Description: secure shell (SSH) server, for secure access from remote machines
+ This is the portable version of OpenSSH, a free implementation of
+ the Secure Shell protocol as specified by the IETF secsh working
+ group.
+ .
+ Ssh (Secure Shell) is a program for logging into a remote machine
+ and for executing commands on a remote machine.
+ It provides secure encrypted communications between two untrusted
+ hosts over an insecure network. X11 connections and arbitrary TCP/IP
+ ports can also be forwarded over the secure channel.
+ It can be used to provide applications with a secure communication
+ channel.
+ .
+ This package provides the sshd server.
+ .
+ In some countries it may be illegal to use any encryption at all
+ without a special permit.
+ .
+ sshd replaces the insecure rshd program, which is obsolete for most
+ purposes.
+
+Package: openssh-sftp-server
+Priority: optional
+Architecture: any
+Depends: ${misc:Depends},
+ ${shlibs:Depends},
+Recommends: openssh-server | ssh-server,
+Breaks: openssh-server (<< 1:6.5p1-5),
+Replaces: openssh-server (<< 1:6.5p1-5),
+Enhances: openssh-server,
+ ssh-server,
+Multi-Arch: foreign
+Description: secure shell (SSH) sftp server module, for SFTP access from remote machines
+ This is the portable version of OpenSSH, a free implementation of
+ the Secure Shell protocol as specified by the IETF secsh working
+ group.
+ .
+ Ssh (Secure Shell) is a program for logging into a remote machine
+ and for executing commands on a remote machine.
+ It provides secure encrypted communications between two untrusted
+ hosts over an insecure network. X11 connections and arbitrary TCP/IP
+ ports can also be forwarded over the secure channel.
+ It can be used to provide applications with a secure communication
+ channel.
+ .
+ This package provides the SFTP server module for the SSH server. It
+ is needed if you want to access your SSH server with SFTP. The SFTP
+ server module also works with other SSH daemons like dropbear.
+ .
+ OpenSSH's sftp and sftp-server implement revision 3 of the SSH filexfer
+ protocol described in:
+ .
+ http://www.openssh.com/txt/draft-ietf-secsh-filexfer-02.txt
+ .
+ Newer versions of the draft will not be supported, though some features
+ are individually implemented as extensions.
+
+Package: openssh-tests
+Priority: optional
+Architecture: any
+Depends: openssh-client (= ${binary:Version}),
+ openssh-server (= ${binary:Version}),
+ openssh-sftp-server (= ${binary:Version}),
+ openssl,
+ putty-tools (>= 0.67-2),
+ python3-twisted,
+ ${misc:Depends},
+ ${shlibs:Depends},
+Multi-Arch: foreign
+Description: OpenSSH regression tests
+ This package provides OpenSSH's regression test suite. It is mainly
+ intended for use with the autopkgtest system, though can also be run
+ directly using /usr/lib/openssh/regress/run-tests.
+
+Package: ssh
+Priority: optional
+Architecture: all
+Depends: openssh-client (>= ${binary:Version}),
+ openssh-server (>= ${binary:Version}),
+ ${misc:Depends},
+Multi-Arch: foreign
+Description: secure shell client and server (metapackage)
+ This metapackage is a convenient way to install both the OpenSSH client
+ and the OpenSSH server. It provides nothing in and of itself, so you
+ may remove it if nothing depends on it.
+
+Package: ssh-askpass-gnome
+Build-Profiles: <!pkg.openssh.nognome>
+Section: gnome
+Priority: optional
+Architecture: any
+Depends: openssh-client | ssh (>= 1:1.2pre7-4),
+ ${misc:Depends},
+ ${shlibs:Depends},
+Replaces: ssh (<< 1:3.5p1-3),
+Provides: ssh-askpass,
+Multi-Arch: foreign
+Description: interactive X program to prompt users for a passphrase for ssh-add
+ This has been split out of the main openssh-client package so that
+ openssh-client does not need to depend on GTK+.
+ .
+ You probably want the ssh-askpass package instead, but this is
+ provided to add to your choice and/or confusion.
+
+Package: openssh-client-udeb
+Build-Profiles: <!noudeb>
+Package-Type: udeb
+Section: debian-installer
+Priority: optional
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends},
+XB-Installer-Menu-Item: 99999
+Description: secure shell client for the Debian installer
+ This is the portable version of OpenSSH, a free implementation of
+ the Secure Shell protocol as specified by the IETF secsh working
+ group.
+ .
+ This package provides the ssh client for use in debian-installer.
+
+Package: openssh-server-udeb
+Build-Profiles: <!noudeb>
+Package-Type: udeb
+Section: debian-installer
+Priority: optional
+Architecture: any
+Depends: ${shlibs:Depends}, ${misc:Depends},
+Description: secure shell server for the Debian installer
+ This is the portable version of OpenSSH, a free implementation of
+ the Secure Shell protocol as specified by the IETF secsh working
+ group.
+ .
+ This package provides the sshd server for use in debian-installer.
+ Since it is expected to be used in specialized situations (e.g. S/390
+ installs with no console), it does not provide any configuration.
diff --git a/debian/copyright b/debian/copyright
new file mode 100644
index 0000000..7c7c201
--- /dev/null
+++ b/debian/copyright
@@ -0,0 +1,238 @@
+Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
+Upstream-Name: OpenSSH
+Upstream-Contact: openssh-unix-dev@mindrot.org
+Source: https://www.openssh.com/portable.html
+Comment:
+ The overall licence of the OpenSSH upstream code amounts to BSD-3-clause or
+ various less restrictive licences, with the additional restrictions that
+ derived versions must be clearly marked as such and that if derived works
+ are incompatible with the RFC-specified protocol then they must be called
+ by a name other than "ssh" or "Secure Shell".
+
+Files: *
+Copyright:
+ 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
+ Markus Friedl
+ Theo de Raadt
+ Niels Provos
+ Dug Song
+ Aaron Campbell
+ Damien Miller
+ Kevin Steves
+ Daniel Kouril
+ Wesley Griffin
+ Per Allansson
+ Nils Nordman
+ Simon Wilkinson
+ Ben Lindstrom
+ Tim Rice
+ Andre Lucas
+ Chris Adams
+ Corinna Vinschen
+ Cray Inc.
+ Denis Parker
+ Gert Doering
+ Jakob Schlyter
+ Jason Downs
+ Juha Yrjölä
+ Michael Stone
+ Networks Associates Technology, Inc.
+ Solar Designer
+ Todd C. Miller
+ Wayne Schroeder
+ William Jones
+ Darren Tucker
+ Sun Microsystems
+ The SCO Group
+ Daniel Walsh
+ Red Hat, Inc
+ Simon Vallet / Genoscope
+ Internet Software Consortium
+ Reyk Floeter
+ Chad Mynhier
+License: OpenSSH
+ Tatu Ylonen's original licence is as follows (excluding some terms about
+ third-party code which are no longer relevant; see the LICENCE file for
+ details):
+ .
+ As far as I am concerned, the code I have written for this software
+ can be used freely for any purpose. Any derived versions of this
+ software must be clearly marked as such, and if the derived work is
+ incompatible with the protocol description in the RFC file, it must be
+ called by a name other than "ssh" or "Secure Shell".
+ .
+ Note that any information and cryptographic algorithms used in this
+ software are publicly available on the Internet and at any major
+ bookstore, scientific library, and patent office worldwide. More
+ information can be found e.g. at "http://www.cs.hut.fi/crypto".
+ .
+ The legal status of this program is some combination of all these
+ permissions and restrictions. Use only at your own responsibility.
+ You will be responsible for any legal consequences yourself; I am not
+ making any claims whether possessing or using this is legal or not in
+ your country, and I am not taking any responsibility on your behalf.
+ .
+ Most remaining components of the software are provided under a standard
+ 2-term BSD licence:
+ .
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+ .
+ Some code is licensed under an ISC-style license, to the following
+ copyright holders:
+ .
+ Permission to use, copy, modify, and distribute this software for any
+ purpose with or without fee is hereby granted, provided that the above
+ copyright notice and this permission notice appear in all copies.
+ .
+ THE SOFTWARE IS PROVIDED "AS IS" AND TODD C. MILLER DISCLAIMS ALL
+ WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL TODD C. MILLER BE LIABLE
+ FOR ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+ WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION
+ OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN
+ CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+
+Files: ssh-keyscan.*
+Copyright: 1995, 1996 David Mazieres <dm@lcs.mit.edu>
+License: Mazieres-BSD-style
+ Modification and redistribution in source and binary forms is
+ permitted provided that due credit is given to the author and the
+ OpenBSD project by leaving this copyright notice intact.
+
+Files: rijndael.*
+License: public-domain
+ This code is from a reference implementation of the Rijndael cipher which
+ has been dedicated to the public domain.
+ .
+ @version 3.0 (December 2000)
+ .
+ Optimised ANSI C code for the Rijndael cipher (now AES)
+ .
+ @author Vincent Rijmen <vincent.rijmen@esat.kuleuven.ac.be>
+ @author Antoon Bosselaers <antoon.bosselaers@esat.kuleuven.ac.be>
+ @author Paulo Barreto <paulo.barreto@terra.com.br>
+ .
+ This code is hereby placed in the public domain.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE AUTHORS ''AS IS'' AND ANY EXPRESS
+ OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
+ WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHORS OR CONTRIBUTORS BE
+ LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
+ BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY,
+ WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE
+ OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE,
+ EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+Files: loginrec.c openbsd-compat/* scp.c
+Copyright:
+ 1983, 1995-1997 Eric P. Allman
+ 1999 Aaron Campbell
+ 1993 by Digital Equipment Corporation
+ 2000 Andre Lucas
+ 1999-2010 Damien Miller
+ 1997-2010 Todd C. Miller
+ 1995, 1996, 1998, 1999, 2008 Theo de Raadt
+ 2003 Constantin S. Svintsoff <kostik@iclub.nsu.ru>
+ 1980, 1983, 1987, 1988, 1989, 1990, 1991, 1992, 1993, 1994, 1995 The Regents of the University of California
+License: BSD-3-clause
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ 3. Neither the name of the University nor the names of its contributors
+ may be used to endorse or promote products derived from this software
+ without specific prior written permission.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
+ ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
+ FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ SUCH DAMAGE.
+
+Files: openbsd-compat/bsd-snprintf.c
+Copyright: 1995 Patrick Powell
+License: Powell-BSD-style
+ This code is based on code written by Patrick Powell
+ (papowell@astart.com) It may be used for any purpose as long as this
+ notice remains intact on all source code distributions
+
+Files: openbsd-compat/sigact.*
+Copyright: 1998, 2000 Free Software Foundation, Inc.
+License: Expat-with-advertising-restriction
+ Permission is hereby granted, free of charge, to any person obtaining a
+ copy of this software and associated documentation files (the
+ "Software"), to deal in the Software without restriction, including
+ without limitation the rights to use, copy, modify, merge, publish,
+ distribute, distribute with modifications, sublicense, and/or sell
+ copies of the Software, and to permit persons to whom the Software is
+ furnished to do so, subject to the following conditions:
+ .
+ The above copyright notice and this permission notice shall be included
+ in all copies or substantial portions of the Software.
+ .
+ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
+ OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
+ MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
+ IN NO EVENT SHALL THE ABOVE COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM,
+ DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
+ OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR
+ THE USE OR OTHER DEALINGS IN THE SOFTWARE.
+ .
+ Except as contained in this notice, the name(s) of the above copyright
+ holders shall not be used in advertising or otherwise to promote the
+ sale, use or other dealings in this Software without prior written
+ authorization.
+
+Files: debian/*
+Copyright: Matthew Vernon, Colin Watson
+License: BSD-2-clause
+ Redistribution and use in source and binary forms, with or without
+ modification, are permitted provided that the following conditions
+ are met:
+ 1. Redistributions of source code must retain the above copyright
+ notice, this list of conditions and the following disclaimer.
+ 2. Redistributions in binary form must reproduce the above copyright
+ notice, this list of conditions and the following disclaimer in the
+ documentation and/or other materials provided with the distribution.
+ .
+ THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+ IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+ OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+ INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+ NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+ DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+ THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+ (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+ THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
diff --git a/debian/gnome-ssh-askpass.1 b/debian/gnome-ssh-askpass.1
new file mode 100644
index 0000000..4651b8b
--- /dev/null
+++ b/debian/gnome-ssh-askpass.1
@@ -0,0 +1,91 @@
+.\" Copyright (c) 2003-2022 Colin Watson <cjwatson@debian.org>
+.\" Based on a manual page by Philip Hands for x11-ssh-askpass(1).
+.\"
+.\" Permission to use, copy, modify, and distribute this software for any
+.\" purpose with or without fee is hereby granted, provided that the above
+.\" copyright notice and this permission notice appear in all copies.
+.\"
+.\" THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
+.\" WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
+.\" MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
+.\" ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
+.\" WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
+.\" ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
+.\" OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
+.Dd $Mdocdate: November 14 2022 $
+.Dt GNOME-SSH-ASKPASS 1
+.Os
+.Sh NAME
+.Nm gnome-ssh-askpass
+.Nd prompts a user for a passphrase using GNOME
+.Sh SYNOPSIS
+.Nm Op Ar message ...
+.Sh DESCRIPTION
+.Nm
+is a GNOME-based passphrase dialog for use with OpenSSH.
+It is intended to be called by the
+.Xr ssh-add 1
+program and not invoked directly.
+It allows
+.Xr ssh-add 1
+to obtain a passphrase from a user, even if not connected to a terminal
+(assuming that an X display is available).
+This happens automatically in the case where
+.Xr ssh-add 1
+is invoked from one's
+.Pa ~/.xsession
+or as one of the GNOME startup programs, for example.
+.Pp
+In order to be called automatically by
+.Xr ssh-add 1 ,
+the
+.Ev SSH_ASKPASS
+environment variable should be set to point to the location of
+.Nm ,
+or
+.Nm
+should be installed as
+.Pa /usr/bin/ssh-askpass .
+.Sh ENVIRONMENT
+The following environment variables are recognized:
+.Bl -tag -width "GNOME_SSH_ASKPASS_GRAB_POINTER"
+.It Ev GNOME_SSH_ASKPASS_BG_COLOR
+Text area background color, specified as hexadecimal RGB or RRGGBB,
+optionally prefixed by
+.Dq #
+or
+.Dq 0x .
+.It Ev GNOME_SSH_ASKPASS_FG_COLOR
+Text area foreground color, specified as hexadecimal RGB or RRGGBB,
+optionally prefixed by
+.Dq #
+or
+.Dq 0x .
+.It Ev GNOME_SSH_ASKPASS_GRAB_POINTER
+If set, causes
+.Nm
+to grab the mouse pointer before asking for a passphrase.
+.It Ev GNOME_SSH_ASKPASS_GRAB_SERVER
+If set, causes
+.Nm
+to grab the X server before asking for a passphrase.
+.It Ev SSH_ASKPASS_PROMPT
+If set to
+.Li confirm ,
+show a yes-or-no prompt, defaulting to yes.
+If set to
+.Li none ,
+show a prompt with only a close button.
+Otherwise, show an OK-or-cancel prompt, defaulting to OK.
+This environment variable is typically set by
+.Xr ssh-add 1 ,
+and should not normally be set manually.
+.El
+.Pp
+Regardless of whether either
+.Ev GNOME_SSH_ASKPASS_GRAB_POINTER
+or
+.Ev GNOME_SSH_ASKPASS_GRAB_SERVER
+is set,
+.Nm
+will grab the keyboard.
diff --git a/debian/keygen-test/Makefile b/debian/keygen-test/Makefile
new file mode 100644
index 0000000..71f5eb8
--- /dev/null
+++ b/debian/keygen-test/Makefile
@@ -0,0 +1,12 @@
+test: getpid.so
+ chmod +x keygen-test
+ ./keygen-test
+
+getpid.o: getpid.c
+ gcc $(CPPFLAGS) $(CFLAGS) -fPIC -c $< -o $@
+
+getpid.so: getpid.o
+ gcc $(LDFLAGS) -shared -o $@ $<
+
+clean:
+ rm -f getpid.o getpid.so key1 key1.pub key2 key2.pub
diff --git a/debian/keygen-test/getpid.c b/debian/keygen-test/getpid.c
new file mode 100644
index 0000000..c9e35b8
--- /dev/null
+++ b/debian/keygen-test/getpid.c
@@ -0,0 +1,39 @@
+/*
+ * Compile:
+
+gcc -fPIC -c getpid.c -o getpid.o
+gcc -shared -o getpid.so getpid.o
+
+ * Use:
+
+FORCE_PID=1234 LD_PRELOAD=./getpid.so bash
+
+#
+# Copyright (C) 2001-2008 Kees Cook
+# kees@outflux.net, http://outflux.net/
+#
+# This program is free software; you can redistribute it and/or
+# modify it under the terms of the GNU General Public License
+# as published by the Free Software Foundation; either version 2
+# of the License, or (at your option) any later version.
+#
+# This program is distributed in the hope that it will be useful,
+# but WITHOUT ANY WARRANTY; without even the implied warranty of
+# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+# GNU General Public License for more details.
+#
+# You should have received a copy of the GNU General Public License
+# along with this program; if not, write to the Free Software
+# Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.
+# http://www.gnu.org/copyleft/gpl.html
+
+*/
+
+#include <sys/types.h>
+#include <unistd.h>
+#include <stdlib.h>
+
+pid_t getpid(void)
+{
+ return atoi(getenv("FORCE_PID"));
+}
diff --git a/debian/keygen-test/keygen-test b/debian/keygen-test/keygen-test
new file mode 100755
index 0000000..2abe815
--- /dev/null
+++ b/debian/keygen-test/keygen-test
@@ -0,0 +1,12 @@
+#! /bin/sh
+
+rm -f key1 key1.pub key2 key2.pub
+LD_PRELOAD="$(pwd)/getpid.so" FORCE_PID=1234 \
+ ../build-deb/ssh-keygen -N '' -f key1 >/dev/null
+LD_PRELOAD="$(pwd)/getpid.so" FORCE_PID=1234 \
+ ../build-deb/ssh-keygen -N '' -f key2 >/dev/null
+if cmp -s key1 key2; then
+ echo "Generated two identical keys!" >&2
+ exit 1
+fi
+exit 0
diff --git a/debian/openssh-client-udeb.install b/debian/openssh-client-udeb.install
new file mode 100644
index 0000000..b3891f0
--- /dev/null
+++ b/debian/openssh-client-udeb.install
@@ -0,0 +1,3 @@
+scp usr/bin
+sftp usr/bin
+ssh usr/bin
diff --git a/debian/openssh-client.apport b/debian/openssh-client.apport
new file mode 100644
index 0000000..e10ca2f
--- /dev/null
+++ b/debian/openssh-client.apport
@@ -0,0 +1,35 @@
+'''apport hook for openssh-client
+
+(c) 2010 Canonical Ltd.
+Author: Chuck Short <chuck.short@canonical.com>
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version. See http://www.gnu.org/copyleft/gpl.html for
+the full text of the license.
+'''
+
+from apport.hookutils import (
+ attach_conffiles,
+ attach_related_packages,
+ command_output,
+)
+
+
+def add_info(report, ui):
+ response = ui.yesno("The contents of your /etc/ssh/ssh_config file "
+ "may help developers diagnose your bug more "
+ "quickly. However, it may contain sensitive "
+ "information. Do you want to include it in your "
+ "bug report?")
+
+ if response == None: # user cancelled
+ raise StopIteration
+
+ elif response:
+ attach_conffiles(report, 'openssh-client')
+
+ attach_related_packages(report,
+ ['ssh-askpass', 'libpam-ssh', 'keychain', 'ssh-askpass-gnome'])
+ report['SSHClientVersion'] = command_output(['/usr/bin/ssh', '-V'])
diff --git a/debian/openssh-client.dirs b/debian/openssh-client.dirs
new file mode 100644
index 0000000..c39cb76
--- /dev/null
+++ b/debian/openssh-client.dirs
@@ -0,0 +1 @@
+etc/ssh/ssh_config.d
diff --git a/debian/openssh-client.docs b/debian/openssh-client.docs
new file mode 100644
index 0000000..ee3e332
--- /dev/null
+++ b/debian/openssh-client.docs
@@ -0,0 +1,4 @@
+OVERVIEW
+README
+README.dns
+README.tun
diff --git a/debian/openssh-client.install b/debian/openssh-client.install
new file mode 100755
index 0000000..96c8dea
--- /dev/null
+++ b/debian/openssh-client.install
@@ -0,0 +1,36 @@
+#! /usr/bin/dh-exec
+
+etc/ssh/ssh_config
+usr/bin/scp
+usr/bin/sftp
+usr/bin/ssh
+usr/bin/ssh-add
+usr/bin/ssh-agent
+usr/bin/ssh-keygen
+usr/bin/ssh-keyscan
+usr/lib/openssh/ssh-keysign
+usr/lib/openssh/ssh-pkcs11-helper
+usr/lib/openssh/ssh-sk-helper
+usr/share/man/man1/scp.1
+usr/share/man/man1/sftp.1
+usr/share/man/man1/ssh-add.1
+usr/share/man/man1/ssh-agent.1
+usr/share/man/man1/ssh-keygen.1
+usr/share/man/man1/ssh-keyscan.1
+usr/share/man/man1/ssh.1
+usr/share/man/man5/ssh_config.5
+usr/share/man/man8/ssh-keysign.8
+usr/share/man/man8/ssh-pkcs11-helper.8
+usr/share/man/man8/ssh-sk-helper.8
+
+contrib/ssh-copy-id usr/bin
+debian/ssh-argv0 usr/bin
+
+debian/agent-launch usr/lib/openssh
+
+# dh_apport would be neater, but at the time of writing it isn't in unstable
+# yet.
+debian/openssh-client.apport => usr/share/apport/package-hooks/openssh-client.py
+
+# systemd user unit (only used under sessions)
+debian/systemd/ssh-agent.service usr/lib/systemd/user
diff --git a/debian/openssh-client.links b/debian/openssh-client.links
new file mode 100644
index 0000000..85bd299
--- /dev/null
+++ b/debian/openssh-client.links
@@ -0,0 +1,3 @@
+usr/share/man/man1/ssh.1 usr/share/man/man1/slogin.1
+# enable systemd user unit for graphical sessions that use systemd
+usr/lib/systemd/user/ssh-agent.service usr/lib/systemd/user/graphical-session-pre.target.wants/ssh-agent.service
diff --git a/debian/openssh-client.lintian-overrides b/debian/openssh-client.lintian-overrides
new file mode 100644
index 0000000..0251844
--- /dev/null
+++ b/debian/openssh-client.lintian-overrides
@@ -0,0 +1 @@
+openssh-client: elevated-privileges 4755 root/root [usr/lib/openssh/ssh-keysign]
diff --git a/debian/openssh-client.maintscript b/debian/openssh-client.maintscript
new file mode 100644
index 0000000..e39db9a
--- /dev/null
+++ b/debian/openssh-client.maintscript
@@ -0,0 +1 @@
+rm_conffile /etc/ssh/moduli 1:7.9p1-8~
diff --git a/debian/openssh-client.manpages b/debian/openssh-client.manpages
new file mode 100644
index 0000000..690bd8a
--- /dev/null
+++ b/debian/openssh-client.manpages
@@ -0,0 +1,2 @@
+contrib/ssh-copy-id.1
+debian/ssh-argv0.1
diff --git a/debian/openssh-client.postinst b/debian/openssh-client.postinst
new file mode 100644
index 0000000..dd4d95a
--- /dev/null
+++ b/debian/openssh-client.postinst
@@ -0,0 +1,48 @@
+#!/bin/sh
+set -e
+
+action="$1"
+
+umask 022
+
+
+update_ssh_group_name() {
+ # The _ssh group used to be called ssh, but that could clash with
+ # locally-created user accounts. Since this only exists as an
+ # otherwise-empty group to which ssh-agent is installed setgid, it's
+ # easy to rename.
+ if getent group ssh >/dev/null && ! getent group _ssh >/dev/null; then
+ groupmod -n _ssh ssh
+ fi
+}
+
+set_ssh_agent_permissions() {
+ if ! getent group _ssh >/dev/null; then
+ addgroup --system --quiet --force-badname _ssh
+ fi
+ if ! dpkg-statoverride --list /usr/bin/ssh-agent >/dev/null; then
+ chgrp _ssh /usr/bin/ssh-agent
+ chmod 2755 /usr/bin/ssh-agent
+ fi
+}
+
+remove_obsolete_alternatives() {
+ update-alternatives --remove rcp /usr/bin/scp
+ update-alternatives --remove rlogin /usr/bin/slogin
+ update-alternatives --remove rsh /usr/bin/ssh
+}
+
+
+if [ "$action" = configure ]; then
+ if dpkg --compare-versions "$2" lt-nl 1:8.4p1-6~; then
+ update_ssh_group_name
+ fi
+ set_ssh_agent_permissions
+ if dpkg --compare-versions "$2" lt-nl 1:9.1p1-1~; then
+ remove_obsolete_alternatives
+ fi
+fi
+
+#DEBHELPER#
+
+exit 0
diff --git a/debian/openssh-client.postrm b/debian/openssh-client.postrm
new file mode 100644
index 0000000..9c9fb02
--- /dev/null
+++ b/debian/openssh-client.postrm
@@ -0,0 +1,22 @@
+#!/bin/sh
+set -e
+
+#DEBHELPER#
+
+case $1 in
+ purge)
+ # Remove all non-conffiles that ssh might create, so that we
+ # can smoothly remove /etc/ssh if and only if the user
+ # hasn't dropped some other files in there. Conffiles have
+ # already been removed at this point.
+ rm -f /etc/ssh/moduli /etc/ssh/primes
+ rm -f /etc/ssh/ssh_known_hosts /etc/ssh/ssh_known_hosts2
+ [ ! -d /etc/ssh ] || rmdir --ignore-fail-on-non-empty /etc/ssh
+
+ if command -v delgroup >/dev/null 2>&1; then
+ delgroup --quiet ssh > /dev/null || true
+ fi
+ ;;
+esac
+
+exit 0
diff --git a/debian/openssh-server-udeb.dirs b/debian/openssh-server-udeb.dirs
new file mode 100644
index 0000000..e730fc4
--- /dev/null
+++ b/debian/openssh-server-udeb.dirs
@@ -0,0 +1 @@
+run/sshd
diff --git a/debian/openssh-server-udeb.install b/debian/openssh-server-udeb.install
new file mode 100644
index 0000000..05ccbf7
--- /dev/null
+++ b/debian/openssh-server-udeb.install
@@ -0,0 +1,2 @@
+sshd usr/sbin
+ssh-keygen usr/bin
diff --git a/debian/openssh-server.apport b/debian/openssh-server.apport
new file mode 100644
index 0000000..aa853b5
--- /dev/null
+++ b/debian/openssh-server.apport
@@ -0,0 +1,27 @@
+'''apport hook for openssh-server
+
+(c) 2010 Canonical Ltd.
+Author: Chuck Short <chuck.short@canonical.com>
+
+This program is free software; you can redistribute it and/or modify it
+under the terms of the GNU General Public License as published by the
+Free Software Foundation; either version 2 of the License, or (at your
+option) any later version. See http://www.gnu.org/copyleft/gpl.html for
+the full text of the license.
+'''
+
+from apport.hookutils import root_command_output
+
+
+def add_info(report, ui):
+ response = ui.yesno("The contents of your /etc/ssh/sshd_config file "
+ "may help developers diagnose your bug more "
+ "quickly. However, it may contain sensitive "
+ "information. Do you want to include it in your "
+ "bug report?")
+
+ if response == None: # user cancelled
+ raise StopIteration
+
+ elif response:
+ report['SSHDConfig'] = root_command_output(['/usr/sbin/sshd', '-T'])
diff --git a/debian/openssh-server.config b/debian/openssh-server.config
new file mode 100644
index 0000000..614080e
--- /dev/null
+++ b/debian/openssh-server.config
@@ -0,0 +1,36 @@
+#! /bin/sh
+set -e
+
+. /usr/share/debconf/confmodule
+db_version 2.0
+
+get_config_option() {
+ option="$1"
+
+ [ -f /etc/ssh/sshd_config ] || return
+
+ # TODO: actually only one '=' allowed after option
+ sed -E -n -e 's/[[:space:]]+/ /g' -e 's/[[:space:]]+$//' \
+ -e 's/^[[:space:]]*'"$option"'[[:space:]=]+//Ip' \
+ /etc/ssh/sshd_config 2>/dev/null
+
+}
+
+permit_root_login="$(get_config_option PermitRootLogin)" || true
+password_authentication="$(get_config_option PasswordAuthentication)" || true
+if [ -f /etc/ssh/sshd_config ]; then
+ # Make sure the debconf database is in sync with the current state
+ # of the system.
+ if [ "$permit_root_login" = yes ]; then
+ db_set openssh-server/permit-root-login false
+ else
+ db_set openssh-server/permit-root-login true
+ fi
+ if [ "$password_authentication" = no ]; then
+ db_set openssh-server/password-authentication false
+ else
+ db_set openssh-server/password-authentication true
+ fi
+fi
+
+exit 0
diff --git a/debian/openssh-server.dirs b/debian/openssh-server.dirs
new file mode 100644
index 0000000..6639eca
--- /dev/null
+++ b/debian/openssh-server.dirs
@@ -0,0 +1 @@
+etc/ssh/sshd_config.d
diff --git a/debian/openssh-server.examples b/debian/openssh-server.examples
new file mode 100644
index 0000000..9f15e1f
--- /dev/null
+++ b/debian/openssh-server.examples
@@ -0,0 +1 @@
+debian/systemd/ssh-session-cleanup.service
diff --git a/debian/openssh-server.install b/debian/openssh-server.install
new file mode 100755
index 0000000..cf86dce
--- /dev/null
+++ b/debian/openssh-server.install
@@ -0,0 +1,21 @@
+#! /usr/bin/dh-exec
+
+etc/ssh/moduli
+usr/sbin/sshd
+usr/share/man/man5/authorized_keys.5
+usr/share/man/man5/moduli.5
+usr/share/man/man5/sshd_config.5
+usr/share/man/man8/sshd.8
+
+debian/tmp/etc/ssh/sshd_config => usr/share/openssh/sshd_config
+debian/openssh-server.ucf-md5sum => usr/share/openssh/sshd_config.md5sum
+
+debian/openssh-server.ufw.profile => etc/ufw/applications.d/openssh-server
+debian/systemd/ssh.service lib/systemd/system
+debian/systemd/ssh.socket lib/systemd/system
+debian/systemd/rescue-ssh.target lib/systemd/system
+debian/systemd/ssh-session-cleanup usr/lib/openssh
+
+# dh_apport would be neater, but at the time of writing it isn't in unstable
+# yet.
+debian/openssh-server.apport => usr/share/apport/package-hooks/openssh-server.py
diff --git a/debian/openssh-server.links b/debian/openssh-server.links
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/debian/openssh-server.links
diff --git a/debian/openssh-server.lintian-overrides b/debian/openssh-server.lintian-overrides
new file mode 100644
index 0000000..ea3c041
--- /dev/null
+++ b/debian/openssh-server.lintian-overrides
@@ -0,0 +1,4 @@
+# Ignoring until after the release of bookworm to avoid problems with
+# partial upgrades on non-default init systems. See
+# https://lists.debian.org/debian-devel/2023/01/msg00158.html and thread.
+openssh-server: depends-on-obsolete-package Depends: lsb-base
diff --git a/debian/openssh-server.maintscript b/debian/openssh-server.maintscript
new file mode 100644
index 0000000..db05b22
--- /dev/null
+++ b/debian/openssh-server.maintscript
@@ -0,0 +1 @@
+rm_conffile /etc/network/if-up.d/openssh-server 1:7.9p1-1~
diff --git a/debian/openssh-server.postinst b/debian/openssh-server.postinst
new file mode 100644
index 0000000..d38695f
--- /dev/null
+++ b/debian/openssh-server.postinst
@@ -0,0 +1,144 @@
+#!/bin/sh
+set -e
+
+. /usr/share/debconf/confmodule
+db_version 2.0
+
+action="$1"
+
+umask 022
+
+
+get_config_option() {
+ option="$1"
+
+ [ -f /etc/ssh/sshd_config ] || return
+
+ # TODO: actually only one '=' allowed after option
+ sed -E -n -e 's/[[:space:]]+/ /g' -e 's/[[:space:]]+$//' \
+ -e 's/^[[:space:]]*'"$option"'[[:space:]=]+//Ip' \
+ /etc/ssh/sshd_config
+}
+
+
+host_keys_required() {
+ hostkeys="$(get_config_option HostKey)"
+ if [ "$hostkeys" ]; then
+ echo "$hostkeys"
+ else
+ # No HostKey directives at all, so the server picks some
+ # defaults.
+ echo /etc/ssh/ssh_host_rsa_key
+ echo /etc/ssh/ssh_host_ecdsa_key
+ echo /etc/ssh/ssh_host_ed25519_key
+ fi
+}
+
+
+create_key() {
+ msg="$1"
+ shift
+ hostkeys="$1"
+ shift
+ file="$1"
+ shift
+
+ if echo "$hostkeys" | grep -x "$file" >/dev/null && \
+ [ ! -f "$file" ] ; then
+ printf %s "$msg"
+ ssh-keygen -q -f "$file" -N '' "$@"
+ echo
+ if command -v restorecon >/dev/null 2>&1; then
+ restorecon "$file" "$file.pub"
+ fi
+ ssh-keygen -l -f "$file.pub"
+ fi
+}
+
+
+create_keys() {
+ hostkeys="$(host_keys_required)"
+
+ create_key "Creating SSH2 RSA key; this may take some time ..." \
+ "$hostkeys" /etc/ssh/ssh_host_rsa_key -t rsa
+ create_key "Creating SSH2 DSA key; this may take some time ..." \
+ "$hostkeys" /etc/ssh/ssh_host_dsa_key -t dsa
+ create_key "Creating SSH2 ECDSA key; this may take some time ..." \
+ "$hostkeys" /etc/ssh/ssh_host_ecdsa_key -t ecdsa
+ create_key "Creating SSH2 ED25519 key; this may take some time ..." \
+ "$hostkeys" /etc/ssh/ssh_host_ed25519_key -t ed25519
+}
+
+
+new_config=
+
+cleanup() {
+ if [ "$new_config" ]; then
+ rm -f "$new_config"
+ fi
+}
+
+
+create_sshdconfig() {
+ # XXX cjwatson 2016-12-24: This debconf template is very confusingly
+ # named; its description is "Disable SSH password authentication for
+ # root?", so true -> prohibit-password (the upstream default),
+ # false -> yes.
+ db_get openssh-server/permit-root-login
+ permit_root_login="$RET"
+ db_get openssh-server/password-authentication
+ password_authentication="$RET"
+
+ trap cleanup EXIT
+ new_config="$(mktemp)"
+ cp -aZ /usr/share/openssh/sshd_config "$new_config"
+ if [ "$permit_root_login" != true ]; then
+ sed -i 's/^#*PermitRootLogin .*/PermitRootLogin yes/' \
+ "$new_config"
+ fi
+ if [ "$password_authentication" != true ]; then
+ sed -i 's/^#PasswordAuthentication .*/PasswordAuthentication no/' \
+ "$new_config"
+ fi
+ mkdir -pZ /etc/ssh
+ ucf --three-way --debconf-ok \
+ --sum-file /usr/share/openssh/sshd_config.md5sum \
+ "$new_config" /etc/ssh/sshd_config
+ ucfr openssh-server /etc/ssh/sshd_config
+}
+
+setup_sshd_user() {
+ if ! getent passwd sshd >/dev/null; then
+ adduser --quiet --system --no-create-home --home /run/sshd --shell /usr/sbin/nologin sshd
+ fi
+}
+
+if [ "$action" = configure ]; then
+ create_sshdconfig
+ create_keys
+ setup_sshd_user
+ if dpkg --compare-versions "$2" lt-nl 1:7.9p1-5 && \
+ [ -f /etc/ssh/moduli.dpkg-bak ]; then
+ # Handle /etc/ssh/moduli being moved from openssh-client to
+ # openssh-server. If there were no user modifications, then we
+ # don't need to do anything special here; but if there were,
+ # then the dpkg-maintscript-helper calls from openssh-client's
+ # maintainer scripts will have saved the old file as .dpkg-bak,
+ # which we now move back into place.
+ mv /etc/ssh/moduli.dpkg-bak /etc/ssh/moduli
+ fi
+ if dpkg --compare-versions "$2" lt-nl 1:9.1p1-1~ && \
+ deb-systemd-helper --quiet was-enabled ssh.socket && \
+ [ -d /run/systemd/system ]
+ then
+ # migrate to systemd socket activation.
+ systemctl unmask ssh.service
+ systemctl disable ssh.service
+ fi
+fi
+
+#DEBHELPER#
+
+db_stop
+
+exit 0
diff --git a/debian/openssh-server.postrm b/debian/openssh-server.postrm
new file mode 100644
index 0000000..fbaeb17
--- /dev/null
+++ b/debian/openssh-server.postrm
@@ -0,0 +1,35 @@
+#!/bin/sh
+set -e
+
+#DEBHELPER#
+
+case $1 in
+ purge)
+ # Remove all non-conffiles that ssh might create, so that we
+ # can smoothly remove /etc/ssh if and only if the user
+ # hasn't dropped some other files in there. Conffiles have
+ # already been removed at this point.
+ rm -f /etc/ssh/ssh_host_key /etc/ssh/ssh_host_key.pub
+ rm -f /etc/ssh/ssh_host_rsa_key /etc/ssh/ssh_host_rsa_key.pub
+ rm -f /etc/ssh/ssh_host_dsa_key /etc/ssh/ssh_host_dsa_key.pub
+ rm -f /etc/ssh/ssh_host_ecdsa_key /etc/ssh/ssh_host_ecdsa_key.pub
+ rm -f /etc/ssh/ssh_host_ed25519_key /etc/ssh/ssh_host_ed25519_key.pub
+ for ext in .ucf-new .ucf-old .ucf-dist ""; do
+ rm -f "/etc/ssh/sshd_config$ext"
+ done
+ if command -v ucf >/dev/null 2>&1; then
+ ucf --purge /etc/ssh/sshd_config
+ fi
+ if command -v ucfr >/dev/null 2>&1; then
+ ucfr --purge openssh-server /etc/ssh/sshd_config
+ fi
+ rm -f /etc/ssh/sshd_not_to_be_run
+ [ ! -d /etc/ssh ] || rmdir --ignore-fail-on-non-empty /etc/ssh
+
+ if command -v deluser >/dev/null 2>&1; then
+ deluser --quiet sshd > /dev/null || true
+ fi
+ ;;
+esac
+
+exit 0
diff --git a/debian/openssh-server.runit b/debian/openssh-server.runit
new file mode 100644
index 0000000..cb659a0
--- /dev/null
+++ b/debian/openssh-server.runit
@@ -0,0 +1 @@
+debian/openssh-server.ssh.runscript logscript,name=ssh,since=1:8.0p1-5
diff --git a/debian/openssh-server.ssh.default b/debian/openssh-server.ssh.default
new file mode 100644
index 0000000..3040422
--- /dev/null
+++ b/debian/openssh-server.ssh.default
@@ -0,0 +1,5 @@
+# Default settings for openssh-server. This file is sourced by /bin/sh from
+# /etc/init.d/ssh.
+
+# Options to pass to sshd
+SSHD_OPTS=
diff --git a/debian/openssh-server.ssh.init b/debian/openssh-server.ssh.init
new file mode 100755
index 0000000..1913218
--- /dev/null
+++ b/debian/openssh-server.ssh.init
@@ -0,0 +1,166 @@
+#! /bin/sh
+
+### BEGIN INIT INFO
+# Provides: ssh sshd
+# Required-Start: $remote_fs $syslog
+# Required-Stop: $remote_fs $syslog
+# Default-Start: 2 3 4 5
+# Default-Stop:
+# Short-Description: OpenBSD Secure Shell server
+### END INIT INFO
+
+set -e
+
+# /etc/init.d/ssh: start and stop the OpenBSD "secure shell(tm)" daemon
+
+test -x /usr/sbin/sshd || exit 0
+( /usr/sbin/sshd -\? 2>&1 | grep -q OpenSSH ) 2>/dev/null || exit 0
+
+umask 022
+
+if test -f /etc/default/ssh; then
+ . /etc/default/ssh
+fi
+
+. /lib/lsb/init-functions
+
+if [ -n "$2" ]; then
+ SSHD_OPTS="$SSHD_OPTS $2"
+fi
+
+# Are we running from init?
+run_by_init() {
+ ([ "$previous" ] && [ "$runlevel" ]) || [ "$runlevel" = S ]
+}
+
+check_for_no_start() {
+ # forget it if we're trying to start, and /etc/ssh/sshd_not_to_be_run exists
+ if [ -e /etc/ssh/sshd_not_to_be_run ]; then
+ if [ "$1" = log_end_msg ]; then
+ log_end_msg 0 || true
+ fi
+ if ! run_by_init; then
+ log_action_msg "OpenBSD Secure Shell server not in use (/etc/ssh/sshd_not_to_be_run)" || true
+ fi
+ exit 0
+ fi
+}
+
+check_dev_null() {
+ if [ ! -c /dev/null ]; then
+ if [ "$1" = log_end_msg ]; then
+ log_end_msg 1 || true
+ fi
+ if ! run_by_init; then
+ log_action_msg "/dev/null is not a character device!" || true
+ fi
+ exit 1
+ fi
+}
+
+check_privsep_dir() {
+ # Create the PrivSep empty dir if necessary
+ if [ ! -d /run/sshd ]; then
+ mkdir /run/sshd
+ chmod 0755 /run/sshd
+ fi
+}
+
+check_config() {
+ if [ ! -e /etc/ssh/sshd_not_to_be_run ]; then
+ # shellcheck disable=SC2086
+ /usr/sbin/sshd $SSHD_OPTS -t || exit 1
+ fi
+}
+
+export PATH="${PATH:+$PATH:}/usr/sbin:/sbin"
+
+case "$1" in
+ start)
+ check_privsep_dir
+ check_for_no_start
+ check_dev_null
+ log_daemon_msg "Starting OpenBSD Secure Shell server" "sshd" || true
+ # shellcheck disable=SC2086
+ if start-stop-daemon --start --quiet --oknodo --chuid 0:0 --pidfile /run/sshd.pid --exec /usr/sbin/sshd -- $SSHD_OPTS; then
+ log_end_msg 0 || true
+ else
+ log_end_msg 1 || true
+ fi
+ ;;
+ stop)
+ log_daemon_msg "Stopping OpenBSD Secure Shell server" "sshd" || true
+ if start-stop-daemon --stop --quiet --oknodo --pidfile /run/sshd.pid --exec /usr/sbin/sshd; then
+ log_end_msg 0 || true
+ else
+ log_end_msg 1 || true
+ fi
+ ;;
+
+ reload|force-reload)
+ check_for_no_start
+ check_config
+ log_daemon_msg "Reloading OpenBSD Secure Shell server's configuration" "sshd" || true
+ if start-stop-daemon --stop --signal 1 --quiet --oknodo --pidfile /run/sshd.pid --exec /usr/sbin/sshd; then
+ log_end_msg 0 || true
+ else
+ log_end_msg 1 || true
+ fi
+ ;;
+
+ restart)
+ check_privsep_dir
+ check_config
+ log_daemon_msg "Restarting OpenBSD Secure Shell server" "sshd" || true
+ start-stop-daemon --stop --quiet --oknodo --retry 30 --pidfile /run/sshd.pid --exec /usr/sbin/sshd
+ check_for_no_start log_end_msg
+ check_dev_null log_end_msg
+ # shellcheck disable=SC2086
+ if start-stop-daemon --start --quiet --oknodo --chuid 0:0 --pidfile /run/sshd.pid --exec /usr/sbin/sshd -- $SSHD_OPTS; then
+ log_end_msg 0 || true
+ else
+ log_end_msg 1 || true
+ fi
+ ;;
+
+ try-restart)
+ check_privsep_dir
+ check_config
+ log_daemon_msg "Restarting OpenBSD Secure Shell server" "sshd" || true
+ RET=0
+ start-stop-daemon --stop --quiet --retry 30 --pidfile /run/sshd.pid --exec /usr/sbin/sshd || RET="$?"
+ case $RET in
+ 0)
+ # old daemon stopped
+ check_for_no_start log_end_msg
+ check_dev_null log_end_msg
+ # shellcheck disable=SC2086
+ if start-stop-daemon --start --quiet --oknodo --chuid 0:0 --pidfile /run/sshd.pid --exec /usr/sbin/sshd -- $SSHD_OPTS; then
+ log_end_msg 0 || true
+ else
+ log_end_msg 1 || true
+ fi
+ ;;
+ 1)
+ # daemon not running
+ log_progress_msg "(not running)" || true
+ log_end_msg 0 || true
+ ;;
+ *)
+ # failed to stop
+ log_progress_msg "(failed to stop)" || true
+ log_end_msg 1 || true
+ ;;
+ esac
+ ;;
+
+ status)
+ status_of_proc -p /run/sshd.pid /usr/sbin/sshd sshd && exit 0 || exit $?
+ ;;
+
+ *)
+ log_action_msg "Usage: /etc/init.d/ssh {start|stop|reload|force-reload|restart|try-restart|status}" || true
+ exit 1
+esac
+
+exit 0
diff --git a/debian/openssh-server.ssh.runscript/finish b/debian/openssh-server.ssh.runscript/finish
new file mode 100644
index 0000000..8c67acf
--- /dev/null
+++ b/debian/openssh-server.ssh.runscript/finish
@@ -0,0 +1,16 @@
+#!/bin/sh
+set -e
+
+NAME=ssh
+
+[ "$1" = -1 ] && echo "runsv: ERROR in $NAME: unexpected error or wrong sh syntax"
+# no need to stop the service here, runsv will stop trying after the first attempt
+
+[ "$1" = 161 ] && echo "runsv: ERROR $1 in $NAME: disabled by local settings" \
+ && sv d "$(dirname "$0")" && exit 0
+
+[ "$1" = 162 ] && echo "runsv: ERROR $1 in $NAME: configtest or early setup failed" \
+ && sv d "$(dirname "$0")" && exit 0
+
+echo "$NAME Stopped"
+
diff --git a/debian/openssh-server.ssh.runscript/run b/debian/openssh-server.ssh.runscript/run
new file mode 100644
index 0000000..1d05245
--- /dev/null
+++ b/debian/openssh-server.ssh.runscript/run
@@ -0,0 +1,20 @@
+#!/usr/bin/env /lib/runit/invoke-run
+set -e
+
+NAME="ssh"
+
+sv start auditd || sv check auditd || true
+
+# don't start if 'sshd_not_to_be_run' exists
+test -e /etc/ssh/sshd_not_to_be_run && exit 161
+
+#Create /run/sshd
+test -d /run/sshd || mkdir /run/sshd && chmod 0755 /run/sshd
+
+exec 2>&1
+
+#Config test
+/usr/sbin/sshd -t || exit 162
+
+echo "Starting $NAME..."
+exec /usr/sbin/sshd -D -e $SSHD_OPTS
diff --git a/debian/openssh-server.sshd.pam.in b/debian/openssh-server.sshd.pam.in
new file mode 100644
index 0000000..2cad67d
--- /dev/null
+++ b/debian/openssh-server.sshd.pam.in
@@ -0,0 +1,55 @@
+# PAM configuration for the Secure Shell service
+
+# Standard Un*x authentication.
+@include common-auth
+
+# Disallow non-root logins when /etc/nologin exists.
+account required pam_nologin.so
+
+# Uncomment and edit /etc/security/access.conf if you need to set complex
+# access limits that are hard to express in sshd_config.
+# account required pam_access.so
+
+# Standard Un*x authorization.
+@include common-account
+
+# SELinux needs to be the first session rule. This ensures that any
+# lingering context has been cleared. Without this it is possible that a
+# module could execute code in the wrong domain.
+session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so close
+
+# Set the loginuid process attribute.
+session required pam_loginuid.so
+
+@IF_KEYINIT@# Create a new session keyring.
+@IF_KEYINIT@session optional pam_keyinit.so force revoke
+
+# Standard Un*x session setup and teardown.
+@include common-session
+
+# Print the message of the day upon successful login.
+# This includes a dynamically generated part from /run/motd.dynamic
+# and a static (admin-editable) part from /etc/motd.
+session optional pam_motd.so motd=/run/motd.dynamic
+session optional pam_motd.so noupdate
+
+# Print the status of the user's mailbox upon successful login.
+session optional pam_mail.so standard noenv # [1]
+
+# Set up user limits from /etc/security/limits.conf.
+session required pam_limits.so
+
+# Read environment variables from /etc/environment and
+# /etc/security/pam_env.conf.
+session required pam_env.so # [1]
+# In Debian 4.0 (etch), locale-related environment variables were moved to
+# /etc/default/locale, so read that as well.
+session required pam_env.so user_readenv=1 envfile=/etc/default/locale
+
+# SELinux needs to intervene at login time to ensure that the process starts
+# in the proper default security context. Only sessions which are intended
+# to run in the user's context should be run after this.
+session [success=ok ignore=ignore module_unknown=ignore default=bad] pam_selinux.so open
+
+# Standard Un*x password updating.
+@include common-password
diff --git a/debian/openssh-server.templates b/debian/openssh-server.templates
new file mode 100644
index 0000000..e071fe3
--- /dev/null
+++ b/debian/openssh-server.templates
@@ -0,0 +1,23 @@
+Template: openssh-server/permit-root-login
+Type: boolean
+Default: true
+_Description: Disable SSH password authentication for root?
+ Previous versions of openssh-server permitted logging in as root over SSH
+ using password authentication. The default for new installations is now
+ "PermitRootLogin prohibit-password", which disables password authentication
+ for root without breaking systems that have explicitly configured SSH
+ public key authentication for root.
+ .
+ This change makes systems more secure against brute-force password
+ dictionary attacks on the root user (a very common target for such
+ attacks). However, it may break systems that are set up with the
+ expectation of being able to SSH as root using password authentication. You
+ should only make this change if you do not need to do that.
+
+Template: openssh-server/password-authentication
+Type: boolean
+Default: true
+Description: Allow password authentication?
+ By default, the SSH server will allow authenticating using a password.
+ You may want to change this if all users on this system authenticate using
+ a stronger authentication method, such as public keys.
diff --git a/debian/openssh-server.ucf-md5sum b/debian/openssh-server.ucf-md5sum
new file mode 100644
index 0000000..3a9dc23
--- /dev/null
+++ b/debian/openssh-server.ucf-md5sum
@@ -0,0 +1,110 @@
+# Historical md5sums of the default /etc/ssh/sshd_config up to and including
+# 1:7.3p1-5.
+0d06fc337cee10609d4833dc88df740f
+10dc68360f6658910a98a051273de22c
+11f9e107b4d13bbcabe7f8e8da734371
+16c827adcff44efaca05ec5eea6383d7
+2eeff28468576c3f2e538314e177687b
+386c8b9079625b78f6d624ae506958ae
+38fc7b31b3e3078848f0eec457d3e050
+395c5e13801f9b4f17c2cb54aa634fbd
+423d5796cee663af2d0f24c4d520b578
+42be2cb5b64bc91443b2e46969d2d539
+42cd8b7c5ea9e440d3efa50b9a1bb444
+4f56ca8d0b5dfdaeb732becd3292ce5d
+54998a682a97af8449e9de0316eacf1d
+5c0bdc1735accbdc062381149937ec4a
+6357b54acf8e089c57544e06d1bbec53
+6a621d8bc448987e5a8a613c40307a4c
+702a79962e60aa17c6d3df742e8ec670
+7a69eff91ec92b4e065b8dd8846366b2
+7c60e22f183b6219c684f15ce24153fd
+8304e780c43d4a606f695c8965f48299
+8b9e70ee87f4b822714e2ed7af5b70dc
+8caefdd9e251b7cc1baa37874149a870
+90baeb1c778464d2da610f8268939719
+962a382e51f43f80109131838ca326ba
+96eaf22faba705a37905282f6ad69d64
+9cb6cd83be1c21f73476be629b163c01
+a07a9865cd33b85a1426cd67954c6fa0
+ae1e844b43986e2a964cf84f46b50c5b
+b516afa5a1e298f4cd00952b36dd623f
+b69fc974ee9b5a111bd473ef54cdd232
+ba9c3f808c811d6f944ad10a508c4767
+bccf9af9c7027afd0895d8ff8e02761a
+bd3a2b95f8b4b180eed707794ad81e4d
+c34586b56496f81a10615c002685fc74
+c47555a21189a6b703d2c5d37d2c50ed
+cac079e87c0ae0d77eafc9b285e36348
+d224f92823483333432974f63cb6dc66
+d50ef9ef2aa51cb9f808f6a776260c0a
+e0029e1e9871d4d2b673ee6d70a38614
+e086e7eb521ccc5776371b2e198f0702
+e101f74dc7381527e9aefa1f78b01a7f
+e24f749808133a27d94fda84a89bb27b
+ec16c3dd0203f13885d74ce529719fda
+efcff5380823d4e3f5039620c2e08459
+f58056370a64dbd2017d7486421c281d
+fe396d52df77f1fbf710591d4dbf3311
+
+# From this point on, we have four md5sums for each released version of
+# sshd_config, depending on the state of openssh-server/permit-root-login
+# and openssh-server/password-authentication; the plain copy plus the result
+# of running through either or both of the following:
+#
+# sed 's/^#*PermitRootLogin .*/PermitRootLogin yes/'
+# sed 's/^#PasswordAuthentication .*/PasswordAuthentication no/'
+#
+# This obviously leaves something to be desired in terms of maintainability.
+#
+# The following covers up to 1:7.8p1-1, including everything except the
+# latest version of sshd_config. It should be extended any time sshd_config
+# changes.
+
+# From 1:7.4p1-1:
+f8ecd8f588749a0e39a5b1d3ff261cb2
+0f923c50ef1b00e1e88e02736727f03e
+abc2568a7ec0cb54c584ea03c7a4f854
+17851b145a2515fce2e8d0b9020d5cd4
+
+# From 1:7.4p1-6:
+bbcdf7b77777d40996e287495bb96e47
+55dd47f61a4af5d1a8884ec590ce33ef
+e1375e853a36f9bcd5faeb4b8c570dd1
+fa6d314c0ab05933ab970fd362ab2800
+
+# From 1:7.4p1-7:
+bbad7ed242a834e831c7066901cee49e
+df8447ce600dd3d6bc4048ccc2faa536
+87adc8952a7f06efdda8473fd772997f
+14301f8b9e39c72b3f929dc70e41ebf6
+
+# From 1:7.5p1-1:
+739d6887c8f3dd71a9168c614c07175c
+cc463c55b512da68e807784f675a1301
+203e9b92fe3623aeba277ee44297f7dd
+1d29cac6b0dd5c0004cf7d80b823715c
+
+# From 1:7.7p1-1:
+cc873ab3ccc9cf3a3830c3c0728c0d0b
+2d0b1d2719c01b15457401fd97d607ed
+8ce930e15835a8f46285315ed0da7f4a
+8a71a3620605f21ac3ef16fd5d23f76a
+
+# From 1:7.8p1-1:
+55570f990ec9c3b8d19c19ab4d0b8eb8
+0b8a28dca5cdbace0cd85fcd7794cba8
+18df1377273c4d51d4c03c9adc31021f
+63284e767f6ccf2375ef80507c564797
+
+# From 1:8.2p1-1:
+6dbdc3a27e1953d209f929df7aff0c57
+0ef8c8fe6a3afd12382dbb93cd7bbb4e
+9f1bec115595c0f76282d80abe5d9bcc
+ae1a449c8adb31cb603e28fda5342696
+
+# From 1:8.7p1-1:
+fe83fd23553510bb632dc8e6e35ab41a
+d96ecd9064ea650c44372a5a33d3e497
+7fdb195ac56e0bf1992e18ac656811af
+4e03b4df60cd00c651777ec14ff76aef
diff --git a/debian/openssh-server.ufw.profile b/debian/openssh-server.ufw.profile
new file mode 100644
index 0000000..9bbe906
--- /dev/null
+++ b/debian/openssh-server.ufw.profile
@@ -0,0 +1,4 @@
+[OpenSSH]
+title=Secure shell server, an rshd replacement
+description=OpenSSH is a free implementation of the Secure Shell protocol.
+ports=22/tcp
diff --git a/debian/openssh-sftp-server.install b/debian/openssh-sftp-server.install
new file mode 100644
index 0000000..25b12dc
--- /dev/null
+++ b/debian/openssh-sftp-server.install
@@ -0,0 +1,2 @@
+usr/lib/openssh/sftp-server
+usr/share/man/man8/sftp-server.8
diff --git a/debian/openssh-sftp-server.links b/debian/openssh-sftp-server.links
new file mode 100644
index 0000000..2d98b1d
--- /dev/null
+++ b/debian/openssh-sftp-server.links
@@ -0,0 +1 @@
+usr/lib/openssh/sftp-server usr/lib/sftp-server
diff --git a/debian/openssh-tests.install b/debian/openssh-tests.install
new file mode 100644
index 0000000..9417045
--- /dev/null
+++ b/debian/openssh-tests.install
@@ -0,0 +1,11 @@
+regress /usr/lib/openssh
+debian/build-deb/regress/check-perm /usr/lib/openssh/regress
+debian/build-deb/regress/misc /usr/lib/openssh/regress
+debian/build-deb/regress/mkdtemp /usr/lib/openssh/regress
+debian/build-deb/regress/modpipe /usr/lib/openssh/regress
+debian/build-deb/regress/netcat /usr/lib/openssh/regress
+debian/build-deb/regress/setuid-allowed /usr/lib/openssh/regress
+debian/build-deb/regress/unittests /usr/lib/openssh/regress
+
+debian/build-deb/config.h /usr/lib/openssh/regress
+debian/run-tests /usr/lib/openssh/regress
diff --git a/debian/patches/CVE-2023-28531.patch b/debian/patches/CVE-2023-28531.patch
new file mode 100644
index 0000000..448632a
--- /dev/null
+++ b/debian/patches/CVE-2023-28531.patch
@@ -0,0 +1,31 @@
+From d1461c936223751e723662115b12bb0e9ba96f65 Mon Sep 17 00:00:00 2001
+From: "djm@openbsd.org" <djm@openbsd.org>
+Date: Thu, 9 Mar 2023 06:58:26 +0000
+Subject: upstream: include destination constraints for smartcard keys too.
+
+Spotted by Luci Stanescu; ok deraadt@ markus@
+
+OpenBSD-Commit-ID: add879fac6903a1cb1d1e42c4309e5359c3d870f
+
+Bug-Debian: https://bugs.debian.org/1033166
+Origin: backport, https://anongit.mindrot.org/openssh.git/commit/?id=54ac4ab2b53ce9fcb66b8250dee91c070e4167ed
+Last-Update: 2023-12-19
+
+Patch-Name: CVE-2023-28531.patch
+---
+ authfd.c | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/authfd.c b/authfd.c
+index b633e35ea..b9ae505ad 100644
+--- a/authfd.c
++++ b/authfd.c
+@@ -666,7 +666,7 @@ ssh_update_card(int sock, int add, const char *reader_id, const char *pin,
+ struct dest_constraint **dest_constraints, size_t ndest_constraints)
+ {
+ struct sshbuf *msg;
+- int r, constrained = (life || confirm);
++ int r, constrained = (life || confirm || dest_constraints);
+ u_char type;
+
+ if (add) {
diff --git a/debian/patches/CVE-2023-38408-1.patch b/debian/patches/CVE-2023-38408-1.patch
new file mode 100644
index 0000000..9f6d1ec
--- /dev/null
+++ b/debian/patches/CVE-2023-38408-1.patch
@@ -0,0 +1,30 @@
+From dee3878689aef5365955442869be02d420b65ea6 Mon Sep 17 00:00:00 2001
+From: Damien Miller <djm@mindrot.org>
+Date: Thu, 13 Jul 2023 12:09:34 +1000
+Subject: terminate pkcs11 process for bad libraries
+
+Origin: upstream, https://anongit.mindrot.org/openssh.git/commit/?id=b23fe83f06ee7e721033769cfa03ae840476d280
+Last-Update: 2023-09-17
+
+Patch-Name: CVE-2023-38408-1.patch
+---
+ ssh-pkcs11.c | 6 ++----
+ 1 file changed, 2 insertions(+), 4 deletions(-)
+
+diff --git a/ssh-pkcs11.c b/ssh-pkcs11.c
+index b2e2b32a5..9e48c134e 100644
+--- a/ssh-pkcs11.c
++++ b/ssh-pkcs11.c
+@@ -1537,10 +1537,8 @@ pkcs11_register_provider(char *provider_id, char *pin,
+ error("dlopen %s failed: %s", provider_id, dlerror());
+ goto fail;
+ }
+- if ((getfunctionlist = dlsym(handle, "C_GetFunctionList")) == NULL) {
+- error("dlsym(C_GetFunctionList) failed: %s", dlerror());
+- goto fail;
+- }
++ if ((getfunctionlist = dlsym(handle, "C_GetFunctionList")) == NULL)
++ fatal("dlsym(C_GetFunctionList) failed: %s", dlerror());
+ p = xcalloc(1, sizeof(*p));
+ p->name = xstrdup(provider_id);
+ p->handle = handle;
diff --git a/debian/patches/CVE-2023-38408-2.patch b/debian/patches/CVE-2023-38408-2.patch
new file mode 100644
index 0000000..c8f5980
--- /dev/null
+++ b/debian/patches/CVE-2023-38408-2.patch
@@ -0,0 +1,104 @@
+From 5c06b89189eb27f692b900526d60bf744918511e Mon Sep 17 00:00:00 2001
+From: Damien Miller <djm@mindrot.org>
+Date: Fri, 7 Jul 2023 13:30:15 +1000
+Subject: disallow remote addition of FIDO/PKCS11 keys
+
+Depends on the local client performing the session-bind@openssh.com
+operation, so non-OpenSSH local client may circumvent this.
+
+Origin: upstream, https://anongit.mindrot.org/openssh.git/commit/?id=d7790cdce72a1b6982795baa2b4d6f0bdbb0100d
+Last-Update: 2023-09-17
+
+Patch-Name: CVE-2023-38408-2.patch
+---
+ ssh-agent.1 | 22 ++++++++++++++++++++--
+ ssh-agent.c | 21 ++++++++++++++++++++-
+ 2 files changed, 40 insertions(+), 3 deletions(-)
+
+diff --git a/ssh-agent.1 b/ssh-agent.1
+index ba418bb41..0e5b6c15c 100644
+--- a/ssh-agent.1
++++ b/ssh-agent.1
+@@ -107,9 +107,27 @@ environment variable).
+ .It Fl O Ar option
+ Specify an option when starting
+ .Nm .
+-Currently only one option is supported:
++Currently two options are supported:
++.Cm allow-remote-pkcs11
++and
+ .Cm no-restrict-websafe .
+-This instructs
++.Pp
++The
++.Cm allow-remote-pkcs11
++option allows clients of a forwarded
++.Nm
++to load PKCS#11 or FIDO provider libraries.
++By default only local clients may perform this operation.
++Note that signalling that a
++.Nm
++client remote is performed by
++.Xr ssh 1 ,
++and use of other tools to forward access to the agent socket may circumvent
++this restriction.
++.Pp
++The
++.Cm no-restrict-websafe ,
++instructs
+ .Nm
+ to permit signatures using FIDO keys that might be web authentication
+ requests.
+diff --git a/ssh-agent.c b/ssh-agent.c
+index 63e1137bc..dce2849d8 100644
+--- a/ssh-agent.c
++++ b/ssh-agent.c
+@@ -170,6 +170,12 @@ char socket_dir[PATH_MAX];
+ /* Pattern-list of allowed PKCS#11/Security key paths */
+ static char *allowed_providers;
+
++/*
++ * Allows PKCS11 providers or SK keys that use non-internal providers to
++ * be added over a remote connection (identified by session-bind@openssh.com).
++ */
++static int remote_add_provider;
++
+ /* locking */
+ #define LOCK_SIZE 32
+ #define LOCK_SALT_SIZE 16
+@@ -1229,6 +1235,12 @@ process_add_identity(SocketEntry *e)
+ if (strcasecmp(sk_provider, "internal") == 0) {
+ debug_f("internal provider");
+ } else {
++ if (e->nsession_ids != 0 && !remote_add_provider) {
++ verbose("failed add of SK provider \"%.100s\": "
++ "remote addition of providers is disabled",
++ sk_provider);
++ goto out;
++ }
+ if (realpath(sk_provider, canonical_provider) == NULL) {
+ verbose("failed provider \"%.100s\": "
+ "realpath: %s", sk_provider,
+@@ -1392,6 +1404,11 @@ process_add_smartcard_key(SocketEntry *e)
+ error_f("failed to parse constraints");
+ goto send;
+ }
++ if (e->nsession_ids != 0 && !remote_add_provider) {
++ verbose("failed PKCS#11 add of \"%.100s\": remote addition of "
++ "providers is disabled", provider);
++ goto send;
++ }
+ if (realpath(provider, canonical_provider) == NULL) {
+ verbose("failed PKCS#11 add of \"%.100s\": realpath: %s",
+ provider, strerror(errno));
+@@ -2052,7 +2069,9 @@ main(int ac, char **av)
+ break;
+ case 'O':
+ if (strcmp(optarg, "no-restrict-websafe") == 0)
+- restrict_websafe = 0;
++ restrict_websafe = 0;
++ else if (strcmp(optarg, "allow-remote-pkcs11") == 0)
++ remote_add_provider = 1;
+ else
+ fatal("Unknown -O option");
+ break;
diff --git a/debian/patches/CVE-2023-38408-3.patch b/debian/patches/CVE-2023-38408-3.patch
new file mode 100644
index 0000000..6089222
--- /dev/null
+++ b/debian/patches/CVE-2023-38408-3.patch
@@ -0,0 +1,174 @@
+From 29c7785a3673101b3af8f6f712795fa128e52ddd Mon Sep 17 00:00:00 2001
+From: "djm@openbsd.org" <djm@openbsd.org>
+Date: Wed, 19 Jul 2023 14:02:27 +0000
+Subject: upstream: Ensure FIDO/PKCS11 libraries contain expected symbols
+
+This checks via nlist(3) that candidate provider libraries contain one
+of the symbols that we will require prior to dlopen(), which can cause
+a number of side effects, including execution of constructors.
+
+Feedback deraadt; ok markus
+
+OpenBSD-Commit-ID: 1508a5fbd74e329e69a55b56c453c292029aefbe
+
+Origin: upstream, https://anongit.mindrot.org/openssh.git/commit/?id=29ef8a04866ca14688d5b7fed7b8b9deab851f77
+Last-Update: 2023-09-17
+
+Patch-Name: CVE-2023-38408-3.patch
+---
+ misc.c | 76 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ misc.h | 1 +
+ ssh-pkcs11.c | 4 +++
+ ssh-sk.c | 8 +++---
+ 4 files changed, 86 insertions(+), 3 deletions(-)
+
+diff --git a/misc.c b/misc.c
+index 2268d8875..36e72f5b5 100644
+--- a/misc.c
++++ b/misc.c
+@@ -22,6 +22,7 @@
+
+ #include <sys/types.h>
+ #include <sys/ioctl.h>
++#include <sys/mman.h>
+ #include <sys/socket.h>
+ #include <sys/stat.h>
+ #include <sys/time.h>
+@@ -35,6 +36,9 @@
+ #ifdef HAVE_POLL_H
+ #include <poll.h>
+ #endif
++#ifdef HAVE_NLIST_H
++#include <nlist.h>
++#endif
+ #include <signal.h>
+ #include <stdarg.h>
+ #include <stdio.h>
+@@ -2962,3 +2966,75 @@ ptimeout_isset(struct timespec *pt)
+ {
+ return pt->tv_sec != -1;
+ }
++
++/*
++ * Returns zero if the library at 'path' contains symbol 's', nonzero
++ * otherwise.
++ */
++int
++lib_contains_symbol(const char *path, const char *s)
++{
++#ifdef HAVE_NLIST_H
++ struct nlist nl[2];
++ int ret = -1, r;
++
++ memset(nl, 0, sizeof(nl));
++ nl[0].n_name = xstrdup(s);
++ nl[1].n_name = NULL;
++ if ((r = nlist(path, nl)) == -1) {
++ error_f("nlist failed for %s", path);
++ goto out;
++ }
++ if (r != 0 || nl[0].n_value == 0 || nl[0].n_type == 0) {
++ error_f("library %s does not contain symbol %s", path, s);
++ goto out;
++ }
++ /* success */
++ ret = 0;
++ out:
++ free(nl[0].n_name);
++ return ret;
++#else /* HAVE_NLIST_H */
++ int fd, ret = -1;
++ struct stat st;
++ void *m = NULL;
++ size_t sz = 0;
++
++ memset(&st, 0, sizeof(st));
++ if ((fd = open(path, O_RDONLY)) < 0) {
++ error_f("open %s: %s", path, strerror(errno));
++ return -1;
++ }
++ if (fstat(fd, &st) != 0) {
++ error_f("fstat %s: %s", path, strerror(errno));
++ goto out;
++ }
++ if (!S_ISREG(st.st_mode)) {
++ error_f("%s is not a regular file", path);
++ goto out;
++ }
++ if (st.st_size < 0 ||
++ (size_t)st.st_size < strlen(s) ||
++ st.st_size >= INT_MAX/2) {
++ error_f("%s bad size %lld", path, (long long)st.st_size);
++ goto out;
++ }
++ sz = (size_t)st.st_size;
++ if ((m = mmap(NULL, sz, PROT_READ, MAP_PRIVATE, fd, 0)) == MAP_FAILED ||
++ m == NULL) {
++ error_f("mmap %s: %s", path, strerror(errno));
++ goto out;
++ }
++ if (memmem(m, sz, s, strlen(s)) == NULL) {
++ error_f("%s does not contain expected string %s", path, s);
++ goto out;
++ }
++ /* success */
++ ret = 0;
++ out:
++ if (m != NULL && m != MAP_FAILED)
++ munmap(m, sz);
++ close(fd);
++ return ret;
++#endif /* HAVE_NLIST_H */
++}
+diff --git a/misc.h b/misc.h
+index 31b6557c6..1a49e7cec 100644
+--- a/misc.h
++++ b/misc.h
+@@ -96,6 +96,7 @@ int parse_absolute_time(const char *, uint64_t *);
+ void format_absolute_time(uint64_t, char *, size_t);
+ int path_absolute(const char *);
+ int stdfd_devnull(int, int, int);
++int lib_contains_symbol(const char *, const char *);
+
+ void sock_set_v6only(int);
+
+diff --git a/ssh-pkcs11.c b/ssh-pkcs11.c
+index 9e48c134e..0aef37934 100644
+--- a/ssh-pkcs11.c
++++ b/ssh-pkcs11.c
+@@ -1532,6 +1532,10 @@ pkcs11_register_provider(char *provider_id, char *pin,
+ debug_f("provider already registered: %s", provider_id);
+ goto fail;
+ }
++ if (lib_contains_symbol(provider_id, "C_GetFunctionList") != 0) {
++ error("provider %s is not a PKCS11 library", provider_id);
++ goto fail;
++ }
+ /* open shared pkcs11-library */
+ if ((handle = dlopen(provider_id, RTLD_NOW)) == NULL) {
+ error("dlopen %s failed: %s", provider_id, dlerror());
+diff --git a/ssh-sk.c b/ssh-sk.c
+index fbeb39320..d1c18803f 100644
+--- a/ssh-sk.c
++++ b/ssh-sk.c
+@@ -1,4 +1,4 @@
+-/* $OpenBSD: ssh-sk.c,v 1.39 2022/07/20 03:29:14 djm Exp $ */
++/* $OpenBSD: ssh-sk.c,v 1.40 2023/07/19 14:02:27 djm Exp $ */
+ /*
+ * Copyright (c) 2019 Google LLC
+ *
+@@ -133,10 +133,12 @@ sshsk_open(const char *path)
+ goto fail;
+ #endif
+ }
+- if ((ret->dlhandle = dlopen(path, RTLD_NOW)) == NULL) {
+- error("Provider \"%s\" dlopen failed: %s", path, dlerror());
++ if (lib_contains_symbol(path, "sk_api_version") != 0) {
++ error("provider %s is not an OpenSSH FIDO library", path);
+ goto fail;
+ }
++ if ((ret->dlhandle = dlopen(path, RTLD_NOW)) == NULL)
++ fatal("Provider \"%s\" dlopen failed: %s", path, dlerror());
+ if ((ret->sk_api_version = dlsym(ret->dlhandle,
+ "sk_api_version")) == NULL) {
+ error("Provider \"%s\" dlsym(sk_api_version) failed: %s",
diff --git a/debian/patches/CVE-2023-48795.patch b/debian/patches/CVE-2023-48795.patch
new file mode 100644
index 0000000..ef4eca1
--- /dev/null
+++ b/debian/patches/CVE-2023-48795.patch
@@ -0,0 +1,468 @@
+From 9148d0a8031d89f53f045b63ac3a709611d94778 Mon Sep 17 00:00:00 2001
+From: "djm@openbsd.org" <djm@openbsd.org>
+Date: Mon, 18 Dec 2023 14:45:17 +0000
+Subject: upstream: implement "strict key exchange" in ssh and sshd
+
+This adds a protocol extension to improve the integrity of the SSH
+transport protocol, particular in and around the initial key exchange
+(KEX) phase.
+
+Full details of the extension are in the PROTOCOL file.
+
+with markus@
+
+OpenBSD-Commit-ID: 2a66ac962f0a630d7945fee54004ed9e9c439f14
+
+Origin: backport, https://anongit.mindrot.org/openssh.git/commit/?id=1edb00c58f8a6875fad6a497aa2bacf37f9e6cd5
+Last-Update: 2023-12-19
+
+Patch-Name: CVE-2023-48795.patch
+---
+ PROTOCOL | 26 +++++++++++++++++
+ kex.c | 72 +++++++++++++++++++++++++++++++----------------
+ kex.h | 1 +
+ packet.c | 78 ++++++++++++++++++++++++++++++++++++++-------------
+ sshconnect2.c | 14 +++------
+ sshd.c | 9 ++++--
+ 6 files changed, 143 insertions(+), 57 deletions(-)
+
+diff --git a/PROTOCOL b/PROTOCOL
+index 27804d0ca..ad611a01a 100644
+--- a/PROTOCOL
++++ b/PROTOCOL
+@@ -104,6 +104,32 @@ http://git.libssh.org/users/aris/libssh.git/plain/doc/curve25519-sha256@libssh.o
+
+ This is identical to curve25519-sha256 as later published in RFC8731.
+
++1.9 transport: strict key exchange extension
++
++OpenSSH supports a number of transport-layer hardening measures under
++a "strict KEX" feature. This feature is signalled similarly to the
++RFC8308 ext-info feature: by including a additional algorithm in the
++initiial SSH2_MSG_KEXINIT kex_algorithms field. The client may append
++"kex-strict-c-v00@openssh.com" to its kex_algorithms and the server
++may append "kex-strict-s-v00@openssh.com". These pseudo-algorithms
++are only valid in the initial SSH2_MSG_KEXINIT and MUST be ignored
++if they are present in subsequent SSH2_MSG_KEXINIT packets.
++
++When an endpoint that supports this extension observes this algorithm
++name in a peer's KEXINIT packet, it MUST make the following changes to
++the the protocol:
++
++a) During initial KEX, terminate the connection if any unexpected or
++ out-of-sequence packet is received. This includes terminating the
++ connection if the first packet received is not SSH2_MSG_KEXINIT.
++ Unexpected packets for the purpose of strict KEX include messages
++ that are otherwise valid at any time during the connection such as
++ SSH2_MSG_DEBUG and SSH2_MSG_IGNORE.
++b) After sending or receiving a SSH2_MSG_NEWKEYS message, reset the
++ packet sequence number to zero. This behaviour persists for the
++ duration of the connection (i.e. not just the first
++ SSH2_MSG_NEWKEYS).
++
+ 2. Connection protocol changes
+
+ 2.1. connection: Channel write close extension "eow@openssh.com"
+diff --git a/kex.c b/kex.c
+index e7b7316c7..0b4fc4767 100644
+--- a/kex.c
++++ b/kex.c
+@@ -68,7 +68,7 @@
+ #endif
+
+ /* prototype */
+-static int kex_choose_conf(struct ssh *);
++static int kex_choose_conf(struct ssh *, uint32_t seq);
+ static int kex_input_newkeys(int, u_int32_t, struct ssh *);
+
+ static const char * const proposal_names[PROPOSAL_MAX] = {
+@@ -209,6 +209,18 @@ kex_names_valid(const char *names)
+ return 1;
+ }
+
++/* returns non-zero if proposal contains any algorithm from algs */
++static int
++has_any_alg(const char *proposal, const char *algs)
++{
++ char *cp;
++
++ if ((cp = match_list(proposal, algs, NULL)) == NULL)
++ return 0;
++ free(cp);
++ return 1;
++}
++
+ /*
+ * Concatenate algorithm names, avoiding duplicates in the process.
+ * Caller must free returned string.
+@@ -216,7 +228,7 @@ kex_names_valid(const char *names)
+ char *
+ kex_names_cat(const char *a, const char *b)
+ {
+- char *ret = NULL, *tmp = NULL, *cp, *p, *m;
++ char *ret = NULL, *tmp = NULL, *cp, *p;
+ size_t len;
+
+ if (a == NULL || *a == '\0')
+@@ -233,10 +245,8 @@ kex_names_cat(const char *a, const char *b)
+ }
+ strlcpy(ret, a, len);
+ for ((p = strsep(&cp, ",")); p && *p != '\0'; (p = strsep(&cp, ","))) {
+- if ((m = match_list(ret, p, NULL)) != NULL) {
+- free(m);
++ if (has_any_alg(ret, p))
+ continue; /* Algorithm already present */
+- }
+ if (strlcat(ret, ",", len) >= len ||
+ strlcat(ret, p, len) >= len) {
+ free(tmp);
+@@ -467,7 +477,12 @@ kex_protocol_error(int type, u_int32_t seq, struct ssh *ssh)
+ {
+ int r;
+
+- error("kex protocol error: type %d seq %u", type, seq);
++ /* If in strict mode, any unexpected message is an error */
++ if ((ssh->kex->flags & KEX_INITIAL) && ssh->kex->kex_strict) {
++ ssh_packet_disconnect(ssh, "strict KEX violation: "
++ "unexpected packet type %u (seqnr %u)", type, seq);
++ }
++ error_f("type %u seq %u", type, seq);
+ if ((r = sshpkt_start(ssh, SSH2_MSG_UNIMPLEMENTED)) != 0 ||
+ (r = sshpkt_put_u32(ssh, seq)) != 0 ||
+ (r = sshpkt_send(ssh)) != 0)
+@@ -542,6 +557,11 @@ kex_input_ext_info(int type, u_int32_t seq, struct ssh *ssh)
+ ssh_dispatch_set(ssh, SSH2_MSG_EXT_INFO, &kex_protocol_error);
+ if ((r = sshpkt_get_u32(ssh, &ninfo)) != 0)
+ return r;
++ if (ninfo >= 1024) {
++ error("SSH2_MSG_EXT_INFO with too many entries, expected "
++ "<=1024, received %u", ninfo);
++ return dispatch_protocol_error(type, seq, ssh);
++ }
+ for (i = 0; i < ninfo; i++) {
+ if ((r = sshpkt_get_cstring(ssh, &name, NULL)) != 0)
+ return r;
+@@ -657,7 +677,7 @@ kex_input_kexinit(int type, u_int32_t seq, struct ssh *ssh)
+ error_f("no kex");
+ return SSH_ERR_INTERNAL_ERROR;
+ }
+- ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, NULL);
++ ssh_dispatch_set(ssh, SSH2_MSG_KEXINIT, &kex_protocol_error);
+ ptr = sshpkt_ptr(ssh, &dlen);
+ if ((r = sshbuf_put(kex->peer, ptr, dlen)) != 0)
+ return r;
+@@ -693,7 +713,7 @@ kex_input_kexinit(int type, u_int32_t seq, struct ssh *ssh)
+ if (!(kex->flags & KEX_INIT_SENT))
+ if ((r = kex_send_kexinit(ssh)) != 0)
+ return r;
+- if ((r = kex_choose_conf(ssh)) != 0)
++ if ((r = kex_choose_conf(ssh, seq)) != 0)
+ return r;
+
+ if (kex->kex_type < KEX_MAX && kex->kex[kex->kex_type] != NULL)
+@@ -960,20 +980,14 @@ proposals_match(char *my[PROPOSAL_MAX], char *peer[PROPOSAL_MAX])
+ return (1);
+ }
+
+-/* returns non-zero if proposal contains any algorithm from algs */
+ static int
+-has_any_alg(const char *proposal, const char *algs)
++kexalgs_contains(char **peer, const char *ext)
+ {
+- char *cp;
+-
+- if ((cp = match_list(proposal, algs, NULL)) == NULL)
+- return 0;
+- free(cp);
+- return 1;
++ return has_any_alg(peer[PROPOSAL_KEX_ALGS], ext);
+ }
+
+ static int
+-kex_choose_conf(struct ssh *ssh)
++kex_choose_conf(struct ssh *ssh, uint32_t seq)
+ {
+ struct kex *kex = ssh->kex;
+ struct newkeys *newkeys;
+@@ -998,13 +1012,23 @@ kex_choose_conf(struct ssh *ssh)
+ sprop=peer;
+ }
+
+- /* Check whether client supports ext_info_c */
+- if (kex->server && (kex->flags & KEX_INITIAL)) {
+- char *ext;
+-
+- ext = match_list("ext-info-c", peer[PROPOSAL_KEX_ALGS], NULL);
+- kex->ext_info_c = (ext != NULL);
+- free(ext);
++ /* Check whether peer supports ext_info/kex_strict */
++ if ((kex->flags & KEX_INITIAL) != 0) {
++ if (kex->server) {
++ kex->ext_info_c = kexalgs_contains(peer, "ext-info-c");
++ kex->kex_strict = kexalgs_contains(peer,
++ "kex-strict-c-v00@openssh.com");
++ } else {
++ kex->kex_strict = kexalgs_contains(peer,
++ "kex-strict-s-v00@openssh.com");
++ }
++ if (kex->kex_strict) {
++ debug3_f("will use strict KEX ordering");
++ if (seq != 0)
++ ssh_packet_disconnect(ssh,
++ "strict KEX violation: "
++ "KEXINIT was not the first packet");
++ }
+ }
+
+ /* Check whether client supports rsa-sha2 algorithms */
+diff --git a/kex.h b/kex.h
+index e356f5ed0..99b47435f 100644
+--- a/kex.h
++++ b/kex.h
+@@ -157,6 +157,7 @@ struct kex {
+ u_int kex_type;
+ char *server_sig_algs;
+ int ext_info_c;
++ int kex_strict;
+ struct sshbuf *my;
+ struct sshbuf *peer;
+ struct sshbuf *client_version;
+diff --git a/packet.c b/packet.c
+index 3f64d2d32..25553fbb5 100644
+--- a/packet.c
++++ b/packet.c
+@@ -1205,8 +1205,13 @@ ssh_packet_send2_wrapped(struct ssh *ssh)
+ sshbuf_dump(state->output, stderr);
+ #endif
+ /* increment sequence number for outgoing packets */
+- if (++state->p_send.seqnr == 0)
++ if (++state->p_send.seqnr == 0) {
++ if ((ssh->kex->flags & KEX_INITIAL) != 0) {
++ ssh_packet_disconnect(ssh, "outgoing sequence number "
++ "wrapped during initial key exchange");
++ }
+ logit("outgoing seqnr wraps around");
++ }
+ if (++state->p_send.packets == 0)
+ if (!(ssh->compat & SSH_BUG_NOREKEY))
+ return SSH_ERR_NEED_REKEY;
+@@ -1214,6 +1219,11 @@ ssh_packet_send2_wrapped(struct ssh *ssh)
+ state->p_send.bytes += len;
+ sshbuf_reset(state->outgoing_packet);
+
++ if (type == SSH2_MSG_NEWKEYS && ssh->kex->kex_strict) {
++ debug_f("resetting send seqnr %u", state->p_send.seqnr);
++ state->p_send.seqnr = 0;
++ }
++
+ if (type == SSH2_MSG_NEWKEYS)
+ r = ssh_set_newkeys(ssh, MODE_OUT);
+ else if (type == SSH2_MSG_USERAUTH_SUCCESS && state->server_side)
+@@ -1342,8 +1352,7 @@ ssh_packet_read_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
+ /* Stay in the loop until we have received a complete packet. */
+ for (;;) {
+ /* Try to read a packet from the buffer. */
+- r = ssh_packet_read_poll_seqnr(ssh, typep, seqnr_p);
+- if (r != 0)
++ if ((r = ssh_packet_read_poll_seqnr(ssh, typep, seqnr_p)) != 0)
+ break;
+ /* If we got a packet, return it. */
+ if (*typep != SSH_MSG_NONE)
+@@ -1627,10 +1636,16 @@ ssh_packet_read_poll2(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
+ if ((r = sshbuf_consume(state->input, mac->mac_len)) != 0)
+ goto out;
+ }
++
+ if (seqnr_p != NULL)
+ *seqnr_p = state->p_read.seqnr;
+- if (++state->p_read.seqnr == 0)
++ if (++state->p_read.seqnr == 0) {
++ if ((ssh->kex->flags & KEX_INITIAL) != 0) {
++ ssh_packet_disconnect(ssh, "incoming sequence number "
++ "wrapped during initial key exchange");
++ }
+ logit("incoming seqnr wraps around");
++ }
+ if (++state->p_read.packets == 0)
+ if (!(ssh->compat & SSH_BUG_NOREKEY))
+ return SSH_ERR_NEED_REKEY;
+@@ -1696,6 +1711,10 @@ ssh_packet_read_poll2(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
+ #endif
+ /* reset for next packet */
+ state->packlen = 0;
++ if (*typep == SSH2_MSG_NEWKEYS && ssh->kex->kex_strict) {
++ debug_f("resetting read seqnr %u", state->p_read.seqnr);
++ state->p_read.seqnr = 0;
++ }
+
+ if ((r = ssh_packet_check_rekey(ssh)) != 0)
+ return r;
+@@ -1716,10 +1735,39 @@ ssh_packet_read_poll_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
+ r = ssh_packet_read_poll2(ssh, typep, seqnr_p);
+ if (r != 0)
+ return r;
+- if (*typep) {
+- state->keep_alive_timeouts = 0;
+- DBG(debug("received packet type %d", *typep));
++ if (*typep == 0) {
++ /* no message ready */
++ return 0;
++ }
++ state->keep_alive_timeouts = 0;
++ DBG(debug("received packet type %d", *typep));
++
++ /* Always process disconnect messages */
++ if (*typep == SSH2_MSG_DISCONNECT) {
++ if ((r = sshpkt_get_u32(ssh, &reason)) != 0 ||
++ (r = sshpkt_get_string(ssh, &msg, NULL)) != 0)
++ return r;
++ /* Ignore normal client exit notifications */
++ do_log2(ssh->state->server_side &&
++ reason == SSH2_DISCONNECT_BY_APPLICATION ?
++ SYSLOG_LEVEL_INFO : SYSLOG_LEVEL_ERROR,
++ "Received disconnect from %s port %d:"
++ "%u: %.400s", ssh_remote_ipaddr(ssh),
++ ssh_remote_port(ssh), reason, msg);
++ free(msg);
++ return SSH_ERR_DISCONNECTED;
+ }
++
++ /*
++ * Do not implicitly handle any messages here during initial
++ * KEX when in strict mode. They will be need to be allowed
++ * explicitly by the KEX dispatch table or they will generate
++ * protocol errors.
++ */
++ if (ssh->kex != NULL &&
++ (ssh->kex->flags & KEX_INITIAL) && ssh->kex->kex_strict)
++ return 0;
++ /* Implicitly handle transport-level messages */
+ switch (*typep) {
+ case SSH2_MSG_IGNORE:
+ debug3("Received SSH2_MSG_IGNORE");
+@@ -1734,19 +1782,6 @@ ssh_packet_read_poll_seqnr(struct ssh *ssh, u_char *typep, u_int32_t *seqnr_p)
+ debug("Remote: %.900s", msg);
+ free(msg);
+ break;
+- case SSH2_MSG_DISCONNECT:
+- if ((r = sshpkt_get_u32(ssh, &reason)) != 0 ||
+- (r = sshpkt_get_string(ssh, &msg, NULL)) != 0)
+- return r;
+- /* Ignore normal client exit notifications */
+- do_log2(ssh->state->server_side &&
+- reason == SSH2_DISCONNECT_BY_APPLICATION ?
+- SYSLOG_LEVEL_INFO : SYSLOG_LEVEL_ERROR,
+- "Received disconnect from %s port %d:"
+- "%u: %.400s", ssh_remote_ipaddr(ssh),
+- ssh_remote_port(ssh), reason, msg);
+- free(msg);
+- return SSH_ERR_DISCONNECTED;
+ case SSH2_MSG_UNIMPLEMENTED:
+ if ((r = sshpkt_get_u32(ssh, &seqnr)) != 0)
+ return r;
+@@ -2211,6 +2246,7 @@ kex_to_blob(struct sshbuf *m, struct kex *kex)
+ (r = sshbuf_put_u32(m, kex->hostkey_type)) != 0 ||
+ (r = sshbuf_put_u32(m, kex->hostkey_nid)) != 0 ||
+ (r = sshbuf_put_u32(m, kex->kex_type)) != 0 ||
++ (r = sshbuf_put_u32(m, kex->kex_strict)) != 0 ||
+ (r = sshbuf_put_stringb(m, kex->my)) != 0 ||
+ (r = sshbuf_put_stringb(m, kex->peer)) != 0 ||
+ (r = sshbuf_put_stringb(m, kex->client_version)) != 0 ||
+@@ -2373,6 +2409,7 @@ kex_from_blob(struct sshbuf *m, struct kex **kexp)
+ (r = sshbuf_get_u32(m, (u_int *)&kex->hostkey_type)) != 0 ||
+ (r = sshbuf_get_u32(m, (u_int *)&kex->hostkey_nid)) != 0 ||
+ (r = sshbuf_get_u32(m, &kex->kex_type)) != 0 ||
++ (r = sshbuf_get_u32(m, &kex->kex_strict)) != 0 ||
+ (r = sshbuf_get_stringb(m, kex->my)) != 0 ||
+ (r = sshbuf_get_stringb(m, kex->peer)) != 0 ||
+ (r = sshbuf_get_stringb(m, kex->client_version)) != 0 ||
+@@ -2701,6 +2738,7 @@ sshpkt_disconnect(struct ssh *ssh, const char *fmt,...)
+ vsnprintf(buf, sizeof(buf), fmt, args);
+ va_end(args);
+
++ debug2_f("sending SSH2_MSG_DISCONNECT: %s", buf);
+ if ((r = sshpkt_start(ssh, SSH2_MSG_DISCONNECT)) != 0 ||
+ (r = sshpkt_put_u32(ssh, SSH2_DISCONNECT_PROTOCOL_ERROR)) != 0 ||
+ (r = sshpkt_put_cstring(ssh, buf)) != 0 ||
+diff --git a/sshconnect2.c b/sshconnect2.c
+index cb6a94e76..3e5f69470 100644
+--- a/sshconnect2.c
++++ b/sshconnect2.c
+@@ -250,7 +250,8 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port,
+ fatal_fr(r, "kex_assemble_namelist");
+ free(all_key);
+
+- if ((s = kex_names_cat(options.kex_algorithms, "ext-info-c")) == NULL)
++ if ((s = kex_names_cat(options.kex_algorithms,
++ "ext-info-c,kex-strict-c-v00@openssh.com")) == NULL)
+ fatal_f("kex_names_cat");
+ myproposal[PROPOSAL_KEX_ALGS] = prop_kex = compat_kex_proposal(ssh, s);
+ myproposal[PROPOSAL_ENC_ALGS_CTOS] =
+@@ -441,7 +442,6 @@ struct cauthmethod {
+ };
+
+ static int input_userauth_service_accept(int, u_int32_t, struct ssh *);
+-static int input_userauth_ext_info(int, u_int32_t, struct ssh *);
+ static int input_userauth_success(int, u_int32_t, struct ssh *);
+ static int input_userauth_failure(int, u_int32_t, struct ssh *);
+ static int input_userauth_banner(int, u_int32_t, struct ssh *);
+@@ -561,7 +561,7 @@ ssh_userauth2(struct ssh *ssh, const char *local_user,
+
+ ssh->authctxt = &authctxt;
+ ssh_dispatch_init(ssh, &input_userauth_error);
+- ssh_dispatch_set(ssh, SSH2_MSG_EXT_INFO, &input_userauth_ext_info);
++ ssh_dispatch_set(ssh, SSH2_MSG_EXT_INFO, kex_input_ext_info);
+ ssh_dispatch_set(ssh, SSH2_MSG_SERVICE_ACCEPT, &input_userauth_service_accept);
+ ssh_dispatch_run_fatal(ssh, DISPATCH_BLOCK, &authctxt.success); /* loop until success */
+ pubkey_cleanup(ssh);
+@@ -613,13 +613,6 @@ input_userauth_service_accept(int type, u_int32_t seq, struct ssh *ssh)
+ return r;
+ }
+
+-/* ARGSUSED */
+-static int
+-input_userauth_ext_info(int type, u_int32_t seqnr, struct ssh *ssh)
+-{
+- return kex_input_ext_info(type, seqnr, ssh);
+-}
+-
+ void
+ userauth(struct ssh *ssh, char *authlist)
+ {
+@@ -701,6 +694,7 @@ input_userauth_success(int type, u_int32_t seq, struct ssh *ssh)
+ free(authctxt->methoddata);
+ authctxt->methoddata = NULL;
+ authctxt->success = 1; /* break out */
++ ssh_dispatch_set(ssh, SSH2_MSG_EXT_INFO, dispatch_protocol_error);
+ return 0;
+ }
+
+diff --git a/sshd.c b/sshd.c
+index fc22fcb62..dd8fd94a3 100644
+--- a/sshd.c
++++ b/sshd.c
+@@ -2471,11 +2471,13 @@ do_ssh2_kex(struct ssh *ssh)
+ {
+ char *myproposal[PROPOSAL_MAX] = { KEX_SERVER };
+ struct kex *kex;
+- char *prop_kex = NULL, *prop_enc = NULL, *prop_hostkey = NULL;
++ char *s, *prop_kex = NULL, *prop_enc = NULL, *prop_hostkey = NULL;
+ int r;
+
+- myproposal[PROPOSAL_KEX_ALGS] = prop_kex = compat_kex_proposal(ssh,
+- options.kex_algorithms);
++ if ((s = kex_names_cat(options.kex_algorithms,
++ "kex-strict-s-v00@openssh.com")) == NULL)
++ fatal_f("kex_names_cat");
++ myproposal[PROPOSAL_KEX_ALGS] = prop_kex = compat_kex_proposal(ssh, s);
+ myproposal[PROPOSAL_ENC_ALGS_CTOS] =
+ myproposal[PROPOSAL_ENC_ALGS_STOC] = prop_enc =
+ compat_cipher_proposal(ssh, options.ciphers);
+@@ -2583,6 +2585,7 @@ do_ssh2_kex(struct ssh *ssh)
+ free(prop_kex);
+ free(prop_enc);
+ free(prop_hostkey);
++ free(s);
+ debug("KEX done");
+ }
+
diff --git a/debian/patches/CVE-2023-51384.patch b/debian/patches/CVE-2023-51384.patch
new file mode 100644
index 0000000..1953197
--- /dev/null
+++ b/debian/patches/CVE-2023-51384.patch
@@ -0,0 +1,168 @@
+From d5be669c872a313a71d60babee64f3a80340dc51 Mon Sep 17 00:00:00 2001
+From: "djm@openbsd.org" <djm@openbsd.org>
+Date: Mon, 18 Dec 2023 14:46:12 +0000
+Subject: upstream: apply destination constraints to all p11 keys
+
+Previously applied only to the first key returned from each token.
+
+ok markus@
+
+OpenBSD-Commit-ID: 36df3afb8eb94eec6b2541f063d0d164ef8b488d
+
+Origin: backport, https://anongit.mindrot.org/openssh.git/commit/?id=881d9c6af9da4257c69c327c4e2f1508b2fa754b
+Last-Update: 2023-12-19
+
+Patch-Name: CVE-2023-51384.patch
+---
+ ssh-agent.c | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++--
+ 1 file changed, 99 insertions(+), 4 deletions(-)
+
+diff --git a/ssh-agent.c b/ssh-agent.c
+index dce2849d8..27bf9b5ad 100644
+--- a/ssh-agent.c
++++ b/ssh-agent.c
+@@ -248,6 +248,91 @@ free_dest_constraints(struct dest_constraint *dcs, size_t ndcs)
+ free(dcs);
+ }
+
++static void
++dup_dest_constraint_hop(const struct dest_constraint_hop *dch,
++ struct dest_constraint_hop *out)
++{
++ u_int i;
++ int r;
++
++ out->user = dch->user == NULL ? NULL : xstrdup(dch->user);
++ out->hostname = dch->hostname == NULL ? NULL : xstrdup(dch->hostname);
++ out->is_ca = dch->is_ca;
++ out->nkeys = dch->nkeys;
++ out->keys = out->nkeys == 0 ? NULL :
++ xcalloc(out->nkeys, sizeof(*out->keys));
++ out->key_is_ca = out->nkeys == 0 ? NULL :
++ xcalloc(out->nkeys, sizeof(*out->key_is_ca));
++ for (i = 0; i < dch->nkeys; i++) {
++ if (dch->keys[i] != NULL &&
++ (r = sshkey_from_private(dch->keys[i],
++ &(out->keys[i]))) != 0)
++ fatal_fr(r, "copy key");
++ out->key_is_ca[i] = dch->key_is_ca[i];
++ }
++}
++
++static struct dest_constraint *
++dup_dest_constraints(const struct dest_constraint *dcs, size_t ndcs)
++{
++ size_t i;
++ struct dest_constraint *ret;
++
++ if (ndcs == 0)
++ return NULL;
++ ret = xcalloc(ndcs, sizeof(*ret));
++ for (i = 0; i < ndcs; i++) {
++ dup_dest_constraint_hop(&dcs[i].from, &ret[i].from);
++ dup_dest_constraint_hop(&dcs[i].to, &ret[i].to);
++ }
++ return ret;
++}
++
++#ifdef DEBUG_CONSTRAINTS
++static void
++dump_dest_constraint_hop(const struct dest_constraint_hop *dch)
++{
++ u_int i;
++ char *fp;
++
++ debug_f("user %s hostname %s is_ca %d nkeys %u",
++ dch->user == NULL ? "(null)" : dch->user,
++ dch->hostname == NULL ? "(null)" : dch->hostname,
++ dch->is_ca, dch->nkeys);
++ for (i = 0; i < dch->nkeys; i++) {
++ fp = NULL;
++ if (dch->keys[i] != NULL &&
++ (fp = sshkey_fingerprint(dch->keys[i],
++ SSH_FP_HASH_DEFAULT, SSH_FP_DEFAULT)) == NULL)
++ fatal_f("fingerprint failed");
++ debug_f("key %u/%u: %s%s%s key_is_ca %d", i, dch->nkeys,
++ dch->keys[i] == NULL ? "" : sshkey_ssh_name(dch->keys[i]),
++ dch->keys[i] == NULL ? "" : " ",
++ dch->keys[i] == NULL ? "none" : fp,
++ dch->key_is_ca[i]);
++ free(fp);
++ }
++}
++#endif /* DEBUG_CONSTRAINTS */
++
++static void
++dump_dest_constraints(const char *context,
++ const struct dest_constraint *dcs, size_t ndcs)
++{
++#ifdef DEBUG_CONSTRAINTS
++ size_t i;
++
++ debug_f("%s: %zu constraints", context, ndcs);
++ for (i = 0; i < ndcs; i++) {
++ debug_f("constraint %zu / %zu: from: ", i, ndcs);
++ dump_dest_constraint_hop(&dcs[i].from);
++ debug_f("constraint %zu / %zu: to: ", i, ndcs);
++ dump_dest_constraint_hop(&dcs[i].to);
++ }
++ debug_f("done for %s", context);
++#endif /* DEBUG_CONSTRAINTS */
++}
++
+ static void
+ free_identity(Identity *id)
+ {
+@@ -519,13 +604,22 @@ process_request_identities(SocketEntry *e)
+ Identity *id;
+ struct sshbuf *msg, *keys;
+ int r;
+- u_int nentries = 0;
++ u_int i = 0, nentries = 0;
++ char *fp;
+
+ debug2_f("entering");
+
+ if ((msg = sshbuf_new()) == NULL || (keys = sshbuf_new()) == NULL)
+ fatal_f("sshbuf_new failed");
+ TAILQ_FOREACH(id, &idtab->idlist, next) {
++ if ((fp = sshkey_fingerprint(id->key, SSH_FP_HASH_DEFAULT,
++ SSH_FP_DEFAULT)) == NULL)
++ fatal_f("fingerprint failed");
++ debug_f("key %u / %u: %s %s", i++, idtab->nentries,
++ sshkey_ssh_name(id->key), fp);
++ dump_dest_constraints(__func__,
++ id->dest_constraints, id->ndest_constraints);
++ free(fp);
+ /* identity not visible, don't include in response */
+ if (identity_permitted(id, e, NULL, NULL, NULL) != 0)
+ continue;
+@@ -1225,6 +1319,7 @@ process_add_identity(SocketEntry *e)
+ sshbuf_reset(e->request);
+ goto out;
+ }
++ dump_dest_constraints(__func__, dest_constraints, ndest_constraints);
+
+ if (sk_provider != NULL) {
+ if (!sshkey_is_sk(k)) {
+@@ -1404,6 +1499,7 @@ process_add_smartcard_key(SocketEntry *e)
+ error_f("failed to parse constraints");
+ goto send;
+ }
++ dump_dest_constraints(__func__, dest_constraints, ndest_constraints);
+ if (e->nsession_ids != 0 && !remote_add_provider) {
+ verbose("failed PKCS#11 add of \"%.100s\": remote addition of "
+ "providers is disabled", provider);
+@@ -1439,10 +1535,9 @@ process_add_smartcard_key(SocketEntry *e)
+ }
+ id->death = death;
+ id->confirm = confirm;
+- id->dest_constraints = dest_constraints;
++ id->dest_constraints = dup_dest_constraints(
++ dest_constraints, ndest_constraints);
+ id->ndest_constraints = ndest_constraints;
+- dest_constraints = NULL; /* transferred */
+- ndest_constraints = 0;
+ TAILQ_INSERT_TAIL(&idtab->idlist, id, next);
+ idtab->nentries++;
+ success = 1;
diff --git a/debian/patches/CVE-2023-51385.patch b/debian/patches/CVE-2023-51385.patch
new file mode 100644
index 0000000..714c7a0
--- /dev/null
+++ b/debian/patches/CVE-2023-51385.patch
@@ -0,0 +1,94 @@
+From 14c4d6f0fa446414d1c38ad083107576d0ae3032 Mon Sep 17 00:00:00 2001
+From: "djm@openbsd.org" <djm@openbsd.org>
+Date: Mon, 18 Dec 2023 14:47:44 +0000
+Subject: upstream: ban user/hostnames with most shell metacharacters
+
+This makes ssh(1) refuse user or host names provided on the
+commandline that contain most shell metacharacters.
+
+Some programs that invoke ssh(1) using untrusted data do not filter
+metacharacters in arguments they supply. This could create
+interactions with user-specified ProxyCommand and other directives
+that allow shell injection attacks to occur.
+
+It's a mistake to invoke ssh(1) with arbitrary untrusted arguments,
+but getting this stuff right can be tricky, so this should prevent
+most obvious ways of creating risky situations. It however is not
+and cannot be perfect: ssh(1) has no practical way of interpreting
+what shell quoting rules are in use and how they interact with the
+user's specified ProxyCommand.
+
+To allow configurations that use strange user or hostnames to
+continue to work, this strictness is applied only to names coming
+from the commandline. Names specified using User or Hostname
+directives in ssh_config(5) are not affected.
+
+feedback/ok millert@ markus@ dtucker@ deraadt@
+
+OpenBSD-Commit-ID: 3b487348b5964f3e77b6b4d3da4c3b439e94b2d9
+
+Origin: backport, https://anongit.mindrot.org/openssh.git/commit/?id=7ef3787c84b6b524501211b11a26c742f829af1a
+Last-Update: 2023-12-19
+
+Patch-Name: CVE-2023-51385.patch
+---
+ ssh.c | 39 +++++++++++++++++++++++++++++++++++++++
+ 1 file changed, 39 insertions(+)
+
+diff --git a/ssh.c b/ssh.c
+index 8b6b54558..422405035 100644
+--- a/ssh.c
++++ b/ssh.c
+@@ -623,6 +623,41 @@ ssh_conn_info_free(struct ssh_conn_info *cinfo)
+ free(cinfo);
+ }
+
++static int
++valid_hostname(const char *s)
++{
++ size_t i;
++
++ if (*s == '-')
++ return 0;
++ for (i = 0; s[i] != 0; i++) {
++ if (strchr("'`\"$\\;&<>|(){}", s[i]) != NULL ||
++ isspace((u_char)s[i]) || iscntrl((u_char)s[i]))
++ return 0;
++ }
++ return 1;
++}
++
++static int
++valid_ruser(const char *s)
++{
++ size_t i;
++
++ if (*s == '-')
++ return 0;
++ for (i = 0; s[i] != 0; i++) {
++ if (strchr("'`\";&<>|(){}", s[i]) != NULL)
++ return 0;
++ /* Disallow '-' after whitespace */
++ if (isspace((u_char)s[i]) && s[i + 1] == '-')
++ return 0;
++ /* Disallow \ in last position */
++ if (s[i] == '\\' && s[i + 1] == '\0')
++ return 0;
++ }
++ return 1;
++}
++
+ /*
+ * Main program for the ssh client.
+ */
+@@ -1110,6 +1145,10 @@ main(int ac, char **av)
+ if (!host)
+ usage();
+
++ if (!valid_hostname(host))
++ fatal("hostname contains invalid characters");
++ if (options.user != NULL && !valid_ruser(options.user))
++ fatal("remote username contains invalid characters");
+ options.host_arg = xstrdup(host);
+
+ /* Initialize the command to execute on remote host. */
diff --git a/debian/patches/authorized-keys-man-symlink.patch b/debian/patches/authorized-keys-man-symlink.patch
new file mode 100644
index 0000000..46657c9
--- /dev/null
+++ b/debian/patches/authorized-keys-man-symlink.patch
@@ -0,0 +1,26 @@
+From 374a21e4acc5b06719640c0d6b82afdf4182b900 Mon Sep 17 00:00:00 2001
+From: Tomas Pospisek <tpo_deb@sourcepole.ch>
+Date: Sun, 9 Feb 2014 16:10:07 +0000
+Subject: Install authorized_keys(5) as a symlink to sshd(8)
+
+Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=1720
+Bug-Debian: http://bugs.debian.org/441817
+Last-Update: 2013-09-14
+
+Patch-Name: authorized-keys-man-symlink.patch
+---
+ Makefile.in | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/Makefile.in b/Makefile.in
+index 32b607719..85c6ebeb5 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -415,6 +415,7 @@ install-files:
+ $(INSTALL) -m 644 sshd_config.5.out $(DESTDIR)$(mandir)/$(mansubdir)5/sshd_config.5
+ $(INSTALL) -m 644 ssh_config.5.out $(DESTDIR)$(mandir)/$(mansubdir)5/ssh_config.5
+ $(INSTALL) -m 644 sshd.8.out $(DESTDIR)$(mandir)/$(mansubdir)8/sshd.8
++ ln -s ../$(mansubdir)8/sshd.8 $(DESTDIR)$(mandir)/$(mansubdir)5/authorized_keys.5
+ $(INSTALL) -m 644 sftp.1.out $(DESTDIR)$(mandir)/$(mansubdir)1/sftp.1
+ $(INSTALL) -m 644 sftp-server.8.out $(DESTDIR)$(mandir)/$(mansubdir)8/sftp-server.8
+ $(INSTALL) -m 644 ssh-keysign.8.out $(DESTDIR)$(mandir)/$(mansubdir)8/ssh-keysign.8
diff --git a/debian/patches/conch-ssh-rsa.patch b/debian/patches/conch-ssh-rsa.patch
new file mode 100644
index 0000000..09981a5
--- /dev/null
+++ b/debian/patches/conch-ssh-rsa.patch
@@ -0,0 +1,42 @@
+From 2df31e50f4cd159978c99055ed2d54b98a5ec7e4 Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Tue, 15 Feb 2022 18:25:35 +0000
+Subject: Work around RSA SHA-2 signature issues in conch
+
+This was supposed to be fixed in Twisted upstream
+(https://twistedmatrix.com/trac/ticket/9765), and that fix is in Debian
+now. However, regression tests still seem to fail in GitLab CI but not
+locally (see e.g.
+https://salsa.debian.org/ssh-team/openssh/-/jobs/3513178). Leave this
+in place for now until we figure out what's wrong.
+
+Forwarded: not-needed
+Last-Update: 2022-11-14
+
+Patch-Name: conch-ssh-rsa.patch
+---
+ regress/test-exec.sh | 11 +++++++++++
+ 1 file changed, 11 insertions(+)
+
+diff --git a/regress/test-exec.sh b/regress/test-exec.sh
+index a56108179..45ef82314 100644
+--- a/regress/test-exec.sh
++++ b/regress/test-exec.sh
+@@ -682,6 +682,17 @@ REGRESS_INTEROP_CONCH=no
+ if test -x "$CONCH" ; then
+ REGRESS_INTEROP_CONCH=yes
+ fi
++case "$SCRIPT" in
++*conch*) ;;
++*) REGRESS_INTEROP_CONCH=no
++esac
++
++if test "$REGRESS_INTEROP_CONCH" = "yes" ; then
++ # Work around missing support for RSA SHA-2 signatures:
++ # https://twistedmatrix.com/trac/ticket/9765
++ echo HostKeyAlgorithms +ssh-rsa >> $OBJ/sshd_config
++ echo PubkeyAcceptedAlgorithms +ssh-rsa >> $OBJ/sshd_config
++fi
+
+ # If PuTTY is present, new enough and we are running a PuTTY test, prepare
+ # keys and configuration.
diff --git a/debian/patches/debian-banner.patch b/debian/patches/debian-banner.patch
new file mode 100644
index 0000000..2c32879
--- /dev/null
+++ b/debian/patches/debian-banner.patch
@@ -0,0 +1,162 @@
+From 2d3ac49df11f0aed81f35ce9588eb2c578ec98f2 Mon Sep 17 00:00:00 2001
+From: Kees Cook <kees@debian.org>
+Date: Sun, 9 Feb 2014 16:10:06 +0000
+Subject: Add DebianBanner server configuration option
+
+Setting this to "no" causes sshd to omit the Debian revision from its
+initial protocol handshake, for those scared by package-versioning.patch.
+
+Bug-Debian: http://bugs.debian.org/562048
+Forwarded: not-needed
+Last-Update: 2023-01-02
+
+Patch-Name: debian-banner.patch
+---
+ kex.c | 5 +++--
+ kex.h | 2 +-
+ servconf.c | 9 +++++++++
+ servconf.h | 2 ++
+ sshconnect.c | 2 +-
+ sshd.c | 2 +-
+ sshd_config.5 | 5 +++++
+ 7 files changed, 22 insertions(+), 5 deletions(-)
+
+diff --git a/kex.c b/kex.c
+index 32858e65c..e7b7316c7 100644
+--- a/kex.c
++++ b/kex.c
+@@ -1272,7 +1272,7 @@ send_error(struct ssh *ssh, char *msg)
+ */
+ int
+ kex_exchange_identification(struct ssh *ssh, int timeout_ms,
+- const char *version_addendum)
++ int debian_banner, const char *version_addendum)
+ {
+ int remote_major, remote_minor, mismatch, oerrno = 0;
+ size_t len, n;
+@@ -1290,7 +1290,8 @@ kex_exchange_identification(struct ssh *ssh, int timeout_ms,
+ if (version_addendum != NULL && *version_addendum == '\0')
+ version_addendum = NULL;
+ if ((r = sshbuf_putf(our_version, "SSH-%d.%d-%.100s%s%s\r\n",
+- PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_RELEASE,
++ PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2,
++ debian_banner ? SSH_RELEASE : SSH_RELEASE_MINIMUM,
+ version_addendum == NULL ? "" : " ",
+ version_addendum == NULL ? "" : version_addendum)) != 0) {
+ oerrno = errno;
+diff --git a/kex.h b/kex.h
+index 240dca89d..e356f5ed0 100644
+--- a/kex.h
++++ b/kex.h
+@@ -200,7 +200,7 @@ char *kex_names_cat(const char *, const char *);
+ int kex_assemble_names(char **, const char *, const char *);
+ int kex_gss_names_valid(const char *);
+
+-int kex_exchange_identification(struct ssh *, int, const char *);
++int kex_exchange_identification(struct ssh *, int, int, const char *);
+
+ struct kex *kex_new(void);
+ int kex_ready(struct ssh *, char *[PROPOSAL_MAX]);
+diff --git a/servconf.c b/servconf.c
+index 6529f2736..4ecbca8ed 100644
+--- a/servconf.c
++++ b/servconf.c
+@@ -203,6 +203,7 @@ initialize_server_options(ServerOptions *options)
+ options->channel_timeouts = NULL;
+ options->num_channel_timeouts = 0;
+ options->unused_connection_timeout = -1;
++ options->debian_banner = -1;
+ }
+
+ /* Returns 1 if a string option is unset or set to "none" or 0 otherwise. */
+@@ -461,6 +462,8 @@ fill_default_server_options(ServerOptions *options)
+ options->required_rsa_size = SSH_RSA_MINIMUM_MODULUS_SIZE;
+ if (options->unused_connection_timeout == -1)
+ options->unused_connection_timeout = 0;
++ if (options->debian_banner == -1)
++ options->debian_banner = 1;
+
+ assemble_algorithms(options);
+
+@@ -546,6 +549,7 @@ typedef enum {
+ sAllowStreamLocalForwarding, sFingerprintHash, sDisableForwarding,
+ sExposeAuthInfo, sRDomain, sPubkeyAuthOptions, sSecurityKeyProvider,
+ sRequiredRSASize, sChannelTimeout, sUnusedConnectionTimeout,
++ sDebianBanner,
+ sDeprecated, sIgnore, sUnsupported
+ } ServerOpCodes;
+
+@@ -719,6 +723,7 @@ static struct {
+ { "requiredrsasize", sRequiredRSASize, SSHCFG_ALL },
+ { "channeltimeout", sChannelTimeout, SSHCFG_ALL },
+ { "unusedconnectiontimeout", sUnusedConnectionTimeout, SSHCFG_ALL },
++ { "debianbanner", sDebianBanner, SSHCFG_GLOBAL },
+ { NULL, sBadOption, 0 }
+ };
+
+@@ -2596,6 +2601,10 @@ process_server_config_line_depth(ServerOptions *options, char *line,
+ }
+ goto parse_time;
+
++ case sDebianBanner:
++ intptr = &options->debian_banner;
++ goto parse_flag;
++
+ case sDeprecated:
+ case sIgnore:
+ case sUnsupported:
+diff --git a/servconf.h b/servconf.h
+index 38a68d576..e142cf77a 100644
+--- a/servconf.h
++++ b/servconf.h
+@@ -238,6 +238,8 @@ typedef struct {
+ u_int num_channel_timeouts;
+
+ int unused_connection_timeout;
++
++ int debian_banner;
+ } ServerOptions;
+
+ /* Information about the incoming connection as used by Match */
+diff --git a/sshconnect.c b/sshconnect.c
+index 77a3080ba..dbb3c98a7 100644
+--- a/sshconnect.c
++++ b/sshconnect.c
+@@ -1574,7 +1574,7 @@ ssh_login(struct ssh *ssh, Sensitive *sensitive, const char *orighost,
+ lowercase(host);
+
+ /* Exchange protocol version identification strings with the server. */
+- if ((r = kex_exchange_identification(ssh, timeout_ms, NULL)) != 0)
++ if ((r = kex_exchange_identification(ssh, timeout_ms, 1, NULL)) != 0)
+ sshpkt_fatal(ssh, r, "banner exchange");
+
+ /* Put the connection into non-blocking mode. */
+diff --git a/sshd.c b/sshd.c
+index dd4a19131..b4ee435e5 100644
+--- a/sshd.c
++++ b/sshd.c
+@@ -2238,7 +2238,7 @@ main(int ac, char **av)
+ if (!debug_flag)
+ alarm(options.login_grace_time);
+
+- if ((r = kex_exchange_identification(ssh, -1,
++ if ((r = kex_exchange_identification(ssh, -1, options.debian_banner,
+ options.version_addendum)) != 0)
+ sshpkt_fatal(ssh, r, "banner exchange");
+
+diff --git a/sshd_config.5 b/sshd_config.5
+index eb58750a5..2c6ec76cb 100644
+--- a/sshd_config.5
++++ b/sshd_config.5
+@@ -615,6 +615,11 @@ or
+ .Cm no .
+ The default is
+ .Cm yes .
++.It Cm DebianBanner
++Specifies whether the distribution-specified extra version suffix is
++included during initial protocol handshake.
++The default is
++.Cm yes .
+ .It Cm DenyGroups
+ This keyword can be followed by a list of group name patterns, separated
+ by spaces.
diff --git a/debian/patches/debian-config.patch b/debian/patches/debian-config.patch
new file mode 100644
index 0000000..f32c3fd
--- /dev/null
+++ b/debian/patches/debian-config.patch
@@ -0,0 +1,285 @@
+From aedb5d2ee2799e3a95b6913721533d2c42c496b3 Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Sun, 9 Feb 2014 16:10:18 +0000
+Subject: Various Debian-specific configuration changes
+
+ssh: Enable ForwardX11Trusted, returning to earlier semantics which cause
+fewer problems with existing setups (http://bugs.debian.org/237021).
+
+ssh: Set 'SendEnv LANG LC_*' by default (http://bugs.debian.org/264024).
+
+ssh: Enable HashKnownHosts by default to try to limit the spread of ssh
+worms.
+
+ssh: Enable GSSAPIAuthentication by default.
+
+ssh: Include /etc/ssh/ssh_config.d/*.conf.
+
+sshd: Enable PAM, disable KbdInteractiveAuthentication, and disable
+PrintMotd.
+
+sshd: Enable X11Forwarding.
+
+sshd: Set 'AcceptEnv LANG LC_*' by default.
+
+sshd: Change sftp subsystem path to /usr/lib/openssh/sftp-server.
+
+sshd: Include /etc/ssh/sshd_config.d/*.conf.
+
+regress: Run tests with 'UsePAM yes', to match sshd_config.
+
+Document all of this.
+
+Author: Russ Allbery <rra@debian.org>
+Forwarded: not-needed
+Last-Update: 2023-01-03
+
+Patch-Name: debian-config.patch
+---
+ readconf.c | 2 +-
+ regress/test-exec.sh | 1 +
+ ssh.1 | 24 ++++++++++++++++++++++++
+ ssh_config | 8 +++++++-
+ ssh_config.5 | 26 +++++++++++++++++++++++++-
+ sshd_config | 18 ++++++++++++------
+ sshd_config.5 | 29 +++++++++++++++++++++++++++++
+ 7 files changed, 99 insertions(+), 9 deletions(-)
+
+diff --git a/readconf.c b/readconf.c
+index 18e814039..6c8ad919f 100644
+--- a/readconf.c
++++ b/readconf.c
+@@ -2536,7 +2536,7 @@ fill_default_options(Options * options)
+ if (options->forward_x11 == -1)
+ options->forward_x11 = 0;
+ if (options->forward_x11_trusted == -1)
+- options->forward_x11_trusted = 0;
++ options->forward_x11_trusted = 1;
+ if (options->forward_x11_timeout == -1)
+ options->forward_x11_timeout = 1200;
+ /*
+diff --git a/regress/test-exec.sh b/regress/test-exec.sh
+index df43f0214..a56108179 100644
+--- a/regress/test-exec.sh
++++ b/regress/test-exec.sh
+@@ -539,6 +539,7 @@ cat << EOF > $OBJ/sshd_config
+ AcceptEnv _XXX_TEST_*
+ AcceptEnv _XXX_TEST
+ Subsystem sftp $SFTPSERVER
++ UsePAM yes
+ EOF
+
+ # This may be necessary if /usr/src and/or /usr/obj are group-writable,
+diff --git a/ssh.1 b/ssh.1
+index d07cd7840..395abd40b 100644
+--- a/ssh.1
++++ b/ssh.1
+@@ -847,6 +847,16 @@ directive in
+ .Xr ssh_config 5
+ for more information.
+ .Pp
++(Debian-specific: X11 forwarding is not subjected to X11 SECURITY extension
++restrictions by default, because too many programs currently crash in this
++mode.
++Set the
++.Cm ForwardX11Trusted
++option to
++.Dq no
++to restore the upstream behaviour.
++This may change in future depending on client-side improvements.)
++.Pp
+ .It Fl x
+ Disables X11 forwarding.
+ .Pp
+@@ -855,6 +865,20 @@ Enables trusted X11 forwarding.
+ Trusted X11 forwardings are not subjected to the X11 SECURITY extension
+ controls.
+ .Pp
++(Debian-specific: In the default configuration, this option is equivalent to
++.Fl X ,
++since
++.Cm ForwardX11Trusted
++defaults to
++.Dq yes
++as described above.
++Set the
++.Cm ForwardX11Trusted
++option to
++.Dq no
++to restore the upstream behaviour.
++This may change in future depending on client-side improvements.)
++.Pp
+ .It Fl y
+ Send log information using the
+ .Xr syslog 3
+diff --git a/ssh_config b/ssh_config
+index 52aae8692..09a17cf18 100644
+--- a/ssh_config
++++ b/ssh_config
+@@ -17,9 +17,12 @@
+ # list of available options, their meanings and defaults, please see the
+ # ssh_config(5) man page.
+
+-# Host *
++Include /etc/ssh/ssh_config.d/*.conf
++
++Host *
+ # ForwardAgent no
+ # ForwardX11 no
++# ForwardX11Trusted yes
+ # PasswordAuthentication yes
+ # HostbasedAuthentication no
+ # GSSAPIAuthentication no
+@@ -46,3 +49,6 @@
+ # ProxyCommand ssh -q -W %h:%p gateway.example.com
+ # RekeyLimit 1G 1h
+ # UserKnownHostsFile ~/.ssh/known_hosts.d/%k
++ SendEnv LANG LC_*
++ HashKnownHosts yes
++ GSSAPIAuthentication yes
+diff --git a/ssh_config.5 b/ssh_config.5
+index 82d68650e..32851c984 100644
+--- a/ssh_config.5
++++ b/ssh_config.5
+@@ -71,6 +71,29 @@ Since the first obtained value for each parameter is used, more
+ host-specific declarations should be given near the beginning of the
+ file, and general defaults at the end.
+ .Pp
++Note that the Debian
++.Ic openssh-client
++package sets several options as standard in
++.Pa /etc/ssh/ssh_config
++which are not the default in
++.Xr ssh 1 :
++.Pp
++.Bl -bullet -offset indent -compact
++.It
++.Cm Include /etc/ssh/ssh_config.d/*.conf
++.It
++.Cm SendEnv No LANG LC_*
++.It
++.Cm HashKnownHosts No yes
++.It
++.Cm GSSAPIAuthentication No yes
++.El
++.Pp
++.Pa /etc/ssh/ssh_config.d/*.conf
++files are included at the start of the system-wide configuration file, so
++options set there will override those in
++.Pa /etc/ssh/ssh_config.
++.Pp
+ The file contains keyword-argument pairs, one per line.
+ Lines starting with
+ .Ql #
+@@ -802,11 +825,12 @@ elapsed.
+ .It Cm ForwardX11Trusted
+ If this option is set to
+ .Cm yes ,
++(the Debian-specific default),
+ remote X11 clients will have full access to the original X11 display.
+ .Pp
+ If this option is set to
+ .Cm no
+-(the default),
++(the upstream default),
+ remote X11 clients will be considered untrusted and prevented
+ from stealing or tampering with data belonging to trusted X11
+ clients.
+diff --git a/sshd_config b/sshd_config
+index ecfe8d026..677f97d5d 100644
+--- a/sshd_config
++++ b/sshd_config
+@@ -10,6 +10,8 @@
+ # possible, but leave them commented. Uncommented options override the
+ # default value.
+
++Include /etc/ssh/sshd_config.d/*.conf
++
+ #Port 22
+ #AddressFamily any
+ #ListenAddress 0.0.0.0
+@@ -57,8 +59,9 @@ AuthorizedKeysFile .ssh/authorized_keys
+ #PasswordAuthentication yes
+ #PermitEmptyPasswords no
+
+-# Change to no to disable s/key passwords
+-#KbdInteractiveAuthentication yes
++# Change to yes to enable challenge-response passwords (beware issues with
++# some PAM modules and threads)
++KbdInteractiveAuthentication no
+
+ # Kerberos options
+ #KerberosAuthentication no
+@@ -81,16 +84,16 @@ AuthorizedKeysFile .ssh/authorized_keys
+ # If you just want the PAM account and session checks to run without
+ # PAM authentication, then enable this but set PasswordAuthentication
+ # and KbdInteractiveAuthentication to 'no'.
+-#UsePAM no
++UsePAM yes
+
+ #AllowAgentForwarding yes
+ #AllowTcpForwarding yes
+ #GatewayPorts no
+-#X11Forwarding no
++X11Forwarding yes
+ #X11DisplayOffset 10
+ #X11UseLocalhost yes
+ #PermitTTY yes
+-#PrintMotd yes
++PrintMotd no
+ #PrintLastLog yes
+ #TCPKeepAlive yes
+ #PermitUserEnvironment no
+@@ -107,8 +110,11 @@ AuthorizedKeysFile .ssh/authorized_keys
+ # no default banner path
+ #Banner none
+
++# Allow client to pass locale environment variables
++AcceptEnv LANG LC_*
++
+ # override default of no subsystems
+-Subsystem sftp /usr/libexec/sftp-server
++Subsystem sftp /usr/lib/openssh/sftp-server
+
+ # Example of overriding settings on a per-user basis
+ #Match User anoncvs
+diff --git a/sshd_config.5 b/sshd_config.5
+index b9a19c7bd..b13f7665b 100644
+--- a/sshd_config.5
++++ b/sshd_config.5
+@@ -56,6 +56,35 @@ Arguments may optionally be enclosed in double quotes
+ .Pq \&"
+ in order to represent arguments containing spaces.
+ .Pp
++Note that the Debian
++.Ic openssh-server
++package sets several options as standard in
++.Pa /etc/ssh/sshd_config
++which are not the default in
++.Xr sshd 8 :
++.Pp
++.Bl -bullet -offset indent -compact
++.It
++.Cm Include /etc/ssh/sshd_config.d/*.conf
++.It
++.Cm KbdInteractiveAuthentication No no
++.It
++.Cm X11Forwarding No yes
++.It
++.Cm PrintMotd No no
++.It
++.Cm AcceptEnv No LANG LC_*
++.It
++.Cm Subsystem No sftp /usr/lib/openssh/sftp-server
++.It
++.Cm UsePAM No yes
++.El
++.Pp
++.Pa /etc/ssh/sshd_config.d/*.conf
++files are included at the start of the configuration file, so options set
++there will override those in
++.Pa /etc/ssh/sshd_config.
++.Pp
+ The possible
+ keywords and their meanings are as follows (note that
+ keywords are case-insensitive and arguments are case-sensitive):
diff --git a/debian/patches/dnssec-sshfp.patch b/debian/patches/dnssec-sshfp.patch
new file mode 100644
index 0000000..ec30655
--- /dev/null
+++ b/debian/patches/dnssec-sshfp.patch
@@ -0,0 +1,94 @@
+From 25f54fd79c7dc62d5ffaa7ebdc2e3de86a031084 Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Sun, 9 Feb 2014 16:10:01 +0000
+Subject: Force use of DNSSEC even if "options edns0" isn't in resolv.conf
+
+This allows SSHFP DNS records to be verified if glibc 2.11 is installed.
+
+Origin: vendor, https://cvs.fedoraproject.org/viewvc/F-12/openssh/openssh-5.2p1-edns.patch?revision=1.1&view=markup
+Bug: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=572049
+Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=572049
+Last-Update: 2010-04-06
+
+Patch-Name: dnssec-sshfp.patch
+---
+ dns.c | 14 +++++++++++++-
+ openbsd-compat/getrrsetbyname.c | 10 +++++-----
+ openbsd-compat/getrrsetbyname.h | 3 +++
+ 3 files changed, 21 insertions(+), 6 deletions(-)
+
+diff --git a/dns.c b/dns.c
+index f2310bec2..9021d1785 100644
+--- a/dns.c
++++ b/dns.c
+@@ -198,6 +198,7 @@ verify_host_key_dns(const char *hostname, struct sockaddr *address,
+ {
+ u_int counter;
+ int result;
++ unsigned int rrset_flags = 0;
+ struct rrsetinfo *fingerprints = NULL;
+
+ u_int8_t hostkey_algorithm;
+@@ -220,8 +221,19 @@ verify_host_key_dns(const char *hostname, struct sockaddr *address,
+ return -1;
+ }
+
++ /*
++ * Original getrrsetbyname function, found on OpenBSD for example,
++ * doesn't accept any flag and prerequisite for obtaining AD bit in
++ * DNS response is set by "options edns0" in resolv.conf.
++ *
++ * Our version is more clever and use RRSET_FORCE_EDNS0 flag.
++ */
++#ifndef HAVE_GETRRSETBYNAME
++ rrset_flags |= RRSET_FORCE_EDNS0;
++#endif
+ result = getrrsetbyname(hostname, DNS_RDATACLASS_IN,
+- DNS_RDATATYPE_SSHFP, 0, &fingerprints);
++ DNS_RDATATYPE_SSHFP, rrset_flags, &fingerprints);
++
+ if (result) {
+ verbose("DNS lookup error: %s", dns_result_totext(result));
+ return -1;
+diff --git a/openbsd-compat/getrrsetbyname.c b/openbsd-compat/getrrsetbyname.c
+index 73de5e948..4dfa351c6 100644
+--- a/openbsd-compat/getrrsetbyname.c
++++ b/openbsd-compat/getrrsetbyname.c
+@@ -214,8 +214,8 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
+ goto fail;
+ }
+
+- /* don't allow flags yet, unimplemented */
+- if (flags) {
++ /* Allow RRSET_FORCE_EDNS0 flag only. */
++ if ((flags & !RRSET_FORCE_EDNS0) != 0) {
+ result = ERRSET_INVAL;
+ goto fail;
+ }
+@@ -231,9 +231,9 @@ getrrsetbyname(const char *hostname, unsigned int rdclass,
+ #endif /* DEBUG */
+
+ #ifdef RES_USE_DNSSEC
+- /* turn on DNSSEC if EDNS0 is configured */
+- if (_resp->options & RES_USE_EDNS0)
+- _resp->options |= RES_USE_DNSSEC;
++ /* turn on DNSSEC if required */
++ if (flags & RRSET_FORCE_EDNS0)
++ _resp->options |= (RES_USE_EDNS0|RES_USE_DNSSEC);
+ #endif /* RES_USE_DNSEC */
+
+ /* make query */
+diff --git a/openbsd-compat/getrrsetbyname.h b/openbsd-compat/getrrsetbyname.h
+index 1283f5506..dbbc85a2a 100644
+--- a/openbsd-compat/getrrsetbyname.h
++++ b/openbsd-compat/getrrsetbyname.h
+@@ -72,6 +72,9 @@
+ #ifndef RRSET_VALIDATED
+ # define RRSET_VALIDATED 1
+ #endif
++#ifndef RRSET_FORCE_EDNS0
++# define RRSET_FORCE_EDNS0 0x0001
++#endif
+
+ /*
+ * Return codes for getrrsetbyname()
diff --git a/debian/patches/doc-hash-tab-completion.patch b/debian/patches/doc-hash-tab-completion.patch
new file mode 100644
index 0000000..48d44e5
--- /dev/null
+++ b/debian/patches/doc-hash-tab-completion.patch
@@ -0,0 +1,28 @@
+From 4202164dacce1c368f7e6e5c02b3080486deddbf Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Sun, 9 Feb 2014 16:10:11 +0000
+Subject: Document that HashKnownHosts may break tab-completion
+
+Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=1727
+Bug-Debian: http://bugs.debian.org/430154
+Last-Update: 2021-11-05
+
+Patch-Name: doc-hash-tab-completion.patch
+---
+ ssh_config.5 | 3 +++
+ 1 file changed, 3 insertions(+)
+
+diff --git a/ssh_config.5 b/ssh_config.5
+index 92600ed6e..82d68650e 100644
+--- a/ssh_config.5
++++ b/ssh_config.5
+@@ -921,6 +921,9 @@ Note that existing names and addresses in known hosts files
+ will not be converted automatically,
+ but may be manually hashed using
+ .Xr ssh-keygen 1 .
++Use of this option may break facilities such as tab-completion that rely
++on being able to read unhashed host names from
++.Pa ~/.ssh/known_hosts .
+ .It Cm HostbasedAcceptedAlgorithms
+ Specifies the signature algorithms that will be used for hostbased
+ authentication as a comma-separated list of patterns.
diff --git a/debian/patches/gnome-ssh-askpass2-icon.patch b/debian/patches/gnome-ssh-askpass2-icon.patch
new file mode 100644
index 0000000..50f27b4
--- /dev/null
+++ b/debian/patches/gnome-ssh-askpass2-icon.patch
@@ -0,0 +1,26 @@
+From 0b0ba78b1a3a0a7fd2d0d72f508d225c04df5aa7 Mon Sep 17 00:00:00 2001
+From: Vincent Untz <vuntz@ubuntu.com>
+Date: Sun, 9 Feb 2014 16:10:16 +0000
+Subject: Give the ssh-askpass-gnome window a default icon
+
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/27152
+Last-Update: 2010-02-28
+
+Patch-Name: gnome-ssh-askpass2-icon.patch
+---
+ contrib/gnome-ssh-askpass2.c | 2 ++
+ 1 file changed, 2 insertions(+)
+
+diff --git a/contrib/gnome-ssh-askpass2.c b/contrib/gnome-ssh-askpass2.c
+index a62f98152..304569802 100644
+--- a/contrib/gnome-ssh-askpass2.c
++++ b/contrib/gnome-ssh-askpass2.c
+@@ -320,6 +320,8 @@ main(int argc, char **argv)
+
+ gtk_init(&argc, &argv);
+
++ gtk_window_set_default_icon_from_file ("/usr/share/pixmaps/ssh-askpass-gnome.png", NULL);
++
+ if (argc > 1) {
+ message = g_strjoinv(" ", argv + 1);
+ } else {
diff --git a/debian/patches/gssapi.patch b/debian/patches/gssapi.patch
new file mode 100644
index 0000000..072c079
--- /dev/null
+++ b/debian/patches/gssapi.patch
@@ -0,0 +1,4156 @@
+From 61798b25a23b55d72a86a35062106cc3fc0ab834 Mon Sep 17 00:00:00 2001
+From: Simon Wilkinson <simon@sxw.org.uk>
+Date: Sun, 9 Feb 2014 16:09:48 +0000
+Subject: GSSAPI key exchange support
+
+This patch has been rejected upstream: "None of the OpenSSH developers are
+in favour of adding this, and this situation has not changed for several
+years. This is not a slight on Simon's patch, which is of fine quality, but
+just that a) we don't trust GSSAPI implementations that much and b) we don't
+like adding new KEX since they are pre-auth attack surface. This one is
+particularly scary, since it requires hooks out to typically root-owned
+system resources."
+
+However, quite a lot of people rely on this in Debian, and it's better to
+have it merged into the main openssh package rather than having separate
+-krb5 packages (as we used to have). It seems to have a generally good
+security history.
+
+Author: Simon Wilkinson <simon@sxw.org.uk>
+Author: Colin Watson <cjwatson@debian.org>
+Author: Jakub Jelen <jjelen@redhat.com>
+Origin: other, https://github.com/openssh-gsskex/openssh-gsskex/pull/23
+Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=1242
+Last-Updated: 2023-01-02
+
+Patch-Name: gssapi.patch
+---
+ Makefile.in | 5 +-
+ README.md | 36 +++
+ auth.c | 94 +-------
+ auth2-gss.c | 56 ++++-
+ auth2.c | 2 +
+ canohost.c | 91 ++++++++
+ canohost.h | 3 +
+ clientloop.c | 13 ++
+ configure.ac | 24 ++
+ gss-genr.c | 297 +++++++++++++++++++++++-
+ gss-serv-krb5.c | 87 ++++++-
+ gss-serv.c | 205 +++++++++++++++--
+ kex.c | 66 +++++-
+ kex.h | 29 +++
+ kexdh.c | 10 +
+ kexgen.c | 2 +-
+ kexgssc.c | 599 ++++++++++++++++++++++++++++++++++++++++++++++++
+ kexgsss.c | 474 ++++++++++++++++++++++++++++++++++++++
+ monitor.c | 139 ++++++++++-
+ monitor.h | 2 +
+ monitor_wrap.c | 57 ++++-
+ monitor_wrap.h | 4 +-
+ readconf.c | 74 ++++++
+ readconf.h | 6 +
+ servconf.c | 47 ++++
+ servconf.h | 3 +
+ session.c | 10 +-
+ ssh-gss.h | 54 ++++-
+ ssh-null.c | 108 +++++++++
+ ssh.1 | 8 +
+ ssh.c | 6 +-
+ ssh_config | 2 +
+ ssh_config.5 | 57 +++++
+ sshconnect2.c | 156 ++++++++++++-
+ sshd.c | 62 ++++-
+ sshd_config | 2 +
+ sshd_config.5 | 30 +++
+ sshkey.c | 8 +-
+ sshkey.h | 1 +
+ 39 files changed, 2765 insertions(+), 164 deletions(-)
+ create mode 100644 kexgssc.c
+ create mode 100644 kexgsss.c
+ create mode 100644 ssh-null.c
+
+diff --git a/Makefile.in b/Makefile.in
+index c0ebfa041..32b607719 100644
+--- a/Makefile.in
++++ b/Makefile.in
+@@ -101,7 +101,7 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \
+ readpass.o ttymodes.o xmalloc.o addr.o addrmatch.o \
+ atomicio.o dispatch.o mac.o misc.o utf8.o \
+ monitor_fdpass.o rijndael.o ssh-dss.o ssh-ecdsa.o ssh-ecdsa-sk.o \
+- ssh-ed25519-sk.o ssh-rsa.o dh.o \
++ ssh-ed25519-sk.o ssh-rsa.o ssh-null.o dh.o \
+ msg.o progressmeter.o dns.o entropy.o gss-genr.o umac.o umac128.o \
+ ssh-pkcs11.o smult_curve25519_ref.o \
+ poly1305.o chacha.o cipher-chachapoly.o cipher-chachapoly-libcrypto.o \
+@@ -110,6 +110,7 @@ LIBSSH_OBJS=${LIBOPENSSH_OBJS} \
+ kex.o kexdh.o kexgex.o kexecdh.o kexc25519.o \
+ kexgexc.o kexgexs.o \
+ kexsntrup761x25519.o sntrup761.o kexgen.o \
++ kexgssc.o \
+ sftp-realpath.o platform-pledge.o platform-tracing.o platform-misc.o \
+ sshbuf-io.o
+
+@@ -126,7 +127,7 @@ SSHDOBJS=sshd.o auth-rhosts.o auth-passwd.o \
+ auth-bsdauth.o auth2-hostbased.o auth2-kbdint.o \
+ auth2-none.o auth2-passwd.o auth2-pubkey.o auth2-pubkeyfile.o \
+ monitor.o monitor_wrap.o auth-krb5.o \
+- auth2-gss.o gss-serv.o gss-serv-krb5.o \
++ auth2-gss.o gss-serv.o gss-serv-krb5.o kexgsss.o \
+ loginrec.o auth-pam.o auth-shadow.o auth-sia.o \
+ srclimit.o sftp-server.o sftp-common.o \
+ sandbox-null.o sandbox-rlimit.o sandbox-systrace.o sandbox-darwin.o \
+diff --git a/README.md b/README.md
+index 3da933817..a338802ff 100644
+--- a/README.md
++++ b/README.md
+@@ -1,3 +1,39 @@
++Portable OpenSSH with GSSAPI Key Exchange patches
++=================================================
++
++[![Language grade: C/C++](https://img.shields.io/lgtm/grade/cpp/g/openssh-gsskex/openssh-gsskex.svg?logo=lgtm&logoWidth=18)](https://lgtm.com/projects/g/openssh-gsskex/openssh-gsskex/context:cpp)
++
++Currently, there are two branches with gssapi key exchange related
++patches:
++
++ * fedora/master: Changes that are shipped in Fedora [![Build Status](https://travis-ci.org/openssh-gsskex/openssh-gsskex.svg?branch=fedora%2Fmaster)](https://travis-ci.org/openssh-gsskex/openssh-gsskex)
++ * debian/master: Changes that are shipped in Debian [![Build Status](https://travis-ci.org/openssh-gsskex/openssh-gsskex.svg?branch=debian%2Fmaster)](https://travis-ci.org/openssh-gsskex/openssh-gsskex)
++
++The target is to converge to a shared repository with single master
++branch from where we could build releases for both OSes.
++
++
++What is in:
++
++ * The original patch implementing missing parts of RFC4462 by Simon Wilkinson
++ adapted to the current OpenSSH versions and with several fixes
++ * New methods for GSSAPI Kex from IETF draft [1] from Jakub Jelen
++
++
++Missing kerberos-related parts:
++
++ * .k5login and .kusers support available in Fedora [2] [3].
++ * Improved handling of kerberos ccache location [4]
++
++
++
++[1] https://tools.ietf.org/html/draft-ietf-curdle-gss-keyex-sha2-08
++[2] https://src.fedoraproject.org/rpms/openssh/blob/master/f/openssh-6.6p1-kuserok.patch
++[3] https://src.fedoraproject.org/rpms/openssh/blob/master/f/openssh-6.6p1-GSSAPIEnablek5users.patch
++[4] https://bugzilla.mindrot.org/show_bug.cgi?id=2775
++
++-------------------------------------------------------------------------------
++
+ # Portable OpenSSH
+
+ [![C/C++ CI](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml/badge.svg)](https://github.com/openssh/openssh-portable/actions/workflows/c-cpp.yml)
+diff --git a/auth.c b/auth.c
+index 03a777cce..946dc6074 100644
+--- a/auth.c
++++ b/auth.c
+@@ -358,7 +358,8 @@ auth_root_allowed(struct ssh *ssh, const char *method)
+ case PERMIT_NO_PASSWD:
+ if (strcmp(method, "publickey") == 0 ||
+ strcmp(method, "hostbased") == 0 ||
+- strcmp(method, "gssapi-with-mic") == 0)
++ strcmp(method, "gssapi-with-mic") == 0 ||
++ strcmp(method, "gssapi-keyex") == 0)
+ return 1;
+ break;
+ case PERMIT_FORCED_ONLY:
+@@ -638,97 +639,6 @@ fakepw(void)
+ return (&fake);
+ }
+
+-/*
+- * Returns the remote DNS hostname as a string. The returned string must not
+- * be freed. NB. this will usually trigger a DNS query the first time it is
+- * called.
+- * This function does additional checks on the hostname to mitigate some
+- * attacks on based on conflation of hostnames and IP addresses.
+- */
+-
+-static char *
+-remote_hostname(struct ssh *ssh)
+-{
+- struct sockaddr_storage from;
+- socklen_t fromlen;
+- struct addrinfo hints, *ai, *aitop;
+- char name[NI_MAXHOST], ntop2[NI_MAXHOST];
+- const char *ntop = ssh_remote_ipaddr(ssh);
+-
+- /* Get IP address of client. */
+- fromlen = sizeof(from);
+- memset(&from, 0, sizeof(from));
+- if (getpeername(ssh_packet_get_connection_in(ssh),
+- (struct sockaddr *)&from, &fromlen) == -1) {
+- debug("getpeername failed: %.100s", strerror(errno));
+- return xstrdup(ntop);
+- }
+-
+- ipv64_normalise_mapped(&from, &fromlen);
+- if (from.ss_family == AF_INET6)
+- fromlen = sizeof(struct sockaddr_in6);
+-
+- debug3("Trying to reverse map address %.100s.", ntop);
+- /* Map the IP address to a host name. */
+- if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
+- NULL, 0, NI_NAMEREQD) != 0) {
+- /* Host name not found. Use ip address. */
+- return xstrdup(ntop);
+- }
+-
+- /*
+- * if reverse lookup result looks like a numeric hostname,
+- * someone is trying to trick us by PTR record like following:
+- * 1.1.1.10.in-addr.arpa. IN PTR 2.3.4.5
+- */
+- memset(&hints, 0, sizeof(hints));
+- hints.ai_socktype = SOCK_DGRAM; /*dummy*/
+- hints.ai_flags = AI_NUMERICHOST;
+- if (getaddrinfo(name, NULL, &hints, &ai) == 0) {
+- logit("Nasty PTR record \"%s\" is set up for %s, ignoring",
+- name, ntop);
+- freeaddrinfo(ai);
+- return xstrdup(ntop);
+- }
+-
+- /* Names are stored in lowercase. */
+- lowercase(name);
+-
+- /*
+- * Map it back to an IP address and check that the given
+- * address actually is an address of this host. This is
+- * necessary because anyone with access to a name server can
+- * define arbitrary names for an IP address. Mapping from
+- * name to IP address can be trusted better (but can still be
+- * fooled if the intruder has access to the name server of
+- * the domain).
+- */
+- memset(&hints, 0, sizeof(hints));
+- hints.ai_family = from.ss_family;
+- hints.ai_socktype = SOCK_STREAM;
+- if (getaddrinfo(name, NULL, &hints, &aitop) != 0) {
+- logit("reverse mapping checking getaddrinfo for %.700s "
+- "[%s] failed.", name, ntop);
+- return xstrdup(ntop);
+- }
+- /* Look for the address from the list of addresses. */
+- for (ai = aitop; ai; ai = ai->ai_next) {
+- if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop2,
+- sizeof(ntop2), NULL, 0, NI_NUMERICHOST) == 0 &&
+- (strcmp(ntop, ntop2) == 0))
+- break;
+- }
+- freeaddrinfo(aitop);
+- /* If we reached the end of the list, the address was not there. */
+- if (ai == NULL) {
+- /* Address not found for the host name. */
+- logit("Address %.100s maps to %.600s, but this does not "
+- "map back to the address.", ntop, name);
+- return xstrdup(ntop);
+- }
+- return xstrdup(name);
+-}
+-
+ /*
+ * Return the canonical name of the host in the other side of the current
+ * connection. The host name is cached, so it is efficient to call this
+diff --git a/auth2-gss.c b/auth2-gss.c
+index 2062609d9..4566d425c 100644
+--- a/auth2-gss.c
++++ b/auth2-gss.c
+@@ -1,7 +1,7 @@
+ /* $OpenBSD: auth2-gss.c,v 1.33 2021/12/19 22:12:07 djm Exp $ */
+
+ /*
+- * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
++ * Copyright (c) 2001-2007 Simon Wilkinson. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -55,6 +55,48 @@ static int input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh);
+ static int input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh);
+ static int input_gssapi_errtok(int, u_int32_t, struct ssh *);
+
++/*
++ * The 'gssapi_keyex' userauth mechanism.
++ */
++static int
++userauth_gsskeyex(struct ssh *ssh)
++{
++ Authctxt *authctxt = ssh->authctxt;
++ int r, authenticated = 0;
++ struct sshbuf *b = NULL;
++ gss_buffer_desc mic, gssbuf;
++ u_char *p;
++ size_t len;
++
++ if ((r = sshpkt_get_string(ssh, &p, &len)) != 0 ||
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal_fr(r, "parsing");
++
++ if ((b = sshbuf_new()) == NULL)
++ fatal_f("sshbuf_new failed");
++
++ mic.value = p;
++ mic.length = len;
++
++ ssh_gssapi_buildmic(b, authctxt->user, authctxt->service,
++ "gssapi-keyex", ssh->kex->session_id);
++
++ if ((gssbuf.value = sshbuf_mutable_ptr(b)) == NULL)
++ fatal_f("sshbuf_mutable_ptr failed");
++ gssbuf.length = sshbuf_len(b);
++
++ /* gss_kex_context is NULL with privsep, so we can't check it here */
++ if (!GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gss_kex_context,
++ &gssbuf, &mic))))
++ authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user,
++ authctxt->pw, 1));
++
++ sshbuf_free(b);
++ free(mic.value);
++
++ return (authenticated);
++}
++
+ /*
+ * We only support those mechanisms that we know about (ie ones that we know
+ * how to check local user kuserok and the like)
+@@ -261,7 +303,8 @@ input_gssapi_exchange_complete(int type, u_int32_t plen, struct ssh *ssh)
+ if ((r = sshpkt_get_end(ssh)) != 0)
+ fatal_fr(r, "parse packet");
+
+- authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user));
++ authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user,
++ authctxt->pw, 1));
+
+ if ((!use_privsep || mm_is_monitor()) &&
+ (displayname = ssh_gssapi_displayname()) != NULL)
+@@ -307,7 +350,8 @@ input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh)
+ gssbuf.length = sshbuf_len(b);
+
+ if (!GSS_ERROR(PRIVSEP(ssh_gssapi_checkmic(gssctxt, &gssbuf, &mic))))
+- authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user));
++ authenticated = PRIVSEP(ssh_gssapi_userok(authctxt->user,
++ authctxt->pw, 0));
+ else
+ logit("GSSAPI MIC check failed");
+
+@@ -327,6 +371,12 @@ input_gssapi_mic(int type, u_int32_t plen, struct ssh *ssh)
+ return 0;
+ }
+
++Authmethod method_gsskeyex = {
++ "gssapi-keyex",
++ userauth_gsskeyex,
++ &options.gss_authentication
++};
++
+ Authmethod method_gssapi = {
+ "gssapi-with-mic",
+ NULL,
+diff --git a/auth2.c b/auth2.c
+index 6c061934b..44bd49177 100644
+--- a/auth2.c
++++ b/auth2.c
+@@ -71,6 +71,7 @@ extern Authmethod method_passwd;
+ extern Authmethod method_kbdint;
+ extern Authmethod method_hostbased;
+ #ifdef GSSAPI
++extern Authmethod method_gsskeyex;
+ extern Authmethod method_gssapi;
+ #endif
+
+@@ -78,6 +79,7 @@ Authmethod *authmethods[] = {
+ &method_none,
+ &method_pubkey,
+ #ifdef GSSAPI
++ &method_gsskeyex,
+ &method_gssapi,
+ #endif
+ &method_passwd,
+diff --git a/canohost.c b/canohost.c
+index a810da0ee..99f1cd406 100644
+--- a/canohost.c
++++ b/canohost.c
+@@ -35,6 +35,97 @@
+ #include "canohost.h"
+ #include "misc.h"
+
++/*
++ * Returns the remote DNS hostname as a string. The returned string must not
++ * be freed. NB. this will usually trigger a DNS query the first time it is
++ * called.
++ * This function does additional checks on the hostname to mitigate some
++ * attacks on legacy rhosts-style authentication.
++ */
++
++char *
++remote_hostname(struct ssh *ssh)
++{
++ struct sockaddr_storage from;
++ socklen_t fromlen;
++ struct addrinfo hints, *ai, *aitop;
++ char name[NI_MAXHOST], ntop2[NI_MAXHOST];
++ const char *ntop = ssh_remote_ipaddr(ssh);
++
++ /* Get IP address of client. */
++ fromlen = sizeof(from);
++ memset(&from, 0, sizeof(from));
++ if (getpeername(ssh_packet_get_connection_in(ssh),
++ (struct sockaddr *)&from, &fromlen) == -1) {
++ debug("getpeername failed: %.100s", strerror(errno));
++ return xstrdup(ntop);
++ }
++
++ ipv64_normalise_mapped(&from, &fromlen);
++ if (from.ss_family == AF_INET6)
++ fromlen = sizeof(struct sockaddr_in6);
++
++ debug3("Trying to reverse map address %.100s.", ntop);
++ /* Map the IP address to a host name. */
++ if (getnameinfo((struct sockaddr *)&from, fromlen, name, sizeof(name),
++ NULL, 0, NI_NAMEREQD) != 0) {
++ /* Host name not found. Use ip address. */
++ return xstrdup(ntop);
++ }
++
++ /*
++ * if reverse lookup result looks like a numeric hostname,
++ * someone is trying to trick us by PTR record like following:
++ * 1.1.1.10.in-addr.arpa. IN PTR 2.3.4.5
++ */
++ memset(&hints, 0, sizeof(hints));
++ hints.ai_socktype = SOCK_DGRAM; /*dummy*/
++ hints.ai_flags = AI_NUMERICHOST;
++ if (getaddrinfo(name, NULL, &hints, &ai) == 0) {
++ logit("Nasty PTR record \"%s\" is set up for %s, ignoring",
++ name, ntop);
++ freeaddrinfo(ai);
++ return xstrdup(ntop);
++ }
++
++ /* Names are stored in lowercase. */
++ lowercase(name);
++
++ /*
++ * Map it back to an IP address and check that the given
++ * address actually is an address of this host. This is
++ * necessary because anyone with access to a name server can
++ * define arbitrary names for an IP address. Mapping from
++ * name to IP address can be trusted better (but can still be
++ * fooled if the intruder has access to the name server of
++ * the domain).
++ */
++ memset(&hints, 0, sizeof(hints));
++ hints.ai_family = from.ss_family;
++ hints.ai_socktype = SOCK_STREAM;
++ if (getaddrinfo(name, NULL, &hints, &aitop) != 0) {
++ logit("reverse mapping checking getaddrinfo for %.700s "
++ "[%s] failed.", name, ntop);
++ return xstrdup(ntop);
++ }
++ /* Look for the address from the list of addresses. */
++ for (ai = aitop; ai; ai = ai->ai_next) {
++ if (getnameinfo(ai->ai_addr, ai->ai_addrlen, ntop2,
++ sizeof(ntop2), NULL, 0, NI_NUMERICHOST) == 0 &&
++ (strcmp(ntop, ntop2) == 0))
++ break;
++ }
++ freeaddrinfo(aitop);
++ /* If we reached the end of the list, the address was not there. */
++ if (ai == NULL) {
++ /* Address not found for the host name. */
++ logit("Address %.100s maps to %.600s, but this does not "
++ "map back to the address.", ntop, name);
++ return xstrdup(ntop);
++ }
++ return xstrdup(name);
++}
++
+ void
+ ipv64_normalise_mapped(struct sockaddr_storage *addr, socklen_t *len)
+ {
+diff --git a/canohost.h b/canohost.h
+index 26d62855a..0cadc9f18 100644
+--- a/canohost.h
++++ b/canohost.h
+@@ -15,6 +15,9 @@
+ #ifndef _CANOHOST_H
+ #define _CANOHOST_H
+
++struct ssh;
++
++char *remote_hostname(struct ssh *);
+ char *get_peer_ipaddr(int);
+ int get_peer_port(int);
+ char *get_local_ipaddr(int);
+diff --git a/clientloop.c b/clientloop.c
+index fef9efc6c..8f1fac58a 100644
+--- a/clientloop.c
++++ b/clientloop.c
+@@ -115,6 +115,10 @@
+ #include "ssherr.h"
+ #include "hostfile.h"
+
++#ifdef GSSAPI
++#include "ssh-gss.h"
++#endif
++
+ /* Permitted RSA signature algorithms for UpdateHostkeys proofs */
+ #define HOSTKEY_PROOF_RSA_ALGS "rsa-sha2-512,rsa-sha2-256"
+
+@@ -1415,6 +1419,15 @@ client_loop(struct ssh *ssh, int have_pty, int escape_char_arg,
+ /* Do channel operations. */
+ channel_after_poll(ssh, pfd, npfd_active);
+
++#ifdef GSSAPI
++ if (!ssh_packet_is_rekeying(ssh) &&
++ options.gss_renewal_rekey &&
++ ssh_gssapi_credentials_updated(NULL)) {
++ debug("credentials updated - forcing rekey");
++ need_rekeying = 1;
++ }
++#endif
++
+ /* Buffer input from the connection. */
+ if (conn_in_ready)
+ client_process_net_input(ssh);
+diff --git a/configure.ac b/configure.ac
+index 22fee70f6..75a9e5670 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -756,6 +756,30 @@ int main(void) { if (NSVersionOfRunTimeLibrary("System") >= (60 << 16))
+ [Use tunnel device compatibility to OpenBSD])
+ AC_DEFINE([SSH_TUN_PREPEND_AF], [1],
+ [Prepend the address family to IP tunnel traffic])
++ AC_MSG_CHECKING([if we have the Security Authorization Session API])
++ AC_TRY_COMPILE([#include <Security/AuthSession.h>],
++ [SessionCreate(0, 0);],
++ [ac_cv_use_security_session_api="yes"
++ AC_DEFINE([USE_SECURITY_SESSION_API], [1],
++ [platform has the Security Authorization Session API])
++ LIBS="$LIBS -framework Security"
++ AC_MSG_RESULT([yes])],
++ [ac_cv_use_security_session_api="no"
++ AC_MSG_RESULT([no])])
++ AC_MSG_CHECKING([if we have an in-memory credentials cache])
++ AC_TRY_COMPILE(
++ [#include <Kerberos/Kerberos.h>],
++ [cc_context_t c;
++ (void) cc_initialize (&c, 0, NULL, NULL);],
++ [AC_DEFINE([USE_CCAPI], [1],
++ [platform uses an in-memory credentials cache])
++ LIBS="$LIBS -framework Security"
++ AC_MSG_RESULT([yes])
++ if test "x$ac_cv_use_security_session_api" = "xno"; then
++ AC_MSG_ERROR([*** Need a security framework to use the credentials cache API ***])
++ fi],
++ [AC_MSG_RESULT([no])]
++ )
+ m4_pattern_allow([AU_IPv])
+ AC_CHECK_DECL([AU_IPv4], [],
+ AC_DEFINE([AU_IPv4], [0], [System only supports IPv4 audit records])
+diff --git a/gss-genr.c b/gss-genr.c
+index 2cd695e54..9f9745b7f 100644
+--- a/gss-genr.c
++++ b/gss-genr.c
+@@ -1,7 +1,7 @@
+ /* $OpenBSD: gss-genr.c,v 1.28 2021/01/27 10:05:28 djm Exp $ */
+
+ /*
+- * Copyright (c) 2001-2007 Simon Wilkinson. All rights reserved.
++ * Copyright (c) 2001-2009 Simon Wilkinson. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -42,9 +42,33 @@
+ #include "sshbuf.h"
+ #include "log.h"
+ #include "ssh2.h"
++#include "cipher.h"
++#include "sshkey.h"
++#include "kex.h"
++#include "digest.h"
++#include "packet.h"
+
+ #include "ssh-gss.h"
+
++typedef struct {
++ char *encoded;
++ gss_OID oid;
++} ssh_gss_kex_mapping;
++
++/*
++ * XXX - It would be nice to find a more elegant way of handling the
++ * XXX passing of the key exchange context to the userauth routines
++ */
++
++Gssctxt *gss_kex_context = NULL;
++
++static ssh_gss_kex_mapping *gss_enc2oid = NULL;
++
++int
++ssh_gssapi_oid_table_ok(void) {
++ return (gss_enc2oid != NULL);
++}
++
+ /* sshbuf_get for gss_buffer_desc */
+ int
+ ssh_gssapi_get_buffer_desc(struct sshbuf *b, gss_buffer_desc *g)
+@@ -60,6 +84,159 @@ ssh_gssapi_get_buffer_desc(struct sshbuf *b, gss_buffer_desc *g)
+ return 0;
+ }
+
++/* sshpkt_get of gss_buffer_desc */
++int
++ssh_gssapi_sshpkt_get_buffer_desc(struct ssh *ssh, gss_buffer_desc *g)
++{
++ int r;
++ u_char *p;
++ size_t len;
++
++ if ((r = sshpkt_get_string(ssh, &p, &len)) != 0)
++ return r;
++ g->value = p;
++ g->length = len;
++ return 0;
++}
++
++/*
++ * Return a list of the gss-group1-sha1 mechanisms supported by this program
++ *
++ * We test mechanisms to ensure that we can use them, to avoid starting
++ * a key exchange with a bad mechanism
++ */
++
++char *
++ssh_gssapi_client_mechanisms(const char *host, const char *client,
++ const char *kex) {
++ gss_OID_set gss_supported = NULL;
++ OM_uint32 min_status;
++
++ if (GSS_ERROR(gss_indicate_mechs(&min_status, &gss_supported)))
++ return NULL;
++
++ return ssh_gssapi_kex_mechs(gss_supported, ssh_gssapi_check_mechanism,
++ host, client, kex);
++}
++
++char *
++ssh_gssapi_kex_mechs(gss_OID_set gss_supported, ssh_gssapi_check_fn *check,
++ const char *host, const char *client, const char *kex) {
++ struct sshbuf *buf = NULL;
++ size_t i;
++ int r = SSH_ERR_ALLOC_FAIL;
++ int oidpos, enclen;
++ char *mechs, *encoded;
++ u_char digest[SSH_DIGEST_MAX_LENGTH];
++ char deroid[2];
++ struct ssh_digest_ctx *md = NULL;
++ char *s, *cp, *p;
++
++ if (gss_enc2oid != NULL) {
++ for (i = 0; gss_enc2oid[i].encoded != NULL; i++)
++ free(gss_enc2oid[i].encoded);
++ free(gss_enc2oid);
++ }
++
++ gss_enc2oid = xmalloc(sizeof(ssh_gss_kex_mapping) *
++ (gss_supported->count + 1));
++
++ if ((buf = sshbuf_new()) == NULL)
++ fatal_f("sshbuf_new failed");
++
++ oidpos = 0;
++ s = cp = xstrdup(kex);
++ for (i = 0; i < gss_supported->count; i++) {
++ if (gss_supported->elements[i].length < 128 &&
++ (*check)(NULL, &(gss_supported->elements[i]), host, client)) {
++
++ deroid[0] = SSH_GSS_OIDTYPE;
++ deroid[1] = gss_supported->elements[i].length;
++
++ if ((md = ssh_digest_start(SSH_DIGEST_MD5)) == NULL ||
++ (r = ssh_digest_update(md, deroid, 2)) != 0 ||
++ (r = ssh_digest_update(md,
++ gss_supported->elements[i].elements,
++ gss_supported->elements[i].length)) != 0 ||
++ (r = ssh_digest_final(md, digest, sizeof(digest))) != 0)
++ fatal_fr(r, "digest failed");
++ ssh_digest_free(md);
++ md = NULL;
++
++ encoded = xmalloc(ssh_digest_bytes(SSH_DIGEST_MD5)
++ * 2);
++ enclen = __b64_ntop(digest,
++ ssh_digest_bytes(SSH_DIGEST_MD5), encoded,
++ ssh_digest_bytes(SSH_DIGEST_MD5) * 2);
++
++ cp = strncpy(s, kex, strlen(kex));
++ for ((p = strsep(&cp, ",")); p && *p != '\0';
++ (p = strsep(&cp, ","))) {
++ if (sshbuf_len(buf) != 0 &&
++ (r = sshbuf_put_u8(buf, ',')) != 0)
++ fatal_fr(r, "sshbuf_put_u8 error");
++ if ((r = sshbuf_put(buf, p, strlen(p))) != 0 ||
++ (r = sshbuf_put(buf, encoded, enclen)) != 0)
++ fatal_fr(r, "sshbuf_put error");
++ }
++
++ gss_enc2oid[oidpos].oid = &(gss_supported->elements[i]);
++ gss_enc2oid[oidpos].encoded = encoded;
++ oidpos++;
++ }
++ }
++ free(s);
++ gss_enc2oid[oidpos].oid = NULL;
++ gss_enc2oid[oidpos].encoded = NULL;
++
++ if ((mechs = sshbuf_dup_string(buf)) == NULL)
++ fatal_f("sshbuf_dup_string failed");
++
++ sshbuf_free(buf);
++
++ if (strlen(mechs) == 0) {
++ free(mechs);
++ mechs = NULL;
++ }
++
++ return (mechs);
++}
++
++gss_OID
++ssh_gssapi_id_kex(Gssctxt *ctx, char *name, int kex_type) {
++ int i = 0;
++
++#define SKIP_KEX_NAME(type) \
++ case type: \
++ if (strlen(name) < sizeof(type##_ID)) \
++ return GSS_C_NO_OID; \
++ name += sizeof(type##_ID) - 1; \
++ break;
++
++ switch (kex_type) {
++ SKIP_KEX_NAME(KEX_GSS_GRP1_SHA1)
++ SKIP_KEX_NAME(KEX_GSS_GRP14_SHA1)
++ SKIP_KEX_NAME(KEX_GSS_GRP14_SHA256)
++ SKIP_KEX_NAME(KEX_GSS_GRP16_SHA512)
++ SKIP_KEX_NAME(KEX_GSS_GEX_SHA1)
++ SKIP_KEX_NAME(KEX_GSS_NISTP256_SHA256)
++ SKIP_KEX_NAME(KEX_GSS_C25519_SHA256)
++ default:
++ return GSS_C_NO_OID;
++ }
++
++#undef SKIP_KEX_NAME
++
++ while (gss_enc2oid[i].encoded != NULL &&
++ strcmp(name, gss_enc2oid[i].encoded) != 0)
++ i++;
++
++ if (gss_enc2oid[i].oid != NULL && ctx != NULL)
++ ssh_gssapi_set_oid(ctx, gss_enc2oid[i].oid);
++
++ return gss_enc2oid[i].oid;
++}
++
+ /* Check that the OID in a data stream matches that in the context */
+ int
+ ssh_gssapi_check_oid(Gssctxt *ctx, void *data, size_t len)
+@@ -216,7 +393,7 @@ ssh_gssapi_init_ctx(Gssctxt *ctx, int deleg_creds, gss_buffer_desc *recv_tok,
+ }
+
+ ctx->major = gss_init_sec_context(&ctx->minor,
+- GSS_C_NO_CREDENTIAL, &ctx->context, ctx->name, ctx->oid,
++ ctx->client_creds, &ctx->context, ctx->name, ctx->oid,
+ GSS_C_MUTUAL_FLAG | GSS_C_INTEG_FLAG | deleg_flag,
+ 0, NULL, recv_tok, NULL, send_tok, flags, NULL);
+
+@@ -245,9 +422,43 @@ ssh_gssapi_import_name(Gssctxt *ctx, const char *host)
+ return (ctx->major);
+ }
+
++OM_uint32
++ssh_gssapi_client_identity(Gssctxt *ctx, const char *name)
++{
++ gss_buffer_desc gssbuf;
++ gss_name_t gssname;
++ OM_uint32 status;
++ gss_OID_set oidset;
++
++ gssbuf.value = (void *) name;
++ gssbuf.length = strlen(gssbuf.value);
++
++ gss_create_empty_oid_set(&status, &oidset);
++ gss_add_oid_set_member(&status, ctx->oid, &oidset);
++
++ ctx->major = gss_import_name(&ctx->minor, &gssbuf,
++ GSS_C_NT_USER_NAME, &gssname);
++
++ if (!ctx->major)
++ ctx->major = gss_acquire_cred(&ctx->minor,
++ gssname, 0, oidset, GSS_C_INITIATE,
++ &ctx->client_creds, NULL, NULL);
++
++ gss_release_name(&status, &gssname);
++ gss_release_oid_set(&status, &oidset);
++
++ if (ctx->major)
++ ssh_gssapi_error(ctx);
++
++ return(ctx->major);
++}
++
+ OM_uint32
+ ssh_gssapi_sign(Gssctxt *ctx, gss_buffer_t buffer, gss_buffer_t hash)
+ {
++ if (ctx == NULL)
++ return -1;
++
+ if ((ctx->major = gss_get_mic(&ctx->minor, ctx->context,
+ GSS_C_QOP_DEFAULT, buffer, hash)))
+ ssh_gssapi_error(ctx);
+@@ -255,6 +466,19 @@ ssh_gssapi_sign(Gssctxt *ctx, gss_buffer_t buffer, gss_buffer_t hash)
+ return (ctx->major);
+ }
+
++/* Priviledged when used by server */
++OM_uint32
++ssh_gssapi_checkmic(Gssctxt *ctx, gss_buffer_t gssbuf, gss_buffer_t gssmic)
++{
++ if (ctx == NULL)
++ return -1;
++
++ ctx->major = gss_verify_mic(&ctx->minor, ctx->context,
++ gssbuf, gssmic, NULL);
++
++ return (ctx->major);
++}
++
+ void
+ ssh_gssapi_buildmic(struct sshbuf *b, const char *user, const char *service,
+ const char *context, const struct sshbuf *session_id)
+@@ -271,11 +495,16 @@ ssh_gssapi_buildmic(struct sshbuf *b, const char *user, const char *service,
+ }
+
+ int
+-ssh_gssapi_check_mechanism(Gssctxt **ctx, gss_OID oid, const char *host)
++ssh_gssapi_check_mechanism(Gssctxt **ctx, gss_OID oid, const char *host,
++ const char *client)
+ {
+ gss_buffer_desc token = GSS_C_EMPTY_BUFFER;
+ OM_uint32 major, minor;
+ gss_OID_desc spnego_oid = {6, (void *)"\x2B\x06\x01\x05\x05\x02"};
++ Gssctxt *intctx = NULL;
++
++ if (ctx == NULL)
++ ctx = &intctx;
+
+ /* RFC 4462 says we MUST NOT do SPNEGO */
+ if (oid->length == spnego_oid.length &&
+@@ -285,6 +514,10 @@ ssh_gssapi_check_mechanism(Gssctxt **ctx, gss_OID oid, const char *host)
+ ssh_gssapi_build_ctx(ctx);
+ ssh_gssapi_set_oid(*ctx, oid);
+ major = ssh_gssapi_import_name(*ctx, host);
++
++ if (!GSS_ERROR(major) && client)
++ major = ssh_gssapi_client_identity(*ctx, client);
++
+ if (!GSS_ERROR(major)) {
+ major = ssh_gssapi_init_ctx(*ctx, 0, GSS_C_NO_BUFFER, &token,
+ NULL);
+@@ -294,10 +527,66 @@ ssh_gssapi_check_mechanism(Gssctxt **ctx, gss_OID oid, const char *host)
+ GSS_C_NO_BUFFER);
+ }
+
+- if (GSS_ERROR(major))
++ if (GSS_ERROR(major) || intctx != NULL)
+ ssh_gssapi_delete_ctx(ctx);
+
+ return (!GSS_ERROR(major));
+ }
+
++int
++ssh_gssapi_credentials_updated(Gssctxt *ctxt) {
++ static gss_name_t saved_name = GSS_C_NO_NAME;
++ static OM_uint32 saved_lifetime = 0;
++ static gss_OID saved_mech = GSS_C_NO_OID;
++ static gss_name_t name;
++ static OM_uint32 last_call = 0;
++ OM_uint32 lifetime, now, major, minor;
++ int equal;
++
++ now = time(NULL);
++
++ if (ctxt) {
++ debug("Rekey has happened - updating saved versions");
++
++ if (saved_name != GSS_C_NO_NAME)
++ gss_release_name(&minor, &saved_name);
++
++ major = gss_inquire_cred(&minor, GSS_C_NO_CREDENTIAL,
++ &saved_name, &saved_lifetime, NULL, NULL);
++
++ if (!GSS_ERROR(major)) {
++ saved_mech = ctxt->oid;
++ saved_lifetime+= now;
++ } else {
++ /* Handle the error */
++ }
++ return 0;
++ }
++
++ if (now - last_call < 10)
++ return 0;
++
++ last_call = now;
++
++ if (saved_mech == GSS_C_NO_OID)
++ return 0;
++
++ major = gss_inquire_cred(&minor, GSS_C_NO_CREDENTIAL,
++ &name, &lifetime, NULL, NULL);
++ if (major == GSS_S_CREDENTIALS_EXPIRED)
++ return 0;
++ else if (GSS_ERROR(major))
++ return 0;
++
++ major = gss_compare_name(&minor, saved_name, name, &equal);
++ gss_release_name(&minor, &name);
++ if (GSS_ERROR(major))
++ return 0;
++
++ if (equal && (saved_lifetime < lifetime + now - 10))
++ return 1;
++
++ return 0;
++}
++
+ #endif /* GSSAPI */
+diff --git a/gss-serv-krb5.c b/gss-serv-krb5.c
+index a151bc1e4..ef20401ec 100644
+--- a/gss-serv-krb5.c
++++ b/gss-serv-krb5.c
+@@ -1,7 +1,7 @@
+ /* $OpenBSD: gss-serv-krb5.c,v 1.9 2018/07/09 21:37:55 markus Exp $ */
+
+ /*
+- * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
++ * Copyright (c) 2001-2007 Simon Wilkinson. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -120,7 +120,7 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
+ krb5_error_code problem;
+ krb5_principal princ;
+ OM_uint32 maj_status, min_status;
+- int len;
++ const char *new_ccname;
+ const char *errmsg;
+
+ if (client->creds == NULL) {
+@@ -180,11 +180,16 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
+ return;
+ }
+
+- client->store.filename = xstrdup(krb5_cc_get_name(krb_context, ccache));
++ new_ccname = krb5_cc_get_name(krb_context, ccache);
++
+ client->store.envvar = "KRB5CCNAME";
+- len = strlen(client->store.filename) + 6;
+- client->store.envval = xmalloc(len);
+- snprintf(client->store.envval, len, "FILE:%s", client->store.filename);
++#ifdef USE_CCAPI
++ xasprintf(&client->store.envval, "API:%s", new_ccname);
++ client->store.filename = NULL;
++#else
++ xasprintf(&client->store.envval, "FILE:%s", new_ccname);
++ client->store.filename = xstrdup(new_ccname);
++#endif
+
+ #ifdef USE_PAM
+ if (options.use_pam)
+@@ -193,9 +198,76 @@ ssh_gssapi_krb5_storecreds(ssh_gssapi_client *client)
+
+ krb5_cc_close(krb_context, ccache);
+
++ client->store.data = krb_context;
++
+ return;
+ }
+
++int
++ssh_gssapi_krb5_updatecreds(ssh_gssapi_ccache *store,
++ ssh_gssapi_client *client)
++{
++ krb5_ccache ccache = NULL;
++ krb5_principal principal = NULL;
++ char *name = NULL;
++ krb5_error_code problem;
++ OM_uint32 maj_status, min_status;
++
++ if ((problem = krb5_cc_resolve(krb_context, store->envval, &ccache))) {
++ logit("krb5_cc_resolve(): %.100s",
++ krb5_get_err_text(krb_context, problem));
++ return 0;
++ }
++
++ /* Find out who the principal in this cache is */
++ if ((problem = krb5_cc_get_principal(krb_context, ccache,
++ &principal))) {
++ logit("krb5_cc_get_principal(): %.100s",
++ krb5_get_err_text(krb_context, problem));
++ krb5_cc_close(krb_context, ccache);
++ return 0;
++ }
++
++ if ((problem = krb5_unparse_name(krb_context, principal, &name))) {
++ logit("krb5_unparse_name(): %.100s",
++ krb5_get_err_text(krb_context, problem));
++ krb5_free_principal(krb_context, principal);
++ krb5_cc_close(krb_context, ccache);
++ return 0;
++ }
++
++
++ if (strcmp(name,client->exportedname.value)!=0) {
++ debug("Name in local credentials cache differs. Not storing");
++ krb5_free_principal(krb_context, principal);
++ krb5_cc_close(krb_context, ccache);
++ krb5_free_unparsed_name(krb_context, name);
++ return 0;
++ }
++ krb5_free_unparsed_name(krb_context, name);
++
++ /* Name matches, so lets get on with it! */
++
++ if ((problem = krb5_cc_initialize(krb_context, ccache, principal))) {
++ logit("krb5_cc_initialize(): %.100s",
++ krb5_get_err_text(krb_context, problem));
++ krb5_free_principal(krb_context, principal);
++ krb5_cc_close(krb_context, ccache);
++ return 0;
++ }
++
++ krb5_free_principal(krb_context, principal);
++
++ if ((maj_status = gss_krb5_copy_ccache(&min_status, client->creds,
++ ccache))) {
++ logit("gss_krb5_copy_ccache() failed. Sorry!");
++ krb5_cc_close(krb_context, ccache);
++ return 0;
++ }
++
++ return 1;
++}
++
+ ssh_gssapi_mech gssapi_kerberos_mech = {
+ "toWM5Slw5Ew8Mqkay+al2g==",
+ "Kerberos",
+@@ -203,7 +275,8 @@ ssh_gssapi_mech gssapi_kerberos_mech = {
+ NULL,
+ &ssh_gssapi_krb5_userok,
+ NULL,
+- &ssh_gssapi_krb5_storecreds
++ &ssh_gssapi_krb5_storecreds,
++ &ssh_gssapi_krb5_updatecreds
+ };
+
+ #endif /* KRB5 */
+diff --git a/gss-serv.c b/gss-serv.c
+index b5d4bb2d1..4287579ae 100644
+--- a/gss-serv.c
++++ b/gss-serv.c
+@@ -1,7 +1,7 @@
+ /* $OpenBSD: gss-serv.c,v 1.32 2020/03/13 03:17:07 djm Exp $ */
+
+ /*
+- * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
++ * Copyright (c) 2001-2009 Simon Wilkinson. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -44,17 +44,19 @@
+ #include "session.h"
+ #include "misc.h"
+ #include "servconf.h"
++#include "uidswap.h"
+
+ #include "ssh-gss.h"
++#include "monitor_wrap.h"
+
+ extern ServerOptions options;
+
+ static ssh_gssapi_client gssapi_client =
+- { GSS_C_EMPTY_BUFFER, GSS_C_EMPTY_BUFFER,
+- GSS_C_NO_CREDENTIAL, NULL, {NULL, NULL, NULL, NULL}};
++ { GSS_C_EMPTY_BUFFER, GSS_C_EMPTY_BUFFER, GSS_C_NO_CREDENTIAL,
++ GSS_C_NO_NAME, NULL, {NULL, NULL, NULL, NULL, NULL}, 0, 0};
+
+ ssh_gssapi_mech gssapi_null_mech =
+- { NULL, NULL, {0, NULL}, NULL, NULL, NULL, NULL};
++ { NULL, NULL, {0, NULL}, NULL, NULL, NULL, NULL, NULL};
+
+ #ifdef KRB5
+ extern ssh_gssapi_mech gssapi_kerberos_mech;
+@@ -140,6 +142,29 @@ ssh_gssapi_server_ctx(Gssctxt **ctx, gss_OID oid)
+ return (ssh_gssapi_acquire_cred(*ctx));
+ }
+
++/* Unprivileged */
++char *
++ssh_gssapi_server_mechanisms(void) {
++ if (supported_oids == NULL)
++ ssh_gssapi_prepare_supported_oids();
++ return (ssh_gssapi_kex_mechs(supported_oids,
++ &ssh_gssapi_server_check_mech, NULL, NULL,
++ options.gss_kex_algorithms));
++}
++
++/* Unprivileged */
++int
++ssh_gssapi_server_check_mech(Gssctxt **dum, gss_OID oid, const char *data,
++ const char *dummy) {
++ Gssctxt *ctx = NULL;
++ int res;
++
++ res = !GSS_ERROR(PRIVSEP(ssh_gssapi_server_ctx(&ctx, oid)));
++ ssh_gssapi_delete_ctx(&ctx);
++
++ return (res);
++}
++
+ /* Unprivileged */
+ void
+ ssh_gssapi_supported_oids(gss_OID_set *oidset)
+@@ -150,7 +175,9 @@ ssh_gssapi_supported_oids(gss_OID_set *oidset)
+ gss_OID_set supported;
+
+ gss_create_empty_oid_set(&min_status, oidset);
+- gss_indicate_mechs(&min_status, &supported);
++
++ if (GSS_ERROR(gss_indicate_mechs(&min_status, &supported)))
++ return;
+
+ while (supported_mechs[i]->name != NULL) {
+ if (GSS_ERROR(gss_test_oid_set_member(&min_status,
+@@ -276,8 +303,48 @@ OM_uint32
+ ssh_gssapi_getclient(Gssctxt *ctx, ssh_gssapi_client *client)
+ {
+ int i = 0;
++ int equal = 0;
++ gss_name_t new_name = GSS_C_NO_NAME;
++ gss_buffer_desc ename = GSS_C_EMPTY_BUFFER;
++
++ if (options.gss_store_rekey && client->used && ctx->client_creds) {
++ if (client->mech->oid.length != ctx->oid->length ||
++ (memcmp(client->mech->oid.elements,
++ ctx->oid->elements, ctx->oid->length) !=0)) {
++ debug("Rekeyed credentials have different mechanism");
++ return GSS_S_COMPLETE;
++ }
++
++ if ((ctx->major = gss_inquire_cred_by_mech(&ctx->minor,
++ ctx->client_creds, ctx->oid, &new_name,
++ NULL, NULL, NULL))) {
++ ssh_gssapi_error(ctx);
++ return (ctx->major);
++ }
+
+- gss_buffer_desc ename;
++ ctx->major = gss_compare_name(&ctx->minor, client->name,
++ new_name, &equal);
++
++ if (GSS_ERROR(ctx->major)) {
++ ssh_gssapi_error(ctx);
++ return (ctx->major);
++ }
++
++ if (!equal) {
++ debug("Rekeyed credentials have different name");
++ return GSS_S_COMPLETE;
++ }
++
++ debug("Marking rekeyed credentials for export");
++
++ gss_release_name(&ctx->minor, &client->name);
++ gss_release_cred(&ctx->minor, &client->creds);
++ client->name = new_name;
++ client->creds = ctx->client_creds;
++ ctx->client_creds = GSS_C_NO_CREDENTIAL;
++ client->updated = 1;
++ return GSS_S_COMPLETE;
++ }
+
+ client->mech = NULL;
+
+@@ -292,6 +359,13 @@ ssh_gssapi_getclient(Gssctxt *ctx, ssh_gssapi_client *client)
+ if (client->mech == NULL)
+ return GSS_S_FAILURE;
+
++ if (ctx->client_creds &&
++ (ctx->major = gss_inquire_cred_by_mech(&ctx->minor,
++ ctx->client_creds, ctx->oid, &client->name, NULL, NULL, NULL))) {
++ ssh_gssapi_error(ctx);
++ return (ctx->major);
++ }
++
+ if ((ctx->major = gss_display_name(&ctx->minor, ctx->client,
+ &client->displayname, NULL))) {
+ ssh_gssapi_error(ctx);
+@@ -309,6 +383,8 @@ ssh_gssapi_getclient(Gssctxt *ctx, ssh_gssapi_client *client)
+ return (ctx->major);
+ }
+
++ gss_release_buffer(&ctx->minor, &ename);
++
+ /* We can't copy this structure, so we just move the pointer to it */
+ client->creds = ctx->client_creds;
+ ctx->client_creds = GSS_C_NO_CREDENTIAL;
+@@ -319,11 +395,20 @@ ssh_gssapi_getclient(Gssctxt *ctx, ssh_gssapi_client *client)
+ void
+ ssh_gssapi_cleanup_creds(void)
+ {
+- if (gssapi_client.store.filename != NULL) {
+- /* Unlink probably isn't sufficient */
+- debug("removing gssapi cred file\"%s\"",
+- gssapi_client.store.filename);
+- unlink(gssapi_client.store.filename);
++ krb5_ccache ccache = NULL;
++ krb5_error_code problem;
++
++ if (gssapi_client.store.data != NULL) {
++ if ((problem = krb5_cc_resolve(gssapi_client.store.data, gssapi_client.store.envval, &ccache))) {
++ debug_f("krb5_cc_resolve(): %.100s",
++ krb5_get_err_text(gssapi_client.store.data, problem));
++ } else if ((problem = krb5_cc_destroy(gssapi_client.store.data, ccache))) {
++ debug_f("krb5_cc_destroy(): %.100s",
++ krb5_get_err_text(gssapi_client.store.data, problem));
++ } else {
++ krb5_free_context(gssapi_client.store.data);
++ gssapi_client.store.data = NULL;
++ }
+ }
+ }
+
+@@ -356,19 +441,23 @@ ssh_gssapi_do_child(char ***envp, u_int *envsizep)
+
+ /* Privileged */
+ int
+-ssh_gssapi_userok(char *user)
++ssh_gssapi_userok(char *user, struct passwd *pw, int kex)
+ {
+ OM_uint32 lmin;
+
++ (void) kex; /* used in privilege separation */
++
+ if (gssapi_client.exportedname.length == 0 ||
+ gssapi_client.exportedname.value == NULL) {
+ debug("No suitable client data");
+ return 0;
+ }
+ if (gssapi_client.mech && gssapi_client.mech->userok)
+- if ((*gssapi_client.mech->userok)(&gssapi_client, user))
++ if ((*gssapi_client.mech->userok)(&gssapi_client, user)) {
++ gssapi_client.used = 1;
++ gssapi_client.store.owner = pw;
+ return 1;
+- else {
++ } else {
+ /* Destroy delegated credentials if userok fails */
+ gss_release_buffer(&lmin, &gssapi_client.displayname);
+ gss_release_buffer(&lmin, &gssapi_client.exportedname);
+@@ -382,14 +471,90 @@ ssh_gssapi_userok(char *user)
+ return (0);
+ }
+
+-/* Privileged */
+-OM_uint32
+-ssh_gssapi_checkmic(Gssctxt *ctx, gss_buffer_t gssbuf, gss_buffer_t gssmic)
++/* These bits are only used for rekeying. The unpriviledged child is running
++ * as the user, the monitor is root.
++ *
++ * In the child, we want to :
++ * *) Ask the monitor to store our credentials into the store we specify
++ * *) If it succeeds, maybe do a PAM update
++ */
++
++/* Stuff for PAM */
++
++#ifdef USE_PAM
++static int ssh_gssapi_simple_conv(int n, const struct pam_message **msg,
++ struct pam_response **resp, void *data)
+ {
+- ctx->major = gss_verify_mic(&ctx->minor, ctx->context,
+- gssbuf, gssmic, NULL);
++ return (PAM_CONV_ERR);
++}
++#endif
+
+- return (ctx->major);
++void
++ssh_gssapi_rekey_creds(void) {
++ int ok;
++#ifdef USE_PAM
++ int ret;
++ pam_handle_t *pamh = NULL;
++ struct pam_conv pamconv = {ssh_gssapi_simple_conv, NULL};
++ char *envstr;
++#endif
++
++ if (gssapi_client.store.filename == NULL &&
++ gssapi_client.store.envval == NULL &&
++ gssapi_client.store.envvar == NULL)
++ return;
++
++ ok = PRIVSEP(ssh_gssapi_update_creds(&gssapi_client.store));
++
++ if (!ok)
++ return;
++
++ debug("Rekeyed credentials stored successfully");
++
++ /* Actually managing to play with the ssh pam stack from here will
++ * be next to impossible. In any case, we may want different options
++ * for rekeying. So, use our own :)
++ */
++#ifdef USE_PAM
++ if (!use_privsep) {
++ debug("Not even going to try and do PAM with privsep disabled");
++ return;
++ }
++
++ ret = pam_start("sshd-rekey", gssapi_client.store.owner->pw_name,
++ &pamconv, &pamh);
++ if (ret)
++ return;
++
++ xasprintf(&envstr, "%s=%s", gssapi_client.store.envvar,
++ gssapi_client.store.envval);
++
++ ret = pam_putenv(pamh, envstr);
++ if (!ret)
++ pam_setcred(pamh, PAM_REINITIALIZE_CRED);
++ pam_end(pamh, PAM_SUCCESS);
++#endif
++}
++
++int
++ssh_gssapi_update_creds(ssh_gssapi_ccache *store) {
++ int ok = 0;
++
++ /* Check we've got credentials to store */
++ if (!gssapi_client.updated)
++ return 0;
++
++ gssapi_client.updated = 0;
++
++ temporarily_use_uid(gssapi_client.store.owner);
++ if (gssapi_client.mech && gssapi_client.mech->updatecreds)
++ ok = (*gssapi_client.mech->updatecreds)(store, &gssapi_client);
++ else
++ debug("No update function for this mechanism");
++
++ restore_uid();
++
++ return ok;
+ }
+
+ /* Privileged */
+diff --git a/kex.c b/kex.c
+index 8cdefcf7c..c259e00fc 100644
+--- a/kex.c
++++ b/kex.c
+@@ -57,11 +57,16 @@
+ #include "misc.h"
+ #include "dispatch.h"
+ #include "monitor.h"
++#include "xmalloc.h"
+
+ #include "ssherr.h"
+ #include "sshbuf.h"
+ #include "digest.h"
+
++#ifdef GSSAPI
++#include "ssh-gss.h"
++#endif
++
+ /* prototype */
+ static int kex_choose_conf(struct ssh *);
+ static int kex_input_newkeys(int, u_int32_t, struct ssh *);
+@@ -117,15 +122,28 @@ static const struct kexalg kexalgs[] = {
+ #endif /* HAVE_EVP_SHA256 || !WITH_OPENSSL */
+ { NULL, 0, -1, -1},
+ };
++static const struct kexalg gss_kexalgs[] = {
++#ifdef GSSAPI
++ { KEX_GSS_GEX_SHA1_ID, KEX_GSS_GEX_SHA1, 0, SSH_DIGEST_SHA1 },
++ { KEX_GSS_GRP1_SHA1_ID, KEX_GSS_GRP1_SHA1, 0, SSH_DIGEST_SHA1 },
++ { KEX_GSS_GRP14_SHA1_ID, KEX_GSS_GRP14_SHA1, 0, SSH_DIGEST_SHA1 },
++ { KEX_GSS_GRP14_SHA256_ID, KEX_GSS_GRP14_SHA256, 0, SSH_DIGEST_SHA256 },
++ { KEX_GSS_GRP16_SHA512_ID, KEX_GSS_GRP16_SHA512, 0, SSH_DIGEST_SHA512 },
++ { KEX_GSS_NISTP256_SHA256_ID, KEX_GSS_NISTP256_SHA256,
++ NID_X9_62_prime256v1, SSH_DIGEST_SHA256 },
++ { KEX_GSS_C25519_SHA256_ID, KEX_GSS_C25519_SHA256, 0, SSH_DIGEST_SHA256 },
++#endif
++ { NULL, 0, -1, -1},
++};
+
+-char *
+-kex_alg_list(char sep)
++static char *
++kex_alg_list_internal(char sep, const struct kexalg *algs)
+ {
+ char *ret = NULL, *tmp;
+ size_t nlen, rlen = 0;
+ const struct kexalg *k;
+
+- for (k = kexalgs; k->name != NULL; k++) {
++ for (k = algs; k->name != NULL; k++) {
+ if (ret != NULL)
+ ret[rlen++] = sep;
+ nlen = strlen(k->name);
+@@ -140,6 +158,18 @@ kex_alg_list(char sep)
+ return ret;
+ }
+
++char *
++kex_alg_list(char sep)
++{
++ return kex_alg_list_internal(sep, kexalgs);
++}
++
++char *
++kex_gss_alg_list(char sep)
++{
++ return kex_alg_list_internal(sep, gss_kexalgs);
++}
++
+ static const struct kexalg *
+ kex_alg_by_name(const char *name)
+ {
+@@ -149,6 +179,10 @@ kex_alg_by_name(const char *name)
+ if (strcmp(k->name, name) == 0)
+ return k;
+ }
++ for (k = gss_kexalgs; k->name != NULL; k++) {
++ if (strncmp(k->name, name, strlen(k->name)) == 0)
++ return k;
++ }
+ return NULL;
+ }
+
+@@ -317,6 +351,29 @@ kex_assemble_names(char **listp, const char *def, const char *all)
+ return r;
+ }
+
++/* Validate GSS KEX method name list */
++int
++kex_gss_names_valid(const char *names)
++{
++ char *s, *cp, *p;
++
++ if (names == NULL || *names == '\0')
++ return 0;
++ s = cp = xstrdup(names);
++ for ((p = strsep(&cp, ",")); p && *p != '\0';
++ (p = strsep(&cp, ","))) {
++ if (strncmp(p, "gss-", 4) != 0
++ || kex_alg_by_name(p) == NULL) {
++ error("Unsupported KEX algorithm \"%.100s\"", p);
++ free(s);
++ return 0;
++ }
++ }
++ debug3("gss kex names ok: [%s]", names);
++ free(s);
++ return 1;
++}
++
+ /* put algorithm proposal into buffer */
+ int
+ kex_prop2buf(struct sshbuf *b, char *proposal[PROPOSAL_MAX])
+@@ -719,6 +776,9 @@ kex_free(struct kex *kex)
+ sshbuf_free(kex->session_id);
+ sshbuf_free(kex->initial_sig);
+ sshkey_free(kex->initial_hostkey);
++#ifdef GSSAPI
++ free(kex->gss_host);
++#endif /* GSSAPI */
+ free(kex->failed_choice);
+ free(kex->hostkey_alg);
+ free(kex->name);
+diff --git a/kex.h b/kex.h
+index c35329501..240dca89d 100644
+--- a/kex.h
++++ b/kex.h
+@@ -102,6 +102,15 @@ enum kex_exchange {
+ KEX_ECDH_SHA2,
+ KEX_C25519_SHA256,
+ KEX_KEM_SNTRUP761X25519_SHA512,
++#ifdef GSSAPI
++ KEX_GSS_GRP1_SHA1,
++ KEX_GSS_GRP14_SHA1,
++ KEX_GSS_GRP14_SHA256,
++ KEX_GSS_GRP16_SHA512,
++ KEX_GSS_GEX_SHA1,
++ KEX_GSS_NISTP256_SHA256,
++ KEX_GSS_C25519_SHA256,
++#endif
+ KEX_MAX
+ };
+
+@@ -159,6 +168,12 @@ struct kex {
+ u_int flags;
+ int hash_alg;
+ int ec_nid;
++#ifdef GSSAPI
++ int gss_deleg_creds;
++ int gss_trust_dns;
++ char *gss_host;
++ char *gss_client;
++#endif
+ char *failed_choice;
+ int (*verify_host_key)(struct sshkey *, struct ssh *);
+ struct sshkey *(*load_host_public_key)(int, int, struct ssh *);
+@@ -180,8 +195,10 @@ struct kex {
+
+ int kex_names_valid(const char *);
+ char *kex_alg_list(char);
++char *kex_gss_alg_list(char);
+ char *kex_names_cat(const char *, const char *);
+ int kex_assemble_names(char **, const char *, const char *);
++int kex_gss_names_valid(const char *);
+
+ int kex_exchange_identification(struct ssh *, int, const char *);
+
+@@ -209,6 +226,12 @@ int kexgex_client(struct ssh *);
+ int kexgex_server(struct ssh *);
+ int kex_gen_client(struct ssh *);
+ int kex_gen_server(struct ssh *);
++#if defined(GSSAPI) && defined(WITH_OPENSSL)
++int kexgssgex_client(struct ssh *);
++int kexgssgex_server(struct ssh *);
++int kexgss_client(struct ssh *);
++int kexgss_server(struct ssh *);
++#endif
+
+ int kex_dh_keypair(struct kex *);
+ int kex_dh_enc(struct kex *, const struct sshbuf *, struct sshbuf **,
+@@ -241,6 +264,12 @@ int kexgex_hash(int, const struct sshbuf *, const struct sshbuf *,
+ const BIGNUM *, const u_char *, size_t,
+ u_char *, size_t *);
+
++int kex_gen_hash(int hash_alg, const struct sshbuf *client_version,
++ const struct sshbuf *server_version, const struct sshbuf *client_kexinit,
++ const struct sshbuf *server_kexinit, const struct sshbuf *server_host_key_blob,
++ const struct sshbuf *client_pub, const struct sshbuf *server_pub,
++ const struct sshbuf *shared_secret, u_char *hash, size_t *hashlen);
++
+ void kexc25519_keygen(u_char key[CURVE25519_SIZE], u_char pub[CURVE25519_SIZE])
+ __attribute__((__bounded__(__minbytes__, 1, CURVE25519_SIZE)))
+ __attribute__((__bounded__(__minbytes__, 2, CURVE25519_SIZE)));
+diff --git a/kexdh.c b/kexdh.c
+index c1084f214..0faab21b0 100644
+--- a/kexdh.c
++++ b/kexdh.c
+@@ -49,13 +49,23 @@ kex_dh_keygen(struct kex *kex)
+ {
+ switch (kex->kex_type) {
+ case KEX_DH_GRP1_SHA1:
++#ifdef GSSAPI
++ case KEX_GSS_GRP1_SHA1:
++#endif
+ kex->dh = dh_new_group1();
+ break;
+ case KEX_DH_GRP14_SHA1:
+ case KEX_DH_GRP14_SHA256:
++#ifdef GSSAPI
++ case KEX_GSS_GRP14_SHA1:
++ case KEX_GSS_GRP14_SHA256:
++#endif
+ kex->dh = dh_new_group14();
+ break;
+ case KEX_DH_GRP16_SHA512:
++#ifdef GSSAPI
++ case KEX_GSS_GRP16_SHA512:
++#endif
+ kex->dh = dh_new_group16();
+ break;
+ case KEX_DH_GRP18_SHA512:
+diff --git a/kexgen.c b/kexgen.c
+index 20f3c5711..ca704844e 100644
+--- a/kexgen.c
++++ b/kexgen.c
+@@ -44,7 +44,7 @@
+ static int input_kex_gen_init(int, u_int32_t, struct ssh *);
+ static int input_kex_gen_reply(int type, u_int32_t seq, struct ssh *ssh);
+
+-static int
++int
+ kex_gen_hash(
+ int hash_alg,
+ const struct sshbuf *client_version,
+diff --git a/kexgssc.c b/kexgssc.c
+new file mode 100644
+index 000000000..1c62740e7
+--- /dev/null
++++ b/kexgssc.c
+@@ -0,0 +1,599 @@
++/*
++ * Copyright (c) 2001-2009 Simon Wilkinson. All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include "includes.h"
++
++#if defined(GSSAPI) && defined(WITH_OPENSSL)
++
++#include "includes.h"
++
++#include <openssl/crypto.h>
++#include <openssl/bn.h>
++
++#include <string.h>
++
++#include "xmalloc.h"
++#include "sshbuf.h"
++#include "ssh2.h"
++#include "sshkey.h"
++#include "cipher.h"
++#include "kex.h"
++#include "log.h"
++#include "packet.h"
++#include "dh.h"
++#include "digest.h"
++#include "ssherr.h"
++
++#include "ssh-gss.h"
++
++int
++kexgss_client(struct ssh *ssh)
++{
++ struct kex *kex = ssh->kex;
++ gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER,
++ recv_tok = GSS_C_EMPTY_BUFFER,
++ gssbuf, msg_tok = GSS_C_EMPTY_BUFFER, *token_ptr;
++ Gssctxt *ctxt;
++ OM_uint32 maj_status, min_status, ret_flags;
++ struct sshbuf *server_blob = NULL;
++ struct sshbuf *shared_secret = NULL;
++ struct sshbuf *server_host_key_blob = NULL;
++ struct sshbuf *empty = NULL;
++ u_char *msg;
++ int type = 0;
++ int first = 1;
++ u_char hash[SSH_DIGEST_MAX_LENGTH];
++ size_t hashlen;
++ u_char c;
++ int r;
++
++ /* Initialise our GSSAPI world */
++ ssh_gssapi_build_ctx(&ctxt);
++ if (ssh_gssapi_id_kex(ctxt, kex->name, kex->kex_type)
++ == GSS_C_NO_OID)
++ fatal("Couldn't identify host exchange");
++
++ if (ssh_gssapi_import_name(ctxt, kex->gss_host))
++ fatal("Couldn't import hostname");
++
++ if (kex->gss_client &&
++ ssh_gssapi_client_identity(ctxt, kex->gss_client))
++ fatal("Couldn't acquire client credentials");
++
++ /* Step 1 */
++ switch (kex->kex_type) {
++ case KEX_GSS_GRP1_SHA1:
++ case KEX_GSS_GRP14_SHA1:
++ case KEX_GSS_GRP14_SHA256:
++ case KEX_GSS_GRP16_SHA512:
++ r = kex_dh_keypair(kex);
++ break;
++ case KEX_GSS_NISTP256_SHA256:
++ r = kex_ecdh_keypair(kex);
++ break;
++ case KEX_GSS_C25519_SHA256:
++ r = kex_c25519_keypair(kex);
++ break;
++ default:
++ fatal_f("Unexpected KEX type %d", kex->kex_type);
++ }
++ if (r != 0)
++ return r;
++
++ token_ptr = GSS_C_NO_BUFFER;
++
++ do {
++ debug("Calling gss_init_sec_context");
++
++ maj_status = ssh_gssapi_init_ctx(ctxt,
++ kex->gss_deleg_creds, token_ptr, &send_tok,
++ &ret_flags);
++
++ if (GSS_ERROR(maj_status)) {
++ /* XXX Useles code: Missing send? */
++ if (send_tok.length != 0) {
++ if ((r = sshpkt_start(ssh,
++ SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
++ (r = sshpkt_put_string(ssh, send_tok.value,
++ send_tok.length)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ }
++ fatal("gss_init_context failed");
++ }
++
++ /* If we've got an old receive buffer get rid of it */
++ if (token_ptr != GSS_C_NO_BUFFER)
++ gss_release_buffer(&min_status, &recv_tok);
++
++ if (maj_status == GSS_S_COMPLETE) {
++ /* If mutual state flag is not true, kex fails */
++ if (!(ret_flags & GSS_C_MUTUAL_FLAG))
++ fatal("Mutual authentication failed");
++
++ /* If integ avail flag is not true kex fails */
++ if (!(ret_flags & GSS_C_INTEG_FLAG))
++ fatal("Integrity check failed");
++ }
++
++ /*
++ * If we have data to send, then the last message that we
++ * received cannot have been a 'complete'.
++ */
++ if (send_tok.length != 0) {
++ if (first) {
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_INIT)) != 0 ||
++ (r = sshpkt_put_string(ssh, send_tok.value,
++ send_tok.length)) != 0 ||
++ (r = sshpkt_put_stringb(ssh, kex->client_pub)) != 0)
++ fatal("failed to construct packet: %s", ssh_err(r));
++ first = 0;
++ } else {
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
++ (r = sshpkt_put_string(ssh, send_tok.value,
++ send_tok.length)) != 0)
++ fatal("failed to construct packet: %s", ssh_err(r));
++ }
++ if ((r = sshpkt_send(ssh)) != 0)
++ fatal("failed to send packet: %s", ssh_err(r));
++ gss_release_buffer(&min_status, &send_tok);
++
++ /* If we've sent them data, they should reply */
++ do {
++ type = ssh_packet_read(ssh);
++ if (type == SSH2_MSG_KEXGSS_HOSTKEY) {
++ debug("Received KEXGSS_HOSTKEY");
++ if (server_host_key_blob)
++ fatal("Server host key received more than once");
++ if ((r = sshpkt_getb_froms(ssh, &server_host_key_blob)) != 0)
++ fatal("Failed to read server host key: %s", ssh_err(r));
++ }
++ } while (type == SSH2_MSG_KEXGSS_HOSTKEY);
++
++ switch (type) {
++ case SSH2_MSG_KEXGSS_CONTINUE:
++ debug("Received GSSAPI_CONTINUE");
++ if (maj_status == GSS_S_COMPLETE)
++ fatal("GSSAPI Continue received from server when complete");
++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
++ &recv_tok)) != 0 ||
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal("Failed to read token: %s", ssh_err(r));
++ break;
++ case SSH2_MSG_KEXGSS_COMPLETE:
++ debug("Received GSSAPI_COMPLETE");
++ if (msg_tok.value != NULL)
++ fatal("Received GSSAPI_COMPLETE twice?");
++ if ((r = sshpkt_getb_froms(ssh, &server_blob)) != 0 ||
++ (r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
++ &msg_tok)) != 0)
++ fatal("Failed to read message: %s", ssh_err(r));
++
++ /* Is there a token included? */
++ if ((r = sshpkt_get_u8(ssh, &c)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ if (c) {
++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(
++ ssh, &recv_tok)) != 0)
++ fatal("Failed to read token: %s", ssh_err(r));
++ /* If we're already complete - protocol error */
++ if (maj_status == GSS_S_COMPLETE)
++ sshpkt_disconnect(ssh, "Protocol error: received token when complete");
++ } else {
++ /* No token included */
++ if (maj_status != GSS_S_COMPLETE)
++ sshpkt_disconnect(ssh, "Protocol error: did not receive final token");
++ }
++ if ((r = sshpkt_get_end(ssh)) != 0) {
++ fatal("Expecting end of packet.");
++ }
++ break;
++ case SSH2_MSG_KEXGSS_ERROR:
++ debug("Received Error");
++ if ((r = sshpkt_get_u32(ssh, &maj_status)) != 0 ||
++ (r = sshpkt_get_u32(ssh, &min_status)) != 0 ||
++ (r = sshpkt_get_string(ssh, &msg, NULL)) != 0 ||
++ (r = sshpkt_get_string(ssh, NULL, NULL)) != 0 || /* lang tag */
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal("sshpkt_get failed: %s", ssh_err(r));
++ fatal("GSSAPI Error: \n%.400s", msg);
++ default:
++ sshpkt_disconnect(ssh, "Protocol error: didn't expect packet type %d",
++ type);
++ }
++ token_ptr = &recv_tok;
++ } else {
++ /* No data, and not complete */
++ if (maj_status != GSS_S_COMPLETE)
++ fatal("Not complete, and no token output");
++ }
++ } while (maj_status & GSS_S_CONTINUE_NEEDED);
++
++ /*
++ * We _must_ have received a COMPLETE message in reply from the
++ * server, which will have set server_blob and msg_tok
++ */
++
++ if (type != SSH2_MSG_KEXGSS_COMPLETE)
++ fatal("Didn't receive a SSH2_MSG_KEXGSS_COMPLETE when I expected it");
++
++ /* compute shared secret */
++ switch (kex->kex_type) {
++ case KEX_GSS_GRP1_SHA1:
++ case KEX_GSS_GRP14_SHA1:
++ case KEX_GSS_GRP14_SHA256:
++ case KEX_GSS_GRP16_SHA512:
++ r = kex_dh_dec(kex, server_blob, &shared_secret);
++ break;
++ case KEX_GSS_C25519_SHA256:
++ if (sshbuf_ptr(server_blob)[sshbuf_len(server_blob)] & 0x80)
++ fatal("The received key has MSB of last octet set!");
++ r = kex_c25519_dec(kex, server_blob, &shared_secret);
++ break;
++ case KEX_GSS_NISTP256_SHA256:
++ if (sshbuf_len(server_blob) != 65)
++ fatal("The received NIST-P256 key did not match"
++ "expected length (expected 65, got %zu)", sshbuf_len(server_blob));
++
++ if (sshbuf_ptr(server_blob)[0] != POINT_CONVERSION_UNCOMPRESSED)
++ fatal("The received NIST-P256 key does not have first octet 0x04");
++
++ r = kex_ecdh_dec(kex, server_blob, &shared_secret);
++ break;
++ default:
++ r = SSH_ERR_INVALID_ARGUMENT;
++ break;
++ }
++ if (r != 0)
++ goto out;
++
++ if ((empty = sshbuf_new()) == NULL) {
++ r = SSH_ERR_ALLOC_FAIL;
++ goto out;
++ }
++
++ hashlen = sizeof(hash);
++ if ((r = kex_gen_hash(
++ kex->hash_alg,
++ kex->client_version,
++ kex->server_version,
++ kex->my,
++ kex->peer,
++ (server_host_key_blob ? server_host_key_blob : empty),
++ kex->client_pub,
++ server_blob,
++ shared_secret,
++ hash, &hashlen)) != 0)
++ fatal_f("Unexpected KEX type %d", kex->kex_type);
++
++ gssbuf.value = hash;
++ gssbuf.length = hashlen;
++
++ /* Verify that the hash matches the MIC we just got. */
++ if (GSS_ERROR(ssh_gssapi_checkmic(ctxt, &gssbuf, &msg_tok)))
++ sshpkt_disconnect(ssh, "Hash's MIC didn't verify");
++
++ gss_release_buffer(&min_status, &msg_tok);
++
++ if (kex->gss_deleg_creds)
++ ssh_gssapi_credentials_updated(ctxt);
++
++ if (gss_kex_context == NULL)
++ gss_kex_context = ctxt;
++ else
++ ssh_gssapi_delete_ctx(&ctxt);
++
++ if ((r = kex_derive_keys(ssh, hash, hashlen, shared_secret)) == 0)
++ r = kex_send_newkeys(ssh);
++
++out:
++ explicit_bzero(hash, sizeof(hash));
++ explicit_bzero(kex->c25519_client_key, sizeof(kex->c25519_client_key));
++ sshbuf_free(empty);
++ sshbuf_free(server_host_key_blob);
++ sshbuf_free(server_blob);
++ sshbuf_free(shared_secret);
++ sshbuf_free(kex->client_pub);
++ kex->client_pub = NULL;
++ return r;
++}
++
++int
++kexgssgex_client(struct ssh *ssh)
++{
++ struct kex *kex = ssh->kex;
++ gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER,
++ recv_tok = GSS_C_EMPTY_BUFFER, gssbuf,
++ msg_tok = GSS_C_EMPTY_BUFFER, *token_ptr;
++ Gssctxt *ctxt;
++ OM_uint32 maj_status, min_status, ret_flags;
++ struct sshbuf *shared_secret = NULL;
++ BIGNUM *p = NULL;
++ BIGNUM *g = NULL;
++ struct sshbuf *buf = NULL;
++ struct sshbuf *server_host_key_blob = NULL;
++ struct sshbuf *server_blob = NULL;
++ BIGNUM *dh_server_pub = NULL;
++ u_char *msg;
++ int type = 0;
++ int first = 1;
++ u_char hash[SSH_DIGEST_MAX_LENGTH];
++ size_t hashlen;
++ const BIGNUM *pub_key, *dh_p, *dh_g;
++ int nbits = 0, min = DH_GRP_MIN, max = DH_GRP_MAX;
++ struct sshbuf *empty = NULL;
++ u_char c;
++ int r;
++
++ /* Initialise our GSSAPI world */
++ ssh_gssapi_build_ctx(&ctxt);
++ if (ssh_gssapi_id_kex(ctxt, kex->name, kex->kex_type)
++ == GSS_C_NO_OID)
++ fatal("Couldn't identify host exchange");
++
++ if (ssh_gssapi_import_name(ctxt, kex->gss_host))
++ fatal("Couldn't import hostname");
++
++ if (kex->gss_client &&
++ ssh_gssapi_client_identity(ctxt, kex->gss_client))
++ fatal("Couldn't acquire client credentials");
++
++ debug("Doing group exchange");
++ nbits = dh_estimate(kex->dh_need * 8);
++
++ kex->min = DH_GRP_MIN;
++ kex->max = DH_GRP_MAX;
++ kex->nbits = nbits;
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_GROUPREQ)) != 0 ||
++ (r = sshpkt_put_u32(ssh, min)) != 0 ||
++ (r = sshpkt_put_u32(ssh, nbits)) != 0 ||
++ (r = sshpkt_put_u32(ssh, max)) != 0 ||
++ (r = sshpkt_send(ssh)) != 0)
++ fatal("Failed to construct a packet: %s", ssh_err(r));
++
++ if ((r = ssh_packet_read_expect(ssh, SSH2_MSG_KEXGSS_GROUP)) != 0)
++ fatal("Error: %s", ssh_err(r));
++
++ if ((r = sshpkt_get_bignum2(ssh, &p)) != 0 ||
++ (r = sshpkt_get_bignum2(ssh, &g)) != 0 ||
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal("shpkt_get_bignum2 failed: %s", ssh_err(r));
++
++ if (BN_num_bits(p) < min || BN_num_bits(p) > max)
++ fatal("GSSGRP_GEX group out of range: %d !< %d !< %d",
++ min, BN_num_bits(p), max);
++
++ if ((kex->dh = dh_new_group(g, p)) == NULL)
++ fatal("dn_new_group() failed");
++ p = g = NULL; /* belong to kex->dh now */
++
++ if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0)
++ goto out;
++ DH_get0_key(kex->dh, &pub_key, NULL);
++
++ token_ptr = GSS_C_NO_BUFFER;
++
++ do {
++ /* Step 2 - call GSS_Init_sec_context() */
++ debug("Calling gss_init_sec_context");
++
++ maj_status = ssh_gssapi_init_ctx(ctxt,
++ kex->gss_deleg_creds, token_ptr, &send_tok,
++ &ret_flags);
++
++ if (GSS_ERROR(maj_status)) {
++ /* XXX Useles code: Missing send? */
++ if (send_tok.length != 0) {
++ if ((r = sshpkt_start(ssh,
++ SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
++ (r = sshpkt_put_string(ssh, send_tok.value,
++ send_tok.length)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ }
++ fatal("gss_init_context failed");
++ }
++
++ /* If we've got an old receive buffer get rid of it */
++ if (token_ptr != GSS_C_NO_BUFFER)
++ gss_release_buffer(&min_status, &recv_tok);
++
++ if (maj_status == GSS_S_COMPLETE) {
++ /* If mutual state flag is not true, kex fails */
++ if (!(ret_flags & GSS_C_MUTUAL_FLAG))
++ fatal("Mutual authentication failed");
++
++ /* If integ avail flag is not true kex fails */
++ if (!(ret_flags & GSS_C_INTEG_FLAG))
++ fatal("Integrity check failed");
++ }
++
++ /*
++ * If we have data to send, then the last message that we
++ * received cannot have been a 'complete'.
++ */
++ if (send_tok.length != 0) {
++ if (first) {
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_INIT)) != 0 ||
++ (r = sshpkt_put_string(ssh, send_tok.value,
++ send_tok.length)) != 0 ||
++ (r = sshpkt_put_bignum2(ssh, pub_key)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ first = 0;
++ } else {
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
++ (r = sshpkt_put_string(ssh,send_tok.value,
++ send_tok.length)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ }
++ if ((r = sshpkt_send(ssh)) != 0)
++ fatal("sshpkt_send failed: %s", ssh_err(r));
++ gss_release_buffer(&min_status, &send_tok);
++
++ /* If we've sent them data, they should reply */
++ do {
++ type = ssh_packet_read(ssh);
++ if (type == SSH2_MSG_KEXGSS_HOSTKEY) {
++ debug("Received KEXGSS_HOSTKEY");
++ if (server_host_key_blob)
++ fatal("Server host key received more than once");
++ if ((r = sshpkt_getb_froms(ssh, &server_host_key_blob)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ }
++ } while (type == SSH2_MSG_KEXGSS_HOSTKEY);
++
++ switch (type) {
++ case SSH2_MSG_KEXGSS_CONTINUE:
++ debug("Received GSSAPI_CONTINUE");
++ if (maj_status == GSS_S_COMPLETE)
++ fatal("GSSAPI Continue received from server when complete");
++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
++ &recv_tok)) != 0 ||
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ break;
++ case SSH2_MSG_KEXGSS_COMPLETE:
++ debug("Received GSSAPI_COMPLETE");
++ if (msg_tok.value != NULL)
++ fatal("Received GSSAPI_COMPLETE twice?");
++ if ((r = sshpkt_getb_froms(ssh, &server_blob)) != 0 ||
++ (r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
++ &msg_tok)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++
++ /* Is there a token included? */
++ if ((r = sshpkt_get_u8(ssh, &c)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ if (c) {
++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(
++ ssh, &recv_tok)) != 0 ||
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ /* If we're already complete - protocol error */
++ if (maj_status == GSS_S_COMPLETE)
++ sshpkt_disconnect(ssh, "Protocol error: received token when complete");
++ } else {
++ /* No token included */
++ if (maj_status != GSS_S_COMPLETE)
++ sshpkt_disconnect(ssh, "Protocol error: did not receive final token");
++ }
++ break;
++ case SSH2_MSG_KEXGSS_ERROR:
++ debug("Received Error");
++ if ((r = sshpkt_get_u32(ssh, &maj_status)) != 0 ||
++ (r = sshpkt_get_u32(ssh, &min_status)) != 0 ||
++ (r = sshpkt_get_string(ssh, &msg, NULL)) != 0 ||
++ (r = sshpkt_get_string(ssh, NULL, NULL)) != 0 || /* lang tag */
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ fatal("GSSAPI Error: \n%.400s", msg);
++ default:
++ sshpkt_disconnect(ssh, "Protocol error: didn't expect packet type %d",
++ type);
++ }
++ token_ptr = &recv_tok;
++ } else {
++ /* No data, and not complete */
++ if (maj_status != GSS_S_COMPLETE)
++ fatal("Not complete, and no token output");
++ }
++ } while (maj_status & GSS_S_CONTINUE_NEEDED);
++
++ /*
++ * We _must_ have received a COMPLETE message in reply from the
++ * server, which will have set dh_server_pub and msg_tok
++ */
++
++ if (type != SSH2_MSG_KEXGSS_COMPLETE)
++ fatal("Didn't receive a SSH2_MSG_KEXGSS_COMPLETE when I expected it");
++
++ /* 7. C verifies that the key Q_S is valid */
++ /* 8. C computes shared secret */
++ if ((buf = sshbuf_new()) == NULL ||
++ (r = sshbuf_put_stringb(buf, server_blob)) != 0 ||
++ (r = sshbuf_get_bignum2(buf, &dh_server_pub)) != 0)
++ goto out;
++ sshbuf_free(buf);
++ buf = NULL;
++
++ if ((shared_secret = sshbuf_new()) == NULL) {
++ r = SSH_ERR_ALLOC_FAIL;
++ goto out;
++ }
++
++ if ((r = kex_dh_compute_key(kex, dh_server_pub, shared_secret)) != 0)
++ goto out;
++ if ((empty = sshbuf_new()) == NULL) {
++ r = SSH_ERR_ALLOC_FAIL;
++ goto out;
++ }
++
++ DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
++ hashlen = sizeof(hash);
++ if ((r = kexgex_hash(
++ kex->hash_alg,
++ kex->client_version,
++ kex->server_version,
++ kex->my,
++ kex->peer,
++ (server_host_key_blob ? server_host_key_blob : empty),
++ kex->min, kex->nbits, kex->max,
++ dh_p, dh_g,
++ pub_key,
++ dh_server_pub,
++ sshbuf_ptr(shared_secret), sshbuf_len(shared_secret),
++ hash, &hashlen)) != 0)
++ fatal("Failed to calculate hash: %s", ssh_err(r));
++
++ gssbuf.value = hash;
++ gssbuf.length = hashlen;
++
++ /* Verify that the hash matches the MIC we just got. */
++ if (GSS_ERROR(ssh_gssapi_checkmic(ctxt, &gssbuf, &msg_tok)))
++ sshpkt_disconnect(ssh, "Hash's MIC didn't verify");
++
++ gss_release_buffer(&min_status, &msg_tok);
++
++ if (kex->gss_deleg_creds)
++ ssh_gssapi_credentials_updated(ctxt);
++
++ if (gss_kex_context == NULL)
++ gss_kex_context = ctxt;
++ else
++ ssh_gssapi_delete_ctx(&ctxt);
++
++ /* Finally derive the keys and send them */
++ if ((r = kex_derive_keys(ssh, hash, hashlen, shared_secret)) == 0)
++ r = kex_send_newkeys(ssh);
++out:
++ sshbuf_free(buf);
++ sshbuf_free(server_blob);
++ sshbuf_free(empty);
++ explicit_bzero(hash, sizeof(hash));
++ DH_free(kex->dh);
++ kex->dh = NULL;
++ BN_clear_free(dh_server_pub);
++ sshbuf_free(shared_secret);
++ sshbuf_free(server_host_key_blob);
++ return r;
++}
++#endif /* defined(GSSAPI) && defined(WITH_OPENSSL) */
+diff --git a/kexgsss.c b/kexgsss.c
+new file mode 100644
+index 000000000..a2c02148b
+--- /dev/null
++++ b/kexgsss.c
+@@ -0,0 +1,474 @@
++/*
++ * Copyright (c) 2001-2009 Simon Wilkinson. All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR `AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include "includes.h"
++
++#if defined(GSSAPI) && defined(WITH_OPENSSL)
++
++#include <string.h>
++
++#include <openssl/crypto.h>
++#include <openssl/bn.h>
++
++#include "xmalloc.h"
++#include "sshbuf.h"
++#include "ssh2.h"
++#include "sshkey.h"
++#include "cipher.h"
++#include "kex.h"
++#include "log.h"
++#include "packet.h"
++#include "dh.h"
++#include "ssh-gss.h"
++#include "monitor_wrap.h"
++#include "misc.h" /* servconf.h needs misc.h for struct ForwardOptions */
++#include "servconf.h"
++#include "ssh-gss.h"
++#include "digest.h"
++#include "ssherr.h"
++
++extern ServerOptions options;
++
++int
++kexgss_server(struct ssh *ssh)
++{
++ struct kex *kex = ssh->kex;
++ OM_uint32 maj_status, min_status;
++
++ /*
++ * Some GSSAPI implementations use the input value of ret_flags (an
++ * output variable) as a means of triggering mechanism specific
++ * features. Initializing it to zero avoids inadvertently
++ * activating this non-standard behaviour.
++ */
++
++ OM_uint32 ret_flags = 0;
++ gss_buffer_desc gssbuf, recv_tok, msg_tok;
++ gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER;
++ Gssctxt *ctxt = NULL;
++ struct sshbuf *shared_secret = NULL;
++ struct sshbuf *client_pubkey = NULL;
++ struct sshbuf *server_pubkey = NULL;
++ struct sshbuf *empty = sshbuf_new();
++ int type = 0;
++ gss_OID oid;
++ char *mechs;
++ u_char hash[SSH_DIGEST_MAX_LENGTH];
++ size_t hashlen;
++ int r;
++
++ /* Initialise GSSAPI */
++
++ /* If we're rekeying, privsep means that some of the private structures
++ * in the GSSAPI code are no longer available. This kludges them back
++ * into life
++ */
++ if (!ssh_gssapi_oid_table_ok()) {
++ mechs = ssh_gssapi_server_mechanisms();
++ free(mechs);
++ }
++
++ debug2_f("Identifying %s", kex->name);
++ oid = ssh_gssapi_id_kex(NULL, kex->name, kex->kex_type);
++ if (oid == GSS_C_NO_OID)
++ fatal("Unknown gssapi mechanism");
++
++ debug2_f("Acquiring credentials");
++
++ if (GSS_ERROR(PRIVSEP(ssh_gssapi_server_ctx(&ctxt, oid))))
++ fatal("Unable to acquire credentials for the server");
++
++ do {
++ debug("Wait SSH2_MSG_KEXGSS_INIT");
++ type = ssh_packet_read(ssh);
++ switch(type) {
++ case SSH2_MSG_KEXGSS_INIT:
++ if (client_pubkey != NULL)
++ fatal("Received KEXGSS_INIT after initialising");
++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
++ &recv_tok)) != 0 ||
++ (r = sshpkt_getb_froms(ssh, &client_pubkey)) != 0 ||
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++
++ switch (kex->kex_type) {
++ case KEX_GSS_GRP1_SHA1:
++ case KEX_GSS_GRP14_SHA1:
++ case KEX_GSS_GRP14_SHA256:
++ case KEX_GSS_GRP16_SHA512:
++ r = kex_dh_enc(kex, client_pubkey, &server_pubkey,
++ &shared_secret);
++ break;
++ case KEX_GSS_NISTP256_SHA256:
++ r = kex_ecdh_enc(kex, client_pubkey, &server_pubkey,
++ &shared_secret);
++ break;
++ case KEX_GSS_C25519_SHA256:
++ r = kex_c25519_enc(kex, client_pubkey, &server_pubkey,
++ &shared_secret);
++ break;
++ default:
++ fatal_f("Unexpected KEX type %d", kex->kex_type);
++ }
++ if (r != 0)
++ goto out;
++
++ /* Send SSH_MSG_KEXGSS_HOSTKEY here, if we want */
++ break;
++ case SSH2_MSG_KEXGSS_CONTINUE:
++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
++ &recv_tok)) != 0 ||
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ break;
++ default:
++ sshpkt_disconnect(ssh,
++ "Protocol error: didn't expect packet type %d",
++ type);
++ }
++
++ maj_status = PRIVSEP(ssh_gssapi_accept_ctx(ctxt, &recv_tok,
++ &send_tok, &ret_flags));
++
++ gss_release_buffer(&min_status, &recv_tok);
++
++ if (maj_status != GSS_S_COMPLETE && send_tok.length == 0)
++ fatal("Zero length token output when incomplete");
++
++ if (client_pubkey == NULL)
++ fatal("No client public key");
++
++ if (maj_status & GSS_S_CONTINUE_NEEDED) {
++ debug("Sending GSSAPI_CONTINUE");
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
++ (r = sshpkt_put_string(ssh, send_tok.value, send_tok.length)) != 0 ||
++ (r = sshpkt_send(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ gss_release_buffer(&min_status, &send_tok);
++ }
++ } while (maj_status & GSS_S_CONTINUE_NEEDED);
++
++ if (GSS_ERROR(maj_status)) {
++ if (send_tok.length > 0) {
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
++ (r = sshpkt_put_string(ssh, send_tok.value, send_tok.length)) != 0 ||
++ (r = sshpkt_send(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ }
++ fatal("accept_ctx died");
++ }
++
++ if (!(ret_flags & GSS_C_MUTUAL_FLAG))
++ fatal("Mutual Authentication flag wasn't set");
++
++ if (!(ret_flags & GSS_C_INTEG_FLAG))
++ fatal("Integrity flag wasn't set");
++
++ hashlen = sizeof(hash);
++ if ((r = kex_gen_hash(
++ kex->hash_alg,
++ kex->client_version,
++ kex->server_version,
++ kex->peer,
++ kex->my,
++ empty,
++ client_pubkey,
++ server_pubkey,
++ shared_secret,
++ hash, &hashlen)) != 0)
++ goto out;
++
++ gssbuf.value = hash;
++ gssbuf.length = hashlen;
++
++ if (GSS_ERROR(PRIVSEP(ssh_gssapi_sign(ctxt, &gssbuf, &msg_tok))))
++ fatal("Couldn't get MIC");
++
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_COMPLETE)) != 0 ||
++ (r = sshpkt_put_stringb(ssh, server_pubkey)) != 0 ||
++ (r = sshpkt_put_string(ssh, msg_tok.value, msg_tok.length)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++
++ if (send_tok.length != 0) {
++ if ((r = sshpkt_put_u8(ssh, 1)) != 0 || /* true */
++ (r = sshpkt_put_string(ssh, send_tok.value, send_tok.length)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ } else {
++ if ((r = sshpkt_put_u8(ssh, 0)) != 0) /* false */
++ fatal("sshpkt failed: %s", ssh_err(r));
++ }
++ if ((r = sshpkt_send(ssh)) != 0)
++ fatal("sshpkt_send failed: %s", ssh_err(r));
++
++ gss_release_buffer(&min_status, &send_tok);
++ gss_release_buffer(&min_status, &msg_tok);
++
++ if (gss_kex_context == NULL)
++ gss_kex_context = ctxt;
++ else
++ ssh_gssapi_delete_ctx(&ctxt);
++
++ if ((r = kex_derive_keys(ssh, hash, hashlen, shared_secret)) == 0)
++ r = kex_send_newkeys(ssh);
++
++ /* If this was a rekey, then save out any delegated credentials we
++ * just exchanged. */
++ if (options.gss_store_rekey)
++ ssh_gssapi_rekey_creds();
++out:
++ sshbuf_free(empty);
++ explicit_bzero(hash, sizeof(hash));
++ sshbuf_free(shared_secret);
++ sshbuf_free(client_pubkey);
++ sshbuf_free(server_pubkey);
++ return r;
++}
++
++int
++kexgssgex_server(struct ssh *ssh)
++{
++ struct kex *kex = ssh->kex;
++ OM_uint32 maj_status, min_status;
++
++ /*
++ * Some GSSAPI implementations use the input value of ret_flags (an
++ * output variable) as a means of triggering mechanism specific
++ * features. Initializing it to zero avoids inadvertently
++ * activating this non-standard behaviour.
++ */
++
++ OM_uint32 ret_flags = 0;
++ gss_buffer_desc gssbuf, recv_tok, msg_tok;
++ gss_buffer_desc send_tok = GSS_C_EMPTY_BUFFER;
++ Gssctxt *ctxt = NULL;
++ struct sshbuf *shared_secret = NULL;
++ int type = 0;
++ gss_OID oid;
++ char *mechs;
++ u_char hash[SSH_DIGEST_MAX_LENGTH];
++ size_t hashlen;
++ BIGNUM *dh_client_pub = NULL;
++ const BIGNUM *pub_key, *dh_p, *dh_g;
++ int min = -1, max = -1, nbits = -1;
++ int cmin = -1, cmax = -1; /* client proposal */
++ struct sshbuf *empty = sshbuf_new();
++ int r;
++
++ /* Initialise GSSAPI */
++
++ /* If we're rekeying, privsep means that some of the private structures
++ * in the GSSAPI code are no longer available. This kludges them back
++ * into life
++ */
++ if (!ssh_gssapi_oid_table_ok())
++ if ((mechs = ssh_gssapi_server_mechanisms()))
++ free(mechs);
++
++ debug2_f("Identifying %s", kex->name);
++ oid = ssh_gssapi_id_kex(NULL, kex->name, kex->kex_type);
++ if (oid == GSS_C_NO_OID)
++ fatal("Unknown gssapi mechanism");
++
++ debug2_f("Acquiring credentials");
++
++ if (GSS_ERROR(PRIVSEP(ssh_gssapi_server_ctx(&ctxt, oid))))
++ fatal("Unable to acquire credentials for the server");
++
++ /* 5. S generates an ephemeral key pair (do the allocations early) */
++ debug("Doing group exchange");
++ ssh_packet_read_expect(ssh, SSH2_MSG_KEXGSS_GROUPREQ);
++ /* store client proposal to provide valid signature */
++ if ((r = sshpkt_get_u32(ssh, &cmin)) != 0 ||
++ (r = sshpkt_get_u32(ssh, &nbits)) != 0 ||
++ (r = sshpkt_get_u32(ssh, &cmax)) != 0 ||
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ kex->nbits = nbits;
++ kex->min = cmin;
++ kex->max = cmax;
++ min = MAX(DH_GRP_MIN, cmin);
++ max = MIN(DH_GRP_MAX, cmax);
++ nbits = MAXIMUM(DH_GRP_MIN, nbits);
++ nbits = MINIMUM(DH_GRP_MAX, nbits);
++ if (max < min || nbits < min || max < nbits)
++ fatal("GSS_GEX, bad parameters: %d !< %d !< %d",
++ min, nbits, max);
++ kex->dh = PRIVSEP(choose_dh(min, nbits, max));
++ if (kex->dh == NULL) {
++ sshpkt_disconnect(ssh, "Protocol error: no matching group found");
++ fatal("Protocol error: no matching group found");
++ }
++
++ DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_GROUP)) != 0 ||
++ (r = sshpkt_put_bignum2(ssh, dh_p)) != 0 ||
++ (r = sshpkt_put_bignum2(ssh, dh_g)) != 0 ||
++ (r = sshpkt_send(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++
++ if ((r = ssh_packet_write_wait(ssh)) != 0)
++ fatal("ssh_packet_write_wait: %s", ssh_err(r));
++
++ /* Compute our exchange value in parallel with the client */
++ if ((r = dh_gen_key(kex->dh, kex->we_need * 8)) != 0)
++ goto out;
++
++ do {
++ debug("Wait SSH2_MSG_GSSAPI_INIT");
++ type = ssh_packet_read(ssh);
++ switch(type) {
++ case SSH2_MSG_KEXGSS_INIT:
++ if (dh_client_pub != NULL)
++ fatal("Received KEXGSS_INIT after initialising");
++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
++ &recv_tok)) != 0 ||
++ (r = sshpkt_get_bignum2(ssh, &dh_client_pub)) != 0 ||
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++
++ /* Send SSH_MSG_KEXGSS_HOSTKEY here, if we want */
++ break;
++ case SSH2_MSG_KEXGSS_CONTINUE:
++ if ((r = ssh_gssapi_sshpkt_get_buffer_desc(ssh,
++ &recv_tok)) != 0 ||
++ (r = sshpkt_get_end(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ break;
++ default:
++ sshpkt_disconnect(ssh,
++ "Protocol error: didn't expect packet type %d",
++ type);
++ }
++
++ maj_status = PRIVSEP(ssh_gssapi_accept_ctx(ctxt, &recv_tok,
++ &send_tok, &ret_flags));
++
++ gss_release_buffer(&min_status, &recv_tok);
++
++ if (maj_status != GSS_S_COMPLETE && send_tok.length == 0)
++ fatal("Zero length token output when incomplete");
++
++ if (dh_client_pub == NULL)
++ fatal("No client public key");
++
++ if (maj_status & GSS_S_CONTINUE_NEEDED) {
++ debug("Sending GSSAPI_CONTINUE");
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
++ (r = sshpkt_put_string(ssh, send_tok.value, send_tok.length)) != 0 ||
++ (r = sshpkt_send(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ gss_release_buffer(&min_status, &send_tok);
++ }
++ } while (maj_status & GSS_S_CONTINUE_NEEDED);
++
++ if (GSS_ERROR(maj_status)) {
++ if (send_tok.length > 0) {
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_CONTINUE)) != 0 ||
++ (r = sshpkt_put_string(ssh, send_tok.value, send_tok.length)) != 0 ||
++ (r = sshpkt_send(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ }
++ fatal("accept_ctx died");
++ }
++
++ if (!(ret_flags & GSS_C_MUTUAL_FLAG))
++ fatal("Mutual Authentication flag wasn't set");
++
++ if (!(ret_flags & GSS_C_INTEG_FLAG))
++ fatal("Integrity flag wasn't set");
++
++ /* calculate shared secret */
++ if ((shared_secret = sshbuf_new()) == NULL) {
++ r = SSH_ERR_ALLOC_FAIL;
++ goto out;
++ }
++ if ((r = kex_dh_compute_key(kex, dh_client_pub, shared_secret)) != 0)
++ goto out;
++
++ DH_get0_key(kex->dh, &pub_key, NULL);
++ DH_get0_pqg(kex->dh, &dh_p, NULL, &dh_g);
++ hashlen = sizeof(hash);
++ if ((r = kexgex_hash(
++ kex->hash_alg,
++ kex->client_version,
++ kex->server_version,
++ kex->peer,
++ kex->my,
++ empty,
++ cmin, nbits, cmax,
++ dh_p, dh_g,
++ dh_client_pub,
++ pub_key,
++ sshbuf_ptr(shared_secret), sshbuf_len(shared_secret),
++ hash, &hashlen)) != 0)
++ fatal("kexgex_hash failed: %s", ssh_err(r));
++
++ gssbuf.value = hash;
++ gssbuf.length = hashlen;
++
++ if (GSS_ERROR(PRIVSEP(ssh_gssapi_sign(ctxt, &gssbuf, &msg_tok))))
++ fatal("Couldn't get MIC");
++
++ if ((r = sshpkt_start(ssh, SSH2_MSG_KEXGSS_COMPLETE)) != 0 ||
++ (r = sshpkt_put_bignum2(ssh, pub_key)) != 0 ||
++ (r = sshpkt_put_string(ssh, msg_tok.value, msg_tok.length)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++
++ if (send_tok.length != 0) {
++ if ((r = sshpkt_put_u8(ssh, 1)) != 0 || /* true */
++ (r = sshpkt_put_string(ssh, send_tok.value, send_tok.length)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++ } else {
++ if ((r = sshpkt_put_u8(ssh, 0)) != 0) /* false */
++ fatal("sshpkt failed: %s", ssh_err(r));
++ }
++ if ((r = sshpkt_send(ssh)) != 0)
++ fatal("sshpkt failed: %s", ssh_err(r));
++
++ gss_release_buffer(&min_status, &send_tok);
++ gss_release_buffer(&min_status, &msg_tok);
++
++ if (gss_kex_context == NULL)
++ gss_kex_context = ctxt;
++ else
++ ssh_gssapi_delete_ctx(&ctxt);
++
++ /* Finally derive the keys and send them */
++ if ((r = kex_derive_keys(ssh, hash, hashlen, shared_secret)) == 0)
++ r = kex_send_newkeys(ssh);
++
++ /* If this was a rekey, then save out any delegated credentials we
++ * just exchanged. */
++ if (options.gss_store_rekey)
++ ssh_gssapi_rekey_creds();
++out:
++ sshbuf_free(empty);
++ explicit_bzero(hash, sizeof(hash));
++ DH_free(kex->dh);
++ kex->dh = NULL;
++ BN_clear_free(dh_client_pub);
++ sshbuf_free(shared_secret);
++ return r;
++}
++#endif /* defined(GSSAPI) && defined(WITH_OPENSSL) */
+diff --git a/monitor.c b/monitor.c
+index 91e0e6245..5f7df9539 100644
+--- a/monitor.c
++++ b/monitor.c
+@@ -145,6 +145,8 @@ int mm_answer_gss_setup_ctx(struct ssh *, int, struct sshbuf *);
+ int mm_answer_gss_accept_ctx(struct ssh *, int, struct sshbuf *);
+ int mm_answer_gss_userok(struct ssh *, int, struct sshbuf *);
+ int mm_answer_gss_checkmic(struct ssh *, int, struct sshbuf *);
++int mm_answer_gss_sign(struct ssh *, int, struct sshbuf *);
++int mm_answer_gss_updatecreds(struct ssh *, int, struct sshbuf *);
+ #endif
+
+ #ifdef SSH_AUDIT_EVENTS
+@@ -217,11 +219,18 @@ struct mon_table mon_dispatch_proto20[] = {
+ {MONITOR_REQ_GSSSTEP, 0, mm_answer_gss_accept_ctx},
+ {MONITOR_REQ_GSSUSEROK, MON_ONCE|MON_AUTHDECIDE, mm_answer_gss_userok},
+ {MONITOR_REQ_GSSCHECKMIC, MON_ONCE, mm_answer_gss_checkmic},
++ {MONITOR_REQ_GSSSIGN, MON_ONCE, mm_answer_gss_sign},
+ #endif
+ {0, 0, NULL}
+ };
+
+ struct mon_table mon_dispatch_postauth20[] = {
++#ifdef GSSAPI
++ {MONITOR_REQ_GSSSETUP, 0, mm_answer_gss_setup_ctx},
++ {MONITOR_REQ_GSSSTEP, 0, mm_answer_gss_accept_ctx},
++ {MONITOR_REQ_GSSSIGN, 0, mm_answer_gss_sign},
++ {MONITOR_REQ_GSSUPCREDS, 0, mm_answer_gss_updatecreds},
++#endif
+ #ifdef WITH_OPENSSL
+ {MONITOR_REQ_MODULI, 0, mm_answer_moduli},
+ #endif
+@@ -290,6 +299,10 @@ monitor_child_preauth(struct ssh *ssh, struct monitor *pmonitor)
+ /* Permit requests for moduli and signatures */
+ monitor_permit(mon_dispatch, MONITOR_REQ_MODULI, 1);
+ monitor_permit(mon_dispatch, MONITOR_REQ_SIGN, 1);
++#ifdef GSSAPI
++ /* and for the GSSAPI key exchange */
++ monitor_permit(mon_dispatch, MONITOR_REQ_GSSSETUP, 1);
++#endif
+
+ /* The first few requests do not require asynchronous access */
+ while (!authenticated) {
+@@ -401,6 +414,10 @@ monitor_child_postauth(struct ssh *ssh, struct monitor *pmonitor)
+ monitor_permit(mon_dispatch, MONITOR_REQ_MODULI, 1);
+ monitor_permit(mon_dispatch, MONITOR_REQ_SIGN, 1);
+ monitor_permit(mon_dispatch, MONITOR_REQ_TERM, 1);
++#ifdef GSSAPI
++ /* and for the GSSAPI key exchange */
++ monitor_permit(mon_dispatch, MONITOR_REQ_GSSSETUP, 1);
++#endif
+
+ if (auth_opts->permit_pty_flag) {
+ monitor_permit(mon_dispatch, MONITOR_REQ_PTY, 1);
+@@ -1744,6 +1761,17 @@ monitor_apply_keystate(struct ssh *ssh, struct monitor *pmonitor)
+ # ifdef OPENSSL_HAS_ECC
+ kex->kex[KEX_ECDH_SHA2] = kex_gen_server;
+ # endif
++# ifdef GSSAPI
++ if (options.gss_keyex) {
++ kex->kex[KEX_GSS_GRP1_SHA1] = kexgss_server;
++ kex->kex[KEX_GSS_GRP14_SHA1] = kexgss_server;
++ kex->kex[KEX_GSS_GRP14_SHA256] = kexgss_server;
++ kex->kex[KEX_GSS_GRP16_SHA512] = kexgss_server;
++ kex->kex[KEX_GSS_GEX_SHA1] = kexgssgex_server;
++ kex->kex[KEX_GSS_NISTP256_SHA256] = kexgss_server;
++ kex->kex[KEX_GSS_C25519_SHA256] = kexgss_server;
++ }
++# endif
+ #endif /* WITH_OPENSSL */
+ kex->kex[KEX_C25519_SHA256] = kex_gen_server;
+ kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server;
+@@ -1836,8 +1864,8 @@ mm_answer_gss_setup_ctx(struct ssh *ssh, int sock, struct sshbuf *m)
+ u_char *p;
+ int r;
+
+- if (!options.gss_authentication)
+- fatal_f("GSSAPI authentication not enabled");
++ if (!options.gss_authentication && !options.gss_keyex)
++ fatal_f("GSSAPI not enabled");
+
+ if ((r = sshbuf_get_string(m, &p, &len)) != 0)
+ fatal_fr(r, "parse");
+@@ -1869,8 +1897,8 @@ mm_answer_gss_accept_ctx(struct ssh *ssh, int sock, struct sshbuf *m)
+ OM_uint32 flags = 0; /* GSI needs this */
+ int r;
+
+- if (!options.gss_authentication)
+- fatal_f("GSSAPI authentication not enabled");
++ if (!options.gss_authentication && !options.gss_keyex)
++ fatal_f("GSSAPI not enabled");
+
+ if ((r = ssh_gssapi_get_buffer_desc(m, &in)) != 0)
+ fatal_fr(r, "ssh_gssapi_get_buffer_desc");
+@@ -1890,6 +1918,7 @@ mm_answer_gss_accept_ctx(struct ssh *ssh, int sock, struct sshbuf *m)
+ monitor_permit(mon_dispatch, MONITOR_REQ_GSSSTEP, 0);
+ monitor_permit(mon_dispatch, MONITOR_REQ_GSSUSEROK, 1);
+ monitor_permit(mon_dispatch, MONITOR_REQ_GSSCHECKMIC, 1);
++ monitor_permit(mon_dispatch, MONITOR_REQ_GSSSIGN, 1);
+ }
+ return (0);
+ }
+@@ -1901,8 +1930,8 @@ mm_answer_gss_checkmic(struct ssh *ssh, int sock, struct sshbuf *m)
+ OM_uint32 ret;
+ int r;
+
+- if (!options.gss_authentication)
+- fatal_f("GSSAPI authentication not enabled");
++ if (!options.gss_authentication && !options.gss_keyex)
++ fatal_f("GSSAPI not enabled");
+
+ if ((r = ssh_gssapi_get_buffer_desc(m, &gssbuf)) != 0 ||
+ (r = ssh_gssapi_get_buffer_desc(m, &mic)) != 0)
+@@ -1928,13 +1957,17 @@ mm_answer_gss_checkmic(struct ssh *ssh, int sock, struct sshbuf *m)
+ int
+ mm_answer_gss_userok(struct ssh *ssh, int sock, struct sshbuf *m)
+ {
+- int r, authenticated;
++ int r, authenticated, kex;
+ const char *displayname;
+
+- if (!options.gss_authentication)
+- fatal_f("GSSAPI authentication not enabled");
++ if (!options.gss_authentication && !options.gss_keyex)
++ fatal_f("GSSAPI not enabled");
+
+- authenticated = authctxt->valid && ssh_gssapi_userok(authctxt->user);
++ if ((r = sshbuf_get_u32(m, &kex)) != 0)
++ fatal_fr(r, "buffer error");
++
++ authenticated = authctxt->valid &&
++ ssh_gssapi_userok(authctxt->user, authctxt->pw, kex);
+
+ sshbuf_reset(m);
+ if ((r = sshbuf_put_u32(m, authenticated)) != 0)
+@@ -1943,7 +1976,11 @@ mm_answer_gss_userok(struct ssh *ssh, int sock, struct sshbuf *m)
+ debug3_f("sending result %d", authenticated);
+ mm_request_send(sock, MONITOR_ANS_GSSUSEROK, m);
+
+- auth_method = "gssapi-with-mic";
++ if (kex) {
++ auth_method = "gssapi-keyex";
++ } else {
++ auth_method = "gssapi-with-mic";
++ }
+
+ if ((displayname = ssh_gssapi_displayname()) != NULL)
+ auth2_record_info(authctxt, "%s", displayname);
+@@ -1951,5 +1988,83 @@ mm_answer_gss_userok(struct ssh *ssh, int sock, struct sshbuf *m)
+ /* Monitor loop will terminate if authenticated */
+ return (authenticated);
+ }
+-#endif /* GSSAPI */
+
++int
++mm_answer_gss_sign(struct ssh *ssh, int socket, struct sshbuf *m)
++{
++ gss_buffer_desc data;
++ gss_buffer_desc hash = GSS_C_EMPTY_BUFFER;
++ OM_uint32 major, minor;
++ size_t len;
++ u_char *p = NULL;
++ int r;
++
++ if (!options.gss_authentication && !options.gss_keyex)
++ fatal_f("GSSAPI not enabled");
++
++ if ((r = sshbuf_get_string(m, &p, &len)) != 0)
++ fatal_fr(r, "buffer error");
++ data.value = p;
++ data.length = len;
++ /* Lengths of SHA-1, SHA-256 and SHA-512 hashes that are used */
++ if (data.length != 20 && data.length != 32 && data.length != 64)
++ fatal_f("data length incorrect: %d", (int) data.length);
++
++ /* Save the session ID on the first time around */
++ if (session_id2_len == 0) {
++ session_id2_len = data.length;
++ session_id2 = xmalloc(session_id2_len);
++ memcpy(session_id2, data.value, session_id2_len);
++ }
++ major = ssh_gssapi_sign(gsscontext, &data, &hash);
++
++ free(data.value);
++
++ sshbuf_reset(m);
++
++ if ((r = sshbuf_put_u32(m, major)) != 0 ||
++ (r = sshbuf_put_string(m, hash.value, hash.length)) != 0)
++ fatal_fr(r, "buffer error");
++
++ mm_request_send(socket, MONITOR_ANS_GSSSIGN, m);
++
++ gss_release_buffer(&minor, &hash);
++
++ /* Turn on getpwnam permissions */
++ monitor_permit(mon_dispatch, MONITOR_REQ_PWNAM, 1);
++
++ /* And credential updating, for when rekeying */
++ monitor_permit(mon_dispatch, MONITOR_REQ_GSSUPCREDS, 1);
++
++ return (0);
++}
++
++int
++mm_answer_gss_updatecreds(struct ssh *ssh, int socket, struct sshbuf *m) {
++ ssh_gssapi_ccache store;
++ int r, ok;
++
++ if (!options.gss_authentication && !options.gss_keyex)
++ fatal_f("GSSAPI not enabled");
++
++ if ((r = sshbuf_get_string(m, (u_char **)&store.filename, NULL)) != 0 ||
++ (r = sshbuf_get_string(m, (u_char **)&store.envvar, NULL)) != 0 ||
++ (r = sshbuf_get_string(m, (u_char **)&store.envval, NULL)) != 0)
++ fatal_fr(r, "buffer error");
++
++ ok = ssh_gssapi_update_creds(&store);
++
++ free(store.filename);
++ free(store.envvar);
++ free(store.envval);
++
++ sshbuf_reset(m);
++ if ((r = sshbuf_put_u32(m, ok)) != 0)
++ fatal_fr(r, "buffer error");
++
++ mm_request_send(socket, MONITOR_ANS_GSSUPCREDS, m);
++
++ return(0);
++}
++
++#endif /* GSSAPI */
+diff --git a/monitor.h b/monitor.h
+index 683e5e071..2b1a2d590 100644
+--- a/monitor.h
++++ b/monitor.h
+@@ -63,6 +63,8 @@ enum monitor_reqtype {
+ MONITOR_REQ_PAM_FREE_CTX = 110, MONITOR_ANS_PAM_FREE_CTX = 111,
+ MONITOR_REQ_AUDIT_EVENT = 112, MONITOR_REQ_AUDIT_COMMAND = 113,
+
++ MONITOR_REQ_GSSSIGN = 150, MONITOR_ANS_GSSSIGN = 151,
++ MONITOR_REQ_GSSUPCREDS = 152, MONITOR_ANS_GSSUPCREDS = 153,
+ };
+
+ struct ssh;
+diff --git a/monitor_wrap.c b/monitor_wrap.c
+index 8e379a15c..a4b66c56f 100644
+--- a/monitor_wrap.c
++++ b/monitor_wrap.c
+@@ -1000,13 +1000,15 @@ mm_ssh_gssapi_checkmic(Gssctxt *ctx, gss_buffer_t gssbuf, gss_buffer_t gssmic)
+ }
+
+ int
+-mm_ssh_gssapi_userok(char *user)
++mm_ssh_gssapi_userok(char *user, struct passwd *pw, int kex)
+ {
+ struct sshbuf *m;
+ int r, authenticated = 0;
+
+ if ((m = sshbuf_new()) == NULL)
+ fatal_f("sshbuf_new failed");
++ if ((r = sshbuf_put_u32(m, kex)) != 0)
++ fatal_fr(r, "buffer error");
+
+ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSUSEROK, m);
+ mm_request_receive_expect(pmonitor->m_recvfd,
+@@ -1019,4 +1021,57 @@ mm_ssh_gssapi_userok(char *user)
+ debug3_f("user %sauthenticated", authenticated ? "" : "not ");
+ return (authenticated);
+ }
++
++OM_uint32
++mm_ssh_gssapi_sign(Gssctxt *ctx, gss_buffer_desc *data, gss_buffer_desc *hash)
++{
++ struct sshbuf *m;
++ OM_uint32 major;
++ int r;
++
++ if ((m = sshbuf_new()) == NULL)
++ fatal_f("sshbuf_new failed");
++ if ((r = sshbuf_put_string(m, data->value, data->length)) != 0)
++ fatal_fr(r, "buffer error");
++
++ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSSIGN, m);
++ mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSSIGN, m);
++
++ if ((r = sshbuf_get_u32(m, &major)) != 0 ||
++ (r = ssh_gssapi_get_buffer_desc(m, hash)) != 0)
++ fatal_fr(r, "buffer error");
++
++ sshbuf_free(m);
++
++ return (major);
++}
++
++int
++mm_ssh_gssapi_update_creds(ssh_gssapi_ccache *store)
++{
++ struct sshbuf *m;
++ int r, ok;
++
++ if ((m = sshbuf_new()) == NULL)
++ fatal_f("sshbuf_new failed");
++
++ if ((r = sshbuf_put_cstring(m,
++ store->filename ? store->filename : "")) != 0 ||
++ (r = sshbuf_put_cstring(m,
++ store->envvar ? store->envvar : "")) != 0 ||
++ (r = sshbuf_put_cstring(m,
++ store->envval ? store->envval : "")) != 0)
++ fatal_fr(r, "buffer error");
++
++ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_GSSUPCREDS, m);
++ mm_request_receive_expect(pmonitor->m_recvfd, MONITOR_ANS_GSSUPCREDS, m);
++
++ if ((r = sshbuf_get_u32(m, &ok)) != 0)
++ fatal_fr(r, "buffer error");
++
++ sshbuf_free(m);
++
++ return (ok);
++}
++
+ #endif /* GSSAPI */
+diff --git a/monitor_wrap.h b/monitor_wrap.h
+index 0df49c25b..830fdb308 100644
+--- a/monitor_wrap.h
++++ b/monitor_wrap.h
+@@ -65,8 +65,10 @@ int mm_sshkey_verify(const struct sshkey *, const u_char *, size_t,
+ OM_uint32 mm_ssh_gssapi_server_ctx(Gssctxt **, gss_OID);
+ OM_uint32 mm_ssh_gssapi_accept_ctx(Gssctxt *,
+ gss_buffer_desc *, gss_buffer_desc *, OM_uint32 *);
+-int mm_ssh_gssapi_userok(char *user);
++int mm_ssh_gssapi_userok(char *user, struct passwd *, int kex);
+ OM_uint32 mm_ssh_gssapi_checkmic(Gssctxt *, gss_buffer_t, gss_buffer_t);
++OM_uint32 mm_ssh_gssapi_sign(Gssctxt *, gss_buffer_t, gss_buffer_t);
++int mm_ssh_gssapi_update_creds(ssh_gssapi_ccache *);
+ #endif
+
+ #ifdef USE_PAM
+diff --git a/readconf.c b/readconf.c
+index cf7949884..55af0115d 100644
+--- a/readconf.c
++++ b/readconf.c
+@@ -67,6 +67,7 @@
+ #include "uidswap.h"
+ #include "myproposal.h"
+ #include "digest.h"
++#include "ssh-gss.h"
+
+ /* Format of the configuration file:
+
+@@ -161,6 +162,8 @@ typedef enum {
+ oClearAllForwardings, oNoHostAuthenticationForLocalhost,
+ oEnableSSHKeysign, oRekeyLimit, oVerifyHostKeyDNS, oConnectTimeout,
+ oAddressFamily, oGssAuthentication, oGssDelegateCreds,
++ oGssTrustDns, oGssKeyEx, oGssClientIdentity, oGssRenewalRekey,
++ oGssServerIdentity, oGssKexAlgorithms,
+ oServerAliveInterval, oServerAliveCountMax, oIdentitiesOnly,
+ oSendEnv, oSetEnv, oControlPath, oControlMaster, oControlPersist,
+ oHashKnownHosts,
+@@ -207,10 +210,22 @@ static struct {
+ /* Sometimes-unsupported options */
+ #if defined(GSSAPI)
+ { "gssapiauthentication", oGssAuthentication },
++ { "gssapikeyexchange", oGssKeyEx },
+ { "gssapidelegatecredentials", oGssDelegateCreds },
++ { "gssapitrustdns", oGssTrustDns },
++ { "gssapiclientidentity", oGssClientIdentity },
++ { "gssapiserveridentity", oGssServerIdentity },
++ { "gssapirenewalforcesrekey", oGssRenewalRekey },
++ { "gssapikexalgorithms", oGssKexAlgorithms },
+ # else
+ { "gssapiauthentication", oUnsupported },
++ { "gssapikeyexchange", oUnsupported },
+ { "gssapidelegatecredentials", oUnsupported },
++ { "gssapitrustdns", oUnsupported },
++ { "gssapiclientidentity", oUnsupported },
++ { "gssapiserveridentity", oUnsupported },
++ { "gssapirenewalforcesrekey", oUnsupported },
++ { "gssapikexalgorithms", oUnsupported },
+ #endif
+ #ifdef ENABLE_PKCS11
+ { "pkcs11provider", oPKCS11Provider },
+@@ -1122,10 +1137,46 @@ parse_time:
+ intptr = &options->gss_authentication;
+ goto parse_flag;
+
++ case oGssKeyEx:
++ intptr = &options->gss_keyex;
++ goto parse_flag;
++
+ case oGssDelegateCreds:
+ intptr = &options->gss_deleg_creds;
+ goto parse_flag;
+
++ case oGssTrustDns:
++ intptr = &options->gss_trust_dns;
++ goto parse_flag;
++
++ case oGssClientIdentity:
++ charptr = &options->gss_client_identity;
++ goto parse_string;
++
++ case oGssServerIdentity:
++ charptr = &options->gss_server_identity;
++ goto parse_string;
++
++ case oGssRenewalRekey:
++ intptr = &options->gss_renewal_rekey;
++ goto parse_flag;
++
++ case oGssKexAlgorithms:
++ arg = argv_next(&ac, &av);
++ if (!arg || *arg == '\0') {
++ error("%.200s line %d: Missing argument.",
++ filename, linenum);
++ goto out;
++ }
++ if (!kex_gss_names_valid(arg)) {
++ error("%.200s line %d: Bad GSSAPI KexAlgorithms '%s'.",
++ filename, linenum, arg ? arg : "<NONE>");
++ goto out;
++ }
++ if (*activep && options->gss_kex_algorithms == NULL)
++ options->gss_kex_algorithms = xstrdup(arg);
++ break;
++
+ case oBatchMode:
+ intptr = &options->batch_mode;
+ goto parse_flag;
+@@ -2343,7 +2394,13 @@ initialize_options(Options * options)
+ options->fwd_opts.streamlocal_bind_unlink = -1;
+ options->pubkey_authentication = -1;
+ options->gss_authentication = -1;
++ options->gss_keyex = -1;
+ options->gss_deleg_creds = -1;
++ options->gss_trust_dns = -1;
++ options->gss_renewal_rekey = -1;
++ options->gss_client_identity = NULL;
++ options->gss_server_identity = NULL;
++ options->gss_kex_algorithms = NULL;
+ options->password_authentication = -1;
+ options->kbd_interactive_authentication = -1;
+ options->kbd_interactive_devices = NULL;
+@@ -2502,8 +2559,18 @@ fill_default_options(Options * options)
+ options->pubkey_authentication = SSH_PUBKEY_AUTH_ALL;
+ if (options->gss_authentication == -1)
+ options->gss_authentication = 0;
++ if (options->gss_keyex == -1)
++ options->gss_keyex = 0;
+ if (options->gss_deleg_creds == -1)
+ options->gss_deleg_creds = 0;
++ if (options->gss_trust_dns == -1)
++ options->gss_trust_dns = 0;
++ if (options->gss_renewal_rekey == -1)
++ options->gss_renewal_rekey = 0;
++#ifdef GSSAPI
++ if (options->gss_kex_algorithms == NULL)
++ options->gss_kex_algorithms = strdup(GSS_KEX_DEFAULT_KEX);
++#endif
+ if (options->password_authentication == -1)
+ options->password_authentication = 1;
+ if (options->kbd_interactive_authentication == -1)
+@@ -3301,7 +3368,14 @@ dump_client_config(Options *o, const char *host)
+ dump_cfg_fmtint(oGatewayPorts, o->fwd_opts.gateway_ports);
+ #ifdef GSSAPI
+ dump_cfg_fmtint(oGssAuthentication, o->gss_authentication);
++ dump_cfg_fmtint(oGssKeyEx, o->gss_keyex);
+ dump_cfg_fmtint(oGssDelegateCreds, o->gss_deleg_creds);
++ dump_cfg_fmtint(oGssTrustDns, o->gss_trust_dns);
++ dump_cfg_fmtint(oGssRenewalRekey, o->gss_renewal_rekey);
++ dump_cfg_string(oGssClientIdentity, o->gss_client_identity);
++ dump_cfg_string(oGssServerIdentity, o->gss_server_identity);
++ dump_cfg_string(oGssKexAlgorithms, o->gss_kex_algorithms ?
++ o->gss_kex_algorithms : GSS_KEX_DEFAULT_KEX);
+ #endif /* GSSAPI */
+ dump_cfg_fmtint(oHashKnownHosts, o->hash_known_hosts);
+ dump_cfg_fmtint(oHostbasedAuthentication, o->hostbased_authentication);
+diff --git a/readconf.h b/readconf.h
+index 2ce1b4c33..d0eb92362 100644
+--- a/readconf.h
++++ b/readconf.h
+@@ -40,7 +40,13 @@ typedef struct {
+ int pubkey_authentication; /* Try ssh2 pubkey authentication. */
+ int hostbased_authentication; /* ssh2's rhosts_rsa */
+ int gss_authentication; /* Try GSS authentication */
++ int gss_keyex; /* Try GSS key exchange */
+ int gss_deleg_creds; /* Delegate GSS credentials */
++ int gss_trust_dns; /* Trust DNS for GSS canonicalization */
++ int gss_renewal_rekey; /* Credential renewal forces rekey */
++ char *gss_client_identity; /* Principal to initiate GSSAPI with */
++ char *gss_server_identity; /* GSSAPI target principal */
++ char *gss_kex_algorithms; /* GSSAPI kex methods to be offered by client. */
+ int password_authentication; /* Try password
+ * authentication. */
+ int kbd_interactive_authentication; /* Try keyboard-interactive auth. */
+diff --git a/servconf.c b/servconf.c
+index 2e039da8b..940de9e15 100644
+--- a/servconf.c
++++ b/servconf.c
+@@ -70,6 +70,7 @@
+ #include "auth.h"
+ #include "myproposal.h"
+ #include "digest.h"
++#include "ssh-gss.h"
+
+ static void add_listen_addr(ServerOptions *, const char *,
+ const char *, int);
+@@ -136,8 +137,11 @@ initialize_server_options(ServerOptions *options)
+ options->kerberos_ticket_cleanup = -1;
+ options->kerberos_get_afs_token = -1;
+ options->gss_authentication=-1;
++ options->gss_keyex = -1;
+ options->gss_cleanup_creds = -1;
+ options->gss_strict_acceptor = -1;
++ options->gss_store_rekey = -1;
++ options->gss_kex_algorithms = NULL;
+ options->password_authentication = -1;
+ options->kbd_interactive_authentication = -1;
+ options->permit_empty_passwd = -1;
+@@ -360,10 +364,18 @@ fill_default_server_options(ServerOptions *options)
+ options->kerberos_get_afs_token = 0;
+ if (options->gss_authentication == -1)
+ options->gss_authentication = 0;
++ if (options->gss_keyex == -1)
++ options->gss_keyex = 0;
+ if (options->gss_cleanup_creds == -1)
+ options->gss_cleanup_creds = 1;
+ if (options->gss_strict_acceptor == -1)
+ options->gss_strict_acceptor = 1;
++ if (options->gss_store_rekey == -1)
++ options->gss_store_rekey = 0;
++#ifdef GSSAPI
++ if (options->gss_kex_algorithms == NULL)
++ options->gss_kex_algorithms = strdup(GSS_KEX_DEFAULT_KEX);
++#endif
+ if (options->password_authentication == -1)
+ options->password_authentication = 1;
+ if (options->kbd_interactive_authentication == -1)
+@@ -520,6 +532,7 @@ typedef enum {
+ sHostKeyAlgorithms, sPerSourceMaxStartups, sPerSourceNetBlockSize,
+ sClientAliveInterval, sClientAliveCountMax, sAuthorizedKeysFile,
+ sGssAuthentication, sGssCleanupCreds, sGssStrictAcceptor,
++ sGssKeyEx, sGssKexAlgorithms, sGssStoreRekey,
+ sAcceptEnv, sSetEnv, sPermitTunnel,
+ sMatch, sPermitOpen, sPermitListen, sForceCommand, sChrootDirectory,
+ sUsePrivilegeSeparation, sAllowAgentForwarding,
+@@ -602,12 +615,22 @@ static struct {
+ #ifdef GSSAPI
+ { "gssapiauthentication", sGssAuthentication, SSHCFG_ALL },
+ { "gssapicleanupcredentials", sGssCleanupCreds, SSHCFG_GLOBAL },
++ { "gssapicleanupcreds", sGssCleanupCreds, SSHCFG_GLOBAL },
+ { "gssapistrictacceptorcheck", sGssStrictAcceptor, SSHCFG_GLOBAL },
++ { "gssapikeyexchange", sGssKeyEx, SSHCFG_GLOBAL },
++ { "gssapistorecredentialsonrekey", sGssStoreRekey, SSHCFG_GLOBAL },
++ { "gssapikexalgorithms", sGssKexAlgorithms, SSHCFG_GLOBAL },
+ #else
+ { "gssapiauthentication", sUnsupported, SSHCFG_ALL },
+ { "gssapicleanupcredentials", sUnsupported, SSHCFG_GLOBAL },
++ { "gssapicleanupcreds", sUnsupported, SSHCFG_GLOBAL },
+ { "gssapistrictacceptorcheck", sUnsupported, SSHCFG_GLOBAL },
++ { "gssapikeyexchange", sUnsupported, SSHCFG_GLOBAL },
++ { "gssapistorecredentialsonrekey", sUnsupported, SSHCFG_GLOBAL },
++ { "gssapikexalgorithms", sUnsupported, SSHCFG_GLOBAL },
+ #endif
++ { "gssusesessionccache", sUnsupported, SSHCFG_GLOBAL },
++ { "gssapiusesessioncredcache", sUnsupported, SSHCFG_GLOBAL },
+ { "passwordauthentication", sPasswordAuthentication, SSHCFG_ALL },
+ { "kbdinteractiveauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL },
+ { "challengeresponseauthentication", sKbdInteractiveAuthentication, SSHCFG_ALL }, /* alias */
+@@ -1644,6 +1667,10 @@ process_server_config_line_depth(ServerOptions *options, char *line,
+ intptr = &options->gss_authentication;
+ goto parse_flag;
+
++ case sGssKeyEx:
++ intptr = &options->gss_keyex;
++ goto parse_flag;
++
+ case sGssCleanupCreds:
+ intptr = &options->gss_cleanup_creds;
+ goto parse_flag;
+@@ -1652,6 +1679,22 @@ process_server_config_line_depth(ServerOptions *options, char *line,
+ intptr = &options->gss_strict_acceptor;
+ goto parse_flag;
+
++ case sGssStoreRekey:
++ intptr = &options->gss_store_rekey;
++ goto parse_flag;
++
++ case sGssKexAlgorithms:
++ arg = argv_next(&ac, &av);
++ if (!arg || *arg == '\0')
++ fatal("%.200s line %d: Missing argument.",
++ filename, linenum);
++ if (!kex_gss_names_valid(arg))
++ fatal("%.200s line %d: Bad GSSAPI KexAlgorithms '%s'.",
++ filename, linenum, arg ? arg : "<NONE>");
++ if (*activep && options->gss_kex_algorithms == NULL)
++ options->gss_kex_algorithms = xstrdup(arg);
++ break;
++
+ case sPasswordAuthentication:
+ intptr = &options->password_authentication;
+ goto parse_flag;
+@@ -3018,6 +3061,10 @@ dump_config(ServerOptions *o)
+ #ifdef GSSAPI
+ dump_cfg_fmtint(sGssAuthentication, o->gss_authentication);
+ dump_cfg_fmtint(sGssCleanupCreds, o->gss_cleanup_creds);
++ dump_cfg_fmtint(sGssKeyEx, o->gss_keyex);
++ dump_cfg_fmtint(sGssStrictAcceptor, o->gss_strict_acceptor);
++ dump_cfg_fmtint(sGssStoreRekey, o->gss_store_rekey);
++ dump_cfg_string(sGssKexAlgorithms, o->gss_kex_algorithms);
+ #endif
+ dump_cfg_fmtint(sPasswordAuthentication, o->password_authentication);
+ dump_cfg_fmtint(sKbdInteractiveAuthentication,
+diff --git a/servconf.h b/servconf.h
+index 7ad43de87..38a68d576 100644
+--- a/servconf.h
++++ b/servconf.h
+@@ -141,8 +141,11 @@ typedef struct {
+ int kerberos_get_afs_token; /* If true, try to get AFS token if
+ * authenticated with Kerberos. */
+ int gss_authentication; /* If true, permit GSSAPI authentication */
++ int gss_keyex; /* If true, permit GSSAPI key exchange */
+ int gss_cleanup_creds; /* If true, destroy cred cache on logout */
+ int gss_strict_acceptor; /* If true, restrict the GSSAPI acceptor name */
++ int gss_store_rekey;
++ char *gss_kex_algorithms; /* GSSAPI kex methods to be offered by client. */
+ int password_authentication; /* If true, permit password
+ * authentication. */
+ int kbd_interactive_authentication; /* If true, permit */
+diff --git a/session.c b/session.c
+index f30d7ac51..96960f2da 100644
+--- a/session.c
++++ b/session.c
+@@ -2680,13 +2680,19 @@ do_cleanup(struct ssh *ssh, Authctxt *authctxt)
+
+ #ifdef KRB5
+ if (options.kerberos_ticket_cleanup &&
+- authctxt->krb5_ctx)
++ authctxt->krb5_ctx) {
++ temporarily_use_uid(authctxt->pw);
+ krb5_cleanup_proc(authctxt);
++ restore_uid();
++ }
+ #endif
+
+ #ifdef GSSAPI
+- if (options.gss_cleanup_creds)
++ if (options.gss_cleanup_creds) {
++ temporarily_use_uid(authctxt->pw);
+ ssh_gssapi_cleanup_creds();
++ restore_uid();
++ }
+ #endif
+
+ /* remove agent socket */
+diff --git a/ssh-gss.h b/ssh-gss.h
+index a8af117d2..6303ce185 100644
+--- a/ssh-gss.h
++++ b/ssh-gss.h
+@@ -1,6 +1,6 @@
+ /* $OpenBSD: ssh-gss.h,v 1.15 2021/01/27 10:05:28 djm Exp $ */
+ /*
+- * Copyright (c) 2001-2003 Simon Wilkinson. All rights reserved.
++ * Copyright (c) 2001-2009 Simon Wilkinson. All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+@@ -61,10 +61,34 @@
+
+ #define SSH_GSS_OIDTYPE 0x06
+
++#define SSH2_MSG_KEXGSS_INIT 30
++#define SSH2_MSG_KEXGSS_CONTINUE 31
++#define SSH2_MSG_KEXGSS_COMPLETE 32
++#define SSH2_MSG_KEXGSS_HOSTKEY 33
++#define SSH2_MSG_KEXGSS_ERROR 34
++#define SSH2_MSG_KEXGSS_GROUPREQ 40
++#define SSH2_MSG_KEXGSS_GROUP 41
++#define KEX_GSS_GRP1_SHA1_ID "gss-group1-sha1-"
++#define KEX_GSS_GRP14_SHA1_ID "gss-group14-sha1-"
++#define KEX_GSS_GRP14_SHA256_ID "gss-group14-sha256-"
++#define KEX_GSS_GRP16_SHA512_ID "gss-group16-sha512-"
++#define KEX_GSS_GEX_SHA1_ID "gss-gex-sha1-"
++#define KEX_GSS_NISTP256_SHA256_ID "gss-nistp256-sha256-"
++#define KEX_GSS_C25519_SHA256_ID "gss-curve25519-sha256-"
++
++#define GSS_KEX_DEFAULT_KEX \
++ KEX_GSS_GRP14_SHA256_ID "," \
++ KEX_GSS_GRP16_SHA512_ID "," \
++ KEX_GSS_NISTP256_SHA256_ID "," \
++ KEX_GSS_C25519_SHA256_ID "," \
++ KEX_GSS_GRP14_SHA1_ID "," \
++ KEX_GSS_GEX_SHA1_ID
++
+ typedef struct {
+ char *filename;
+ char *envvar;
+ char *envval;
++ struct passwd *owner;
+ void *data;
+ } ssh_gssapi_ccache;
+
+@@ -72,8 +96,11 @@ typedef struct {
+ gss_buffer_desc displayname;
+ gss_buffer_desc exportedname;
+ gss_cred_id_t creds;
++ gss_name_t name;
+ struct ssh_gssapi_mech_struct *mech;
+ ssh_gssapi_ccache store;
++ int used;
++ int updated;
+ } ssh_gssapi_client;
+
+ typedef struct ssh_gssapi_mech_struct {
+@@ -84,6 +111,7 @@ typedef struct ssh_gssapi_mech_struct {
+ int (*userok) (ssh_gssapi_client *, char *);
+ int (*localname) (ssh_gssapi_client *, char **);
+ void (*storecreds) (ssh_gssapi_client *);
++ int (*updatecreds) (ssh_gssapi_ccache *, ssh_gssapi_client *);
+ } ssh_gssapi_mech;
+
+ typedef struct {
+@@ -94,10 +122,11 @@ typedef struct {
+ gss_OID oid; /* client */
+ gss_cred_id_t creds; /* server */
+ gss_name_t client; /* server */
+- gss_cred_id_t client_creds; /* server */
++ gss_cred_id_t client_creds; /* both */
+ } Gssctxt;
+
+ extern ssh_gssapi_mech *supported_mechs[];
++extern Gssctxt *gss_kex_context;
+
+ int ssh_gssapi_check_oid(Gssctxt *, void *, size_t);
+ void ssh_gssapi_set_oid_data(Gssctxt *, void *, size_t);
+@@ -109,6 +138,7 @@ OM_uint32 ssh_gssapi_test_oid_supported(OM_uint32 *, gss_OID, int *);
+
+ struct sshbuf;
+ int ssh_gssapi_get_buffer_desc(struct sshbuf *, gss_buffer_desc *);
++int ssh_gssapi_sshpkt_get_buffer_desc(struct ssh *, gss_buffer_desc *);
+
+ OM_uint32 ssh_gssapi_import_name(Gssctxt *, const char *);
+ OM_uint32 ssh_gssapi_init_ctx(Gssctxt *, int,
+@@ -123,17 +153,33 @@ void ssh_gssapi_delete_ctx(Gssctxt **);
+ OM_uint32 ssh_gssapi_sign(Gssctxt *, gss_buffer_t, gss_buffer_t);
+ void ssh_gssapi_buildmic(struct sshbuf *, const char *,
+ const char *, const char *, const struct sshbuf *);
+-int ssh_gssapi_check_mechanism(Gssctxt **, gss_OID, const char *);
++int ssh_gssapi_check_mechanism(Gssctxt **, gss_OID, const char *, const char *);
++OM_uint32 ssh_gssapi_client_identity(Gssctxt *, const char *);
++int ssh_gssapi_credentials_updated(Gssctxt *);
+
+ /* In the server */
++typedef int ssh_gssapi_check_fn(Gssctxt **, gss_OID, const char *,
++ const char *);
++char *ssh_gssapi_client_mechanisms(const char *, const char *, const char *);
++char *ssh_gssapi_kex_mechs(gss_OID_set, ssh_gssapi_check_fn *, const char *,
++ const char *, const char *);
++gss_OID ssh_gssapi_id_kex(Gssctxt *, char *, int);
++int ssh_gssapi_server_check_mech(Gssctxt **,gss_OID, const char *,
++ const char *);
+ OM_uint32 ssh_gssapi_server_ctx(Gssctxt **, gss_OID);
+-int ssh_gssapi_userok(char *name);
++int ssh_gssapi_userok(char *name, struct passwd *, int kex);
+ OM_uint32 ssh_gssapi_checkmic(Gssctxt *, gss_buffer_t, gss_buffer_t);
+ void ssh_gssapi_do_child(char ***, u_int *);
+ void ssh_gssapi_cleanup_creds(void);
+ void ssh_gssapi_storecreds(void);
+ const char *ssh_gssapi_displayname(void);
+
++char *ssh_gssapi_server_mechanisms(void);
++int ssh_gssapi_oid_table_ok(void);
++
++int ssh_gssapi_update_creds(ssh_gssapi_ccache *store);
++void ssh_gssapi_rekey_creds(void);
++
+ #endif /* GSSAPI */
+
+ #endif /* _SSH_GSS_H */
+diff --git a/ssh-null.c b/ssh-null.c
+new file mode 100644
+index 000000000..a934bda77
+--- /dev/null
++++ b/ssh-null.c
+@@ -0,0 +1,108 @@
++/*
++ * Copyright (c) 2023 Colin Watson. All rights reserved.
++ *
++ * Redistribution and use in source and binary forms, with or without
++ * modification, are permitted provided that the following conditions
++ * are met:
++ * 1. Redistributions of source code must retain the above copyright
++ * notice, this list of conditions and the following disclaimer.
++ * 2. Redistributions in binary form must reproduce the above copyright
++ * notice, this list of conditions and the following disclaimer in the
++ * documentation and/or other materials provided with the distribution.
++ *
++ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
++ * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
++ * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
++ * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
++ * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
++ * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
++ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
++ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
++ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
++ * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
++ */
++
++#include "includes.h"
++
++#ifdef GSSAPI
++
++#include "sshbuf.h"
++#include "ssherr.h"
++#include "sshkey.h"
++
++static int
++ssh_null_equal(const struct sshkey *a, const struct sshkey *b)
++{
++ return 1;
++}
++
++static int
++ssh_null_serialize_public(const struct sshkey *key, struct sshbuf *b,
++ enum sshkey_serialize_rep opts)
++{
++ return SSH_ERR_KEY_TYPE_UNKNOWN;
++}
++
++static int
++ssh_null_deserialize_public(const char *ktype, struct sshbuf *b,
++ struct sshkey *key)
++{
++ return SSH_ERR_KEY_TYPE_UNKNOWN;
++}
++
++static int
++ssh_null_serialize_private(const struct sshkey *key, struct sshbuf *b,
++ enum sshkey_serialize_rep opts)
++{
++ return SSH_ERR_KEY_TYPE_UNKNOWN;
++}
++
++static int
++ssh_null_deserialize_private(const char *ktype, struct sshbuf *b,
++ struct sshkey *key)
++{
++ return SSH_ERR_KEY_TYPE_UNKNOWN;
++}
++
++static int
++ssh_null_copy_public(const struct sshkey *from, struct sshkey *to)
++{
++ return SSH_ERR_KEY_TYPE_UNKNOWN;
++}
++
++static int
++ssh_null_verify(const struct sshkey *key, const u_char *sig, size_t siglen,
++ const u_char *data, size_t dlen, const char *alg, u_int compat,
++ struct sshkey_sig_details **detailsp)
++{
++ return SSH_ERR_KEY_TYPE_UNKNOWN;
++}
++
++static const struct sshkey_impl_funcs sshkey_null_funcs = {
++ /* .size = */ NULL,
++ /* .alloc = */ NULL,
++ /* .cleanup = */ NULL,
++ /* .equal = */ ssh_null_equal,
++ /* .ssh_serialize_public = */ ssh_null_serialize_public,
++ /* .ssh_deserialize_public = */ ssh_null_deserialize_public,
++ /* .ssh_serialize_private = */ ssh_null_serialize_private,
++ /* .ssh_deserialize_private = */ ssh_null_deserialize_private,
++ /* .generate = */ NULL,
++ /* .copy_public = */ ssh_null_copy_public,
++ /* .sign = */ NULL,
++ /* .verify = */ ssh_null_verify,
++};
++
++const struct sshkey_impl sshkey_null_impl = {
++ /* .name = */ "null",
++ /* .shortname = */ "null",
++ /* .sigalg = */ NULL,
++ /* .type = */ KEY_NULL,
++ /* .nid = */ 0,
++ /* .cert = */ 0,
++ /* .sigonly = */ 0,
++ /* .keybits = */ 0,
++ /* .funcs = */ &sshkey_null_funcs,
++};
++
++#endif /* GSSAPI */
+diff --git a/ssh.1 b/ssh.1
+index a3d1ba163..dfd80b8bc 100644
+--- a/ssh.1
++++ b/ssh.1
+@@ -534,7 +534,13 @@ For full details of the options listed below, and their possible values, see
+ .It GatewayPorts
+ .It GlobalKnownHostsFile
+ .It GSSAPIAuthentication
++.It GSSAPIKeyExchange
++.It GSSAPIClientIdentity
+ .It GSSAPIDelegateCredentials
++.It GSSAPIKexAlgorithms
++.It GSSAPIRenewalForcesRekey
++.It GSSAPIServerIdentity
++.It GSSAPITrustDns
+ .It HashKnownHosts
+ .It Host
+ .It HostbasedAcceptedAlgorithms
+@@ -612,6 +618,8 @@ flag),
+ (supported message integrity codes),
+ .Ar kex
+ (key exchange algorithms),
++.Ar kex-gss
++(GSSAPI key exchange algorithms),
+ .Ar key
+ (key types),
+ .Ar key-cert
+diff --git a/ssh.c b/ssh.c
+index 87454b84a..855777d7f 100644
+--- a/ssh.c
++++ b/ssh.c
+@@ -787,6 +787,8 @@ main(int ac, char **av)
+ else if (strcmp(optarg, "kex") == 0 ||
+ strcasecmp(optarg, "KexAlgorithms") == 0)
+ cp = kex_alg_list('\n');
++ else if (strcmp(optarg, "kex-gss") == 0)
++ cp = kex_gss_alg_list('\n');
+ else if (strcmp(optarg, "key") == 0)
+ cp = sshkey_alg_list(0, 0, 0, '\n');
+ else if (strcmp(optarg, "key-cert") == 0)
+@@ -814,8 +816,8 @@ main(int ac, char **av)
+ } else if (strcmp(optarg, "help") == 0) {
+ cp = xstrdup(
+ "cipher\ncipher-auth\ncompression\nkex\n"
+- "key\nkey-cert\nkey-plain\nkey-sig\nmac\n"
+- "protocol-version\nsig");
++ "kex-gss\nkey\nkey-cert\nkey-plain\n"
++ "key-sig\nmac\nprotocol-version\nsig");
+ }
+ if (cp == NULL)
+ fatal("Unsupported query \"%s\"", optarg);
+diff --git a/ssh_config b/ssh_config
+index 842ea866c..52aae8692 100644
+--- a/ssh_config
++++ b/ssh_config
+@@ -24,6 +24,8 @@
+ # HostbasedAuthentication no
+ # GSSAPIAuthentication no
+ # GSSAPIDelegateCredentials no
++# GSSAPIKeyExchange no
++# GSSAPITrustDNS no
+ # BatchMode no
+ # CheckHostIP yes
+ # AddressFamily any
+diff --git a/ssh_config.5 b/ssh_config.5
+index 9eb6b9779..43f3b642c 100644
+--- a/ssh_config.5
++++ b/ssh_config.5
+@@ -839,10 +839,67 @@ The default is
+ Specifies whether user authentication based on GSSAPI is allowed.
+ The default is
+ .Cm no .
++.It Cm GSSAPIClientIdentity
++If set, specifies the GSSAPI client identity that ssh should use when
++connecting to the server. The default is unset, which means that the default
++identity will be used.
+ .It Cm GSSAPIDelegateCredentials
+ Forward (delegate) credentials to the server.
+ The default is
+ .Cm no .
++.It Cm GSSAPIKeyExchange
++Specifies whether key exchange based on GSSAPI may be used. When using
++GSSAPI key exchange the server need not have a host key.
++The default is
++.Dq no .
++.It Cm GSSAPIRenewalForcesRekey
++If set to
++.Dq yes
++then renewal of the client's GSSAPI credentials will force the rekeying of the
++ssh connection. With a compatible server, this will delegate the renewed
++credentials to a session on the server.
++.Pp
++Checks are made to ensure that credentials are only propagated when the new
++credentials match the old ones on the originating client and where the
++receiving server still has the old set in its cache.
++.Pp
++The default is
++.Dq no .
++.Pp
++For this to work
++.Cm GSSAPIKeyExchange
++needs to be enabled in the server and also used by the client.
++.It Cm GSSAPIServerIdentity
++If set, specifies the GSSAPI server identity that ssh should expect when
++connecting to the server. The default is unset, which means that the
++expected GSSAPI server identity will be determined from the target
++hostname.
++.It Cm GSSAPITrustDns
++Set to
++.Dq yes
++to indicate that the DNS is trusted to securely canonicalize
++the name of the host being connected to. If
++.Dq no ,
++the hostname entered on the
++command line will be passed untouched to the GSSAPI library.
++The default is
++.Dq no .
++.It Cm GSSAPIKexAlgorithms
++The list of key exchange algorithms that are offered for GSSAPI
++key exchange. Possible values are
++.Bd -literal -offset 3n
++gss-gex-sha1-,
++gss-group1-sha1-,
++gss-group14-sha1-,
++gss-group14-sha256-,
++gss-group16-sha512-,
++gss-nistp256-sha256-,
++gss-curve25519-sha256-
++.Ed
++.Pp
++The default is
++.Dq gss-group14-sha256-,gss-group16-sha512-,gss-nistp256-sha256-,gss-curve25519-sha256-,gss-gex-sha1-,gss-group14-sha1- .
++This option only applies to connections using GSSAPI.
+ .It Cm HashKnownHosts
+ Indicates that
+ .Xr ssh 1
+diff --git a/sshconnect2.c b/sshconnect2.c
+index 58fe98db2..cb6a94e76 100644
+--- a/sshconnect2.c
++++ b/sshconnect2.c
+@@ -81,8 +81,6 @@
+ #endif
+
+ /* import */
+-extern char *client_version_string;
+-extern char *server_version_string;
+ extern Options options;
+
+ /*
+@@ -226,6 +224,11 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port,
+ char *prop_kex = NULL, *prop_enc = NULL, *prop_hostkey = NULL;
+ int r, use_known_hosts_order = 0;
+
++#if defined(GSSAPI) && defined(WITH_OPENSSL)
++ char *orig = NULL, *gss = NULL;
++ char *gss_host = NULL;
++#endif
++
+ xxx_host = host;
+ xxx_hostaddr = hostaddr;
+ xxx_conn_info = cinfo;
+@@ -269,6 +272,42 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port,
+ compat_pkalg_proposal(ssh, options.hostkeyalgorithms);
+ }
+
++#if defined(GSSAPI) && defined(WITH_OPENSSL)
++ if (options.gss_keyex) {
++ /* Add the GSSAPI mechanisms currently supported on this
++ * client to the key exchange algorithm proposal */
++ orig = myproposal[PROPOSAL_KEX_ALGS];
++
++ if (options.gss_server_identity) {
++ gss_host = xstrdup(options.gss_server_identity);
++ } else if (options.gss_trust_dns) {
++ gss_host = remote_hostname(ssh);
++ /* Fall back to specified host if we are using proxy command
++ * and can not use DNS on that socket */
++ if (strcmp(gss_host, "UNKNOWN") == 0) {
++ free(gss_host);
++ gss_host = xstrdup(host);
++ }
++ } else {
++ gss_host = xstrdup(host);
++ }
++
++ gss = ssh_gssapi_client_mechanisms(gss_host,
++ options.gss_client_identity, options.gss_kex_algorithms);
++ if (gss) {
++ debug("Offering GSSAPI proposal: %s", gss);
++ xasprintf(&myproposal[PROPOSAL_KEX_ALGS],
++ "%s,%s", gss, orig);
++
++ /* If we've got GSSAPI algorithms, then we also support the
++ * 'null' hostkey, as a last resort */
++ orig = myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS];
++ xasprintf(&myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS],
++ "%s,null", orig);
++ }
++ }
++#endif
++
+ if (options.rekey_limit || options.rekey_interval)
+ ssh_packet_set_rekey_limits(ssh, options.rekey_limit,
+ options.rekey_interval);
+@@ -287,16 +326,46 @@ ssh_kex2(struct ssh *ssh, char *host, struct sockaddr *hostaddr, u_short port,
+ # ifdef OPENSSL_HAS_ECC
+ ssh->kex->kex[KEX_ECDH_SHA2] = kex_gen_client;
+ # endif
+-#endif
++# ifdef GSSAPI
++ if (options.gss_keyex) {
++ ssh->kex->kex[KEX_GSS_GRP1_SHA1] = kexgss_client;
++ ssh->kex->kex[KEX_GSS_GRP14_SHA1] = kexgss_client;
++ ssh->kex->kex[KEX_GSS_GRP14_SHA256] = kexgss_client;
++ ssh->kex->kex[KEX_GSS_GRP16_SHA512] = kexgss_client;
++ ssh->kex->kex[KEX_GSS_GEX_SHA1] = kexgssgex_client;
++ ssh->kex->kex[KEX_GSS_NISTP256_SHA256] = kexgss_client;
++ ssh->kex->kex[KEX_GSS_C25519_SHA256] = kexgss_client;
++ }
++# endif
++#endif /* WITH_OPENSSL */
+ ssh->kex->kex[KEX_C25519_SHA256] = kex_gen_client;
+ ssh->kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_client;
+ ssh->kex->verify_host_key=&verify_host_key_callback;
+
++#if defined(GSSAPI) && defined(WITH_OPENSSL)
++ if (options.gss_keyex) {
++ ssh->kex->gss_deleg_creds = options.gss_deleg_creds;
++ ssh->kex->gss_trust_dns = options.gss_trust_dns;
++ ssh->kex->gss_client = options.gss_client_identity;
++ ssh->kex->gss_host = gss_host;
++ }
++#endif
++
+ ssh_dispatch_run_fatal(ssh, DISPATCH_BLOCK, &ssh->kex->done);
+
+ /* remove ext-info from the KEX proposals for rekeying */
+ myproposal[PROPOSAL_KEX_ALGS] =
+ compat_kex_proposal(ssh, options.kex_algorithms);
++#if defined(GSSAPI) && defined(WITH_OPENSSL)
++ /* repair myproposal after it was crumpled by the */
++ /* ext-info removal above */
++ if (gss) {
++ orig = myproposal[PROPOSAL_KEX_ALGS];
++ xasprintf(&myproposal[PROPOSAL_KEX_ALGS],
++ "%s,%s", gss, orig);
++ free(gss);
++ }
++#endif
+ if ((r = kex_prop2buf(ssh->kex->my, myproposal)) != 0)
+ fatal_r(r, "kex_prop2buf");
+
+@@ -394,6 +463,7 @@ static int input_gssapi_response(int type, u_int32_t, struct ssh *);
+ static int input_gssapi_token(int type, u_int32_t, struct ssh *);
+ static int input_gssapi_error(int, u_int32_t, struct ssh *);
+ static int input_gssapi_errtok(int, u_int32_t, struct ssh *);
++static int userauth_gsskeyex(struct ssh *);
+ #endif
+
+ void userauth(struct ssh *, char *);
+@@ -410,6 +480,11 @@ static char *authmethods_get(void);
+
+ Authmethod authmethods[] = {
+ #ifdef GSSAPI
++ {"gssapi-keyex",
++ userauth_gsskeyex,
++ NULL,
++ &options.gss_keyex,
++ NULL},
+ {"gssapi-with-mic",
+ userauth_gssapi,
+ userauth_gssapi_cleanup,
+@@ -785,12 +860,32 @@ userauth_gssapi(struct ssh *ssh)
+ OM_uint32 min;
+ int r, ok = 0;
+ gss_OID mech = NULL;
++ char *gss_host = NULL;
++
++ if (options.gss_server_identity) {
++ gss_host = xstrdup(options.gss_server_identity);
++ } else if (options.gss_trust_dns) {
++ gss_host = remote_hostname(ssh);
++ /* Fall back to specified host if we are using proxy command
++ * and can not use DNS on that socket */
++ if (strcmp(gss_host, "UNKNOWN") == 0) {
++ free(gss_host);
++ gss_host = xstrdup(authctxt->host);
++ }
++ } else {
++ gss_host = xstrdup(authctxt->host);
++ }
+
+ /* Try one GSSAPI method at a time, rather than sending them all at
+ * once. */
+
+ if (authctxt->gss_supported_mechs == NULL)
+- gss_indicate_mechs(&min, &authctxt->gss_supported_mechs);
++ if (GSS_ERROR(gss_indicate_mechs(&min,
++ &authctxt->gss_supported_mechs))) {
++ authctxt->gss_supported_mechs = NULL;
++ free(gss_host);
++ return 0;
++ }
+
+ /* Check to see whether the mechanism is usable before we offer it */
+ while (authctxt->mech_tried < authctxt->gss_supported_mechs->count &&
+@@ -799,13 +894,15 @@ userauth_gssapi(struct ssh *ssh)
+ elements[authctxt->mech_tried];
+ /* My DER encoding requires length<128 */
+ if (mech->length < 128 && ssh_gssapi_check_mechanism(&gssctxt,
+- mech, authctxt->host)) {
++ mech, gss_host, options.gss_client_identity)) {
+ ok = 1; /* Mechanism works */
+ } else {
+ authctxt->mech_tried++;
+ }
+ }
+
++ free(gss_host);
++
+ if (!ok || mech == NULL)
+ return 0;
+
+@@ -1046,6 +1143,55 @@ input_gssapi_error(int type, u_int32_t plen, struct ssh *ssh)
+ free(lang);
+ return r;
+ }
++
++int
++userauth_gsskeyex(struct ssh *ssh)
++{
++ struct sshbuf *b = NULL;
++ Authctxt *authctxt = ssh->authctxt;
++ gss_buffer_desc gssbuf;
++ gss_buffer_desc mic = GSS_C_EMPTY_BUFFER;
++ OM_uint32 ms;
++ int r;
++
++ static int attempt = 0;
++ if (attempt++ >= 1)
++ return (0);
++
++ if (gss_kex_context == NULL) {
++ debug("No valid Key exchange context");
++ return (0);
++ }
++
++ if ((b = sshbuf_new()) == NULL)
++ fatal_f("sshbuf_new failed");
++
++ ssh_gssapi_buildmic(b, authctxt->server_user, authctxt->service,
++ "gssapi-keyex", ssh->kex->session_id);
++
++ if ((gssbuf.value = sshbuf_mutable_ptr(b)) == NULL)
++ fatal_f("sshbuf_mutable_ptr failed");
++ gssbuf.length = sshbuf_len(b);
++
++ if (GSS_ERROR(ssh_gssapi_sign(gss_kex_context, &gssbuf, &mic))) {
++ sshbuf_free(b);
++ return (0);
++ }
++
++ if ((r = sshpkt_start(ssh, SSH2_MSG_USERAUTH_REQUEST)) != 0 ||
++ (r = sshpkt_put_cstring(ssh, authctxt->server_user)) != 0 ||
++ (r = sshpkt_put_cstring(ssh, authctxt->service)) != 0 ||
++ (r = sshpkt_put_cstring(ssh, authctxt->method->name)) != 0 ||
++ (r = sshpkt_put_string(ssh, mic.value, mic.length)) != 0 ||
++ (r = sshpkt_send(ssh)) != 0)
++ fatal_fr(r, "parsing");
++
++ sshbuf_free(b);
++ gss_release_buffer(&ms, &mic);
++
++ return (1);
++}
++
+ #endif /* GSSAPI */
+
+ static int
+diff --git a/sshd.c b/sshd.c
+index 6321936c0..6ad9a845a 100644
+--- a/sshd.c
++++ b/sshd.c
+@@ -803,8 +803,8 @@ notify_hostkeys(struct ssh *ssh)
+ }
+ debug3_f("sent %u hostkeys", nkeys);
+ if (nkeys == 0)
+- fatal_f("no hostkeys");
+- if ((r = sshpkt_send(ssh)) != 0)
++ debug3_f("no hostkeys");
++ else if ((r = sshpkt_send(ssh)) != 0)
+ sshpkt_fatal(ssh, r, "%s: send", __func__);
+ sshbuf_free(buf);
+ }
+@@ -1914,7 +1914,8 @@ main(int ac, char **av)
+ free(fp);
+ }
+ accumulate_host_timing_secret(cfg, NULL);
+- if (!sensitive_data.have_ssh2_key) {
++ /* The GSSAPI key exchange can run without a host key */
++ if (!sensitive_data.have_ssh2_key && !options.gss_keyex) {
+ logit("sshd: no hostkeys available -- exiting.");
+ exit(1);
+ }
+@@ -2398,6 +2399,48 @@ do_ssh2_kex(struct ssh *ssh)
+ myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = prop_hostkey =
+ compat_pkalg_proposal(ssh, list_hostkey_types());
+
++#if defined(GSSAPI) && defined(WITH_OPENSSL)
++ {
++ char *orig;
++ char *gss = NULL;
++ char *newstr = NULL;
++ orig = myproposal[PROPOSAL_KEX_ALGS];
++
++ /*
++ * If we don't have a host key, then there's no point advertising
++ * the other key exchange algorithms
++ */
++
++ if (strlen(myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS]) == 0)
++ orig = NULL;
++
++ if (options.gss_keyex)
++ gss = ssh_gssapi_server_mechanisms();
++ else
++ gss = NULL;
++
++ if (gss && orig)
++ xasprintf(&newstr, "%s,%s", gss, orig);
++ else if (gss)
++ newstr = gss;
++ else if (orig)
++ newstr = orig;
++
++ /*
++ * If we've got GSSAPI mechanisms, then we've got the 'null' host
++ * key alg, but we can't tell people about it unless its the only
++ * host key algorithm we support
++ */
++ if (gss && (strlen(myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS])) == 0)
++ myproposal[PROPOSAL_SERVER_HOST_KEY_ALGS] = "null";
++
++ if (newstr)
++ myproposal[PROPOSAL_KEX_ALGS] = newstr;
++ else
++ fatal("No supported key exchange algorithms");
++ }
++#endif
++
+ /* start key exchange */
+ if ((r = kex_setup(ssh, myproposal)) != 0)
+ fatal_r(r, "kex_setup");
+@@ -2413,7 +2456,18 @@ do_ssh2_kex(struct ssh *ssh)
+ # ifdef OPENSSL_HAS_ECC
+ kex->kex[KEX_ECDH_SHA2] = kex_gen_server;
+ # endif
+-#endif
++# ifdef GSSAPI
++ if (options.gss_keyex) {
++ kex->kex[KEX_GSS_GRP1_SHA1] = kexgss_server;
++ kex->kex[KEX_GSS_GRP14_SHA1] = kexgss_server;
++ kex->kex[KEX_GSS_GRP14_SHA256] = kexgss_server;
++ kex->kex[KEX_GSS_GRP16_SHA512] = kexgss_server;
++ kex->kex[KEX_GSS_GEX_SHA1] = kexgssgex_server;
++ kex->kex[KEX_GSS_NISTP256_SHA256] = kexgss_server;
++ kex->kex[KEX_GSS_C25519_SHA256] = kexgss_server;
++ }
++# endif
++#endif /* WITH_OPENSSL */
+ kex->kex[KEX_C25519_SHA256] = kex_gen_server;
+ kex->kex[KEX_KEM_SNTRUP761X25519_SHA512] = kex_gen_server;
+ kex->load_host_public_key=&get_hostkey_public_by_type;
+diff --git a/sshd_config b/sshd_config
+index 36894ace5..ecfe8d026 100644
+--- a/sshd_config
++++ b/sshd_config
+@@ -69,6 +69,8 @@ AuthorizedKeysFile .ssh/authorized_keys
+ # GSSAPI options
+ #GSSAPIAuthentication no
+ #GSSAPICleanupCredentials yes
++#GSSAPIStrictAcceptorCheck yes
++#GSSAPIKeyExchange no
+
+ # Set this to 'yes' to enable PAM authentication, account processing,
+ # and session processing. If this is enabled, PAM authentication will
+diff --git a/sshd_config.5 b/sshd_config.5
+index 7313a7f79..83f840511 100644
+--- a/sshd_config.5
++++ b/sshd_config.5
+@@ -719,6 +719,11 @@ Specifies whether to automatically destroy the user's credentials cache
+ on logout.
+ The default is
+ .Cm yes .
++.It Cm GSSAPIKeyExchange
++Specifies whether key exchange based on GSSAPI is allowed. GSSAPI key exchange
++doesn't rely on ssh keys to verify host identity.
++The default is
++.Cm no .
+ .It Cm GSSAPIStrictAcceptorCheck
+ Determines whether to be strict about the identity of the GSSAPI acceptor
+ a client authenticates against.
+@@ -733,6 +738,31 @@ machine's default store.
+ This facility is provided to assist with operation on multi homed machines.
+ The default is
+ .Cm yes .
++.It Cm GSSAPIStoreCredentialsOnRekey
++Controls whether the user's GSSAPI credentials should be updated following a
++successful connection rekeying. This option can be used to accepted renewed
++or updated credentials from a compatible client. The default is
++.Dq no .
++.Pp
++For this to work
++.Cm GSSAPIKeyExchange
++needs to be enabled in the server and also used by the client.
++.It Cm GSSAPIKexAlgorithms
++The list of key exchange algorithms that are accepted by GSSAPI
++key exchange. Possible values are
++.Bd -literal -offset 3n
++gss-gex-sha1-,
++gss-group1-sha1-,
++gss-group14-sha1-,
++gss-group14-sha256-,
++gss-group16-sha512-,
++gss-nistp256-sha256-,
++gss-curve25519-sha256-
++.Ed
++.Pp
++The default is
++.Dq gss-group14-sha256-,gss-group16-sha512-,gss-nistp256-sha256-,gss-curve25519-sha256-,gss-gex-sha1-,gss-group14-sha1- .
++This option only applies to connections using GSSAPI.
+ .It Cm HostbasedAcceptedAlgorithms
+ Specifies the signature algorithms that will be accepted for hostbased
+ authentication as a list of comma-separated patterns.
+diff --git a/sshkey.c b/sshkey.c
+index 43712253d..35a423e92 100644
+--- a/sshkey.c
++++ b/sshkey.c
+@@ -127,6 +127,9 @@ extern const struct sshkey_impl sshkey_dsa_cert_impl;
+ extern const struct sshkey_impl sshkey_xmss_impl;
+ extern const struct sshkey_impl sshkey_xmss_cert_impl;
+ #endif
++#ifdef GSSAPI
++extern const struct sshkey_impl sshkey_null_impl;
++#endif /* GSSAPI */
+
+ const struct sshkey_impl * const keyimpls[] = {
+ &sshkey_ed25519_impl,
+@@ -164,6 +167,9 @@ const struct sshkey_impl * const keyimpls[] = {
+ &sshkey_xmss_impl,
+ &sshkey_xmss_cert_impl,
+ #endif
++#ifdef GSSAPI
++ &sshkey_null_impl,
++#endif /* GSSAPI */
+ NULL
+ };
+
+@@ -319,7 +325,7 @@ sshkey_alg_list(int certs_only, int plain_only, int include_sigonly, char sep)
+
+ for (i = 0; keyimpls[i] != NULL; i++) {
+ impl = keyimpls[i];
+- if (impl->name == NULL)
++ if (impl->name == NULL || impl->type == KEY_NULL)
+ continue;
+ if (!include_sigonly && impl->sigonly)
+ continue;
+diff --git a/sshkey.h b/sshkey.h
+index 771c4bcee..a0742e8c2 100644
+--- a/sshkey.h
++++ b/sshkey.h
+@@ -71,6 +71,7 @@ enum sshkey_types {
+ KEY_ECDSA_SK_CERT,
+ KEY_ED25519_SK,
+ KEY_ED25519_SK_CERT,
++ KEY_NULL,
+ KEY_UNSPEC
+ };
+
diff --git a/debian/patches/keepalive-extensions.patch b/debian/patches/keepalive-extensions.patch
new file mode 100644
index 0000000..6df9b9e
--- /dev/null
+++ b/debian/patches/keepalive-extensions.patch
@@ -0,0 +1,135 @@
+From dbc7024bb9fe29a5d2bd398219ae2fc5668826b8 Mon Sep 17 00:00:00 2001
+From: Richard Kettlewell <rjk@greenend.org.uk>
+Date: Sun, 9 Feb 2014 16:09:52 +0000
+Subject: Various keepalive extensions
+
+Add compatibility aliases for ProtocolKeepAlives and SetupTimeOut, supported
+in previous versions of Debian's OpenSSH package but since superseded by
+ServerAliveInterval. (We're probably stuck with this bit for
+compatibility.)
+
+In batch mode, default ServerAliveInterval to five minutes.
+
+Adjust documentation to match and to give some more advice on use of
+keepalives.
+
+Author: Ian Jackson <ian@chiark.greenend.org.uk>
+Author: Matthew Vernon <matthew@debian.org>
+Author: Colin Watson <cjwatson@debian.org>
+Last-Update: 2023-01-02
+
+Patch-Name: keepalive-extensions.patch
+---
+ readconf.c | 14 ++++++++++++--
+ ssh_config.5 | 21 +++++++++++++++++++--
+ sshd_config.5 | 3 +++
+ 3 files changed, 34 insertions(+), 4 deletions(-)
+
+diff --git a/readconf.c b/readconf.c
+index 4a39f5b66..9ac71133a 100644
+--- a/readconf.c
++++ b/readconf.c
+@@ -179,6 +179,7 @@ typedef enum {
+ oPubkeyAcceptedAlgorithms, oCASignatureAlgorithms, oProxyJump,
+ oSecurityKeyProvider, oKnownHostsCommand, oRequiredRSASize,
+ oEnableEscapeCommandline,
++ oProtocolKeepAlives, oSetupTimeOut,
+ oIgnore, oIgnoredUnknownOption, oDeprecated, oUnsupported
+ } OpCodes;
+
+@@ -339,6 +340,8 @@ static struct {
+ { "knownhostscommand", oKnownHostsCommand },
+ { "requiredrsasize", oRequiredRSASize },
+ { "enableescapecommandline", oEnableEscapeCommandline },
++ { "protocolkeepalives", oProtocolKeepAlives },
++ { "setuptimeout", oSetupTimeOut },
+
+ { NULL, oBadOption }
+ };
+@@ -1772,6 +1775,8 @@ parse_pubkey_algos:
+ goto parse_flag;
+
+ case oServerAliveInterval:
++ case oProtocolKeepAlives: /* Debian-specific compatibility alias */
++ case oSetupTimeOut: /* Debian-specific compatibility alias */
+ intptr = &options->server_alive_interval;
+ goto parse_time;
+
+@@ -2654,8 +2659,13 @@ fill_default_options(Options * options)
+ options->rekey_interval = 0;
+ if (options->verify_host_key_dns == -1)
+ options->verify_host_key_dns = 0;
+- if (options->server_alive_interval == -1)
+- options->server_alive_interval = 0;
++ if (options->server_alive_interval == -1) {
++ /* in batch mode, default is 5mins */
++ if (options->batch_mode == 1)
++ options->server_alive_interval = 300;
++ else
++ options->server_alive_interval = 0;
++ }
+ if (options->server_alive_count_max == -1)
+ options->server_alive_count_max = 3;
+ if (options->control_master == -1)
+diff --git a/ssh_config.5 b/ssh_config.5
+index 43f3b642c..09905bff3 100644
+--- a/ssh_config.5
++++ b/ssh_config.5
+@@ -275,9 +275,13 @@ If set to
+ .Cm yes ,
+ user interaction such as password prompts and host key confirmation requests
+ will be disabled.
++In addition, the
++.Cm ServerAliveInterval
++option will be set to 300 seconds by default (Debian-specific).
+ This option is useful in scripts and other batch jobs where no user
+ is present to interact with
+-.Xr ssh 1 .
++.Xr ssh 1 ,
++and where it is desirable to detect a broken network swiftly.
+ The argument must be
+ .Cm yes
+ or
+@@ -1794,7 +1798,14 @@ from the server,
+ will send a message through the encrypted
+ channel to request a response from the server.
+ The default
+-is 0, indicating that these messages will not be sent to the server.
++is 0, indicating that these messages will not be sent to the server,
++or 300 if the
++.Cm BatchMode
++option is set (Debian-specific).
++.Cm ProtocolKeepAlives
++and
++.Cm SetupTimeOut
++are Debian-specific compatibility aliases for this option.
+ .It Cm SessionType
+ May be used to either request invocation of a subsystem on the remote system,
+ or to prevent the execution of a remote command at all.
+@@ -1908,6 +1919,12 @@ Specifies whether the system should send TCP keepalive messages to the
+ other side.
+ If they are sent, death of the connection or crash of one
+ of the machines will be properly noticed.
++This option only uses TCP keepalives (as opposed to using ssh level
++keepalives), so takes a long time to notice when the connection dies.
++As such, you probably want
++the
++.Cm ServerAliveInterval
++option as well.
+ However, this means that
+ connections will die if the route is down temporarily, and some people
+ find it annoying.
+diff --git a/sshd_config.5 b/sshd_config.5
+index 83f840511..eb58750a5 100644
+--- a/sshd_config.5
++++ b/sshd_config.5
+@@ -1830,6 +1830,9 @@ This avoids infinitely hanging sessions.
+ .Pp
+ To disable TCP keepalive messages, the value should be set to
+ .Cm no .
++.Pp
++This option was formerly called
++.Cm KeepAlive .
+ .It Cm TrustedUserCAKeys
+ Specifies a file containing public keys of certificate authorities that are
+ trusted to sign user certificates for authentication, or
diff --git a/debian/patches/maxhostnamelen.patch b/debian/patches/maxhostnamelen.patch
new file mode 100644
index 0000000..fd53e7f
--- /dev/null
+++ b/debian/patches/maxhostnamelen.patch
@@ -0,0 +1,30 @@
+From 36b00b5f4d96d6d9db3fd9e418bd2d1f66e8e7fe Mon Sep 17 00:00:00 2001
+From: Svante Signell <svante.signell@gmail.com>
+Date: Fri, 5 Nov 2021 23:22:53 +0000
+Subject: Define MAXHOSTNAMELEN on GNU/Hurd
+
+Bug-Debian: https://bugs.debian.org/997030
+Last-Update: 2021-11-05
+
+Patch-Name: maxhostnamelen.patch
+---
+ defines.h | 6 ++++++
+ 1 file changed, 6 insertions(+)
+
+diff --git a/defines.h b/defines.h
+index 279e509aa..7225cbfab 100644
+--- a/defines.h
++++ b/defines.h
+@@ -136,6 +136,12 @@ enum
+ # endif
+ #endif /* HOST_NAME_MAX */
+
++#ifndef MAXHOSTNAMELEN
++# if defined(_POSIX_HOST_NAME_MAX)
++# define MAXHOSTNAMELEN _POSIX_HOST_NAME_MAX
++# endif
++#endif /* MAXHOSTNAMELEN */
++
+ #if defined(HAVE_DECL_MAXSYMLINKS) && HAVE_DECL_MAXSYMLINKS == 0
+ # define MAXSYMLINKS 5
+ #endif
diff --git a/debian/patches/mention-ssh-keygen-on-keychange.patch b/debian/patches/mention-ssh-keygen-on-keychange.patch
new file mode 100644
index 0000000..71151ff
--- /dev/null
+++ b/debian/patches/mention-ssh-keygen-on-keychange.patch
@@ -0,0 +1,44 @@
+From e797fa7ecced95a0b7f27b000e467ffb31934d28 Mon Sep 17 00:00:00 2001
+From: Scott Moser <smoser@ubuntu.com>
+Date: Sun, 9 Feb 2014 16:10:03 +0000
+Subject: Mention ssh-keygen in ssh fingerprint changed warning
+
+Author: Chris Lamb <lamby@debian.org>
+Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=1843
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/686607
+Last-Update: 2017-08-22
+
+Patch-Name: mention-ssh-keygen-on-keychange.patch
+---
+ sshconnect.c | 9 ++++++++-
+ 1 file changed, 8 insertions(+), 1 deletion(-)
+
+diff --git a/sshconnect.c b/sshconnect.c
+index 891e968dc..77a3080ba 100644
+--- a/sshconnect.c
++++ b/sshconnect.c
+@@ -1270,9 +1270,13 @@ check_host_key(char *hostname, const struct ssh_conn_info *cinfo,
+ error("%s. This could either mean that", key_msg);
+ error("DNS SPOOFING is happening or the IP address for the host");
+ error("and its host key have changed at the same time.");
+- if (ip_status != HOST_NEW)
++ if (ip_status != HOST_NEW) {
+ error("Offending key for IP in %s:%lu",
+ ip_found->file, ip_found->line);
++ error(" remove with:");
++ error(" ssh-keygen -f \"%s\" -R \"%s\"",
++ ip_found->file, ip);
++ }
+ }
+ /* The host key has changed. */
+ warn_changed_key(host_key);
+@@ -1284,6 +1288,9 @@ check_host_key(char *hostname, const struct ssh_conn_info *cinfo,
+ error("Offending %s key in %s:%lu",
+ sshkey_type(host_found->key),
+ host_found->file, host_found->line);
++ error(" remove with:");
++ error(" ssh-keygen -f \"%s\" -R \"%s\"",
++ host_found->file, host);
+
+ /*
+ * If strict host key checking is in use, the user will have
diff --git a/debian/patches/no-openssl-version-status.patch b/debian/patches/no-openssl-version-status.patch
new file mode 100644
index 0000000..4babac9
--- /dev/null
+++ b/debian/patches/no-openssl-version-status.patch
@@ -0,0 +1,62 @@
+From c7c2ce00f07135457dbd924cfe962e03a2b0ab62 Mon Sep 17 00:00:00 2001
+From: Kurt Roeckx <kurt@roeckx.be>
+Date: Sun, 9 Feb 2014 16:10:14 +0000
+Subject: Don't check the status field of the OpenSSL version
+
+There is no reason to check the version of OpenSSL (in Debian). If it's
+not compatible the soname will change. OpenSSH seems to want to do a
+check for the soname based on the version number, but wants to keep the
+status of the release the same. Remove that check on the status since
+it doesn't tell you anything about how compatible that version is.
+
+Author: Colin Watson <cjwatson@debian.org>
+Bug-Debian: https://bugs.debian.org/93581
+Bug-Debian: https://bugs.debian.org/664383
+Bug-Debian: https://bugs.debian.org/732940
+Forwarded: not-needed
+Last-Update: 2014-10-07
+
+Patch-Name: no-openssl-version-status.patch
+---
+ openbsd-compat/openssl-compat.c | 6 +++---
+ openbsd-compat/regress/opensslvertest.c | 1 +
+ 2 files changed, 4 insertions(+), 3 deletions(-)
+
+diff --git a/openbsd-compat/openssl-compat.c b/openbsd-compat/openssl-compat.c
+index a37ca61bf..c1749210d 100644
+--- a/openbsd-compat/openssl-compat.c
++++ b/openbsd-compat/openssl-compat.c
+@@ -34,7 +34,7 @@
+ /*
+ * OpenSSL version numbers: MNNFFPPS: major minor fix patch status
+ * We match major, minor, fix and status (not patch) for <1.0.0.
+- * After that, we acceptable compatible fix versions (so we
++ * After that, we accept compatible fix and status versions (so we
+ * allow 1.0.1 to work with 1.0.0). Going backwards is only allowed
+ * within a patch series.
+ */
+@@ -55,10 +55,10 @@ ssh_compatible_openssl(long headerver, long libver)
+ }
+
+ /*
+- * For versions >= 1.0.0, major,minor,status must match and library
++ * For versions >= 1.0.0, major,minor must match and library
+ * fix version must be equal to or newer than the header.
+ */
+- mask = 0xfff0000fL; /* major,minor,status */
++ mask = 0xfff00000L; /* major,minor */
+ hfix = (headerver & 0x000ff000) >> 12;
+ lfix = (libver & 0x000ff000) >> 12;
+ if ( (headerver & mask) == (libver & mask) && lfix >= hfix)
+diff --git a/openbsd-compat/regress/opensslvertest.c b/openbsd-compat/regress/opensslvertest.c
+index d50066609..aeccc107b 100644
+--- a/openbsd-compat/regress/opensslvertest.c
++++ b/openbsd-compat/regress/opensslvertest.c
+@@ -37,6 +37,7 @@ struct version_test {
+
+ /* built with 1.0.1b release headers */
+ { 0x1000101fL, 0x1000101fL, 1},/* exact match */
++ { 0x1000101fL, 0x10001010L, 1}, /* different status: ok */
+ { 0x1000101fL, 0x1000102fL, 1}, /* newer library patch version: ok */
+ { 0x1000101fL, 0x1000100fL, 1}, /* older library patch version: ok */
+ { 0x1000101fL, 0x1000201fL, 1}, /* newer library fix version: ok */
diff --git a/debian/patches/openbsd-docs.patch b/debian/patches/openbsd-docs.patch
new file mode 100644
index 0000000..6312b84
--- /dev/null
+++ b/debian/patches/openbsd-docs.patch
@@ -0,0 +1,255 @@
+From f8033f154f0fe23f974f67ba2f8a29754a5044af Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Sun, 9 Feb 2014 16:10:09 +0000
+Subject: Adjust various OpenBSD-specific references in manual pages
+
+No single bug reference for this patch, but history includes:
+ https://bugs.debian.org/154434 (login.conf(5))
+ https://bugs.debian.org/513417 (/etc/rc)
+ https://bugs.debian.org/530692 (ssl(8))
+ https://bugs.launchpad.net/bugs/456660 (ssl(8))
+ https://bugs.debian.org/998069 (rdomain(4))
+
+Forwarded: not-needed
+Last-Update: 2021-11-05
+
+Patch-Name: openbsd-docs.patch
+---
+ moduli.5 | 4 ++--
+ ssh-keygen.1 | 12 ++++--------
+ ssh.1 | 4 ++++
+ sshd.8 | 5 ++---
+ sshd_config.5 | 40 ++--------------------------------------
+ 5 files changed, 14 insertions(+), 51 deletions(-)
+
+diff --git a/moduli.5 b/moduli.5
+index 5086a6d42..6dffdc7e6 100644
+--- a/moduli.5
++++ b/moduli.5
+@@ -21,7 +21,7 @@
+ .Nd Diffie-Hellman moduli
+ .Sh DESCRIPTION
+ The
+-.Pa /etc/moduli
++.Pa /etc/ssh/moduli
+ file contains prime numbers and generators for use by
+ .Xr sshd 8
+ in the Diffie-Hellman Group Exchange key exchange method.
+@@ -110,7 +110,7 @@ first estimates the size of the modulus required to produce enough
+ Diffie-Hellman output to sufficiently key the selected symmetric cipher.
+ .Xr sshd 8
+ then randomly selects a modulus from
+-.Fa /etc/moduli
++.Fa /etc/ssh/moduli
+ that best meets the size requirement.
+ .Sh SEE ALSO
+ .Xr ssh-keygen 1 ,
+diff --git a/ssh-keygen.1 b/ssh-keygen.1
+index 8b1f617d2..f2a021878 100644
+--- a/ssh-keygen.1
++++ b/ssh-keygen.1
+@@ -212,9 +212,7 @@ key in
+ .Pa ~/.ssh/id_ed25519_sk
+ or
+ .Pa ~/.ssh/id_rsa .
+-Additionally, the system administrator may use this to generate host keys,
+-as seen in
+-.Pa /etc/rc .
++Additionally, the system administrator may use this to generate host keys.
+ .Pp
+ Normally this program generates the key and asks for a file in which
+ to store the private key.
+@@ -279,9 +277,7 @@ If
+ .Fl f
+ has also been specified, its argument is used as a prefix to the
+ default path for the resulting host key files.
+-This is used by
+-.Pa /etc/rc
+-to generate new host keys.
++This is used by system administration scripts to generate new host keys.
+ .It Fl a Ar rounds
+ When saving a private key, this option specifies the number of KDF
+ (key derivation function, currently
+@@ -849,7 +845,7 @@ option.
+ Valid generator values are 2, 3, and 5.
+ .Pp
+ Screened DH groups may be installed in
+-.Pa /etc/moduli .
++.Pa /etc/ssh/moduli .
+ It is important that this file contains moduli of a range of bit lengths.
+ .Pp
+ A number of options are available for moduli generation and screening via the
+@@ -1307,7 +1303,7 @@ on all machines
+ where the user wishes to log in using public key authentication.
+ There is no need to keep the contents of this file secret.
+ .Pp
+-.It Pa /etc/moduli
++.It Pa /etc/ssh/moduli
+ Contains Diffie-Hellman groups used for DH-GEX.
+ The file format is described in
+ .Xr moduli 5 .
+diff --git a/ssh.1 b/ssh.1
+index 4028f971a..6b56f5638 100644
+--- a/ssh.1
++++ b/ssh.1
+@@ -925,6 +925,10 @@ implements public key authentication protocol automatically,
+ using one of the DSA, ECDSA, Ed25519 or RSA algorithms.
+ The HISTORY section of
+ .Xr ssl 8
++(on non-OpenBSD systems, see
++.nh
++http://www.openbsd.org/cgi\-bin/man.cgi?query=ssl&sektion=8#HISTORY)
++.hy
+ contains a brief discussion of the DSA and RSA algorithms.
+ .Pp
+ The file
+diff --git a/sshd.8 b/sshd.8
+index 71da859dc..ec1687585 100644
+--- a/sshd.8
++++ b/sshd.8
+@@ -64,7 +64,7 @@ over an insecure network.
+ .Nm
+ listens for connections from clients.
+ It is normally started at boot from
+-.Pa /etc/rc .
++.Pa /etc/init.d/ssh .
+ It forks a new
+ daemon for each incoming connection.
+ The forked daemons handle
+@@ -921,7 +921,7 @@ This file is for host-based authentication (see
+ .Xr ssh 1 ) .
+ It should only be writable by root.
+ .Pp
+-.It Pa /etc/moduli
++.It Pa /etc/ssh/moduli
+ Contains Diffie-Hellman groups used for the "Diffie-Hellman Group Exchange"
+ key exchange method.
+ The file format is described in
+@@ -1019,7 +1019,6 @@ The content of this file is not sensitive; it can be world-readable.
+ .Xr ssh-keyscan 1 ,
+ .Xr chroot 2 ,
+ .Xr hosts_access 5 ,
+-.Xr login.conf 5 ,
+ .Xr moduli 5 ,
+ .Xr sshd_config 5 ,
+ .Xr inetd 8 ,
+diff --git a/sshd_config.5 b/sshd_config.5
+index 2c6ec76cb..b9a19c7bd 100644
+--- a/sshd_config.5
++++ b/sshd_config.5
+@@ -981,9 +981,6 @@ for interactive sessions and
+ for non-interactive sessions.
+ .It Cm KbdInteractiveAuthentication
+ Specifies whether to allow keyboard-interactive authentication.
+-All authentication styles from
+-.Xr login.conf 5
+-are supported.
+ The default is
+ .Cm yes .
+ The argument to this keyword must be
+@@ -1087,45 +1084,33 @@ The following forms may be used:
+ .Sm off
+ .Ar hostname | address
+ .Sm on
+-.Op Cm rdomain Ar domain
+ .It
+ .Cm ListenAddress
+ .Sm off
+ .Ar hostname : port
+ .Sm on
+-.Op Cm rdomain Ar domain
+ .It
+ .Cm ListenAddress
+ .Sm off
+ .Ar IPv4_address : port
+ .Sm on
+-.Op Cm rdomain Ar domain
+ .It
+ .Cm ListenAddress
+ .Sm off
+ .Oo Ar hostname | address Oc : Ar port
+ .Sm on
+-.Op Cm rdomain Ar domain
+ .El
+ .Pp
+-The optional
+-.Cm rdomain
+-qualifier requests
+-.Xr sshd 8
+-listen in an explicit routing domain.
+ If
+ .Ar port
+ is not specified,
+ sshd will listen on the address and all
+ .Cm Port
+ options specified.
+-The default is to listen on all local addresses on the current default
+-routing domain.
++The default is to listen on all local addresses.
+ Multiple
+ .Cm ListenAddress
+ options are permitted.
+-For more information on routing domains, see
+-.Xr rdomain 4 .
+ .It Cm LoginGraceTime
+ The server disconnects after this time if the user has not
+ successfully logged in.
+@@ -1250,14 +1235,8 @@ The available criteria are
+ .Cm Host ,
+ .Cm LocalAddress ,
+ .Cm LocalPort ,
+-.Cm RDomain ,
+ and
+-.Cm Address
+-(with
+-.Cm RDomain
+-representing the
+-.Xr rdomain 4
+-on which the connection was received).
++.Cm Address .
+ .Pp
+ The match patterns may consist of single entries or comma-separated
+ lists and may use the wildcard and negation operators described in the
+@@ -1329,7 +1308,6 @@ Available keywords are
+ .Cm PubkeyAuthOptions ,
+ .Cm RekeyLimit ,
+ .Cm RevokedKeys ,
+-.Cm RDomain ,
+ .Cm SetEnv ,
+ .Cm StreamLocalBindMask ,
+ .Cm StreamLocalBindUnlink ,
+@@ -1724,15 +1702,6 @@ an OpenSSH Key Revocation List (KRL) as generated by
+ .Xr ssh-keygen 1 .
+ For more information on KRLs, see the KEY REVOCATION LISTS section in
+ .Xr ssh-keygen 1 .
+-.It Cm RDomain
+-Specifies an explicit routing domain that is applied after authentication
+-has completed.
+-The user session, as well as any forwarded or listening IP sockets,
+-will be bound to this
+-.Xr rdomain 4 .
+-If the routing domain is set to
+-.Cm \&%D ,
+-then the domain in which the incoming connection was received will be applied.
+ .It Cm SecurityKeyProvider
+ Specifies a path to a library that will be used when loading
+ FIDO authenticator-hosted keys, overriding the default of using
+@@ -2047,8 +2016,6 @@ which are expanded at runtime:
+ .It %%
+ A literal
+ .Sq % .
+-.It \&%D
+-The routing domain in which the incoming connection was received.
+ .It %F
+ The fingerprint of the CA key.
+ .It %f
+@@ -2087,9 +2054,6 @@ accepts the tokens %%, %h, %U, and %u.
+ .Pp
+ .Cm ChrootDirectory
+ accepts the tokens %%, %h, %U, and %u.
+-.Pp
+-.Cm RoutingDomain
+-accepts the token %D.
+ .Sh FILES
+ .Bl -tag -width Ds
+ .It Pa /etc/ssh/sshd_config
diff --git a/debian/patches/package-versioning.patch b/debian/patches/package-versioning.patch
new file mode 100644
index 0000000..8529c23
--- /dev/null
+++ b/debian/patches/package-versioning.patch
@@ -0,0 +1,47 @@
+From 720ad1a8e62ff52438766b49f8413ac55b17f570 Mon Sep 17 00:00:00 2001
+From: Matthew Vernon <matthew@debian.org>
+Date: Sun, 9 Feb 2014 16:10:05 +0000
+Subject: Include the Debian version in our identification
+
+This makes it easier to audit networks for versions patched against security
+vulnerabilities. It has little detrimental effect, as attackers will
+generally just try attacks rather than bothering to scan for
+vulnerable-looking version strings. (However, see debian-banner.patch.)
+
+Forwarded: not-needed
+Last-Update: 2021-11-05
+
+Patch-Name: package-versioning.patch
+---
+ kex.c | 2 +-
+ version.h | 7 ++++++-
+ 2 files changed, 7 insertions(+), 2 deletions(-)
+
+diff --git a/kex.c b/kex.c
+index c259e00fc..32858e65c 100644
+--- a/kex.c
++++ b/kex.c
+@@ -1290,7 +1290,7 @@ kex_exchange_identification(struct ssh *ssh, int timeout_ms,
+ if (version_addendum != NULL && *version_addendum == '\0')
+ version_addendum = NULL;
+ if ((r = sshbuf_putf(our_version, "SSH-%d.%d-%.100s%s%s\r\n",
+- PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_VERSION,
++ PROTOCOL_MAJOR_2, PROTOCOL_MINOR_2, SSH_RELEASE,
+ version_addendum == NULL ? "" : " ",
+ version_addendum == NULL ? "" : version_addendum)) != 0) {
+ oerrno = errno;
+diff --git a/version.h b/version.h
+index d83ae5b94..a7d5ecef6 100644
+--- a/version.h
++++ b/version.h
+@@ -3,4 +3,9 @@
+ #define SSH_VERSION "OpenSSH_9.2"
+
+ #define SSH_PORTABLE "p1"
+-#define SSH_RELEASE SSH_VERSION SSH_PORTABLE
++#define SSH_RELEASE_MINIMUM SSH_VERSION SSH_PORTABLE
++#ifdef SSH_EXTRAVERSION
++#define SSH_RELEASE SSH_RELEASE_MINIMUM " " SSH_EXTRAVERSION
++#else
++#define SSH_RELEASE SSH_RELEASE_MINIMUM
++#endif
diff --git a/debian/patches/remove-spurious-ssh-agent-options.patch b/debian/patches/remove-spurious-ssh-agent-options.patch
new file mode 100644
index 0000000..ee02fb3
--- /dev/null
+++ b/debian/patches/remove-spurious-ssh-agent-options.patch
@@ -0,0 +1,29 @@
+From 74edce484429249265baaee1e8a5d1785ee7afa7 Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Tue, 7 Feb 2023 23:55:19 +0000
+Subject: Remove spurious ssh-agent options
+
+These cause regress/agent-getpeereid.sh to leave a stray ssh-agent
+process lying around.
+
+Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=3536
+Last-Update: 2023-02-07
+
+Patch-Name: remove-spurious-ssh-agent-options.patch
+---
+ regress/agent-getpeereid.sh | 2 +-
+ 1 file changed, 1 insertion(+), 1 deletion(-)
+
+diff --git a/regress/agent-getpeereid.sh b/regress/agent-getpeereid.sh
+index 79e9c7d9e..e0379445d 100644
+--- a/regress/agent-getpeereid.sh
++++ b/regress/agent-getpeereid.sh
+@@ -53,7 +53,7 @@ else
+ fi
+
+ trace "kill agent"
+- ${SSHAGENT} -vvv -k >>$OBJ/ssh-agent.log 2>&1
++ ${SSHAGENT} -k >>$OBJ/ssh-agent.log 2>&1
+ fi
+
+ rm -f ${OBJ}/agent
diff --git a/debian/patches/restore-authorized_keys2.patch b/debian/patches/restore-authorized_keys2.patch
new file mode 100644
index 0000000..918da0f
--- /dev/null
+++ b/debian/patches/restore-authorized_keys2.patch
@@ -0,0 +1,35 @@
+From b2cc972d55fcc3c3df709a340ce3019fec9880c4 Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Sun, 5 Mar 2017 02:02:11 +0000
+Subject: Restore reading authorized_keys2 by default
+
+Upstream seems to intend to gradually phase this out, so don't assume
+that this will remain the default forever. However, we were late in
+adopting the upstream sshd_config changes, so it makes sense to extend
+the grace period.
+
+Bug-Debian: https://bugs.debian.org/852320
+Forwarded: not-needed
+Last-Update: 2017-03-05
+
+Patch-Name: restore-authorized_keys2.patch
+---
+ sshd_config | 5 ++---
+ 1 file changed, 2 insertions(+), 3 deletions(-)
+
+diff --git a/sshd_config b/sshd_config
+index 677f97d5d..d500d18cd 100644
+--- a/sshd_config
++++ b/sshd_config
+@@ -38,9 +38,8 @@ Include /etc/ssh/sshd_config.d/*.conf
+
+ #PubkeyAuthentication yes
+
+-# The default is to check both .ssh/authorized_keys and .ssh/authorized_keys2
+-# but this is overridden so installations will only check .ssh/authorized_keys
+-AuthorizedKeysFile .ssh/authorized_keys
++# Expect .ssh/authorized_keys2 to be disregarded by default in future.
++#AuthorizedKeysFile .ssh/authorized_keys .ssh/authorized_keys2
+
+ #AuthorizedPrincipalsFile none
+
diff --git a/debian/patches/restore-tcp-wrappers.patch b/debian/patches/restore-tcp-wrappers.patch
new file mode 100644
index 0000000..404c696
--- /dev/null
+++ b/debian/patches/restore-tcp-wrappers.patch
@@ -0,0 +1,172 @@
+From 8cee1ce3e07ac7904468ab8076ad5595048fb4c9 Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Tue, 7 Oct 2014 13:22:41 +0100
+Subject: Restore TCP wrappers support
+
+Support for TCP wrappers was dropped in OpenSSH 6.7. See this message
+and thread:
+
+ https://lists.mindrot.org/pipermail/openssh-unix-dev/2014-April/032497.html
+
+It is true that this reduces preauth attack surface in sshd. On the
+other hand, this support seems to be quite widely used, and abruptly
+dropping it (from the perspective of users who don't read
+openssh-unix-dev) could easily cause more serious problems in practice.
+
+It's not entirely clear what the right long-term answer for Debian is,
+but it at least probably doesn't involve dropping this feature shortly
+before a freeze.
+
+Forwarded: not-needed
+Last-Update: 2022-02-23
+
+Patch-Name: restore-tcp-wrappers.patch
+---
+ configure.ac | 57 ++++++++++++++++++++++++++++++++++++++++++++++++++++
+ sshd.8 | 7 +++++++
+ sshd.c | 25 +++++++++++++++++++++++
+ 3 files changed, 89 insertions(+)
+
+diff --git a/configure.ac b/configure.ac
+index 75a9e5670..0c59c8b50 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -1667,6 +1667,62 @@ else
+ AC_MSG_RESULT([no])
+ fi
+
++# Check whether user wants TCP wrappers support
++TCPW_MSG="no"
++AC_ARG_WITH([tcp-wrappers],
++ [ --with-tcp-wrappers[[=PATH]] Enable tcpwrappers support (optionally in PATH)],
++ [
++ if test "x$withval" != "xno" ; then
++ saved_LIBS="$LIBS"
++ saved_LDFLAGS="$LDFLAGS"
++ saved_CPPFLAGS="$CPPFLAGS"
++ if test -n "${withval}" && \
++ test "x${withval}" != "xyes"; then
++ if test -d "${withval}/lib"; then
++ if test -n "${need_dash_r}"; then
++ LDFLAGS="-L${withval}/lib -R${withval}/lib ${LDFLAGS}"
++ else
++ LDFLAGS="-L${withval}/lib ${LDFLAGS}"
++ fi
++ else
++ if test -n "${need_dash_r}"; then
++ LDFLAGS="-L${withval} -R${withval} ${LDFLAGS}"
++ else
++ LDFLAGS="-L${withval} ${LDFLAGS}"
++ fi
++ fi
++ if test -d "${withval}/include"; then
++ CPPFLAGS="-I${withval}/include ${CPPFLAGS}"
++ else
++ CPPFLAGS="-I${withval} ${CPPFLAGS}"
++ fi
++ fi
++ LIBS="-lwrap $LIBS"
++ AC_MSG_CHECKING([for libwrap])
++ AC_LINK_IFELSE([AC_LANG_PROGRAM([[
++#include <sys/types.h>
++#include <sys/socket.h>
++#include <netinet/in.h>
++#include <tcpd.h>
++int deny_severity = 0, allow_severity = 0;
++ ]], [[
++ hosts_access(0);
++ ]])], [
++ AC_MSG_RESULT([yes])
++ AC_DEFINE([LIBWRAP], [1],
++ [Define if you want
++ TCP Wrappers support])
++ SSHDLIBS="$SSHDLIBS -lwrap"
++ TCPW_MSG="yes"
++ ], [
++ AC_MSG_ERROR([*** libwrap missing])
++
++ ])
++ LIBS="$saved_LIBS"
++ fi
++ ]
++)
++
+ # Check whether user wants to use ldns
+ LDNS_MSG="no"
+ AC_ARG_WITH(ldns,
+@@ -5653,6 +5709,7 @@ echo " PAM support: $PAM_MSG"
+ echo " OSF SIA support: $SIA_MSG"
+ echo " KerberosV support: $KRB5_MSG"
+ echo " SELinux support: $SELINUX_MSG"
++echo " TCP Wrappers support: $TCPW_MSG"
+ echo " libedit support: $LIBEDIT_MSG"
+ echo " libldns support: $LDNS_MSG"
+ echo " Solaris process contract support: $SPC_MSG"
+diff --git a/sshd.8 b/sshd.8
+index bace97839..71da859dc 100644
+--- a/sshd.8
++++ b/sshd.8
+@@ -910,6 +910,12 @@ the user's home directory becomes accessible.
+ This file should be writable only by the user, and need not be
+ readable by anyone else.
+ .Pp
++.It Pa /etc/hosts.allow
++.It Pa /etc/hosts.deny
++Access controls that should be enforced by tcp-wrappers are defined here.
++Further details are described in
++.Xr hosts_access 5 .
++.Pp
+ .It Pa /etc/hosts.equiv
+ This file is for host-based authentication (see
+ .Xr ssh 1 ) .
+@@ -1012,6 +1018,7 @@ The content of this file is not sensitive; it can be world-readable.
+ .Xr ssh-keygen 1 ,
+ .Xr ssh-keyscan 1 ,
+ .Xr chroot 2 ,
++.Xr hosts_access 5 ,
+ .Xr login.conf 5 ,
+ .Xr moduli 5 ,
+ .Xr sshd_config 5 ,
+diff --git a/sshd.c b/sshd.c
+index 6ad9a845a..7944cf633 100644
+--- a/sshd.c
++++ b/sshd.c
+@@ -129,6 +129,13 @@
+ #include "srclimit.h"
+ #include "dh.h"
+
++#ifdef LIBWRAP
++#include <tcpd.h>
++#include <syslog.h>
++int allow_severity;
++int deny_severity;
++#endif /* LIBWRAP */
++
+ /* Re-exec fds */
+ #define REEXEC_DEVCRYPTO_RESERVED_FD (STDERR_FILENO + 1)
+ #define REEXEC_STARTUP_PIPE_FD (STDERR_FILENO + 2)
+@@ -2189,6 +2196,24 @@ main(int ac, char **av)
+ #ifdef SSH_AUDIT_EVENTS
+ audit_connection_from(remote_ip, remote_port);
+ #endif
++#ifdef LIBWRAP
++ allow_severity = options.log_facility|LOG_INFO;
++ deny_severity = options.log_facility|LOG_WARNING;
++ /* Check whether logins are denied from this host. */
++ if (ssh_packet_connection_is_on_socket(ssh)) {
++ struct request_info req;
++
++ request_init(&req, RQ_DAEMON, __progname, RQ_FILE, sock_in, 0);
++ fromhost(&req);
++
++ if (!hosts_access(&req)) {
++ debug("Connection refused by tcp wrapper");
++ refuse(&req);
++ /* NOTREACHED */
++ fatal("libwrap refuse returns");
++ }
++ }
++#endif /* LIBWRAP */
+
+ rdomain = ssh_packet_rdomain_in(ssh);
+
diff --git a/debian/patches/revert-ipqos-defaults.patch b/debian/patches/revert-ipqos-defaults.patch
new file mode 100644
index 0000000..9ea3ad6
--- /dev/null
+++ b/debian/patches/revert-ipqos-defaults.patch
@@ -0,0 +1,93 @@
+From 8aea1d66b4ba0afd6cb4b25991bfb683d951c6e2 Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Mon, 8 Apr 2019 10:46:29 +0100
+Subject: Revert "upstream: Update default IPQoS in ssh(1), sshd(8) to DSCP
+ AF21 for"
+
+This reverts commit 5ee8448ad7c306f05a9f56769f95336a8269f379.
+
+The IPQoS default changes have some unfortunate interactions with
+iptables (see https://bugs.debian.org/923880) and VMware, so I'm
+temporarily reverting them until those have been fixed.
+
+Bug-Debian: https://bugs.debian.org/923879
+Bug-Debian: https://bugs.debian.org/926229
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/1822370
+Last-Update: 2019-04-08
+
+Patch-Name: revert-ipqos-defaults.patch
+---
+ readconf.c | 4 ++--
+ servconf.c | 4 ++--
+ ssh_config.5 | 6 ++----
+ sshd_config.5 | 6 ++----
+ 4 files changed, 8 insertions(+), 12 deletions(-)
+
+diff --git a/readconf.c b/readconf.c
+index 6c8ad919f..2db9cb6ae 100644
+--- a/readconf.c
++++ b/readconf.c
+@@ -2686,9 +2686,9 @@ fill_default_options(Options * options)
+ if (options->visual_host_key == -1)
+ options->visual_host_key = 0;
+ if (options->ip_qos_interactive == -1)
+- options->ip_qos_interactive = IPTOS_DSCP_AF21;
++ options->ip_qos_interactive = IPTOS_LOWDELAY;
+ if (options->ip_qos_bulk == -1)
+- options->ip_qos_bulk = IPTOS_DSCP_CS1;
++ options->ip_qos_bulk = IPTOS_THROUGHPUT;
+ if (options->request_tty == -1)
+ options->request_tty = REQUEST_TTY_AUTO;
+ if (options->session_type == -1)
+diff --git a/servconf.c b/servconf.c
+index 4ecbca8ed..8b824e35a 100644
+--- a/servconf.c
++++ b/servconf.c
+@@ -441,9 +441,9 @@ fill_default_server_options(ServerOptions *options)
+ if (options->permit_tun == -1)
+ options->permit_tun = SSH_TUNMODE_NO;
+ if (options->ip_qos_interactive == -1)
+- options->ip_qos_interactive = IPTOS_DSCP_AF21;
++ options->ip_qos_interactive = IPTOS_LOWDELAY;
+ if (options->ip_qos_bulk == -1)
+- options->ip_qos_bulk = IPTOS_DSCP_CS1;
++ options->ip_qos_bulk = IPTOS_THROUGHPUT;
+ if (options->version_addendum == NULL)
+ options->version_addendum = xstrdup("");
+ if (options->fwd_opts.streamlocal_bind_mask == (mode_t)-1)
+diff --git a/ssh_config.5 b/ssh_config.5
+index 32851c984..f8616c18b 100644
+--- a/ssh_config.5
++++ b/ssh_config.5
+@@ -1221,11 +1221,9 @@ If one argument is specified, it is used as the packet class unconditionally.
+ If two values are specified, the first is automatically selected for
+ interactive sessions and the second for non-interactive sessions.
+ The default is
+-.Cm af21
+-(Low-Latency Data)
++.Cm lowdelay
+ for interactive sessions and
+-.Cm cs1
+-(Lower Effort)
++.Cm throughput
+ for non-interactive sessions.
+ .It Cm KbdInteractiveAuthentication
+ Specifies whether to use keyboard-interactive authentication.
+diff --git a/sshd_config.5 b/sshd_config.5
+index b13f7665b..7fd8abf48 100644
+--- a/sshd_config.5
++++ b/sshd_config.5
+@@ -1002,11 +1002,9 @@ If one argument is specified, it is used as the packet class unconditionally.
+ If two values are specified, the first is automatically selected for
+ interactive sessions and the second for non-interactive sessions.
+ The default is
+-.Cm af21
+-(Low-Latency Data)
++.Cm lowdelay
+ for interactive sessions and
+-.Cm cs1
+-(Lower Effort)
++.Cm throughput
+ for non-interactive sessions.
+ .It Cm KbdInteractiveAuthentication
+ Specifies whether to allow keyboard-interactive authentication.
diff --git a/debian/patches/scp-quoting.patch b/debian/patches/scp-quoting.patch
new file mode 100644
index 0000000..2419730
--- /dev/null
+++ b/debian/patches/scp-quoting.patch
@@ -0,0 +1,41 @@
+From 501d8554b6792531778d6b3b9344f8e55d84df29 Mon Sep 17 00:00:00 2001
+From: =?UTF-8?q?Nicolas=20Valc=C3=A1rcel?= <nvalcarcel@ubuntu.com>
+Date: Sun, 9 Feb 2014 16:09:59 +0000
+Subject: Adjust scp quoting in verbose mode
+
+Tweak scp's reporting of filenames in verbose mode to be a bit less
+confusing with spaces.
+
+This should be revised to mimic real shell quoting.
+
+Bug-Ubuntu: https://bugs.launchpad.net/bugs/89945
+Last-Update: 2010-02-27
+
+Patch-Name: scp-quoting.patch
+---
+ scp.c | 12 ++++++++++--
+ 1 file changed, 10 insertions(+), 2 deletions(-)
+
+diff --git a/scp.c b/scp.c
+index 1adff5cec..df590c4e3 100644
+--- a/scp.c
++++ b/scp.c
+@@ -239,8 +239,16 @@ do_local_cmd(arglist *a)
+
+ if (verbose_mode) {
+ fprintf(stderr, "Executing:");
+- for (i = 0; i < a->num; i++)
+- fmprintf(stderr, " %s", a->list[i]);
++ for (i = 0; i < a->num; i++) {
++ if (i == 0)
++ fmprintf(stderr, " %s", a->list[i]);
++ else
++ /*
++ * TODO: misbehaves if a->list[i] contains a
++ * single quote
++ */
++ fmprintf(stderr, " '%s'", a->list[i]);
++ }
+ fprintf(stderr, "\n");
+ }
+ if ((pid = fork()) == -1)
diff --git a/debian/patches/selinux-role.patch b/debian/patches/selinux-role.patch
new file mode 100644
index 0000000..7fb35f2
--- /dev/null
+++ b/debian/patches/selinux-role.patch
@@ -0,0 +1,471 @@
+From a1b3f6592e7ef61f5d9544fc652ae44f8c47bd2e Mon Sep 17 00:00:00 2001
+From: Manoj Srivastava <srivasta@debian.org>
+Date: Sun, 9 Feb 2014 16:09:49 +0000
+Subject: Handle SELinux authorisation roles
+
+Rejected upstream due to discomfort with magic usernames; a better approach
+will need an SSH protocol change. In the meantime, this came from Debian's
+SELinux maintainer, so we'll keep it until we have something better.
+
+Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=1641
+Bug-Debian: http://bugs.debian.org/394795
+Last-Update: 2021-11-05
+
+Patch-Name: selinux-role.patch
+---
+ auth.h | 1 +
+ auth2.c | 10 ++++++++--
+ monitor.c | 36 +++++++++++++++++++++++++++++++++---
+ monitor.h | 2 ++
+ monitor_wrap.c | 27 ++++++++++++++++++++++++---
+ monitor_wrap.h | 3 ++-
+ openbsd-compat/port-linux.c | 21 ++++++++++++++-------
+ openbsd-compat/port-linux.h | 4 ++--
+ platform.c | 4 ++--
+ platform.h | 2 +-
+ session.c | 10 +++++-----
+ session.h | 2 +-
+ sshd.c | 2 +-
+ sshpty.c | 4 ++--
+ sshpty.h | 2 +-
+ 15 files changed, 99 insertions(+), 31 deletions(-)
+
+diff --git a/auth.h b/auth.h
+index 6d2d39762..d16dc66b8 100644
+--- a/auth.h
++++ b/auth.h
+@@ -65,6 +65,7 @@ struct Authctxt {
+ char *service;
+ struct passwd *pw; /* set if 'valid' */
+ char *style;
++ char *role;
+
+ /* Method lists for multiple authentication */
+ char **auth_methods; /* modified from server config */
+diff --git a/auth2.c b/auth2.c
+index 44bd49177..d66d73876 100644
+--- a/auth2.c
++++ b/auth2.c
+@@ -264,7 +264,7 @@ input_userauth_request(int type, u_int32_t seq, struct ssh *ssh)
+ {
+ Authctxt *authctxt = ssh->authctxt;
+ Authmethod *m = NULL;
+- char *user = NULL, *service = NULL, *method = NULL, *style = NULL;
++ char *user = NULL, *service = NULL, *method = NULL, *style = NULL, *role = NULL;
+ int r, authenticated = 0;
+ double tstart = monotime_double();
+
+@@ -278,8 +278,13 @@ input_userauth_request(int type, u_int32_t seq, struct ssh *ssh)
+ debug("userauth-request for user %s service %s method %s", user, service, method);
+ debug("attempt %d failures %d", authctxt->attempt, authctxt->failures);
+
++ if ((role = strchr(user, '/')) != NULL)
++ *role++ = 0;
++
+ if ((style = strchr(user, ':')) != NULL)
+ *style++ = 0;
++ else if (role && (style = strchr(role, ':')) != NULL)
++ *style++ = '\0';
+
+ if (authctxt->attempt >= 1024)
+ auth_maxtries_exceeded(ssh);
+@@ -308,8 +313,9 @@ input_userauth_request(int type, u_int32_t seq, struct ssh *ssh)
+ use_privsep ? " [net]" : "");
+ authctxt->service = xstrdup(service);
+ authctxt->style = style ? xstrdup(style) : NULL;
++ authctxt->role = role ? xstrdup(role) : NULL;
+ if (use_privsep)
+- mm_inform_authserv(service, style);
++ mm_inform_authserv(service, style, role);
+ userauth_banner(ssh);
+ if (auth2_setup_methods_lists(authctxt) != 0)
+ ssh_packet_disconnect(ssh,
+diff --git a/monitor.c b/monitor.c
+index 5f7df9539..769eda640 100644
+--- a/monitor.c
++++ b/monitor.c
+@@ -117,6 +117,7 @@ int mm_answer_sign(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_authserv(struct ssh *, int, struct sshbuf *);
++int mm_answer_authrole(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_bsdauthrespond(struct ssh *, int, struct sshbuf *);
+@@ -195,6 +196,7 @@ struct mon_table mon_dispatch_proto20[] = {
+ {MONITOR_REQ_SIGN, MON_ONCE, mm_answer_sign},
+ {MONITOR_REQ_PWNAM, MON_ONCE, mm_answer_pwnamallow},
+ {MONITOR_REQ_AUTHSERV, MON_ONCE, mm_answer_authserv},
++ {MONITOR_REQ_AUTHROLE, MON_ONCE, mm_answer_authrole},
+ {MONITOR_REQ_AUTH2_READ_BANNER, MON_ONCE, mm_answer_auth2_read_banner},
+ {MONITOR_REQ_AUTHPASSWORD, MON_AUTH, mm_answer_authpassword},
+ #ifdef USE_PAM
+@@ -815,6 +817,7 @@ mm_answer_pwnamallow(struct ssh *ssh, int sock, struct sshbuf *m)
+
+ /* Allow service/style information on the auth context */
+ monitor_permit(mon_dispatch, MONITOR_REQ_AUTHSERV, 1);
++ monitor_permit(mon_dispatch, MONITOR_REQ_AUTHROLE, 1);
+ monitor_permit(mon_dispatch, MONITOR_REQ_AUTH2_READ_BANNER, 1);
+
+ #ifdef USE_PAM
+@@ -848,15 +851,42 @@ mm_answer_authserv(struct ssh *ssh, int sock, struct sshbuf *m)
+ monitor_permit_authentications(1);
+
+ if ((r = sshbuf_get_cstring(m, &authctxt->service, NULL)) != 0 ||
+- (r = sshbuf_get_cstring(m, &authctxt->style, NULL)) != 0)
++ (r = sshbuf_get_cstring(m, &authctxt->style, NULL)) != 0 ||
++ (r = sshbuf_get_cstring(m, &authctxt->role, NULL)) != 0)
+ fatal_fr(r, "parse");
+- debug3_f("service=%s, style=%s", authctxt->service, authctxt->style);
++ debug3_f("service=%s, style=%s, role=%s",
++ authctxt->service, authctxt->style, authctxt->role);
+
+ if (strlen(authctxt->style) == 0) {
+ free(authctxt->style);
+ authctxt->style = NULL;
+ }
+
++ if (strlen(authctxt->role) == 0) {
++ free(authctxt->role);
++ authctxt->role = NULL;
++ }
++
++ return (0);
++}
++
++int
++mm_answer_authrole(struct ssh *ssh, int sock, struct sshbuf *m)
++{
++ int r;
++
++ monitor_permit_authentications(1);
++
++ if ((r = sshbuf_get_cstring(m, &authctxt->role, NULL)) != 0)
++ fatal("%s: buffer error: %s", __func__, ssh_err(r));
++ debug3("%s: role=%s",
++ __func__, authctxt->role);
++
++ if (strlen(authctxt->role) == 0) {
++ free(authctxt->role);
++ authctxt->role = NULL;
++ }
++
+ return (0);
+ }
+
+@@ -1578,7 +1608,7 @@ mm_answer_pty(struct ssh *ssh, int sock, struct sshbuf *m)
+ res = pty_allocate(&s->ptyfd, &s->ttyfd, s->tty, sizeof(s->tty));
+ if (res == 0)
+ goto error;
+- pty_setowner(authctxt->pw, s->tty);
++ pty_setowner(authctxt->pw, s->tty, authctxt->role);
+
+ if ((r = sshbuf_put_u32(m, 1)) != 0 ||
+ (r = sshbuf_put_cstring(m, s->tty)) != 0)
+diff --git a/monitor.h b/monitor.h
+index 2b1a2d590..4d87284aa 100644
+--- a/monitor.h
++++ b/monitor.h
+@@ -65,6 +65,8 @@ enum monitor_reqtype {
+
+ MONITOR_REQ_GSSSIGN = 150, MONITOR_ANS_GSSSIGN = 151,
+ MONITOR_REQ_GSSUPCREDS = 152, MONITOR_ANS_GSSUPCREDS = 153,
++
++ MONITOR_REQ_AUTHROLE = 154,
+ };
+
+ struct ssh;
+diff --git a/monitor_wrap.c b/monitor_wrap.c
+index a4b66c56f..6fb47becb 100644
+--- a/monitor_wrap.c
++++ b/monitor_wrap.c
+@@ -375,10 +375,10 @@ mm_auth2_read_banner(void)
+ return (banner);
+ }
+
+-/* Inform the privileged process about service and style */
++/* Inform the privileged process about service, style, and role */
+
+ void
+-mm_inform_authserv(char *service, char *style)
++mm_inform_authserv(char *service, char *style, char *role)
+ {
+ struct sshbuf *m;
+ int r;
+@@ -388,7 +388,8 @@ mm_inform_authserv(char *service, char *style)
+ if ((m = sshbuf_new()) == NULL)
+ fatal_f("sshbuf_new failed");
+ if ((r = sshbuf_put_cstring(m, service)) != 0 ||
+- (r = sshbuf_put_cstring(m, style ? style : "")) != 0)
++ (r = sshbuf_put_cstring(m, style ? style : "")) != 0 ||
++ (r = sshbuf_put_cstring(m, role ? role : "")) != 0)
+ fatal_fr(r, "assemble");
+
+ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTHSERV, m);
+@@ -396,6 +397,26 @@ mm_inform_authserv(char *service, char *style)
+ sshbuf_free(m);
+ }
+
++/* Inform the privileged process about role */
++
++void
++mm_inform_authrole(char *role)
++{
++ struct sshbuf *m;
++ int r;
++
++ debug3("%s entering", __func__);
++
++ if ((m = sshbuf_new()) == NULL)
++ fatal("%s: sshbuf_new failed", __func__);
++ if ((r = sshbuf_put_cstring(m, role ? role : "")) != 0)
++ fatal("%s: buffer error: %s", __func__, ssh_err(r));
++
++ mm_request_send(pmonitor->m_recvfd, MONITOR_REQ_AUTHROLE, m);
++
++ sshbuf_free(m);
++}
++
+ /* Do the password authentication */
+ int
+ mm_auth_password(struct ssh *ssh, char *password)
+diff --git a/monitor_wrap.h b/monitor_wrap.h
+index 830fdb308..c84f96d0c 100644
+--- a/monitor_wrap.h
++++ b/monitor_wrap.h
+@@ -48,7 +48,8 @@ DH *mm_choose_dh(int, int, int);
+ int mm_sshkey_sign(struct ssh *, struct sshkey *, u_char **, size_t *,
+ const u_char *, size_t, const char *, const char *,
+ const char *, u_int compat);
+-void mm_inform_authserv(char *, char *);
++void mm_inform_authserv(char *, char *, char *);
++void mm_inform_authrole(char *);
+ struct passwd *mm_getpwnamallow(struct ssh *, const char *);
+ char *mm_auth2_read_banner(void);
+ int mm_auth_password(struct ssh *, char *);
+diff --git a/openbsd-compat/port-linux.c b/openbsd-compat/port-linux.c
+index 77cb8213a..3a59ba1b7 100644
+--- a/openbsd-compat/port-linux.c
++++ b/openbsd-compat/port-linux.c
+@@ -56,7 +56,7 @@ ssh_selinux_enabled(void)
+
+ /* Return the default security context for the given username */
+ static char *
+-ssh_selinux_getctxbyname(char *pwname)
++ssh_selinux_getctxbyname(char *pwname, const char *role)
+ {
+ char *sc = NULL, *sename = NULL, *lvl = NULL;
+ int r;
+@@ -70,9 +70,16 @@ ssh_selinux_getctxbyname(char *pwname)
+ #endif
+
+ #ifdef HAVE_GET_DEFAULT_CONTEXT_WITH_LEVEL
+- r = get_default_context_with_level(sename, lvl, NULL, &sc);
++ if (role != NULL && role[0])
++ r = get_default_context_with_rolelevel(sename, role, lvl, NULL,
++ &sc);
++ else
++ r = get_default_context_with_level(sename, lvl, NULL, &sc);
+ #else
+- r = get_default_context(sename, NULL, &sc);
++ if (role != NULL && role[0])
++ r = get_default_context_with_role(sename, role, NULL, &sc);
++ else
++ r = get_default_context(sename, NULL, &sc);
+ #endif
+
+ if (r != 0) {
+@@ -102,7 +109,7 @@ ssh_selinux_getctxbyname(char *pwname)
+
+ /* Set the execution context to the default for the specified user */
+ void
+-ssh_selinux_setup_exec_context(char *pwname)
++ssh_selinux_setup_exec_context(char *pwname, const char *role)
+ {
+ char *user_ctx = NULL;
+
+@@ -111,7 +118,7 @@ ssh_selinux_setup_exec_context(char *pwname)
+
+ debug3("%s: setting execution context", __func__);
+
+- user_ctx = ssh_selinux_getctxbyname(pwname);
++ user_ctx = ssh_selinux_getctxbyname(pwname, role);
+ if (setexeccon(user_ctx) != 0) {
+ switch (security_getenforce()) {
+ case -1:
+@@ -133,7 +140,7 @@ ssh_selinux_setup_exec_context(char *pwname)
+
+ /* Set the TTY context for the specified user */
+ void
+-ssh_selinux_setup_pty(char *pwname, const char *tty)
++ssh_selinux_setup_pty(char *pwname, const char *tty, const char *role)
+ {
+ char *new_tty_ctx = NULL, *user_ctx = NULL, *old_tty_ctx = NULL;
+ security_class_t chrclass;
+@@ -143,7 +150,7 @@ ssh_selinux_setup_pty(char *pwname, const char *tty)
+
+ debug3("%s: setting TTY context on %s", __func__, tty);
+
+- user_ctx = ssh_selinux_getctxbyname(pwname);
++ user_ctx = ssh_selinux_getctxbyname(pwname, role);
+
+ /* XXX: should these calls fatal() upon failure in enforcing mode? */
+
+diff --git a/openbsd-compat/port-linux.h b/openbsd-compat/port-linux.h
+index 3c22a854d..c88129428 100644
+--- a/openbsd-compat/port-linux.h
++++ b/openbsd-compat/port-linux.h
+@@ -19,8 +19,8 @@
+
+ #ifdef WITH_SELINUX
+ int ssh_selinux_enabled(void);
+-void ssh_selinux_setup_pty(char *, const char *);
+-void ssh_selinux_setup_exec_context(char *);
++void ssh_selinux_setup_pty(char *, const char *, const char *);
++void ssh_selinux_setup_exec_context(char *, const char *);
+ void ssh_selinux_change_context(const char *);
+ void ssh_selinux_setfscreatecon(const char *);
+ #endif
+diff --git a/platform.c b/platform.c
+index 4fe8744ee..70c3a9b58 100644
+--- a/platform.c
++++ b/platform.c
+@@ -144,7 +144,7 @@ platform_setusercontext(struct passwd *pw)
+ * called if sshd is running as root.
+ */
+ void
+-platform_setusercontext_post_groups(struct passwd *pw)
++platform_setusercontext_post_groups(struct passwd *pw, const char *role)
+ {
+ #if !defined(HAVE_LOGIN_CAP) && defined(USE_PAM)
+ /*
+@@ -185,7 +185,7 @@ platform_setusercontext_post_groups(struct passwd *pw)
+ }
+ #endif /* HAVE_SETPCRED */
+ #ifdef WITH_SELINUX
+- ssh_selinux_setup_exec_context(pw->pw_name);
++ ssh_selinux_setup_exec_context(pw->pw_name, role);
+ #endif
+ }
+
+diff --git a/platform.h b/platform.h
+index 7fef8c983..027fdfb51 100644
+--- a/platform.h
++++ b/platform.h
+@@ -25,7 +25,7 @@ void platform_post_fork_parent(pid_t child_pid);
+ void platform_post_fork_child(void);
+ int platform_privileged_uidswap(void);
+ void platform_setusercontext(struct passwd *);
+-void platform_setusercontext_post_groups(struct passwd *);
++void platform_setusercontext_post_groups(struct passwd *, const char *);
+ char *platform_get_krb5_client(const char *);
+ char *platform_krb5_get_principal_name(const char *);
+ int platform_locked_account(struct passwd *);
+diff --git a/session.c b/session.c
+index 96960f2da..492463529 100644
+--- a/session.c
++++ b/session.c
+@@ -1355,7 +1355,7 @@ safely_chroot(const char *path, uid_t uid)
+
+ /* Set login name, uid, gid, and groups. */
+ void
+-do_setusercontext(struct passwd *pw)
++do_setusercontext(struct passwd *pw, const char *role)
+ {
+ char uidstr[32], *chroot_path, *tmp;
+
+@@ -1383,7 +1383,7 @@ do_setusercontext(struct passwd *pw)
+ endgrent();
+ #endif
+
+- platform_setusercontext_post_groups(pw);
++ platform_setusercontext_post_groups(pw, role);
+
+ if (!in_chroot && options.chroot_directory != NULL &&
+ strcasecmp(options.chroot_directory, "none") != 0) {
+@@ -1527,7 +1527,7 @@ do_child(struct ssh *ssh, Session *s, const char *command)
+
+ /* Force a password change */
+ if (s->authctxt->force_pwchange) {
+- do_setusercontext(pw);
++ do_setusercontext(pw, s->authctxt->role);
+ child_close_fds(ssh);
+ do_pwchange(s);
+ exit(1);
+@@ -1545,7 +1545,7 @@ do_child(struct ssh *ssh, Session *s, const char *command)
+ /* When PAM is enabled we rely on it to do the nologin check */
+ if (!options.use_pam)
+ do_nologin(pw);
+- do_setusercontext(pw);
++ do_setusercontext(pw, s->authctxt->role);
+ /*
+ * PAM session modules in do_setusercontext may have
+ * generated messages, so if this in an interactive
+@@ -1941,7 +1941,7 @@ session_pty_req(struct ssh *ssh, Session *s)
+ sshpkt_fatal(ssh, r, "%s: parse packet", __func__);
+
+ if (!use_privsep)
+- pty_setowner(s->pw, s->tty);
++ pty_setowner(s->pw, s->tty, s->authctxt->role);
+
+ /* Set window size from the packet. */
+ pty_change_window_size(s->ptyfd, s->row, s->col, s->xpixel, s->ypixel);
+diff --git a/session.h b/session.h
+index 344a1ddf9..20ea822a7 100644
+--- a/session.h
++++ b/session.h
+@@ -77,7 +77,7 @@ void session_pty_cleanup2(Session *);
+ Session *session_new(void);
+ Session *session_by_tty(char *);
+ void session_close(struct ssh *, Session *);
+-void do_setusercontext(struct passwd *);
++void do_setusercontext(struct passwd *, const char *);
+
+ const char *session_get_remote_name_or_ip(struct ssh *, u_int, int);
+
+diff --git a/sshd.c b/sshd.c
+index 7944cf633..dd4a19131 100644
+--- a/sshd.c
++++ b/sshd.c
+@@ -584,7 +584,7 @@ privsep_postauth(struct ssh *ssh, Authctxt *authctxt)
+ reseed_prngs();
+
+ /* Drop privileges */
+- do_setusercontext(authctxt->pw);
++ do_setusercontext(authctxt->pw, authctxt->role);
+
+ skip:
+ /* It is safe now to apply the key state */
+diff --git a/sshpty.c b/sshpty.c
+index cae0b977a..7870c6482 100644
+--- a/sshpty.c
++++ b/sshpty.c
+@@ -163,7 +163,7 @@ pty_change_window_size(int ptyfd, u_int row, u_int col,
+ }
+
+ void
+-pty_setowner(struct passwd *pw, const char *tty)
++pty_setowner(struct passwd *pw, const char *tty, const char *role)
+ {
+ struct group *grp;
+ gid_t gid;
+@@ -187,7 +187,7 @@ pty_setowner(struct passwd *pw, const char *tty)
+ strerror(errno));
+
+ #ifdef WITH_SELINUX
+- ssh_selinux_setup_pty(pw->pw_name, tty);
++ ssh_selinux_setup_pty(pw->pw_name, tty, role);
+ #endif
+
+ if (st.st_uid != pw->pw_uid || st.st_gid != gid) {
+diff --git a/sshpty.h b/sshpty.h
+index 9ec7e9a15..de7e000ae 100644
+--- a/sshpty.h
++++ b/sshpty.h
+@@ -24,5 +24,5 @@ int pty_allocate(int *, int *, char *, size_t);
+ void pty_release(const char *);
+ void pty_make_controlling_tty(int *, const char *);
+ void pty_change_window_size(int, u_int, u_int, u_int, u_int);
+-void pty_setowner(struct passwd *, const char *);
++void pty_setowner(struct passwd *, const char *, const char *);
+ void disconnect_controlling_tty(void);
diff --git a/debian/patches/series b/debian/patches/series
new file mode 100644
index 0000000..f9d3791
--- /dev/null
+++ b/debian/patches/series
@@ -0,0 +1,35 @@
+gssapi.patch
+restore-tcp-wrappers.patch
+selinux-role.patch
+ssh-vulnkey-compat.patch
+keepalive-extensions.patch
+syslog-level-silent.patch
+user-group-modes.patch
+scp-quoting.patch
+shell-path.patch
+dnssec-sshfp.patch
+mention-ssh-keygen-on-keychange.patch
+package-versioning.patch
+debian-banner.patch
+authorized-keys-man-symlink.patch
+openbsd-docs.patch
+ssh-argv0.patch
+doc-hash-tab-completion.patch
+ssh-agent-setgid.patch
+no-openssl-version-status.patch
+gnome-ssh-askpass2-icon.patch
+systemd-readiness.patch
+debian-config.patch
+restore-authorized_keys2.patch
+revert-ipqos-defaults.patch
+maxhostnamelen.patch
+conch-ssh-rsa.patch
+systemd-socket-activation.patch
+remove-spurious-ssh-agent-options.patch
+CVE-2023-38408-1.patch
+CVE-2023-38408-2.patch
+CVE-2023-38408-3.patch
+CVE-2023-28531.patch
+CVE-2023-48795.patch
+CVE-2023-51384.patch
+CVE-2023-51385.patch
diff --git a/debian/patches/shell-path.patch b/debian/patches/shell-path.patch
new file mode 100644
index 0000000..5f839df
--- /dev/null
+++ b/debian/patches/shell-path.patch
@@ -0,0 +1,39 @@
+From b364a18c85a959fdfd0a5a2c497482809cadf29f Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Sun, 9 Feb 2014 16:10:00 +0000
+Subject: Look for $SHELL on the path for ProxyCommand/LocalCommand
+
+There's some debate on the upstream bug about whether POSIX requires this.
+I (Colin Watson) agree with Vincent and think it does.
+
+Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=1494
+Bug-Debian: http://bugs.debian.org/492728
+Last-Update: 2020-02-21
+
+Patch-Name: shell-path.patch
+---
+ sshconnect.c | 4 ++--
+ 1 file changed, 2 insertions(+), 2 deletions(-)
+
+diff --git a/sshconnect.c b/sshconnect.c
+index 792bc34bc..891e968dc 100644
+--- a/sshconnect.c
++++ b/sshconnect.c
+@@ -248,7 +248,7 @@ ssh_proxy_connect(struct ssh *ssh, const char *host, const char *host_arg,
+ * extra privileges above.
+ */
+ ssh_signal(SIGPIPE, SIG_DFL);
+- execv(argv[0], argv);
++ execvp(argv[0], argv);
+ perror(argv[0]);
+ exit(1);
+ }
+@@ -1671,7 +1671,7 @@ ssh_local_cmd(const char *args)
+ if (pid == 0) {
+ ssh_signal(SIGPIPE, SIG_DFL);
+ debug3("Executing %s -c \"%s\"", shell, args);
+- execl(shell, shell, "-c", args, (char *)NULL);
++ execlp(shell, shell, "-c", args, (char *)NULL);
+ error("Couldn't execute %s -c \"%s\": %s",
+ shell, args, strerror(errno));
+ _exit(1);
diff --git a/debian/patches/ssh-agent-setgid.patch b/debian/patches/ssh-agent-setgid.patch
new file mode 100644
index 0000000..14478d3
--- /dev/null
+++ b/debian/patches/ssh-agent-setgid.patch
@@ -0,0 +1,40 @@
+From bf54d67a00bf4d408f0e52236c4248cecfb5177f Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Sun, 9 Feb 2014 16:10:13 +0000
+Subject: Document consequences of ssh-agent being setgid in ssh-agent(1)
+
+Bug-Debian: http://bugs.debian.org/711623
+Forwarded: no
+Last-Update: 2020-02-21
+
+Patch-Name: ssh-agent-setgid.patch
+---
+ ssh-agent.1 | 15 +++++++++++++++
+ 1 file changed, 15 insertions(+)
+
+diff --git a/ssh-agent.1 b/ssh-agent.1
+index b0bf65da8..ba418bb41 100644
+--- a/ssh-agent.1
++++ b/ssh-agent.1
+@@ -230,6 +230,21 @@ socket and stores its pathname in this variable.
+ It is accessible only to the current user,
+ but is easily abused by root or another instance of the same user.
+ .El
++.Pp
++In Debian,
++.Nm
++is installed with the set-group-id bit set, to prevent
++.Xr ptrace 2
++attacks retrieving private key material.
++This has the side-effect of causing the run-time linker to remove certain
++environment variables which might have security implications for set-id
++programs, including
++.Ev LD_PRELOAD ,
++.Ev LD_LIBRARY_PATH ,
++and
++.Ev TMPDIR .
++If you need to set any of these environment variables, you will need to do
++so in the program executed by ssh-agent.
+ .Sh FILES
+ .Bl -tag -width Ds
+ .It Pa $TMPDIR/ssh-XXXXXXXXXX/agent.<ppid>
diff --git a/debian/patches/ssh-argv0.patch b/debian/patches/ssh-argv0.patch
new file mode 100644
index 0000000..756d80e
--- /dev/null
+++ b/debian/patches/ssh-argv0.patch
@@ -0,0 +1,31 @@
+From b252064f6d116feca5d07dfe6dfd62ba005927bd Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Sun, 9 Feb 2014 16:10:10 +0000
+Subject: ssh(1): Refer to ssh-argv0(1)
+
+Old versions of OpenSSH (up to 2.5 or thereabouts) allowed creating symlinks
+to ssh with the name of the host you want to connect to. Debian ships an
+ssh-argv0 script restoring this feature; this patch refers to its manual
+page from ssh(1).
+
+Bug-Debian: http://bugs.debian.org/111341
+Forwarded: not-needed
+Last-Update: 2013-09-14
+
+Patch-Name: ssh-argv0.patch
+---
+ ssh.1 | 1 +
+ 1 file changed, 1 insertion(+)
+
+diff --git a/ssh.1 b/ssh.1
+index 6b56f5638..d07cd7840 100644
+--- a/ssh.1
++++ b/ssh.1
+@@ -1667,6 +1667,7 @@ if an error occurred.
+ .Xr sftp 1 ,
+ .Xr ssh-add 1 ,
+ .Xr ssh-agent 1 ,
++.Xr ssh-argv0 1 ,
+ .Xr ssh-keygen 1 ,
+ .Xr ssh-keyscan 1 ,
+ .Xr tun 4 ,
diff --git a/debian/patches/ssh-vulnkey-compat.patch b/debian/patches/ssh-vulnkey-compat.patch
new file mode 100644
index 0000000..f37f827
--- /dev/null
+++ b/debian/patches/ssh-vulnkey-compat.patch
@@ -0,0 +1,42 @@
+From 3878210a9526dc6c78c48d959bab0afb0052b64f Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@ubuntu.com>
+Date: Sun, 9 Feb 2014 16:09:50 +0000
+Subject: Accept obsolete ssh-vulnkey configuration options
+
+These options were used as part of Debian's response to CVE-2008-0166.
+Nearly six years later, we no longer need to continue carrying the bulk
+of that patch, but we do need to avoid failing when the associated
+configuration options are still present.
+
+Last-Update: 2014-02-09
+
+Patch-Name: ssh-vulnkey-compat.patch
+---
+ readconf.c | 1 +
+ servconf.c | 1 +
+ 2 files changed, 2 insertions(+)
+
+diff --git a/readconf.c b/readconf.c
+index 55af0115d..4a39f5b66 100644
+--- a/readconf.c
++++ b/readconf.c
+@@ -194,6 +194,7 @@ static struct {
+ { "fallbacktorsh", oDeprecated },
+ { "globalknownhostsfile2", oDeprecated },
+ { "rhostsauthentication", oDeprecated },
++ { "useblacklistedkeys", oDeprecated },
+ { "userknownhostsfile2", oDeprecated },
+ { "useroaming", oDeprecated },
+ { "usersh", oDeprecated },
+diff --git a/servconf.c b/servconf.c
+index 940de9e15..6529f2736 100644
+--- a/servconf.c
++++ b/servconf.c
+@@ -651,6 +651,7 @@ static struct {
+ { "x11uselocalhost", sX11UseLocalhost, SSHCFG_ALL },
+ { "xauthlocation", sXAuthLocation, SSHCFG_GLOBAL },
+ { "strictmodes", sStrictModes, SSHCFG_GLOBAL },
++ { "permitblacklistedkeys", sDeprecated, SSHCFG_GLOBAL },
+ { "permitemptypasswords", sEmptyPasswd, SSHCFG_ALL },
+ { "permituserenvironment", sPermitUserEnvironment, SSHCFG_GLOBAL },
+ { "uselogin", sDeprecated, SSHCFG_GLOBAL },
diff --git a/debian/patches/syslog-level-silent.patch b/debian/patches/syslog-level-silent.patch
new file mode 100644
index 0000000..e1a8aee
--- /dev/null
+++ b/debian/patches/syslog-level-silent.patch
@@ -0,0 +1,47 @@
+From ac80435d753ff39d9c6ded2f7535d770f257fc59 Mon Sep 17 00:00:00 2001
+From: Natalie Amery <nmamery@chiark.greenend.org.uk>
+Date: Sun, 9 Feb 2014 16:09:54 +0000
+Subject: "LogLevel SILENT" compatibility
+
+"LogLevel SILENT" (-qq) was introduced in Debian openssh 1:3.0.1p1-1 to
+match the behaviour of non-free SSH, in which -q does not suppress fatal
+errors. However, this was unintentionally broken in 1:4.6p1-2 and nobody
+complained, so we've dropped most of it. The parts that remain are basic
+configuration file compatibility, and an adjustment to "Pseudo-terminal will
+not be allocated ..." which should be split out into a separate patch.
+
+Author: Matthew Vernon <matthew@debian.org>
+Author: Colin Watson <cjwatson@debian.org>
+Last-Update: 2013-09-14
+
+Patch-Name: syslog-level-silent.patch
+---
+ log.c | 1 +
+ ssh.c | 2 +-
+ 2 files changed, 2 insertions(+), 1 deletion(-)
+
+diff --git a/log.c b/log.c
+index 99bf046a7..bdc4b6515 100644
+--- a/log.c
++++ b/log.c
+@@ -96,6 +96,7 @@ static struct {
+ LogLevel val;
+ } log_levels[] =
+ {
++ { "SILENT", SYSLOG_LEVEL_QUIET }, /* compatibility */
+ { "QUIET", SYSLOG_LEVEL_QUIET },
+ { "FATAL", SYSLOG_LEVEL_FATAL },
+ { "ERROR", SYSLOG_LEVEL_ERROR },
+diff --git a/ssh.c b/ssh.c
+index 855777d7f..8b6b54558 100644
+--- a/ssh.c
++++ b/ssh.c
+@@ -1363,7 +1363,7 @@ main(int ac, char **av)
+ /* Do not allocate a tty if stdin is not a tty. */
+ if ((!isatty(fileno(stdin)) || options.stdin_null) &&
+ options.request_tty != REQUEST_TTY_FORCE) {
+- if (tty_flag)
++ if (tty_flag && options.log_level != SYSLOG_LEVEL_QUIET)
+ logit("Pseudo-terminal will not be allocated because "
+ "stdin is not a terminal.");
+ tty_flag = 0;
diff --git a/debian/patches/systemd-readiness.patch b/debian/patches/systemd-readiness.patch
new file mode 100644
index 0000000..8f9f543
--- /dev/null
+++ b/debian/patches/systemd-readiness.patch
@@ -0,0 +1,84 @@
+From 5d04f3ebd2825c03fa7c39e27c28bf3384345806 Mon Sep 17 00:00:00 2001
+From: Michael Biebl <biebl@debian.org>
+Date: Mon, 21 Dec 2015 16:08:47 +0000
+Subject: Add systemd readiness notification support
+
+Bug-Debian: https://bugs.debian.org/778913
+Forwarded: no
+Last-Update: 2017-08-22
+
+Patch-Name: systemd-readiness.patch
+---
+ configure.ac | 24 ++++++++++++++++++++++++
+ sshd.c | 9 +++++++++
+ 2 files changed, 33 insertions(+)
+
+diff --git a/configure.ac b/configure.ac
+index 0c59c8b50..23423e48d 100644
+--- a/configure.ac
++++ b/configure.ac
+@@ -4915,6 +4915,29 @@ AC_SUBST([GSSLIBS])
+ AC_SUBST([K5LIBS])
+ AC_SUBST([CHANNELLIBS])
+
++# Check whether user wants systemd support
++SYSTEMD_MSG="no"
++AC_ARG_WITH(systemd,
++ [ --with-systemd Enable systemd support],
++ [ if test "x$withval" != "xno" ; then
++ AC_PATH_TOOL([PKGCONFIG], [pkg-config], [no])
++ if test "$PKGCONFIG" != "no"; then
++ AC_MSG_CHECKING([for libsystemd])
++ if $PKGCONFIG --exists libsystemd; then
++ SYSTEMD_CFLAGS=`$PKGCONFIG --cflags libsystemd`
++ SYSTEMD_LIBS=`$PKGCONFIG --libs libsystemd`
++ CPPFLAGS="$CPPFLAGS $SYSTEMD_CFLAGS"
++ SSHDLIBS="$SSHDLIBS $SYSTEMD_LIBS"
++ AC_MSG_RESULT([yes])
++ AC_DEFINE(HAVE_SYSTEMD, 1, [Define if you want systemd support.])
++ SYSTEMD_MSG="yes"
++ else
++ AC_MSG_RESULT([no])
++ fi
++ fi
++ fi ]
++)
++
+ # Looking for programs, paths and files
+
+ PRIVSEP_PATH=/var/empty
+@@ -5715,6 +5738,7 @@ echo " libldns support: $LDNS_MSG"
+ echo " Solaris process contract support: $SPC_MSG"
+ echo " Solaris project support: $SP_MSG"
+ echo " Solaris privilege support: $SPP_MSG"
++echo " systemd support: $SYSTEMD_MSG"
+ echo " IP address in \$DISPLAY hack: $DISPLAY_HACK_MSG"
+ echo " Translate v4 in v6 hack: $IPV4_IN6_HACK_MSG"
+ echo " BSD Auth support: $BSD_AUTH_MSG"
+diff --git a/sshd.c b/sshd.c
+index b4ee435e5..0a4eefe01 100644
+--- a/sshd.c
++++ b/sshd.c
+@@ -88,6 +88,10 @@
+ #include <prot.h>
+ #endif
+
++#ifdef HAVE_SYSTEMD
++#include <systemd/sd-daemon.h>
++#endif
++
+ #include "xmalloc.h"
+ #include "ssh.h"
+ #include "ssh2.h"
+@@ -2094,6 +2098,11 @@ main(int ac, char **av)
+ }
+ }
+
++#ifdef HAVE_SYSTEMD
++ /* Signal systemd that we are ready to accept connections */
++ sd_notify(0, "READY=1");
++#endif
++
+ /* Accept a connection and return in a forked child */
+ server_accept_loop(&sock_in, &sock_out,
+ &newsock, config_s);
diff --git a/debian/patches/systemd-socket-activation.patch b/debian/patches/systemd-socket-activation.patch
new file mode 100644
index 0000000..5441622
--- /dev/null
+++ b/debian/patches/systemd-socket-activation.patch
@@ -0,0 +1,138 @@
+From 4cedd1c9acac0fba598db2eaf43278dfe8e53ef0 Mon Sep 17 00:00:00 2001
+From: Steve Langasek <steve.langasek@ubuntu.com>
+Date: Thu, 1 Sep 2022 16:03:37 +0100
+Subject: Support systemd socket activation
+
+Unlike inetd socket activation, with systemd socket activation the
+supervisor passes the listened-on socket to the child process and lets
+the child process handle the accept(). This lets us do delayed start
+of the sshd daemon without becoming incompatible with config options
+like ClientAliveCountMax.
+
+Last-Update: 2022-09-01
+
+Patch-Name: systemd-socket-activation.patch
+---
+ sshd.c | 89 +++++++++++++++++++++++++++++++++++++++++++++++++---------
+ 1 file changed, 75 insertions(+), 14 deletions(-)
+
+diff --git a/sshd.c b/sshd.c
+index 0a4eefe01..fc22fcb62 100644
+--- a/sshd.c
++++ b/sshd.c
+@@ -141,10 +141,16 @@ int deny_severity;
+ #endif /* LIBWRAP */
+
+ /* Re-exec fds */
+-#define REEXEC_DEVCRYPTO_RESERVED_FD (STDERR_FILENO + 1)
+-#define REEXEC_STARTUP_PIPE_FD (STDERR_FILENO + 2)
+-#define REEXEC_CONFIG_PASS_FD (STDERR_FILENO + 3)
+-#define REEXEC_MIN_FREE_FD (STDERR_FILENO + 4)
++#ifdef HAVE_SYSTEMD
++#define SYSTEMD_OFFSET sd_listen_fds(0)
++#else
++#define SYSTEMD_OFFSET 0
++#endif
++
++#define REEXEC_DEVCRYPTO_RESERVED_FD (STDERR_FILENO + 1 + SYSTEMD_OFFSET)
++#define REEXEC_STARTUP_PIPE_FD (STDERR_FILENO + 2 + SYSTEMD_OFFSET)
++#define REEXEC_CONFIG_PASS_FD (STDERR_FILENO + 3 + SYSTEMD_OFFSET)
++#define REEXEC_MIN_FREE_FD (STDERR_FILENO + 4 + SYSTEMD_OFFSET)
+
+ extern char *__progname;
+
+@@ -1025,6 +1031,48 @@ server_accept_inetd(int *sock_in, int *sock_out)
+ debug("inetd sockets after dupping: %d, %d", *sock_in, *sock_out);
+ }
+
++#ifdef HAVE_SYSTEMD
++/*
++ * Configure our socket fds that were passed from systemd
++ */
++static void
++setup_systemd_socket(int listen_sock)
++{
++ int ret;
++ struct sockaddr_storage addr;
++ socklen_t len = sizeof(addr);
++ char ntop[NI_MAXHOST], strport[NI_MAXSERV];
++
++ if (getsockname(listen_sock, (struct sockaddr *)&addr, &len) != 0)
++ return;
++
++ if (((struct sockaddr *)&addr)->sa_family != AF_INET
++ && ((struct sockaddr *)&addr)->sa_family != AF_INET6)
++ return;
++ if (num_listen_socks >= MAX_LISTEN_SOCKS)
++ fatal("Too many listen sockets. "
++ "Enlarge MAX_LISTEN_SOCKS");
++ if ((ret = getnameinfo((struct sockaddr *)&addr, len, ntop,
++ sizeof(ntop), strport, sizeof(strport),
++ NI_NUMERICHOST|NI_NUMERICSERV)) != 0) {
++ error("getnameinfo failed: %.100s",
++ ssh_gai_strerror(ret));
++ return;
++ }
++ if (set_nonblock(listen_sock) == -1) {
++ close(listen_sock);
++ return;
++ }
++ /* Socket options */
++ set_reuseaddr(listen_sock);
++
++ listen_socks[num_listen_socks] = listen_sock;
++ num_listen_socks++;
++
++ logit("Server listening on %s port %s.", ntop, strport);
++}
++#endif
++
+ /*
+ * Listen for TCP connections
+ */
+@@ -1104,22 +1152,35 @@ static void
+ server_listen(void)
+ {
+ u_int i;
++#ifdef HAVE_SYSTEMD
++ int systemd_socket_count;
++#endif
+
+ /* Initialise per-source limit tracking. */
+ srclimit_init(options.max_startups, options.per_source_max_startups,
+ options.per_source_masklen_ipv4, options.per_source_masklen_ipv6);
+
+- for (i = 0; i < options.num_listen_addrs; i++) {
+- listen_on_addrs(&options.listen_addrs[i]);
+- freeaddrinfo(options.listen_addrs[i].addrs);
+- free(options.listen_addrs[i].rdomain);
+- memset(&options.listen_addrs[i], 0,
+- sizeof(options.listen_addrs[i]));
++#ifdef HAVE_SYSTEMD
++ systemd_socket_count = sd_listen_fds(0);
++ if (systemd_socket_count > 0)
++ {
++ int i;
++ for (i = 0; i < systemd_socket_count; i++)
++ setup_systemd_socket(SD_LISTEN_FDS_START + i);
++ } else
++#endif
++ {
++ for (i = 0; i < options.num_listen_addrs; i++) {
++ listen_on_addrs(&options.listen_addrs[i]);
++ freeaddrinfo(options.listen_addrs[i].addrs);
++ free(options.listen_addrs[i].rdomain);
++ memset(&options.listen_addrs[i], 0,
++ sizeof(options.listen_addrs[i]));
++ }
++ free(options.listen_addrs);
++ options.listen_addrs = NULL;
++ options.num_listen_addrs = 0;
+ }
+- free(options.listen_addrs);
+- options.listen_addrs = NULL;
+- options.num_listen_addrs = 0;
+-
+ if (!num_listen_socks)
+ fatal("Cannot bind any address.");
+ }
diff --git a/debian/patches/user-group-modes.patch b/debian/patches/user-group-modes.patch
new file mode 100644
index 0000000..51a233b
--- /dev/null
+++ b/debian/patches/user-group-modes.patch
@@ -0,0 +1,210 @@
+From ad9efda53c54f37dbd429c16db4be2946f27063e Mon Sep 17 00:00:00 2001
+From: Colin Watson <cjwatson@debian.org>
+Date: Sun, 9 Feb 2014 16:09:58 +0000
+Subject: Allow harmless group-writability
+
+Allow secure files (~/.ssh/config, ~/.ssh/authorized_keys, etc.) to be
+group-writable, provided that the group in question contains only the file's
+owner. Rejected upstream for IMO incorrect reasons (e.g. a misunderstanding
+about the contents of gr->gr_mem). Given that per-user groups and umask 002
+are the default setup in Debian (for good reasons - this makes operating in
+setgid directories with other groups much easier), we need to permit this by
+default.
+
+Bug: https://bugzilla.mindrot.org/show_bug.cgi?id=1060
+Bug-Debian: http://bugs.debian.org/cgi-bin/bugreport.cgi?bug=314347
+Last-Update: 2022-02-23
+
+Patch-Name: user-group-modes.patch
+---
+ auth-rhosts.c | 6 ++----
+ auth.c | 3 +--
+ misc.c | 57 ++++++++++++++++++++++++++++++++++++++++++++++-----
+ misc.h | 2 ++
+ readconf.c | 3 +--
+ ssh.1 | 2 ++
+ ssh_config.5 | 2 ++
+ 7 files changed, 62 insertions(+), 13 deletions(-)
+
+diff --git a/auth-rhosts.c b/auth-rhosts.c
+index 56724677a..e15f5bc5a 100644
+--- a/auth-rhosts.c
++++ b/auth-rhosts.c
+@@ -266,8 +266,7 @@ auth_rhosts2(struct passwd *pw, const char *client_user, const char *hostname,
+ return 0;
+ }
+ if (options.strict_modes &&
+- ((st.st_uid != 0 && st.st_uid != pw->pw_uid) ||
+- (st.st_mode & 022) != 0)) {
++ !secure_permissions(&st, pw->pw_uid)) {
+ logit("Rhosts authentication refused for %.100s: "
+ "bad ownership or modes for home directory.", pw->pw_name);
+ auth_debug_add("Rhosts authentication refused for %.100s: "
+@@ -296,8 +295,7 @@ auth_rhosts2(struct passwd *pw, const char *client_user, const char *hostname,
+ * allowing access to their account by anyone.
+ */
+ if (options.strict_modes &&
+- ((st.st_uid != 0 && st.st_uid != pw->pw_uid) ||
+- (st.st_mode & 022) != 0)) {
++ !secure_permissions(&st, pw->pw_uid)) {
+ logit("Rhosts authentication refused for %.100s: "
+ "bad modes for %.200s", pw->pw_name, path);
+ auth_debug_add("Bad file modes for %.200s", path);
+diff --git a/auth.c b/auth.c
+index 946dc6074..6653b9e15 100644
+--- a/auth.c
++++ b/auth.c
+@@ -432,8 +432,7 @@ check_key_in_hostfiles(struct passwd *pw, struct sshkey *key, const char *host,
+ user_hostfile = tilde_expand_filename(userfile, pw->pw_uid);
+ if (options.strict_modes &&
+ (stat(user_hostfile, &st) == 0) &&
+- ((st.st_uid != 0 && st.st_uid != pw->pw_uid) ||
+- (st.st_mode & 022) != 0)) {
++ !secure_permissions(&st, pw->pw_uid)) {
+ logit("Authentication refused for %.100s: "
+ "bad owner or modes for %.200s",
+ pw->pw_name, user_hostfile);
+diff --git a/misc.c b/misc.c
+index c098dc610..2268d8875 100644
+--- a/misc.c
++++ b/misc.c
+@@ -55,9 +55,9 @@
+ #include <netdb.h>
+ #ifdef HAVE_PATHS_H
+ # include <paths.h>
++#endif
+ #include <pwd.h>
+ #include <grp.h>
+-#endif
+ #ifdef SSH_TUN_OPENBSD
+ #include <net/if.h>
+ #endif
+@@ -1385,6 +1385,55 @@ percent_dollar_expand(const char *string, ...)
+ return ret;
+ }
+
++int
++secure_permissions(struct stat *st, uid_t uid)
++{
++ if (!platform_sys_dir_uid(st->st_uid) && st->st_uid != uid)
++ return 0;
++ if ((st->st_mode & 002) != 0)
++ return 0;
++ if ((st->st_mode & 020) != 0) {
++ /* If the file is group-writable, the group in question must
++ * have exactly one member, namely the file's owner.
++ * (Zero-member groups are typically used by setgid
++ * binaries, and are unlikely to be suitable.)
++ */
++ struct passwd *pw;
++ struct group *gr;
++ int members = 0;
++
++ gr = getgrgid(st->st_gid);
++ if (!gr)
++ return 0;
++
++ /* Check primary group memberships. */
++ while ((pw = getpwent()) != NULL) {
++ if (pw->pw_gid == gr->gr_gid) {
++ ++members;
++ if (pw->pw_uid != uid)
++ return 0;
++ }
++ }
++ endpwent();
++
++ pw = getpwuid(st->st_uid);
++ if (!pw)
++ return 0;
++
++ /* Check supplementary group memberships. */
++ if (gr->gr_mem[0]) {
++ ++members;
++ if (strcmp(pw->pw_name, gr->gr_mem[0]) ||
++ gr->gr_mem[1])
++ return 0;
++ }
++
++ if (!members)
++ return 0;
++ }
++ return 1;
++}
++
+ int
+ tun_open(int tun, int mode, char **ifname)
+ {
+@@ -2194,8 +2243,7 @@ safe_path(const char *name, struct stat *stp, const char *pw_dir,
+ snprintf(err, errlen, "%s is not a regular file", buf);
+ return -1;
+ }
+- if ((!platform_sys_dir_uid(stp->st_uid) && stp->st_uid != uid) ||
+- (stp->st_mode & 022) != 0) {
++ if (!secure_permissions(stp, uid)) {
+ snprintf(err, errlen, "bad ownership or modes for file %s",
+ buf);
+ return -1;
+@@ -2210,8 +2258,7 @@ safe_path(const char *name, struct stat *stp, const char *pw_dir,
+ strlcpy(buf, cp, sizeof(buf));
+
+ if (stat(buf, &st) == -1 ||
+- (!platform_sys_dir_uid(st.st_uid) && st.st_uid != uid) ||
+- (st.st_mode & 022) != 0) {
++ !secure_permissions(&st, uid)) {
+ snprintf(err, errlen,
+ "bad ownership or modes for directory %s", buf);
+ return -1;
+diff --git a/misc.h b/misc.h
+index 84d93e059..31b6557c6 100644
+--- a/misc.h
++++ b/misc.h
+@@ -233,6 +233,8 @@ struct notifier_ctx *notify_start(int, const char *, ...)
+ void notify_complete(struct notifier_ctx *, const char *, ...)
+ __attribute__((format(printf, 2, 3)));
+
++int secure_permissions(struct stat *st, uid_t uid);
++
+ #define MINIMUM(a, b) (((a) < (b)) ? (a) : (b))
+ #define MAXIMUM(a, b) (((a) > (b)) ? (a) : (b))
+ #define ROUNDUP(x, y) ((((x)+((y)-1))/(y))*(y))
+diff --git a/readconf.c b/readconf.c
+index 9ac71133a..18e814039 100644
+--- a/readconf.c
++++ b/readconf.c
+@@ -2319,8 +2319,7 @@ read_config_file_depth(const char *filename, struct passwd *pw,
+
+ if (fstat(fileno(f), &sb) == -1)
+ fatal("fstat %s: %s", filename, strerror(errno));
+- if (((sb.st_uid != 0 && sb.st_uid != getuid()) ||
+- (sb.st_mode & 022) != 0))
++ if (!secure_permissions(&sb, getuid()))
+ fatal("Bad owner or permissions on %s", filename);
+ }
+
+diff --git a/ssh.1 b/ssh.1
+index dfd80b8bc..4028f971a 100644
+--- a/ssh.1
++++ b/ssh.1
+@@ -1563,6 +1563,8 @@ The file format and configuration options are described in
+ .Xr ssh_config 5 .
+ Because of the potential for abuse, this file must have strict permissions:
+ read/write for the user, and not writable by others.
++It may be group-writable provided that the group in question contains only
++the user.
+ .Pp
+ .It Pa ~/.ssh/environment
+ Contains additional definitions for environment variables; see
+diff --git a/ssh_config.5 b/ssh_config.5
+index 09905bff3..92600ed6e 100644
+--- a/ssh_config.5
++++ b/ssh_config.5
+@@ -2258,6 +2258,8 @@ The format of this file is described above.
+ This file is used by the SSH client.
+ Because of the potential for abuse, this file must have strict permissions:
+ read/write for the user, and not writable by others.
++It may be group-writable provided that the group in question contains only
++the user.
+ .It Pa /etc/ssh/ssh_config
+ Systemwide configuration file.
+ This file provides defaults for those
diff --git a/debian/po/POTFILES.in b/debian/po/POTFILES.in
new file mode 100644
index 0000000..c619f34
--- /dev/null
+++ b/debian/po/POTFILES.in
@@ -0,0 +1 @@
+[type: gettext/rfc822deb] openssh-server.templates
diff --git a/debian/po/cs.po b/debian/po/cs.po
new file mode 100644
index 0000000..d01e0ff
--- /dev/null
+++ b/debian/po/cs.po
@@ -0,0 +1,55 @@
+# Czech PO debconf template translation of openssh.
+# Copyright (C) 2014 Michal Simunek <michal.simunek@gmail.com>
+# This file is distributed under the same license as the openssh package.
+# Michal Simunek <michal.simunek@gmail.com>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh 1:6.6p1-1\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-06-12 12:25+0200\n"
+"Last-Translator: Michal Simunek <michal.simunek@gmail.com>\n"
+"Language-Team: Czech <debian-l10n-czech@lists.debian.org>\n"
+"Language: cs\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=utf-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr "Zakázat ověřování heslem pro uživatele root?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"Předchozí verze openssh-server dovolovala přihlašovat se přes SSH jako root "
+"pomocí ověřování heslem. Výchozí volba pro nové instalace je nyní "
+"\"PermitRootLogin prohibit-password\", která zakazuje ověřování heslem pro "
+"uživatele root, aniž by to omezilo systémy, které mají explicitně nastaveno "
+"ověřování veřejným SSH klíčem pro uživatele root."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Tato změna činí systémy zabezpečenějšími proti útokům hrubou silou na heslo "
+"uživatele root pomocí slovníku (velmi častý cíl útoků). Nicméně, to může "
+"poškodit systémy, které jsou nastaveny s předpokladem, že bude možné se "
+"přihlašovat přes SSH jako root pomocí ověřování heslem. Změnu této volby "
+"byste měli provést pouze pokud ověřování heslem potřebujete."
diff --git a/debian/po/da.po b/debian/po/da.po
new file mode 100644
index 0000000..70d576d
--- /dev/null
+++ b/debian/po/da.po
@@ -0,0 +1,55 @@
+# Danish translation openssh.
+# Copyright (C) 2014 openssh og nedenstående oversættere.
+# This file is distributed under the same license as the openssh package.
+# Joe Hansen <joedalton2@yahoo.dk>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-03-21 23:51+0200\n"
+"Last-Translator: Joe Hansen <joedalton2@yahoo.dk>\n"
+"Language-Team: Danish <debian-l10n-danish@lists.debian.org>\n"
+"Language: da\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr "Deaktiver SSH-adgangskodegodkendelse for root?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"Tidligere versioner af openssh-server tillod indlogning som root over SSH "
+"med brug af adgangskodegodkendelse. Standarden for nye installationer er nu "
+"»PermitRootLogin prohibit-password«, som deaktiverer adgangskodegodkendelse "
+"for root uden at ødelægge systemer, som eksplicit har konfigureret SSH-"
+"offentlig nøglegodkendelse for root."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Denne ændring gør systemer mere sikre mod brute-force angreb vis ordlister "
+"med adgangskoder på root-brugeren (et meget ofte mål for sådanne angreb). "
+"Det kan dog ødelægge systemer, som er opsat med forventning om at kunne SSH "
+"som root via brug af adgangskodegodkendelse. Du skal kun lave denne ændring, "
+"hvis du ikke har brug for dette."
diff --git a/debian/po/de.po b/debian/po/de.po
new file mode 100644
index 0000000..ecba54b
--- /dev/null
+++ b/debian/po/de.po
@@ -0,0 +1,61 @@
+# openssh.
+# Copyright (C) 2014 Colin Watson
+# Copyright (C) 2014 Stephan Beck
+# This file is distributed under the same license as the openssh package.
+# Stephan Beck <sbeck@mailbox.org>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh_1:6.6p1-1\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-03-24 22:21+0100\n"
+"Last-Translator: Stephan Beck <sbeck@mailbox.org>\n"
+"Language-Team: Debian German translation team <debian-l10n-german@lists."
+"debian.org>\n"
+"Language: de\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr "SSH Passwort-Authentifizierung für »root« deaktivieren?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"Vorherige Versionen von openssh-server erlaubten das Anmelden als »root« "
+"über SSH unter Verwendung von Passwort-Authentifizierung. Die "
+"Standardeinstellung für Neuinstallationen lautet nun »PermitRootLogin "
+"prohibit-password«, wodurch die Passwort-Authentifizierung für »root« "
+"deaktiviert wird, und Systeme dennoch funktionsfähig bleiben, bei denen "
+"ausdrücklich die Authentifizierung als »root« mittels öffentlichem SSH-"
+"Schlüssel konfiguriert ist."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Diese Änderung sichert Systeme besser gegen jene Angriffe auf den Benutzer "
+"»root« (ein verbreitetes Ziel solcher Angriffe) ab, die das Passwort durch "
+"simples Ausprobieren aller Einträge von Wörterbüchern zu erraten versuchen. "
+"Sie kann allerdings dazu führen, dass Systeme nicht mehr funktionieren, die "
+"in der Absicht konfiguriert wurden, die Anmeldung als »root« über SSH unter "
+"Verwendung von Passwort-Authentifizierung zuzulassen. Sie sollten diese "
+"Änderung nur vornehmen, wenn Sie auf Letzteres verzichten können."
diff --git a/debian/po/es.po b/debian/po/es.po
new file mode 100644
index 0000000..de8a67a
--- /dev/null
+++ b/debian/po/es.po
@@ -0,0 +1,80 @@
+# openssh po-debconf translation to Spanish
+# Copyright (C) 2014 Software in the Public Interest
+# This file is distributed under the same license as the openssh package.
+#
+# Changes:
+# - Initial translation
+# Matías A. Bellone <matiasbellone+debian@gmail.com>, 2014
+#
+# Traductores, si no conocen el formato PO, merece la pena leer la
+# de gettext, especialmente las secciones dedicadas a este
+# formato, por ejemplo ejecutando:
+# info -n '(gettext)PO Files'
+# info -n '(gettext)Header Entry'
+#
+# Equipo de traducción al español, por favor, lean antes de traducir
+# los siguientes documentos:
+#
+# - El proyecto de traducción de Debian al español
+# http://www.debian.org/intl/spanish/
+# especialmente las notas de traducción en
+# http://www.debian.org/intl/spanish/notas
+#
+# - La guía de traducción de po's de debconf:
+# /usr/share/doc/po-debconf/README-trans
+# o http://www.debian.org/intl/l10n/po-debconf/README-trans
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-03-23 20:43-0300\n"
+"Last-Translator: Matías Bellone <matiasbellone+debian@gmail.com>\n"
+"Language-Team: Debian l10n Spanish <debian-l10n-spanish@lists.debian.org>\n"
+"Language: es\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr ""
+"¿Desea desactivar la autenticación SSH mediante contraseña para el usuario "
+"root?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"Las versiones anteriores de openssh-server permitían iniciar sesión como "
+"usuario root utilizando autenticación con contraseña. La configuración "
+"predeterminada para las nuevas instalaciones ahora incluye «PermitRootLogin "
+"prohibit-password», lo que desactiva la autenticación con contraseña para el "
+"usuario root sin romper los sistemas que tienen configurado explícitamente "
+"la autenticación SSH utilizando claves públicas para el usuario root."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Este cambio hace que los sistemas sean más resistentes contra ataques de "
+"fuerza bruta basados en diccionarios sobre el usuario root (un objetivo muy "
+"común para este tipo de ataques). Sin embargo, podría romper sistemas cuya "
+"configuración permite que el usuario root inicie sesión a través de SSH "
+"utilizando una contraseña. Sólo debería realizar este cambio si no necesita "
+"este comportamiento."
diff --git a/debian/po/fr.po b/debian/po/fr.po
new file mode 100644
index 0000000..f7125e9
--- /dev/null
+++ b/debian/po/fr.po
@@ -0,0 +1,59 @@
+# Translation of openssh debconf template to French
+# Copyright (C) 2014
+# This file is distributed under the same license as the openssh package.
+# Étienne Gilli <etienne.gilli@gmail.com>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh_1:6.5p1-6\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-03-22 08:26+0100\n"
+"Last-Translator: Étienne Gilli <etienne.gilli@gmail.com>\n"
+"Language-Team: French <debian-l10n-french@lists.debian.org>\n"
+"Language: fr\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr ""
+"Désactiver l’authentification SSH par mot de passe pour le superutilisateur ?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"Les versions précédentes du paquet openssh-server autorisaient la connexion "
+"par SSH du superutilisateur (root) en utilisant l’authentification par mot "
+"de passe. Par défaut, les nouvelles installations ont maintenant l’option "
+"« PermitRootLogin prohibit-password », qui désactive l’authentification par "
+"mot de passe pour le compte « root », sans casser les systèmes qui ont "
+"configuré explicitement l’authentification SSH par clé publique pour ce "
+"compte."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Cette modification rend les systèmes plus robustes face aux attaques par "
+"force brute et par dictionnaire contre le superutilisateur (très souvent "
+"pris pour cible par ce type d’attaque). Cependant, cela peut rendre "
+"inutilisables les systèmes reposant sur la possibilité de se connecter au "
+"compte « root » par SSH avec authentification par mot de passe. Vous ne "
+"devriez appliquer cette modification que si ce n’est pas votre cas."
diff --git a/debian/po/it.po b/debian/po/it.po
new file mode 100644
index 0000000..dd71060
--- /dev/null
+++ b/debian/po/it.po
@@ -0,0 +1,58 @@
+# Italian translation of openssh debconf messages.
+# Copyright (C) 2014, openssh package copyright holder
+# This file is distributed under the same license as the openssh package.
+# Beatrice Torracca <beatricet@libero.it>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-03-28 11:12+0200\n"
+"Last-Translator: Beatrice Torracca <beatricet@libero.it>\n"
+"Language-Team: Italian <debian-l10n-italian@lists.debian.org>\n"
+"Language: it\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Virtaal 0.7.1\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr "Disabilitare l'autenticazione SSH con password per root?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"Le versioni precedenti di openssh-server permettevano il login come root via "
+"SSH, usando l'autenticazione con password. Il comportamento predefinito "
+"delle nuove installazioni è «PermitRootLogin prohibit-password» che "
+"disabilita l'autenticazione con password per root, senza rendere non "
+"funzionanti sistemi che hanno esplicitamente configurato l'autenticazione "
+"SSH con chiave pubblica per root."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Questo cambiamento rende i sistemi più al sicuro da attacchi di forza bruta "
+"a dizionario sulle password per l'utente root (un obiettivo molto comune per "
+"tali attacchi). Tuttavia, può rendere non funzionanti sistemi che sono "
+"impostati facendo affidamento sulla possibilità di autenticazione SSH come "
+"root usando la password. Si dovrebbe fare questo cambiamento solo se non si "
+"ha bisogno di tale comportamento."
diff --git a/debian/po/ja.po b/debian/po/ja.po
new file mode 100644
index 0000000..db382f1
--- /dev/null
+++ b/debian/po/ja.po
@@ -0,0 +1,55 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the openssh package.
+# victory <victory.deb@gmail.com>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-03-20 11:06+0900\n"
+"Last-Translator: victory <victory.deb@gmail.com>\n"
+"Language-Team: Japanese <debian-japanese@lists.debian.org>\n"
+"Language: ja\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr "root での SSH パスワード認証を無効にしますか?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"openssh-server の以前のバージョンではパスワード認証を利用した SSH 経由の "
+"root のログインを許可していました。新しくインストールした場合のデフォルト値が"
+"現在は「PermitRootLogin prohibit-password」になり、root のパスワード認証を無"
+"効化しますが SSH の公開鍵認証を root 用に明示的に設定しているシステムでは特に"
+"問題はありません。"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"この変更によりシステムは root ユーザ (こういった攻撃ではとても一般的な攻撃対"
+"象です) へのブルートフォースによるパスワード辞書攻撃に対してはより安全になり"
+"ます。しかしパスワード認証により root で SSH 接続できることを前提として構成し"
+"たシステムでは問題が発生する可能性があります。そういった必要のない場合にのみ"
+"この変更を行うようにしてください。"
diff --git a/debian/po/nl.po b/debian/po/nl.po
new file mode 100644
index 0000000..3afd617
--- /dev/null
+++ b/debian/po/nl.po
@@ -0,0 +1,60 @@
+# Dutch translation of openssh debconf templates.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the openssh package.
+# Frans Spiesschaert <Frans.Spiesschaert@yucom.be>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-10-03 23:54+0200\n"
+"Last-Translator: Frans Spiesschaert <Frans.Spiesschaert@yucom.be>\n"
+"Language-Team: Debian Dutch l10n Team <debian-l10n-dutch@lists.debian.org>\n"
+"Language: nl\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr ""
+"Wachtwoordauthenticatie over SSH voor de systeembeheerder uitschakelen?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"Eerdere versies van de openssh-server lieten de systeembeheerder toe om zich "
+"over SSH te authenticeren met een wachtwoord. Voor nieuwe installaties is de "
+"standaard nu \"PermitRootLogin prohibit-password\". Deze standaardinstelling "
+"maakt het voor de systeembeheerder onmogelijk om zich via een wachtwoord te "
+"authenticeren. Deze instelling heeft geen impact op systemen waarbij de SSH-"
+"configuratie expliciet vereist dat de systeembeheerder zich authenticeert "
+"via een publieke sleutel."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Deze wijziging maakt systemen veiliger tegenover aanvallen met brute kracht "
+"(met een wachtwoordenwoordenboek) op de systeembeheerder, een zeer courant "
+"doelwit voor zulke aanvallen. Maar het kan systemen onbruikbaar maken die "
+"ingesteld werden vanuit de verwachting dat de systeembeheerder SSH kan "
+"gebruiken met authenticatie via wachtwoord. Enkel wanneer u dit laatste niet "
+"nodig heeft, zou u deze wijziging kunnen doorvoeren."
diff --git a/debian/po/pt.po b/debian/po/pt.po
new file mode 100644
index 0000000..2dab84c
--- /dev/null
+++ b/debian/po/pt.po
@@ -0,0 +1,59 @@
+# Translation of openssh's debconf messages to European Portuguese
+# Copyright (C) 2014 YEAR THE openssh'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the openssh package.
+#
+# Américo Monteiro <a_monteiro@gmx.com>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh 1:6.6p1-1\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-03-21 21:13+0000\n"
+"Last-Translator: Américo Monteiro <a_monteiro@gmx.com>\n"
+"Language-Team: Portuguese <traduz@debianpt.org>\n"
+"Language: pt\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+"X-Generator: Lokalize 1.4\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr "Desactivar a autenticação SSH por palavra passe para o root?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"As versões anteriores do servidor openssh permitiam iniciar sessão como root "
+"sobre SSH usando autenticação por palavra-passe. A predefinição para novas "
+"instalações é agora \"PermitRootLogin prohibit-password\", a qual desactiva "
+"a autenticação por palavra-passe para o root sem danificar os sistemas que "
+"têm configurados explicitamente autenticação SSH por chave pública para o "
+"root."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Esta alteração torna os sistemas mais seguros contra ataques em que se "
+"forçam dicionários de palavras-passe no utilizador root (um alvo muito comum "
+"para tais ataques). No entanto, pode danificar sistemas que estão "
+"configurados com a expectativa de serem capazes de SSH como root usando "
+"autenticação por palavra-passe. Apenas deverá fazer esta alteração se não "
+"precisa de tal método de autenticação."
diff --git a/debian/po/pt_BR.po b/debian/po/pt_BR.po
new file mode 100644
index 0000000..99b1182
--- /dev/null
+++ b/debian/po/pt_BR.po
@@ -0,0 +1,57 @@
+# Debconf translations for openssh.
+# Copyright (C) 2014 THE openssh'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the openssh package.
+# José de Figueiredo <deb.gnulinux@gmail.com>, 2014.
+#
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-11-23 23:49-0200\n"
+"Last-Translator: José de Figueiredo <deb.gnulinux@gmail.com>\n"
+"Language-Team: Brazilian Portuguese <debian-l10n-portuguese@lists.debian."
+"org>\n"
+"Language: pt_BR\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr "Desabilitar autenticação por senha do SSH para root?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"Versões anteriores do openssh-server permitiam login como root sobre SSH "
+"usando autenticação por senha. O padrão para as novas instalações agora é "
+"\"PermitRootLogin prohibit-password\", que desabilita a autenticação por "
+"senha para root sem quebrar sistemas que tenham configurado explicitamente o "
+"SSH para autenticação por chave pública para root."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Esta alteração torna sistemas mais seguros contra ataques de força bruta por "
+"dicionário de senhas no usuário root (um alvo muito comum destes ataques). "
+"Entretanto, ela pode quebrar sistemas que foram configurados com a "
+"expectativa de acesso SSH com root usando autenticação por senha. Você deve "
+"fazer esta mudança somente se você não precisa fazer isso."
diff --git a/debian/po/ru.po b/debian/po/ru.po
new file mode 100644
index 0000000..f2e1daf
--- /dev/null
+++ b/debian/po/ru.po
@@ -0,0 +1,57 @@
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the openssh package.
+#
+# Yuri Kozlov <yuray@komyakino.ru>, 2014.
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh 1:6.6p1-1\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-03-22 10:04+0400\n"
+"Last-Translator: Yuri Kozlov <yuray@komyakino.ru>\n"
+"Language-Team: Russian <debian-l10n-russian@lists.debian.org>\n"
+"Language: ru\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=3; plural=(n%10==1 && n%100!=11 ? 0 : n%10>=2 && n"
+"%10<=4 && (n%100<10 || n%100>=20) ? 1 : 2);\n"
+"X-Generator: Lokalize 1.4\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr "Выключить в SSH аутентификацию по паролю для root?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"В предыдущих версиях openssh-server разрешён вход с правами пользователя "
+"root через SSH с помощью аутентификации по паролю. При новых установках по "
+"умолчанию теперь используется настройка «PermitRootLogin prohibit-password», "
+"которая отключает аутентификацию по паролю для root, что не вредит системам, "
+"у которых в SSH для root настроена аутентификация по открытому ключу."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Это изменение делает системы более стойкими к атакам методом перебора "
+"словарных паролей для пользователя root (самая распространённая цель таких "
+"атак). Однако, это вредит системам, в которых специально настроен вход для "
+"root по SSH с парольной аутентификацией. Если это не ваш случай, то ответьте "
+"утвердительно."
diff --git a/debian/po/sv.po b/debian/po/sv.po
new file mode 100644
index 0000000..278b0cc
--- /dev/null
+++ b/debian/po/sv.po
@@ -0,0 +1,58 @@
+# Swedish translations for openssh package
+# Svenska översättningar för paket openssh.
+# Copyright (C) 2014 THE openssh'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the openssh package.
+# Andreas Rönnquist <gusnan@gusnan.se>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-03-21 21:36+0100\n"
+"Last-Translator: Andreas Rönnquist <gusnan@gusnan.se>\n"
+"Language-Team: Swedish\n"
+"Language: sv\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(n != 1);\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr "Inaktivera SSH-lösenordsautentisering för root?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"Tidigare versioner av openssh-server tillät inloggning som root över SSH med "
+"hjälp av lösenordsautentisering. Standardinställningen för nya "
+"installationer är nu \"PermitRootLogin prohibit-password\", vilket "
+"inaktiverar lösenordsautentisering för root utan att förstöra system som "
+"explicit har konfigurerat nyckelautentisering med hjälp av publika nycklar "
+"för root."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Denna förändring gör system säkrare mot brute-force-angrepp med hjälp av "
+"ordlistor med lösenord på root-användaren (ett väldigt vanligt mål för "
+"sådana angrepp). Dock så kan detta förstöra system som förväntas kunna "
+"använda SSH som root med hjälp av lösenordsautentisering. Du skall endast "
+"göra denna förändring om du inte har ett behov av att kunna göra detta."
diff --git a/debian/po/templates.pot b/debian/po/templates.pot
new file mode 100644
index 0000000..47c9e36
--- /dev/null
+++ b/debian/po/templates.pot
@@ -0,0 +1,46 @@
+# SOME DESCRIPTIVE TITLE.
+# Copyright (C) YEAR THE PACKAGE'S COPYRIGHT HOLDER
+# This file is distributed under the same license as the PACKAGE package.
+# FIRST AUTHOR <EMAIL@ADDRESS>, YEAR.
+#
+#, fuzzy
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: YEAR-MO-DA HO:MI+ZONE\n"
+"Last-Translator: FULL NAME <EMAIL@ADDRESS>\n"
+"Language-Team: LANGUAGE <LL@li.org>\n"
+"Language: \n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=CHARSET\n"
+"Content-Transfer-Encoding: 8bit\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr ""
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
diff --git a/debian/po/tr.po b/debian/po/tr.po
new file mode 100644
index 0000000..1ada041
--- /dev/null
+++ b/debian/po/tr.po
@@ -0,0 +1,58 @@
+# Turkish translation of openssh package
+# Copyright (C) 2014 Mert Dirik
+# This file is distributed under the same license as the openssh package.
+# Mert Dirik <mertdirik@gmail.com>, 2014.
+#
+msgid ""
+msgstr ""
+"Project-Id-Version: openssh-server\n"
+"Report-Msgid-Bugs-To: openssh@packages.debian.org\n"
+"POT-Creation-Date: 2014-03-20 02:06+0000\n"
+"PO-Revision-Date: 2014-08-01 14:44+0200\n"
+"Last-Translator: Mert Dirik <mertdirik@gmail.com>\n"
+"Language-Team: Debian L10n Turkish <debian-l10n-turkish@lists.debian.org>\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=UTF-8\n"
+"Content-Transfer-Encoding: 8bit\n"
+"X-Generator: Poedit 1.5.4\n"
+"Language: tr\n"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid "Disable SSH password authentication for root?"
+msgstr "root kullanıcısının parola ile kimlik doğrulaması engellensin mi?"
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"Previous versions of openssh-server permitted logging in as root over SSH "
+"using password authentication. The default for new installations is now "
+"\"PermitRootLogin prohibit-password\", which disables password "
+"authentication for root without breaking systems that have explicitly "
+"configured SSH public key authentication for root."
+msgstr ""
+"openssh-server'ın önceki sürümleri parola ile kimlik doğrulama kullanılarak "
+"root kullanıcısının SSH üzerinden oturum açmasına izin veriyordu. Artık yeni "
+"kurulumların öntanımlı ayarı \"PermitRootLogin prohibit-password\" "
+"şeklindedir. Bu ayar root kullanıcısının parola kullanarak oturum açmasını "
+"yasaklar. SSH genel anahtar doğrulama yöntemine ayrıca izin veren mevcut "
+"sistemler bu ayardan etkilenmez."
+
+#. Type: boolean
+#. Description
+#: ../openssh-server.templates:1001
+msgid ""
+"This change makes systems more secure against brute-force password "
+"dictionary attacks on the root user (a very common target for such attacks). "
+"However, it may break systems that are set up with the expectation of being "
+"able to SSH as root using password authentication. You should only make this "
+"change if you do not need to do that."
+msgstr ""
+"Bu ayar sistemleri kaba kuvvet sözlükten parola saldırılarına karşı güvenli "
+"hale getirir (root kullanıcısı bu tarz saldırıların en büyük "
+"hedeflerindendir). Fakat bu ayarın etkinleştirilmesi, root kullanıcısına "
+"parola doğrulama yöntemiyle oturum açılabileceği varsayımıyla hareket eden "
+"sistemlerde eskiden çalışan düzenin bozulmasına sebep olacaktır. Bu "
+"değişikliği yalnızca sorun çıkarmayacağından eminseniz yapın."
diff --git a/debian/rules b/debian/rules
new file mode 100755
index 0000000..18b2bf3
--- /dev/null
+++ b/debian/rules
@@ -0,0 +1,217 @@
+#!/usr/bin/make -f
+
+export DEB_BUILD_MAINT_OPTIONS := hardening=+all
+
+include /usr/share/dpkg/default.mk
+
+# Uncomment this to turn on verbose mode.
+# export DH_VERBOSE=1
+
+# This has to be exported to make some magic below work.
+export DH_OPTIONS
+
+ifeq (,$(filter nocheck,$(DEB_BUILD_OPTIONS)))
+ RUN_TESTS := yes
+else
+ RUN_TESTS :=
+endif
+
+ifeq (,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
+ PARALLEL :=
+else
+ PARALLEL := \
+ -j$(patsubst parallel=%,%,$(filter parallel=%,$(DEB_BUILD_OPTIONS)))
+endif
+
+ifeq ($(DEB_BUILD_GNU_TYPE),$(DEB_HOST_GNU_TYPE))
+ CC := gcc
+ PKG_CONFIG = pkg-config
+else
+ CC := $(DEB_HOST_GNU_TYPE)-gcc
+ PKG_CONFIG = $(DEB_HOST_GNU_TYPE)-pkg-config
+ RUN_TESTS :=
+endif
+
+# Change the version string to reflect distribution
+SSH_EXTRAVERSION := $(DEB_VENDOR)-$(shell echo '$(DEB_VERSION)' | sed -e 's/.*-//')
+
+UBUNTU := $(shell $(call dpkg_vendor_derives_from,Ubuntu))
+ifeq ($(UBUNTU),yes)
+DEFAULT_PATH := /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin:/usr/games
+else
+DEFAULT_PATH := /usr/local/bin:/usr/bin:/bin:/usr/games
+endif
+SUPERUSER_PATH := /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+
+ifeq ($(UBUNTU),yes)
+server_recommends := ssh-import-id
+else
+server_recommends :=
+endif
+
+# Common path configuration.
+confflags += --sysconfdir=/etc/ssh
+confflags += --libexecdir=\$${prefix}/lib/openssh
+
+# Common build options.
+confflags += --disable-strip
+confflags += --with-mantype=doc
+confflags += --with-4in6
+confflags += --with-privsep-path=/run/sshd
+confflags += --with-pid-dir=/run
+
+# The Hurd needs libcrypt for res_query et al.
+ifeq ($(DEB_HOST_ARCH_OS),hurd)
+confflags += --with-libs=-lcrypt
+endif
+
+# Everything above here is common to the deb and udeb builds.
+confflags_udeb := $(confflags)
+
+# Options specific to the deb build.
+confflags += --with-tcp-wrappers
+confflags += --with-pam
+confflags += --with-libedit
+confflags += --with-kerberos5=/usr
+confflags += --with-ssl-engine
+ifeq ($(DEB_HOST_ARCH_OS),linux)
+confflags += --with-selinux
+confflags += --with-audit=linux
+confflags += --with-systemd
+confflags += --with-security-key-builtin
+endif
+
+# The deb build wants xauth; the udeb build doesn't.
+confflags += --with-xauth=/usr/bin/xauth
+confflags_udeb += --without-xauth
+
+# Default paths. The udeb build has /usr/games removed.
+confflags += --with-default-path=$(DEFAULT_PATH) --with-superuser-path=$(SUPERUSER_PATH)
+confflags_udeb += --with-default-path=/usr/local/bin:/usr/bin:/bin --with-superuser-path=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
+
+# Compiler flags.
+cflags := $(CPPFLAGS) $(CFLAGS)
+cflags += -DSSH_EXTRAVERSION=\"$(SSH_EXTRAVERSION)\"
+cflags_udeb := -Os
+cflags_udeb += -DSSH_EXTRAVERSION=\"$(SSH_EXTRAVERSION)\"
+confflags += --with-cflags='$(cflags)'
+confflags_udeb += --with-cflags='$(cflags_udeb)'
+
+# Linker flags.
+confflags += --with-ldflags='$(strip -Wl,--as-needed $(LDFLAGS))'
+confflags_udeb += --with-ldflags='-Wl,--as-needed'
+
+ifeq ($(shell dpkg-vendor --is Ubuntu && echo yes) $(DEB_HOST_ARCH), yes i386)
+ BUILD_PACKAGES += -Nopenssh-tests
+endif
+
+%:
+ dh $@ --with=runit $(BUILD_PACKAGES)
+
+override_dh_autoreconf-indep:
+
+override_dh_auto_configure-arch:
+ dh_auto_configure -Bdebian/build-deb -- $(confflags)
+ifeq ($(filter noudeb,$(DEB_BUILD_PROFILES)),)
+ dh_auto_configure -Bdebian/build-udeb -- $(confflags_udeb)
+ # Avoid libnsl linkage. Ugh.
+ perl -pi -e 's/ +-lnsl//' debian/build-udeb/config.status
+ cd debian/build-udeb && ./config.status
+endif
+
+override_dh_auto_configure-indep:
+
+override_dh_auto_build-arch:
+ $(MAKE) -C debian/build-deb $(PARALLEL) ASKPASS_PROGRAM='/usr/bin/ssh-askpass'
+ $(MAKE) -C debian/build-deb regress-prep
+ $(MAKE) -C debian/build-deb $(PARALLEL) regress-binaries regress-unit-binaries
+ifeq ($(filter noudeb,$(DEB_BUILD_PROFILES)),)
+ $(MAKE) -C debian/build-udeb $(PARALLEL) ASKPASS_PROGRAM='/usr/bin/ssh-askpass' ssh scp sftp sshd ssh-keygen
+endif
+
+ifeq ($(filter pkg.openssh.nognome,$(DEB_BUILD_PROFILES)),)
+ $(MAKE) -C contrib gnome-ssh-askpass3 CC='$(CC) $(CPPFLAGS) $(CFLAGS) -Wall -Wl,--as-needed $(LDFLAGS)' PKG_CONFIG=$(PKG_CONFIG)
+endif
+
+override_dh_auto_build-indep:
+
+override_dh_auto_test-arch:
+ifeq ($(RUN_TESTS),yes)
+ $(MAKE) -C debian/build-deb unit compat-tests
+ $(MAKE) -C debian/keygen-test
+endif
+
+override_dh_auto_test-indep:
+
+override_dh_auto_clean:
+ rm -rf debian/build-deb debian/build-udeb
+ifeq ($(RUN_TESTS),yes)
+ $(MAKE) -C debian/keygen-test clean
+endif
+ $(MAKE) -C contrib clean
+
+override_dh_auto_install-arch:
+ $(MAKE) -C debian/build-deb DESTDIR=`pwd`/debian/tmp install-nokeys
+
+override_dh_auto_install-indep:
+
+override_dh_install-arch:
+ # Remove version control tags to avoid unnecessary conffile
+ # resolution steps for administrators.
+ sed -i '/\$$OpenBSD:/d' \
+ debian/tmp/etc/ssh/moduli \
+ debian/tmp/etc/ssh/ssh_config \
+ debian/tmp/etc/ssh/sshd_config
+
+ dh_install -Nopenssh-client-udeb -Nopenssh-server-udeb
+ifeq ($(filter noudeb,$(DEB_BUILD_PROFILES)),)
+ dh_install -popenssh-client-udeb -popenssh-server-udeb \
+ --sourcedir=debian/build-udeb
+endif
+
+ # This can't be done using dh_link, because it's needed earlier by
+ # dh_installalternatives.
+ ln -sf ssh debian/openssh-client/usr/bin/slogin
+
+ rm -f debian/openssh-tests/usr/lib/openssh/regress/misc/sk-dummy/*.lo
+
+override_dh_installdocs:
+ dh_installdocs -Nopenssh-server -Nopenssh-sftp-server
+ dh_installdocs -popenssh-server -popenssh-sftp-server \
+ --link-doc=openssh-client
+ # Avoid breaking dh_installexamples later.
+ mkdir -p debian/openssh-server/usr/share/doc/openssh-client
+
+override_dh_installinit:
+ dh_installinit -R --name ssh
+
+override_dh_installsystemd:
+ dh_installsystemd -popenssh-server ssh.service rescue-ssh.target
+ dh_installsystemd -popenssh-server --no-enable ssh.socket
+
+debian/openssh-server.sshd.pam: debian/openssh-server.sshd.pam.in
+ifeq ($(DEB_HOST_ARCH_OS),linux)
+ sed 's/^@IF_KEYINIT@//' $< > $@
+else
+ sed '/^@IF_KEYINIT@/d' $< > $@
+endif
+
+override_dh_installpam: debian/openssh-server.sshd.pam
+ dh_installpam --name sshd
+
+override_dh_runit:
+ dh_runit -popenssh-server
+
+execute_after_dh_fixperms-arch:
+ chmod u+s debian/openssh-client/usr/lib/openssh/ssh-keysign
+
+# Work around debhelper/dh-exec bug #1017023.
+override_dh_missing:
+ dh_missing --list-missing
+
+# Tighten libssl dependencies to match the check in entropy.c.
+execute_after_dh_shlibdeps:
+ debian/adjust-openssl-dependencies
+
+override_dh_gencontrol:
+ dh_gencontrol -- -V'openssh-server:Recommends=$(server_recommends)'
diff --git a/debian/run-tests b/debian/run-tests
new file mode 100755
index 0000000..f71e496
--- /dev/null
+++ b/debian/run-tests
@@ -0,0 +1,45 @@
+#! /bin/sh
+# Run installed OpenSSH regression tests.
+
+tmp="$1"
+if [ -z "$tmp" ]; then
+ tmp="$(mktemp -d)"
+ cleanup () {
+ rm -rf "$tmp"
+ }
+ trap cleanup EXIT
+fi
+shift
+if [ -z "$1" ]; then
+ set -- tests interop-tests
+fi
+
+# Copy the regression tests to a fresh directory; this is easier than trying
+# to pick apart which ones need write access.
+cp -a /usr/lib/openssh/regress "$tmp/regress"
+
+ret=0
+make -C "$tmp/regress" \
+ .OBJDIR="$tmp/regress" \
+ .CURDIR="$tmp/regress" \
+ BUILDDIR="$tmp/regress" \
+ OBJ="$tmp/regress" \
+ SUDO=sudo \
+ TEST_SHELL=sh \
+ TEST_SSH_SSH=ssh \
+ TEST_SSH_SFTPSERVER=/usr/lib/openssh/sftp-server \
+ TEST_SSH_PLINK=plink \
+ TEST_SSH_PUTTYGEN=puttygen \
+ TEST_SSH_CONCH=conch3 \
+ TEST_SSH_IPV6=yes \
+ TEST_SSH_ECC=yes \
+ TEST_SSH_UNSAFE_PERMISSIONS=1 \
+ "$@" </dev/zero || ret="$?"
+if [ "$ret" -ne 0 ]; then
+ for log in failed-regress.log failed-ssh.log failed-sshd.log; do
+ if [ -e "$tmp/regress/$log" ]; then
+ tail -v -n+0 "$tmp/regress/$log"
+ fi
+ done
+fi
+exit "$ret"
diff --git a/debian/salsa-ci.yml b/debian/salsa-ci.yml
new file mode 100644
index 0000000..8424db4
--- /dev/null
+++ b/debian/salsa-ci.yml
@@ -0,0 +1,3 @@
+---
+include:
+ - https://salsa.debian.org/salsa-ci-team/pipeline/raw/master/recipes/debian.yml
diff --git a/debian/source/format b/debian/source/format
new file mode 100644
index 0000000..163aaf8
--- /dev/null
+++ b/debian/source/format
@@ -0,0 +1 @@
+3.0 (quilt)
diff --git a/debian/source/include-binaries b/debian/source/include-binaries
new file mode 100644
index 0000000..df5790e
--- /dev/null
+++ b/debian/source/include-binaries
@@ -0,0 +1 @@
+debian/ssh-askpass-gnome.png
diff --git a/debian/source/lintian-overrides b/debian/source/lintian-overrides
new file mode 100644
index 0000000..cd804f3
--- /dev/null
+++ b/debian/source/lintian-overrides
@@ -0,0 +1,2 @@
+# openssh-server/password-authentication is preseeding-only, at least for now.
+openssh source: untranslatable-debconf-templates [debian/openssh-server.templates:20]
diff --git a/debian/ssh-argv0 b/debian/ssh-argv0
new file mode 100644
index 0000000..945530c
--- /dev/null
+++ b/debian/ssh-argv0
@@ -0,0 +1,31 @@
+#! /bin/sh
+set -e
+
+# Copyright (c) 2001 Natalie Amery.
+#
+# Redistribution and use in source and binary forms, with or without
+# modification, are permitted provided that the following conditions
+# are met:
+# 1. Redistributions of source code must retain the above copyright
+# notice, this list of conditions and the following disclaimer.
+# 2. Redistributions in binary form must reproduce the above copyright
+# notice, this list of conditions and the following disclaimer in the
+# documentation and/or other materials provided with the distribution.
+#
+# THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
+# IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
+# OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+# IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
+# INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
+# NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
+# DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
+# THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
+# (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
+# THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
+
+if [ "${0##*/}" = "ssh-argv0" ]
+then
+ echo 'ssh-argv0: This script should not be run like this, see ssh-argv0(1) for details' 1>&2
+ exit 1
+fi
+exec ssh "${0##*/}" "$@"
diff --git a/debian/ssh-argv0.1 b/debian/ssh-argv0.1
new file mode 100644
index 0000000..fec9ff3
--- /dev/null
+++ b/debian/ssh-argv0.1
@@ -0,0 +1,64 @@
+.Dd September 7, 2001
+.Dt SSH-ARGV0 1
+.Os Debian Project
+.Sh NAME
+.Nm ssh-argv0
+.Nd replaces the old ssh command-name as hostname handling
+.Sh SYNOPSIS
+.Ar hostname | user@hostname
+.Op Fl l Ar login_name
+.Op Ar command
+.Pp
+.Ar hostname | user@hostname
+.Op Fl afgknqstvxACNTX1246
+.Op Fl b Ar bind_address
+.Op Fl c Ar cipher_spec
+.Op Fl e Ar escape_char
+.Op Fl i Ar identity_file
+.Op Fl l Ar login_name
+.Op Fl m Ar mac_spec
+.Op Fl o Ar option
+.Op Fl p Ar port
+.Op Fl F Ar configfile
+.Oo Fl L Xo
+.Sm off
+.Ar port :
+.Ar host :
+.Ar hostport
+.Sm on
+.Xc
+.Oc
+.Oo Fl R Xo
+.Sm off
+.Ar port :
+.Ar host :
+.Ar hostport
+.Sm on
+.Xc
+.Oc
+.Op Fl D Ar port
+.Op Ar command
+.Sh DESCRIPTION
+.Nm
+replaces the old ssh command-name as hostname handling.
+If you link to this script with a hostname then executing the link is
+equivalent to having executed ssh with that hostname as an argument.
+All other arguments are passed to ssh and will be processed normally.
+.Sh OPTIONS
+See
+.Xr ssh 1 .
+.Sh FILES
+See
+.Xr ssh 1 .
+.Sh AUTHORS
+OpenSSH is a derivative of the original and free
+ssh 1.2.12 release by Tatu Ylonen.
+Aaron Campbell, Bob Beck, Markus Friedl, Niels Provos,
+Theo de Raadt and Dug Song
+removed many bugs, re-added newer features and
+created OpenSSH.
+Markus Friedl contributed the support for SSH
+protocol versions 1.5 and 2.0.
+Natalie Amery wrote this ssh-argv0 script and the associated documentation.
+.Sh SEE ALSO
+.Xr ssh 1
diff --git a/debian/ssh-askpass-gnome.alternatives b/debian/ssh-askpass-gnome.alternatives
new file mode 100644
index 0000000..c1bf499
--- /dev/null
+++ b/debian/ssh-askpass-gnome.alternatives
@@ -0,0 +1,6 @@
+Name: ssh-askpass
+Link: /usr/bin/ssh-askpass
+Alternative: /usr/lib/openssh/gnome-ssh-askpass
+Dependents:
+ /usr/share/man/man1/ssh-askpass.1.gz ssh-askpass.1.gz /usr/share/man/man1/gnome-ssh-askpass.1.gz
+Priority: 30
diff --git a/debian/ssh-askpass-gnome.desktop b/debian/ssh-askpass-gnome.desktop
new file mode 100644
index 0000000..48c5640
--- /dev/null
+++ b/debian/ssh-askpass-gnome.desktop
@@ -0,0 +1,11 @@
+[Desktop Entry]
+Version=1.0
+Name=SSH AskPass
+GenericName=ssh-add
+Comment=Enter passphrase to authenticate to the ssh agent
+Exec=/usr/bin/ssh-add
+TryExec=ssh-add
+Terminal=false
+Type=Application
+Icon=ssh-askpass-gnome
+Categories=Network;Security;
diff --git a/debian/ssh-askpass-gnome.examples b/debian/ssh-askpass-gnome.examples
new file mode 100644
index 0000000..66fd8c0
--- /dev/null
+++ b/debian/ssh-askpass-gnome.examples
@@ -0,0 +1 @@
+debian/ssh-askpass-gnome.desktop
diff --git a/debian/ssh-askpass-gnome.install b/debian/ssh-askpass-gnome.install
new file mode 100755
index 0000000..8715aaf
--- /dev/null
+++ b/debian/ssh-askpass-gnome.install
@@ -0,0 +1,3 @@
+#! /usr/bin/dh-exec
+contrib/gnome-ssh-askpass3 => usr/lib/openssh/gnome-ssh-askpass
+debian/ssh-askpass-gnome.png usr/share/pixmaps
diff --git a/debian/ssh-askpass-gnome.manpages b/debian/ssh-askpass-gnome.manpages
new file mode 100644
index 0000000..7749f13
--- /dev/null
+++ b/debian/ssh-askpass-gnome.manpages
@@ -0,0 +1 @@
+debian/gnome-ssh-askpass.1
diff --git a/debian/ssh-askpass-gnome.png b/debian/ssh-askpass-gnome.png
new file mode 100644
index 0000000..06f7576
--- /dev/null
+++ b/debian/ssh-askpass-gnome.png
Binary files differ
diff --git a/debian/systemd/rescue-ssh.target b/debian/systemd/rescue-ssh.target
new file mode 100644
index 0000000..9501b7f
--- /dev/null
+++ b/debian/systemd/rescue-ssh.target
@@ -0,0 +1,6 @@
+[Unit]
+Description=Rescue with network and ssh
+Documentation=man:systemd.special(7)
+Requires=network-online.target ssh.service
+After=network-online.target ssh.service
+AllowIsolate=yes
diff --git a/debian/systemd/ssh-agent.service b/debian/systemd/ssh-agent.service
new file mode 100644
index 0000000..cdc10bb
--- /dev/null
+++ b/debian/systemd/ssh-agent.service
@@ -0,0 +1,11 @@
+[Unit]
+Description=OpenSSH Agent
+Documentation=man:ssh-agent(1)
+Before=graphical-session-pre.target
+ConditionPathExists=/etc/X11/Xsession.options
+Wants=dbus.socket
+After=dbus.socket
+
+[Service]
+ExecStart=/usr/lib/openssh/agent-launch start
+ExecStopPost=/usr/lib/openssh/agent-launch stop
diff --git a/debian/systemd/ssh-session-cleanup b/debian/systemd/ssh-session-cleanup
new file mode 100755
index 0000000..f283cc9
--- /dev/null
+++ b/debian/systemd/ssh-session-cleanup
@@ -0,0 +1,11 @@
+#! /bin/sh
+
+ssh_session_pattern='sshd: \S.*@pts/[0-9]+'
+
+IFS="$IFS@"
+pgrep -a -f "$ssh_session_pattern" | while read pid daemon user pty; do
+ echo "Found ${daemon%:} session $pid on $pty; sending SIGTERM"
+ kill "$pid" || true
+done
+
+exit 0
diff --git a/debian/systemd/ssh-session-cleanup.service b/debian/systemd/ssh-session-cleanup.service
new file mode 100644
index 0000000..b867272
--- /dev/null
+++ b/debian/systemd/ssh-session-cleanup.service
@@ -0,0 +1,13 @@
+[Unit]
+Description=OpenBSD Secure Shell session cleanup
+Wants=network.target
+After=network.target
+
+[Service]
+ExecStart=/bin/true
+ExecStop=/usr/lib/openssh/ssh-session-cleanup
+RemainAfterExit=yes
+Type=oneshot
+
+[Install]
+WantedBy=multi-user.target
diff --git a/debian/systemd/ssh.service b/debian/systemd/ssh.service
new file mode 100644
index 0000000..7495d9a
--- /dev/null
+++ b/debian/systemd/ssh.service
@@ -0,0 +1,22 @@
+[Unit]
+Description=OpenBSD Secure Shell server
+Documentation=man:sshd(8) man:sshd_config(5)
+After=network.target auditd.service
+ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
+
+[Service]
+EnvironmentFile=-/etc/default/ssh
+ExecStartPre=/usr/sbin/sshd -t
+ExecStart=/usr/sbin/sshd -D $SSHD_OPTS
+ExecReload=/usr/sbin/sshd -t
+ExecReload=/bin/kill -HUP $MAINPID
+KillMode=process
+Restart=on-failure
+RestartPreventExitStatus=255
+Type=notify
+RuntimeDirectory=sshd
+RuntimeDirectoryMode=0755
+
+[Install]
+WantedBy=multi-user.target
+Alias=sshd.service
diff --git a/debian/systemd/ssh.socket b/debian/systemd/ssh.socket
new file mode 100644
index 0000000..1de1280
--- /dev/null
+++ b/debian/systemd/ssh.socket
@@ -0,0 +1,11 @@
+[Unit]
+Description=OpenBSD Secure Shell server socket
+Before=sockets.target
+ConditionPathExists=!/etc/ssh/sshd_not_to_be_run
+
+[Socket]
+ListenStream=22
+Accept=no
+
+[Install]
+WantedBy=sockets.target
diff --git a/debian/tests/control b/debian/tests/control
new file mode 100644
index 0000000..8bc480a
--- /dev/null
+++ b/debian/tests/control
@@ -0,0 +1,10 @@
+Tests: regress
+Restrictions: needs-root allow-stderr
+Depends: devscripts,
+ haveged,
+ openssh-tests,
+ openssl,
+ putty-tools,
+ python3-twisted,
+ sudo,
+ sysvinit-utils,
diff --git a/debian/tests/regress b/debian/tests/regress
new file mode 100755
index 0000000..40a73b2
--- /dev/null
+++ b/debian/tests/regress
@@ -0,0 +1,84 @@
+#! /bin/sh
+set -e
+
+if [ "$(id -un)" != openssh-tests ]; then
+ TMP="$AUTOPKGTEST_TMP/user"
+ CREATED_RUN_SSHD=false
+ STARTED_HAVEGED=false
+ ADDED_HOST=false
+
+ cleanup () {
+ if $ADDED_HOST; then
+ sed -i '/[[:space:]]UNKNOWN$/d' /etc/hosts
+ fi
+
+ if $STARTED_HAVEGED; then
+ if [ -d /run/systemd/system ] && \
+ which systemctl >/dev/null 2>&1; then
+ systemctl disable haveged || true
+ systemctl stop haveged || true
+ else
+ start-stop-daemon --stop --quiet --oknodo \
+ --retry=TERM/30/KILL/5 \
+ --pidfile "$AUTOPKGTEST_TMP/haveged.pid" \
+ --name haveged
+ fi
+ fi
+ rm -f /etc/sudoers.d/openssh-tests
+ if id openssh-tests >/dev/null 2>&1; then
+ deluser --remove-home openssh-tests
+ fi
+
+ if $CREATED_RUN_SSHD; then
+ rm -rf /run/sshd
+ fi
+ }
+ trap cleanup EXIT
+
+ adduser --disabled-password --gecos 'OpenSSH tests' openssh-tests
+ usermod -p '*' openssh-tests
+ cat >/etc/sudoers.d/openssh-tests <<EOF
+openssh-tests ALL = (ALL:ALL) NOPASSWD: ALL
+EOF
+ chmod 440 /etc/sudoers.d/openssh-tests
+ mkdir -p "$TMP"
+ chown -R openssh-tests:openssh-tests "$TMP"
+
+ # Depending on how the environment is configured, our test
+ # dependency on openssh-server may not actually started sshd and
+ # thus may not have caused /run/sshd to be created.
+ if [ ! -d /run/sshd ]; then
+ mkdir -m755 /run/sshd
+ CREATED_RUN_SSHD=:
+ fi
+
+ # If we're running in a container, haveged may not have started
+ # automatically.
+ if [ -d /run/systemd/system ] && which systemctl >/dev/null 2>&1; then
+ systemctl enable haveged || true
+ systemctl start haveged || true
+ STARTED_HAVEGED=:
+ elif ! pidof haveged >/dev/null; then
+ start-stop-daemon --start --quiet \
+ --pidfile "$AUTOPKGTEST_TMP/haveged.pid" \
+ --exec /usr/sbin/haveged -- \
+ -p "$AUTOPKGTEST_TMP/haveged.pid"
+ STARTED_HAVEGED=:
+ fi
+
+ # ssh ends up setting PAM_RHOST to "UNKNOWN" during a number of
+ # regression tests, which causes DNS resolution delays, slowing down
+ # the test suite substantially and causing the connection-timeout
+ # tests to fail. The only way to work around this while running
+ # tests with "UsePAM yes" appears to be to make "UNKNOWN"
+ # resolvable.
+ if ! grep -q '[[:space:]]UNKNOWN$' /etc/hosts; then
+ echo '127.0.0.1 UNKNOWN' >>/etc/hosts
+ ADDED_HOST=:
+ fi
+
+ sudo -u openssh-tests env TMP="$TMP" "$0" "$@"
+ exit "$?"
+fi
+
+annotate-output +%H:%M:%S.%N /usr/lib/openssh/regress/run-tests "$TMP"
diff --git a/debian/upstream/signing-key.asc b/debian/upstream/signing-key.asc
new file mode 100644
index 0000000..e4eabc2
--- /dev/null
+++ b/debian/upstream/signing-key.asc
@@ -0,0 +1,70 @@
+-----BEGIN PGP PUBLIC KEY BLOCK-----
+
+mQGdBFKmggUBDICUNqm4cNh7tdEbwaNhbnwqLiHpILeXT6sddGI0Stz5ofB1uvIH
+m9kXYG5XUUwlc5ywjIZm2JeuKqrd/6wAz5laLagFA6k86EZzzuBE3b5FxSQ4EN4K
+5XZEJo61xASEF7z1mQCiqoA6/F407ht7nNoiVE95kOmqJlv4cqbpCw3n8f2VW+mV
+UH6MYRZVrYAC9NnJWv24rem2fjgFhNT1/bx44G7H9bVJqL7hMEGa+xYQBI3YT/ul
+Eu9HYmLFVeiZm1gB1eKXW7jS4ctLl5uPrxayA5DX/qNB2yqgVVlIKFwUm8gGPGPO
+nsNKo0xBseE7E0F/KeGpaT5aS9yFgPm9A652Jx9felYgb0e9Ipt3lxriPQwgF/cx
+LGuP/WEbN5fpWFnuV0ViklusuVI2e8GHJGU5bQD5AlzvWu4Sv6oBOcDCabScydY7
+IxPBk/XBWCF9QDIa2qa32Mc9dYc8EnJszPeVCHX5hG23omDRmdLGLwH7F+CuBvCx
+AKCymZtJl5DhRmnhdzRg9d+0VG4hLF7O06ANABEBAAG0H0RhbWllbiBNaWxsZXIg
+PGRqbUBtaW5kcm90Lm9yZz6JAc0EEwECACcCGwMFCQ1H67ECHgECF4AFAlKmjJwE
+CwkIBwYVCgkICwIFFgIDAQAACgkQ0+X1a22SDTB2TAx9E1ozPJKUGWJPZefqsSr8
+KsO6Dp3QuPrw2Zwgo2QfeCT+uzNA5AKCDIAaYEpVbQsvu4sDy8dAW1+HENCxVrMX
+WG+SH41lcdAdI4io0PGHVQDl42R5jX3e9pfjYCQALVv5BDXddK6054nyxEmudQ3I
+CFCYXIcqQbA1nfj3Uk06jGhuM99B2/akbxCoFSiUX9uHDZKNYAGpU7/FCF9xCZF4
+Kd9Twvyy17jDIg7km3/Q4Jy++VP8FyvE5JjBdLRQSBzSG9GCjv9fyKWW7S0bMY4D
+3SKKt/Jm1XchEMgpRr4eBpgCs3rxO1hXjzqm3te97uy6/q8CuJUtupJsPKc9Wh4+
+ogUZifC0ta7UrxZp8yZTRvPSUxYrlvDzM32VDLQ3FX6Y2i4VNo48PSJMA+BPUx7D
+TcZKIXt457zsLD4jF4sRdwOk/QF/GXCkH2GAyKHWCPXIOe+jIXgiuajcqZm9cAWj
+L3hidSohKfefvKkzsg75mDmjhvAtDncIbmImJNjXIe2PQU4iY9Vq5i0vlaVKgBgK
+SpkCDQRf7mYNARAAz2vrsO3Cz8vYpaXvc5tN9uloHBpeMl7Fb5A5U4XB36ux3JE0
+3mxIWgpVaCtKgwPAwaOprywMBee3jJh2xBIuv3cy1JSB/zCl12erUEQhSqk8wc4S
+Wou/h9ecl5L0b3255lbayeTWJaaz2EjVzezbiROqeHTXkd8Agrjbr6IzcdycOZiV
+K8SLjdpCN8A9VzqjD7FLsQ+i4MN9sE+V7QjUASnTEPBgvVhrEX10xQTagoyF2230
+XlcYSKv2rLpgk7J2LzjFWrNZ/m2AriMMg1jQGKijYMHV1f5PQ/DSye/9QTUPLwHz
+iRZek7A3pZGTjv4bq1Tywc8d0VmvE56IfVIsn1cYhYq4mBm2IeWTO+IcxVjAS2uf
+N8RUu8MnFnFHohzKVB6Q7Cg4HhiUgmNn6xnRE59NxuTd30OcTDxQ0SNgJjSRfMMq
+8nl0upQCDH5ksrVSCUPB95GLeO2WtSgMOBsefeZcQU3y0QyxRkBX1sB1H84u9vF2
+5FZHHzMJmd+PhWW+V8n00wnr8zpUdvmBzIGz3C91Y0DjJxewmfYvgoBD80cSF9SJ
+Q5Hwvk1M/125sfUBN1rBvh08ON3mMvfxds4deT8Gtc8N74ggWYRGgJUkYvTEc8Ho
+0FGWkg/VTNeRTEY7tIzVm2XojWMvdK1733sf1b3mEV3NTyqYuDnnxjoDa0cAEQEA
+AbQfRGFtaWVuIE1pbGxlciA8ZGptQG1pbmRyb3Qub3JnPokCTgQTAQgAOBYhBHFo
+uYOBWl7vWaSt/So/QU5zYGC6BQJf7mYNAhsDBQsJCAcCBhUKCQgLAgQWAgMBAh4B
+AheAAAoJECo/QU5zYGC6kI4P/AxEYU8XTuZHYzAim7sHRr+Z1HnknrgN9mGL3HuC
+y8H8cdOZkQLnHSOmYjGfOKRNTzWibr36Cd4ERCXP+blDCtkrFw1QLoLRICZ5nJCc
+FSr5CanrU87wUwCQ0xfkkPl8iF8j1dorIDZOetAKumn87wKYnNphGQifPZF5GS0N
+S+Xp7vmg+R+abTTCSTnxFNPwiQJwRm/lXO+A4bCHcuPL/X1vfVEYOARS+n3l29gp
+nHUoroiWKC/F+HRvr6o4dIAml+jMq6xBMB6j9yYsyzNrq96GMxXDLvPCUkEad96+
+gR2vRJJvFMUMa9tzc4C9n/Ks8t5s7um63l3eSYlHuVL6adI9SlVLbzyudBr7P+mU
+3r0zxvYozTzPALwgohs4bYiWqdtE9y+qLsJrg5zM1g5gFJWAFWNhXkfB10NeoYN0
+L8IyRZMaBq4154fg99eaQBETzh1qoyAE1wZ5DFzzGMn0Z5gqyYd6pTxYol+6UIFv
+kuIbhvzo7AnEQb9CMzCceJcPaSDoWJn8MXibgcR8zQ+bJL9BoOwevTuPBRRg4dW6
+IOBDEqBjzZysSI7ET36R99WsBq0kxtPjmrbo5G66DkrwDBps7sggRg2Y23tgmrOs
+sDVszN+erC+80XClDTBz8myB3y6d4VU+dWG4n0ZDGJE+w6YNZN/2pCKESlgU8e5K
+5qUtuQINBF/uZg0BEADaJmzxsGKzGvlpATWBNVfC+C2cg6NDpoM6H1uaKdoBC2D6
+e280WLodTNK8HRdOMDDywfYHPfwKRzO4N93hh9k7MAlElMbnw0C5sAwOMnfIet8/
++5ef4pURR0Ni/7BNtsDhw/O0wuE3E0nCA8qNUuP0UaR1gsJ77FMPc86LAw61rOlb
+i53Kc0JxDU/4Mg/Me46KwnUCRioOtKFyURRyK07jj/7wnOGIof0fHCiY4uS7uXCM
+XWcTK9ULrMleXGpciZt4UVFsouUi1xutUPVIlYEXoSy0WBIIVyMbT4o3zotEAF+n
+3zTg6MeJIGIM5NPRbhbmJwOco7OP5mWx1J1IhzACcvPueyChuCNRpE+izTXd11ww
+MVIhL5I20AT+yLgkd0sZRUIoflGAfJYyMrYxAbHcsJoc9VP8SLS4t1Jsq2kulKxi
+w2iSWLDzgLN3qxSONH8iEeMnuvIPh4lLJe3u+5np723DIm6Zw8m9bDd94WMaoYqa
+HCnDq+IqRgSoNKRLsglGp1LwzLU8ybfwTDrVZpJhh6G54fXI7/9a2WjaFh8WHg3g
+dy70To14kE0RzbSDPq1OSTJu4i4Kxl1Gv0wRmBwQTAf4x/fzoun79Wp+mbKRRpPh
+cBOTOFIeIUXHfLWMP+AKU3jMBOZL2zbV1/w2ihypZMmM6MuYqf2d6+ngmt/k0QAR
+AQABiQI2BBgBCAAgFiEEcWi5g4FaXu9ZpK39Kj9BTnNgYLoFAl/uZg0CGwwACgkQ
+Kj9BTnNgYLpr+hAAqOiAeJCpEouxpGPnKKnLnaKzy9eOwN2G/b0ZMVX/Rous9wXH
+k2Qc9/mZCw3+TV9h/Adqra7Aa4v9gHpFrp5kE4//F3SLsmlQutI9MMFYSCoXlTO5
+ptAljyhgrxF0DlFLpNzhDfwv1/1Fsdg8a9GAN5tmeAxU5RA4PSzgSQBjCh844T9r
+lL5PL7Xaju34FMW5yOAX9GKiA7fwfJ5R6kqIkVS+5JFyW4i8dqigu8My9+ZlP+dm
+FmyoBredPvzQ6D1qikjfq2ZS5lJHV8nmNiCPl1TckDXUdZqLBtmJVcSc0OH9Y+vM
+zyT4oZ/93HKYu4JtE5z7DCOGqJYaftwolxUsfNII7Ss9Vom+uWJO6LTK1EtDkXcD
+z6eyrziVsdcNladgxwZUXSKW5CSxtCRz1U+6dEhUDdR8+3s7+srwuRmUm20o9kvT
+jYgLu+s8VkgcNtiXk4RDCiE7nm//QyC1oPNz8+TuadWRwvK9ovXKXwVZ758pjgmT
+xJQLKDDEIKO0K/tNZho0Z6l6VCifBFbELJ/7FRqcSs7GAAeEt+CvMVbfWpTaet3Z
+Rtu2PqNfC0k0x4/VkIEvkGBxSnKlhSH0PLGyN1KaOGYWThRcEKml/k+j/WpKmvko
++bC5ZN3QoYISeixT1FKkm0TvymHGqQpoHwDceZF48mDJLiHYEvQ2BBEhFVY=
+=1FpL
+-----END PGP PUBLIC KEY BLOCK-----
diff --git a/debian/watch b/debian/watch
new file mode 100644
index 0000000..fa0555e
--- /dev/null
+++ b/debian/watch
@@ -0,0 +1,3 @@
+version=4
+opts=pgpsigurlmangle=s/$/.asc/ \
+https://ftp.openbsd.org/pub/OpenBSD/OpenSSH/portable/openssh-(.*)\.tar\.gz