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