summaryrefslogtreecommitdiff
path: root/ssh-agent.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 /ssh-agent.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 'ssh-agent.c')
-rw-r--r--ssh-agent.c49
1 files changed, 32 insertions, 17 deletions
diff --git a/ssh-agent.c b/ssh-agent.c
index c3d5e5a75..9123cfe6b 100644
--- a/ssh-agent.c
+++ b/ssh-agent.c
@@ -1,4 +1,4 @@
1/* $OpenBSD: ssh-agent.c,v 1.155 2007/03/19 12:16:42 dtucker Exp $ */ 1/* $OpenBSD: ssh-agent.c,v 1.159 2008/06/28 14:05:15 djm Exp $ */
2/* 2/*
3 * Author: Tatu Ylonen <ylo@cs.hut.fi> 3 * Author: Tatu Ylonen <ylo@cs.hut.fi>
4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland 4 * Copyright (c) 1995 Tatu Ylonen <ylo@cs.hut.fi>, Espoo, Finland
@@ -51,6 +51,7 @@
51 51
52#include <openssl/evp.h> 52#include <openssl/evp.h>
53#include <openssl/md5.h> 53#include <openssl/md5.h>
54#include "openbsd-compat/openssl-compat.h"
54 55
55#include <errno.h> 56#include <errno.h>
56#include <fcntl.h> 57#include <fcntl.h>
@@ -311,6 +312,7 @@ process_sign_request2(SocketEntry *e)
311 u_char *blob, *data, *signature = NULL; 312 u_char *blob, *data, *signature = NULL;
312 u_int blen, dlen, slen = 0; 313 u_int blen, dlen, slen = 0;
313 extern int datafellows; 314 extern int datafellows;
315 int odatafellows;
314 int ok = -1, flags; 316 int ok = -1, flags;
315 Buffer msg; 317 Buffer msg;
316 Key *key; 318 Key *key;
@@ -321,6 +323,7 @@ process_sign_request2(SocketEntry *e)
321 data = buffer_get_string(&e->request, &dlen); 323 data = buffer_get_string(&e->request, &dlen);
322 324
323 flags = buffer_get_int(&e->request); 325 flags = buffer_get_int(&e->request);
326 odatafellows = datafellows;
324 if (flags & SSH_AGENT_OLD_SIGNATURE) 327 if (flags & SSH_AGENT_OLD_SIGNATURE)
325 datafellows = SSH_BUG_SIGBLOB; 328 datafellows = SSH_BUG_SIGBLOB;
326 329
@@ -346,6 +349,7 @@ process_sign_request2(SocketEntry *e)
346 xfree(blob); 349 xfree(blob);
347 if (signature != NULL) 350 if (signature != NULL)
348 xfree(signature); 351 xfree(signature);
352 datafellows = odatafellows;
349} 353}
350 354
351/* shared */ 355/* shared */
@@ -457,6 +461,7 @@ static void
457process_add_identity(SocketEntry *e, int version) 461process_add_identity(SocketEntry *e, int version)
458{ 462{
459 Idtab *tab = idtab_lookup(version); 463 Idtab *tab = idtab_lookup(version);
464 Identity *id;
460 int type, success = 0, death = 0, confirm = 0; 465 int type, success = 0, death = 0, confirm = 0;
461 char *type_name, *comment; 466 char *type_name, *comment;
462 Key *k = NULL; 467 Key *k = NULL;
@@ -524,9 +529,8 @@ process_add_identity(SocketEntry *e, int version)
524 xfree(comment); 529 xfree(comment);
525 goto send; 530 goto send;
526 } 531 }
527 success = 1;
528 while (buffer_len(&e->request)) { 532 while (buffer_len(&e->request)) {
529 switch (buffer_get_char(&e->request)) { 533 switch ((type = buffer_get_char(&e->request))) {
530 case SSH_AGENT_CONSTRAIN_LIFETIME: 534 case SSH_AGENT_CONSTRAIN_LIFETIME:
531 death = time(NULL) + buffer_get_int(&e->request); 535 death = time(NULL) + buffer_get_int(&e->request);
532 break; 536 break;
@@ -534,24 +538,29 @@ process_add_identity(SocketEntry *e, int version)
534 confirm = 1; 538 confirm = 1;
535 break; 539 break;
536 default: 540 default:
537 break; 541 error("process_add_identity: "
542 "Unknown constraint type %d", type);
543 xfree(comment);
544 key_free(k);
545 goto send;
538 } 546 }
539 } 547 }
548 success = 1;
540 if (lifetime && !death) 549 if (lifetime && !death)
541 death = time(NULL) + lifetime; 550 death = time(NULL) + lifetime;
542 if (lookup_identity(k, version) == NULL) { 551 if ((id = lookup_identity(k, version)) == NULL) {
543 Identity *id = xmalloc(sizeof(Identity)); 552 id = xmalloc(sizeof(Identity));
544 id->key = k; 553 id->key = k;
545 id->comment = comment;
546 id->death = death;
547 id->confirm = confirm;
548 TAILQ_INSERT_TAIL(&tab->idlist, id, next); 554 TAILQ_INSERT_TAIL(&tab->idlist, id, next);
549 /* Increment the number of identities. */ 555 /* Increment the number of identities. */
550 tab->nentries++; 556 tab->nentries++;
551 } else { 557 } else {
552 key_free(k); 558 key_free(k);
553 xfree(comment); 559 xfree(id->comment);
554 } 560 }
561 id->comment = comment;
562 id->death = death;
563 id->confirm = confirm;
555send: 564send:
556 buffer_put_int(&e->output, 1); 565 buffer_put_int(&e->output, 1);
557 buffer_put_char(&e->output, 566 buffer_put_char(&e->output,
@@ -602,10 +611,10 @@ no_identities(SocketEntry *e, u_int type)
602 611
603#ifdef SMARTCARD 612#ifdef SMARTCARD
604static void 613static void
605process_add_smartcard_key (SocketEntry *e) 614process_add_smartcard_key(SocketEntry *e)
606{ 615{
607 char *sc_reader_id = NULL, *pin; 616 char *sc_reader_id = NULL, *pin;
608 int i, version, success = 0, death = 0, confirm = 0; 617 int i, type, version, success = 0, death = 0, confirm = 0;
609 Key **keys, *k; 618 Key **keys, *k;
610 Identity *id; 619 Identity *id;
611 Idtab *tab; 620 Idtab *tab;
@@ -614,7 +623,7 @@ process_add_smartcard_key (SocketEntry *e)
614 pin = buffer_get_string(&e->request, NULL); 623 pin = buffer_get_string(&e->request, NULL);
615 624
616 while (buffer_len(&e->request)) { 625 while (buffer_len(&e->request)) {
617 switch (buffer_get_char(&e->request)) { 626 switch ((type = buffer_get_char(&e->request))) {
618 case SSH_AGENT_CONSTRAIN_LIFETIME: 627 case SSH_AGENT_CONSTRAIN_LIFETIME:
619 death = time(NULL) + buffer_get_int(&e->request); 628 death = time(NULL) + buffer_get_int(&e->request);
620 break; 629 break;
@@ -622,7 +631,11 @@ process_add_smartcard_key (SocketEntry *e)
622 confirm = 1; 631 confirm = 1;
623 break; 632 break;
624 default: 633 default:
625 break; 634 error("process_add_smartcard_key: "
635 "Unknown constraint type %d", type);
636 xfree(sc_reader_id);
637 xfree(pin);
638 goto send;
626 } 639 }
627 } 640 }
628 if (lifetime && !death) 641 if (lifetime && !death)
@@ -948,7 +961,8 @@ after_select(fd_set *readset, fd_set *writeset)
948 buffer_ptr(&sockets[i].output), 961 buffer_ptr(&sockets[i].output),
949 buffer_len(&sockets[i].output)); 962 buffer_len(&sockets[i].output));
950 if (len == -1 && (errno == EAGAIN || 963 if (len == -1 && (errno == EAGAIN ||
951 errno == EINTR)) 964 errno == EINTR ||
965 errno == EWOULDBLOCK))
952 continue; 966 continue;
953 break; 967 break;
954 } while (1); 968 } while (1);
@@ -962,7 +976,8 @@ after_select(fd_set *readset, fd_set *writeset)
962 do { 976 do {
963 len = read(sockets[i].fd, buf, sizeof(buf)); 977 len = read(sockets[i].fd, buf, sizeof(buf));
964 if (len == -1 && (errno == EAGAIN || 978 if (len == -1 && (errno == EAGAIN ||
965 errno == EINTR)) 979 errno == EINTR ||
980 errno == EWOULDBLOCK))
966 continue; 981 continue;
967 break; 982 break;
968 } while (1); 983 } while (1);
@@ -1016,7 +1031,7 @@ check_parent_exists(void)
1016static void 1031static void
1017usage(void) 1032usage(void)
1018{ 1033{
1019 fprintf(stderr, "Usage: %s [options] [command [args ...]]\n", 1034 fprintf(stderr, "usage: %s [options] [command [arg ...]]\n",
1020 __progname); 1035 __progname);
1021 fprintf(stderr, "Options:\n"); 1036 fprintf(stderr, "Options:\n");
1022 fprintf(stderr, " -c Generate C-shell commands on stdout.\n"); 1037 fprintf(stderr, " -c Generate C-shell commands on stdout.\n");