Home | History | Annotate | Download | only in openssh
      1 This documents OpenSSH's deviations and extensions to the published SSH
      2 protocol.
      3 
      4 Note that OpenSSH's sftp and sftp-server implement revision 3 of the SSH
      5 filexfer protocol described in:
      6 
      7 http://www.openssh.com/txt/draft-ietf-secsh-filexfer-02.txt
      8 
      9 Newer versions of the draft will not be supported, though some features
     10 are individually implemented as extensions described below.
     11 
     12 The protocol used by OpenSSH's ssh-agent is described in the file
     13 PROTOCOL.agent
     14 
     15 1. Transport protocol changes
     16 
     17 1.1. transport: Protocol 2 MAC algorithm "umac-64 (a] openssh.com"
     18 
     19 This is a new transport-layer MAC method using the UMAC algorithm
     20 (rfc4418). This method is identical to the "umac-64" method documented
     21 in:
     22 
     23 http://www.openssh.com/txt/draft-miller-secsh-umac-01.txt
     24 
     25 1.2. transport: Protocol 2 compression algorithm "zlib (a] openssh.com"
     26 
     27 This transport-layer compression method uses the zlib compression
     28 algorithm (identical to the "zlib" method in rfc4253), but delays the
     29 start of compression until after authentication has completed. This
     30 avoids exposing compression code to attacks from unauthenticated users.
     31 
     32 The method is documented in:
     33 
     34 http://www.openssh.com/txt/draft-miller-secsh-compression-delayed-00.txt
     35 
     36 1.3. transport: New public key algorithms "ssh-rsa-cert-v00 (a] openssh.com",
     37      "ssh-dsa-cert-v00 (a] openssh.com",
     38      "ecdsa-sha2-nistp256-cert-v01 (a] openssh.com",
     39      "ecdsa-sha2-nistp384-cert-v01 (a] openssh.com" and
     40      "ecdsa-sha2-nistp521-cert-v01 (a] openssh.com"
     41 
     42 OpenSSH introduces new public key algorithms to support certificate
     43 authentication for users and hostkeys. These methods are documented in
     44 the file PROTOCOL.certkeys
     45 
     46 1.4. transport: Elliptic Curve cryptography
     47 
     48 OpenSSH supports ECC key exchange and public key authentication as
     49 specified in RFC5656. Only the ecdsa-sha2-nistp256, ecdsa-sha2-nistp384
     50 and ecdsa-sha2-nistp521 curves over GF(p) are supported. Elliptic
     51 curve points encoded using point compression are NOT accepted or
     52 generated.
     53 
     54 2. Connection protocol changes
     55 
     56 2.1. connection: Channel write close extension "eow (a] openssh.com"
     57 
     58 The SSH connection protocol (rfc4254) provides the SSH_MSG_CHANNEL_EOF
     59 message to allow an endpoint to signal its peer that it will send no
     60 more data over a channel. Unfortunately, there is no symmetric way for
     61 an endpoint to request that its peer should cease sending data to it
     62 while still keeping the channel open for the endpoint to send data to
     63 the peer.
     64 
     65 This is desirable, since it saves the transmission of data that would
     66 otherwise need to be discarded and it allows an endpoint to signal local
     67 processes of the condition, e.g. by closing the corresponding file
     68 descriptor.
     69 
     70 OpenSSH implements a channel extension message to perform this
     71 signalling: "eow (a] openssh.com" (End Of Write). This message is sent by
     72 an endpoint when the local output of a session channel is closed or
     73 experiences a write error. The message is formatted as follows:
     74 
     75 	byte		SSH_MSG_CHANNEL_REQUEST
     76 	uint32		recipient channel
     77 	string		"eow (a] openssh.com"
     78 	boolean		FALSE
     79 
     80 On receiving this message, the peer SHOULD cease sending data of
     81 the channel and MAY signal the process from which the channel data
     82 originates (e.g. by closing its read file descriptor).
     83 
     84 As with the symmetric SSH_MSG_CHANNEL_EOF message, the channel does
     85 remain open after a "eow (a] openssh.com" has been sent and more data may
     86 still be sent in the other direction. This message does not consume
     87 window space and may be sent even if no window space is available.
     88 
     89 NB. due to certain broken SSH implementations aborting upon receipt
     90 of this message (in contravention of RFC4254 section 5.4), this
     91 message is only sent to OpenSSH peers (identified by banner).
     92 Other SSH implementations may be whitelisted to receive this message
     93 upon request.
     94 
     95 2.2. connection: disallow additional sessions extension
     96      "no-more-sessions (a] openssh.com"
     97 
     98 Most SSH connections will only ever request a single session, but a
     99 attacker may abuse a running ssh client to surreptitiously open
    100 additional sessions under their control. OpenSSH provides a global
    101 request "no-more-sessions (a] openssh.com" to mitigate this attack.
    102 
    103 When an OpenSSH client expects that it will never open another session
    104 (i.e. it has been started with connection multiplexing disabled), it
    105 will send the following global request:
    106 
    107 	byte		SSH_MSG_GLOBAL_REQUEST
    108 	string		"no-more-sessions (a] openssh.com"
    109 	char		want-reply
    110 
    111 On receipt of such a message, an OpenSSH server will refuse to open
    112 future channels of type "session" and instead immediately abort the
    113 connection.
    114 
    115 Note that this is not a general defence against compromised clients
    116 (that is impossible), but it thwarts a simple attack.
    117 
    118 NB. due to certain broken SSH implementations aborting upon receipt
    119 of this message, the no-more-sessions request is only sent to OpenSSH
    120 servers (identified by banner). Other SSH implementations may be
    121 whitelisted to receive this message upon request.
    122 
    123 2.3. connection: Tunnel forward extension "tun (a] openssh.com"
    124 
    125 OpenSSH supports layer 2 and layer 3 tunnelling via the "tun (a] openssh.com"
    126 channel type. This channel type supports forwarding of network packets
    127 with datagram boundaries intact between endpoints equipped with 
    128 interfaces like the BSD tun(4) device. Tunnel forwarding channels are
    129 requested by the client with the following packet:
    130 
    131 	byte		SSH_MSG_CHANNEL_OPEN
    132 	string		"tun (a] openssh.com"
    133 	uint32		sender channel
    134 	uint32		initial window size
    135 	uint32		maximum packet size
    136 	uint32		tunnel mode
    137 	uint32		remote unit number
    138 
    139 The "tunnel mode" parameter specifies whether the tunnel should forward
    140 layer 2 frames or layer 3 packets. It may take one of the following values:
    141 
    142 	SSH_TUNMODE_POINTOPOINT  1		/* layer 3 packets */
    143 	SSH_TUNMODE_ETHERNET     2		/* layer 2 frames */
    144 
    145 The "tunnel unit number" specifies the remote interface number, or may
    146 be 0x7fffffff to allow the server to automatically chose an interface. A
    147 server that is not willing to open a client-specified unit should refuse
    148 the request with a SSH_MSG_CHANNEL_OPEN_FAILURE error. On successful
    149 open, the server should reply with SSH_MSG_CHANNEL_OPEN_SUCCESS.
    150 
    151 Once established the client and server may exchange packet or frames
    152 over the tunnel channel by encapsulating them in SSH protocol strings
    153 and sending them as channel data. This ensures that packet boundaries
    154 are kept intact. Specifically, packets are transmitted using normal
    155 SSH_MSG_CHANNEL_DATA packets:
    156 
    157 	byte		SSH_MSG_CHANNEL_DATA
    158 	uint32		recipient channel
    159 	string		data
    160 
    161 The contents of the "data" field for layer 3 packets is:
    162 
    163 	uint32			packet length
    164 	uint32			address family
    165 	byte[packet length - 4]	packet data
    166 
    167 The "address family" field identifies the type of packet in the message.
    168 It may be one of:
    169 
    170 	SSH_TUN_AF_INET		2		/* IPv4 */
    171 	SSH_TUN_AF_INET6	24		/* IPv6 */
    172 
    173 The "packet data" field consists of the IPv4/IPv6 datagram itself
    174 without any link layer header.
    175 
    176 The contents of the "data" field for layer 2 packets is:
    177 
    178 	uint32			packet length
    179 	byte[packet length]	frame
    180 
    181 The "frame" field contains an IEEE 802.3 Ethernet frame, including
    182 header.
    183 
    184 3. SFTP protocol changes
    185 
    186 3.1. sftp: Reversal of arguments to SSH_FXP_SYMLINK
    187 
    188 When OpenSSH's sftp-server was implemented, the order of the arguments
    189 to the SSH_FXP_SYMLINK method was inadvertently reversed. Unfortunately,
    190 the reversal was not noticed until the server was widely deployed. Since
    191 fixing this to follow the specification would cause incompatibility, the
    192 current order was retained. For correct operation, clients should send
    193 SSH_FXP_SYMLINK as follows:
    194 
    195 	uint32		id
    196 	string		targetpath
    197 	string		linkpath
    198 
    199 3.2. sftp: Server extension announcement in SSH_FXP_VERSION
    200 
    201 OpenSSH's sftp-server lists the extensions it supports using the
    202 standard extension announcement mechanism in the SSH_FXP_VERSION server
    203 hello packet:
    204 
    205 	uint32		3		/* protocol version */
    206 	string		ext1-name
    207 	string		ext1-version
    208 	string		ext2-name
    209 	string		ext2-version
    210 	...
    211 	string		extN-name
    212 	string		extN-version
    213 
    214 Each extension reports its integer version number as an ASCII encoded
    215 string, e.g. "1". The version will be incremented if the extension is
    216 ever changed in an incompatible way. The server MAY advertise the same
    217 extension with multiple versions (though this is unlikely). Clients MUST
    218 check the version number before attempting to use the extension.
    219 
    220 3.3. sftp: Extension request "posix-rename (a] openssh.com"
    221 
    222 This operation provides a rename operation with POSIX semantics, which
    223 are different to those provided by the standard SSH_FXP_RENAME in
    224 draft-ietf-secsh-filexfer-02.txt. This request is implemented as a
    225 SSH_FXP_EXTENDED request with the following format:
    226 
    227 	uint32		id
    228 	string		"posix-rename (a] openssh.com"
    229 	string		oldpath
    230 	string		newpath
    231 
    232 On receiving this request the server will perform the POSIX operation
    233 rename(oldpath, newpath) and will respond with a SSH_FXP_STATUS message.
    234 This extension is advertised in the SSH_FXP_VERSION hello with version
    235 "1".
    236 
    237 3.4. sftp: Extension requests "statvfs (a] openssh.com" and
    238          "fstatvfs (a] openssh.com"
    239 
    240 These requests correspond to the statvfs and fstatvfs POSIX system
    241 interfaces. The "statvfs (a] openssh.com" request operates on an explicit
    242 pathname, and is formatted as follows:
    243 
    244 	uint32		id
    245 	string		"statvfs (a] openssh.com"
    246 	string		path
    247 
    248 The "fstatvfs (a] openssh.com" operates on an open file handle:
    249 
    250 	uint32		id
    251 	string		"fstatvfs (a] openssh.com"
    252 	string		handle
    253 
    254 These requests return a SSH_FXP_STATUS reply on failure. On success they
    255 return the following SSH_FXP_EXTENDED_REPLY reply:
    256 
    257 	uint32		id
    258 	uint64		f_bsize		/* file system block size */
    259 	uint64		f_frsize	/* fundamental fs block size */
    260 	uint64		f_blocks	/* number of blocks (unit f_frsize) */
    261 	uint64		f_bfree		/* free blocks in file system */
    262 	uint64		f_bavail	/* free blocks for non-root */
    263 	uint64		f_files		/* total file inodes */
    264 	uint64		f_ffree		/* free file inodes */
    265 	uint64		f_favail	/* free file inodes for to non-root */
    266 	uint64		f_fsid		/* file system id */
    267 	uint64		f_flag		/* bit mask of f_flag values */
    268 	uint64		f_namemax	/* maximum filename length */
    269 
    270 The values of the f_flag bitmask are as follows:
    271 
    272 	#define SSH_FXE_STATVFS_ST_RDONLY	0x1	/* read-only */
    273 	#define SSH_FXE_STATVFS_ST_NOSUID	0x2	/* no setuid */
    274 
    275 Both the "statvfs (a] openssh.com" and "fstatvfs (a] openssh.com" extensions are
    276 advertised in the SSH_FXP_VERSION hello with version "2".
    277 
    278 10. sftp: Extension request "hardlink (a] openssh.com"
    279 
    280 This request is for creating a hard link to a regular file. This
    281 request is implemented as a SSH_FXP_EXTENDED request with the
    282 following format:
    283 
    284 	uint32		id
    285 	string		"hardlink (a] openssh.com"
    286 	string		oldpath
    287 	string		newpath
    288 
    289 On receiving this request the server will perform the operation
    290 link(oldpath, newpath) and will respond with a SSH_FXP_STATUS message.
    291 This extension is advertised in the SSH_FXP_VERSION hello with version
    292 "1".
    293 
    294 $OpenBSD: PROTOCOL,v 1.17 2010/12/04 00:18:01 djm Exp $
    295