]> andersk Git - openssh.git/blame - PROTOCOL
- djm@cvs.openbsd.org 2010/01/30 02:54:53
[openssh.git] / PROTOCOL
CommitLineData
8be03682 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
29c7b6ce 9Newer versions of the draft will not be supported, though some features
10are individually implemented as extensions described below.
8be03682 11
ab3eb078 12The protocol used by OpenSSH's ssh-agent is described in the file
13PROTOCOL.agent
14
8be03682 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
8fb1ddc9 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:
8be03682 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
e75a14a1 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
3f0444ca 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
e75a14a1 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
9bcf03ce 1015. connection: Tunnel forward extension "tun@openssh.com"
102
cda43f66 103OpenSSH supports layer 2 and layer 3 tunnelling via the "tun@openssh.com"
9bcf03ce 104channel type. This channel type supports forwarding of network packets
cda43f66 105with datagram boundaries intact between endpoints equipped with
9bcf03ce 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
f67f71f1 124be 0x7fffffff to allow the server to automatically chose an interface. A
125server that is not willing to open a client-specified unit should refuse
126the request with a SSH_MSG_CHANNEL_OPEN_FAILURE error. On successful
127open, the server should reply with SSH_MSG_CHANNEL_OPEN_SUCCESS.
9bcf03ce 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
f67f71f1 154The contents of the "data" field for layer 2 packets is:
9bcf03ce 155
156 uint32 packet length
157 byte[packet length] frame
158
cda43f66 159The "frame" field contains an IEEE 802.3 Ethernet frame, including
9bcf03ce 160header.
161
1626. sftp: Reversal of arguments to SSH_FXP_SYMLINK
8be03682 163
164When OpenSSH's sftp-server was implemented, the order of the arguments
cda43f66 165to the SSH_FXP_SYMLINK method was inadvertently reversed. Unfortunately,
8be03682 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
9bcf03ce 1757. sftp: Server extension announcement in SSH_FXP_VERSION
8be03682 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
cda43f66 194check the version number before attempting to use the extension.
8be03682 195
9bcf03ce 1968. sftp: Extension request "posix-rename@openssh.com"
8be03682 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
9bcf03ce 2139. sftp: Extension requests "statvfs@openssh.com" and
8be03682 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
cda43f66 224The "fstatvfs@openssh.com" operates on an open file handle:
8be03682 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
f044f89e 234 uint64 f_bsize /* file system block size */
235 uint64 f_frsize /* fundamental fs block size */
8be03682 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 */
0ad258dc 242 uint64 f_fsid /* file system id */
f044f89e 243 uint64 f_flag /* bit mask of f_flag values */
244 uint64 f_namemax /* maximum filename length */
8be03682 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
3086db6e 251Both the "statvfs@openssh.com" and "fstatvfs@openssh.com" extensions are
252advertised in the SSH_FXP_VERSION hello with version "2".
0ad258dc 253
29c7b6ce 254$OpenBSD: PROTOCOL,v 1.14 2010/01/09 00:57:10 djm Exp $
This page took 0.099486 seconds and 5 git commands to generate.