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