summaryrefslogtreecommitdiff
path: root/monitor.c
diff options
context:
space:
mode:
authorColin Watson <cjwatson@debian.org>2008-07-22 19:45:18 +0000
committerColin Watson <cjwatson@debian.org>2008-07-22 19:45:18 +0000
commit137d76ba65883aa8143af1fcad83b57e7badef0c (patch)
treef426e804bb5248ceafedfab7bb78ae6e6752942c /monitor.c
parentdac7d049dad31f5f84d421d4eb628a7e13f977d7 (diff)
parentef94e5613d37bcbf880f21ee6094e4b1c7683a4c (diff)
* 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). - 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". + 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). + Prevent sshd(8) from erroneously applying public key restrictions leaned from ~/.ssh/authorized_keys to other authentication methods when public key authentication subsequently fails (LP: #161047). + Fixed an UMAC alignment problem that manifested on Itanium platforms.
Diffstat (limited to 'monitor.c')
-rw-r--r--monitor.c33
1 files changed, 23 insertions, 10 deletions
diff --git a/monitor.c b/monitor.c
index de323f538..5305911a4 100644
--- a/monitor.c
+++ b/monitor.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: monitor.c,v 1.91 2007/05/17 20:52:13 djm Exp $ */ 1/* $OpenBSD: monitor.c,v 1.99 2008/07/10 18:08:11 markus Exp $ */
2/* 2/*
3 * Copyright 2002 Niels Provos <provos@citi.umich.edu> 3 * Copyright 2002 Niels Provos <provos@citi.umich.edu>
4 * Copyright 2002 Markus Friedl <markus@openbsd.org> 4 * Copyright 2002 Markus Friedl <markus@openbsd.org>
@@ -51,6 +51,7 @@
51 51
52#include <openssl/dh.h> 52#include <openssl/dh.h>
53 53
54#include "openbsd-compat/sys-queue.h"
54#include "xmalloc.h" 55#include "xmalloc.h"
55#include "ssh.h" 56#include "ssh.h"
56#include "key.h" 57#include "key.h"
@@ -660,11 +661,11 @@ mm_answer_pwnamallow(int sock, Buffer *m)
660#endif 661#endif
661 buffer_put_cstring(m, pwent->pw_dir); 662 buffer_put_cstring(m, pwent->pw_dir);
662 buffer_put_cstring(m, pwent->pw_shell); 663 buffer_put_cstring(m, pwent->pw_shell);
664
665 out:
663 buffer_put_string(m, &options, sizeof(options)); 666 buffer_put_string(m, &options, sizeof(options));
664 if (options.banner != NULL) 667 if (options.banner != NULL)
665 buffer_put_cstring(m, options.banner); 668 buffer_put_cstring(m, options.banner);
666
667 out:
668 debug3("%s: sending MONITOR_ANS_PWNAM: %d", __func__, allowed); 669 debug3("%s: sending MONITOR_ANS_PWNAM: %d", __func__, allowed);
669 mm_request_send(sock, MONITOR_ANS_PWNAM, m); 670 mm_request_send(sock, MONITOR_ANS_PWNAM, m);
670 671
@@ -1055,6 +1056,8 @@ mm_answer_keyallowed(int sock, Buffer *m)
1055 allowed = options.pubkey_authentication && 1056 allowed = options.pubkey_authentication &&
1056 user_key_allowed(authctxt->pw, key); 1057 user_key_allowed(authctxt->pw, key);
1057 auth_method = "publickey"; 1058 auth_method = "publickey";
1059 if (options.pubkey_authentication && allowed != 1)
1060 auth_clear_options();
1058 break; 1061 break;
1059 case MM_HOSTKEY: 1062 case MM_HOSTKEY:
1060 allowed = options.hostbased_authentication && 1063 allowed = options.hostbased_authentication &&
@@ -1067,6 +1070,8 @@ mm_answer_keyallowed(int sock, Buffer *m)
1067 allowed = options.rhosts_rsa_authentication && 1070 allowed = options.rhosts_rsa_authentication &&
1068 auth_rhosts_rsa_key_allowed(authctxt->pw, 1071 auth_rhosts_rsa_key_allowed(authctxt->pw,
1069 cuser, chost, key); 1072 cuser, chost, key);
1073 if (options.rhosts_rsa_authentication && allowed != 1)
1074 auth_clear_options();
1070 auth_method = "rsa"; 1075 auth_method = "rsa";
1071 break; 1076 break;
1072 default: 1077 default:
@@ -1096,7 +1101,7 @@ mm_answer_keyallowed(int sock, Buffer *m)
1096 } 1101 }
1097 1102
1098 debug3("%s: key %p is %s", 1103 debug3("%s: key %p is %s",
1099 __func__, key, allowed ? "allowed" : "disallowed"); 1104 __func__, key, allowed ? "allowed" : "not allowed");
1100 1105
1101 buffer_clear(m); 1106 buffer_clear(m);
1102 buffer_put_int(m, allowed); 1107 buffer_put_int(m, allowed);
@@ -1313,7 +1318,7 @@ mm_session_close(Session *s)
1313 debug3("%s: tty %s ptyfd %d", __func__, s->tty, s->ptyfd); 1318 debug3("%s: tty %s ptyfd %d", __func__, s->tty, s->ptyfd);
1314 session_pty_cleanup2(s); 1319 session_pty_cleanup2(s);
1315 } 1320 }
1316 s->used = 0; 1321 session_unused(s->self);
1317} 1322}
1318 1323
1319int 1324int
@@ -1355,8 +1360,9 @@ mm_answer_pty(int sock, Buffer *m)
1355 1360
1356 mm_request_send(sock, MONITOR_ANS_PTY, m); 1361 mm_request_send(sock, MONITOR_ANS_PTY, m);
1357 1362
1358 mm_send_fd(sock, s->ptyfd); 1363 if (mm_send_fd(sock, s->ptyfd) == -1 ||
1359 mm_send_fd(sock, s->ttyfd); 1364 mm_send_fd(sock, s->ttyfd) == -1)
1365 fatal("%s: send fds failed", __func__);
1360 1366
1361 /* make sure nothing uses fd 0 */ 1367 /* make sure nothing uses fd 0 */
1362 if ((fd0 = open(_PATH_DEVNULL, O_RDONLY)) < 0) 1368 if ((fd0 = open(_PATH_DEVNULL, O_RDONLY)) < 0)
@@ -1587,6 +1593,11 @@ mm_answer_term(int sock, Buffer *req)
1587 /* The child is terminating */ 1593 /* The child is terminating */
1588 session_destroy_all(&mm_session_close); 1594 session_destroy_all(&mm_session_close);
1589 1595
1596#ifdef USE_PAM
1597 if (options.use_pam)
1598 sshpam_cleanup();
1599#endif
1600
1590 while (waitpid(pmonitor->m_pid, &status, 0) == -1) 1601 while (waitpid(pmonitor->m_pid, &status, 0) == -1)
1591 if (errno != EINTR) 1602 if (errno != EINTR)
1592 exit(1); 1603 exit(1);
@@ -1740,7 +1751,7 @@ mm_get_keystate(struct monitor *pmonitor)
1740 u_char *blob, *p; 1751 u_char *blob, *p;
1741 u_int bloblen, plen; 1752 u_int bloblen, plen;
1742 u_int32_t seqnr, packets; 1753 u_int32_t seqnr, packets;
1743 u_int64_t blocks; 1754 u_int64_t blocks, bytes;
1744 1755
1745 debug3("%s: Waiting for new keys", __func__); 1756 debug3("%s: Waiting for new keys", __func__);
1746 1757
@@ -1773,11 +1784,13 @@ mm_get_keystate(struct monitor *pmonitor)
1773 seqnr = buffer_get_int(&m); 1784 seqnr = buffer_get_int(&m);
1774 blocks = buffer_get_int64(&m); 1785 blocks = buffer_get_int64(&m);
1775 packets = buffer_get_int(&m); 1786 packets = buffer_get_int(&m);
1776 packet_set_state(MODE_OUT, seqnr, blocks, packets); 1787 bytes = buffer_get_int64(&m);
1788 packet_set_state(MODE_OUT, seqnr, blocks, packets, bytes);
1777 seqnr = buffer_get_int(&m); 1789 seqnr = buffer_get_int(&m);
1778 blocks = buffer_get_int64(&m); 1790 blocks = buffer_get_int64(&m);
1779 packets = buffer_get_int(&m); 1791 packets = buffer_get_int(&m);
1780 packet_set_state(MODE_IN, seqnr, blocks, packets); 1792 bytes = buffer_get_int64(&m);
1793 packet_set_state(MODE_IN, seqnr, blocks, packets, bytes);
1781 1794
1782 skip: 1795 skip:
1783 /* Get the key context */ 1796 /* Get the key context */