| |
| |
| |
| |
| |
| |
| Network Working Group T. Ylonen |
| Request for Comments: 4254 SSH Communications Security Corp |
| Category: Standards Track C. Lonvick, Ed. |
| Cisco Systems, Inc. |
| January 2006 |
| |
| |
| The Secure Shell (SSH) Connection Protocol |
| |
| Status of This Memo |
| |
| This document specifies an Internet standards track protocol for the |
| Internet community, and requests discussion and suggestions for |
| improvements. Please refer to the current edition of the "Internet |
| Official Protocol Standards" (STD 1) for the standardization state |
| and status of this protocol. Distribution of this memo is unlimited. |
| |
| Copyright Notice |
| |
| Copyright (C) The Internet Society (2006). |
| |
| Abstract |
| |
| Secure Shell (SSH) is a protocol for secure remote login and other |
| secure network services over an insecure network. |
| |
| This document describes the SSH Connection Protocol. It provides |
| interactive login sessions, remote execution of commands, forwarded |
| TCP/IP connections, and forwarded X11 connections. All of these |
| channels are multiplexed into a single encrypted tunnel. |
| |
| The SSH Connection Protocol has been designed to run on top of the |
| SSH transport layer and user authentication protocols. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 1] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| Table of Contents |
| |
| 1. Introduction ....................................................2 |
| 2. Contributors ....................................................3 |
| 3. Conventions Used in This Document ...............................3 |
| 4. Global Requests .................................................4 |
| 5. Channel Mechanism ...............................................5 |
| 5.1. Opening a Channel ..........................................5 |
| 5.2. Data Transfer ..............................................7 |
| 5.3. Closing a Channel ..........................................9 |
| 5.4. Channel-Specific Requests ..................................9 |
| 6. Interactive Sessions ...........................................10 |
| 6.1. Opening a Session .........................................10 |
| 6.2. Requesting a Pseudo-Terminal ..............................11 |
| 6.3. X11 Forwarding ............................................11 |
| 6.3.1. Requesting X11 Forwarding ..........................11 |
| 6.3.2. X11 Channels .......................................12 |
| 6.4. Environment Variable Passing ..............................12 |
| 6.5. Starting a Shell or a Command .............................13 |
| 6.6. Session Data Transfer .....................................14 |
| 6.7. Window Dimension Change Message ...........................14 |
| 6.8. Local Flow Control ........................................14 |
| 6.9. Signals ...................................................15 |
| 6.10. Returning Exit Status ....................................15 |
| 7. TCP/IP Port Forwarding .........................................16 |
| 7.1. Requesting Port Forwarding ................................16 |
| 7.2. TCP/IP Forwarding Channels ................................18 |
| 8. Encoding of Terminal Modes .....................................19 |
| 9. Summary of Message Numbers .....................................21 |
| 10. IANA Considerations ...........................................21 |
| 11. Security Considerations .......................................21 |
| 12. References ....................................................22 |
| 12.1. Normative References .....................................22 |
| 12.2. Informative References ...................................22 |
| Authors' Addresses ................................................23 |
| Trademark Notice ..................................................23 |
| |
| 1. Introduction |
| |
| The SSH Connection Protocol has been designed to run on top of the |
| SSH transport layer and user authentication protocols ([SSH-TRANS] |
| and [SSH-USERAUTH]). It provides interactive login sessions, remote |
| execution of commands, forwarded TCP/IP connections, and forwarded |
| X11 connections. |
| |
| The 'service name' for this protocol is "ssh-connection". |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 2] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| This document should be read only after reading the SSH architecture |
| document [SSH-ARCH]. This document freely uses terminology and |
| notation from the architecture document without reference or further |
| explanation. |
| |
| 2. Contributors |
| |
| The major original contributors of this set of documents have been: |
| Tatu Ylonen, Tero Kivinen, Timo J. Rinne, Sami Lehtinen (all of SSH |
| Communications Security Corp), and Markku-Juhani O. Saarinen |
| (University of Jyvaskyla). Darren Moffat was the original editor of |
| this set of documents and also made very substantial contributions. |
| |
| Many people contributed to the development of this document over the |
| years. People who should be acknowledged include Mats Andersson, Ben |
| Harris, Bill Sommerfeld, Brent McClure, Niels Moller, Damien Miller, |
| Derek Fawcus, Frank Cusack, Heikki Nousiainen, Jakob Schlyter, Jeff |
| Van Dyke, Jeffrey Altman, Jeffrey Hutzelman, Jon Bright, Joseph |
| Galbraith, Ken Hornstein, Markus Friedl, Martin Forssen, Nicolas |
| Williams, Niels Provos, Perry Metzger, Peter Gutmann, Simon |
| Josefsson, Simon Tatham, Wei Dai, Denis Bider, der Mouse, and |
| Tadayoshi Kohno. Listing their names here does not mean that they |
| endorse this document, but that they have contributed to it. |
| |
| 3. Conventions Used in This Document |
| |
| All documents related to the SSH protocols shall use the keywords |
| "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", "SHOULD", |
| "SHOULD NOT", "RECOMMENDED", "MAY", and "OPTIONAL" to describe |
| requirements. These keywords are to be interpreted as described in |
| [RFC2119]. |
| |
| The keywords "PRIVATE USE", "HIERARCHICAL ALLOCATION", "FIRST COME |
| FIRST SERVED", "EXPERT REVIEW", "SPECIFICATION REQUIRED", "IESG |
| APPROVAL", "IETF CONSENSUS", and "STANDARDS ACTION" that appear in |
| this document when used to describe namespace allocation are to be |
| interpreted as described in [RFC2434]. |
| |
| Protocol fields and possible values to fill them are defined in this |
| set of documents. Protocol fields will be defined in the message |
| definitions. As an example, SSH_MSG_CHANNEL_DATA is defined as |
| follows. |
| |
| byte SSH_MSG_CHANNEL_DATA |
| uint32 recipient channel |
| string data |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 3] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| Throughout these documents, when the fields are referenced, they will |
| appear within single quotes. When values to fill those fields are |
| referenced, they will appear within double quotes. Using the above |
| example, possible values for 'data' are "foo" and "bar". |
| |
| 4. Global Requests |
| |
| There are several kinds of requests that affect the state of the |
| remote end globally, independent of any channels. An example is a |
| request to start TCP/IP forwarding for a specific port. Note that |
| both the client and server MAY send global requests at any time, and |
| the receiver MUST respond appropriately. All such requests use the |
| following format. |
| |
| byte SSH_MSG_GLOBAL_REQUEST |
| string request name in US-ASCII only |
| boolean want reply |
| .... request-specific data follows |
| |
| The value of 'request name' follows the DNS extensibility naming |
| convention outlined in [SSH-ARCH]. |
| |
| The recipient will respond to this message with |
| SSH_MSG_REQUEST_SUCCESS or SSH_MSG_REQUEST_FAILURE if 'want reply' is |
| TRUE. |
| |
| byte SSH_MSG_REQUEST_SUCCESS |
| .... response specific data |
| |
| Usually, the 'response specific data' is non-existent. |
| |
| If the recipient does not recognize or support the request, it simply |
| responds with SSH_MSG_REQUEST_FAILURE. |
| |
| byte SSH_MSG_REQUEST_FAILURE |
| |
| In general, the reply messages do not include request type |
| identifiers. To make it possible for the originator of a request to |
| identify to which request each reply refers, it is REQUIRED that |
| replies to SSH_MSG_GLOBAL_REQUESTS MUST be sent in the same order as |
| the corresponding request messages. For channel requests, replies |
| that relate to the same channel MUST also be replied to in the right |
| order. However, channel requests for distinct channels MAY be |
| replied to out-of-order. |
| |
| |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 4] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| 5. Channel Mechanism |
| |
| All terminal sessions, forwarded connections, etc., are channels. |
| Either side may open a channel. Multiple channels are multiplexed |
| into a single connection. |
| |
| Channels are identified by numbers at each end. The number referring |
| to a channel may be different on each side. Requests to open a |
| channel contain the sender's channel number. Any other channel- |
| related messages contain the recipient's channel number for the |
| channel. |
| |
| Channels are flow-controlled. No data may be sent to a channel until |
| a message is received to indicate that window space is available. |
| |
| 5.1. Opening a Channel |
| |
| When either side wishes to open a new channel, it allocates a local |
| number for the channel. It then sends the following message to the |
| other side, and includes the local channel number and initial window |
| size in the message. |
| |
| byte SSH_MSG_CHANNEL_OPEN |
| string channel type in US-ASCII only |
| uint32 sender channel |
| uint32 initial window size |
| uint32 maximum packet size |
| .... channel type specific data follows |
| |
| The 'channel type' is a name, as described in [SSH-ARCH] and |
| [SSH-NUMBERS], with similar extension mechanisms. The 'sender |
| channel' is a local identifier for the channel used by the sender of |
| this message. The 'initial window size' specifies how many bytes of |
| channel data can be sent to the sender of this message without |
| adjusting the window. The 'maximum packet size' specifies the |
| maximum size of an individual data packet that can be sent to the |
| sender. For example, one might want to use smaller packets for |
| interactive connections to get better interactive response on slow |
| links. |
| |
| The remote side then decides whether it can open the channel, and |
| responds with either SSH_MSG_CHANNEL_OPEN_CONFIRMATION or |
| SSH_MSG_CHANNEL_OPEN_FAILURE. |
| |
| |
| |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 5] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| byte SSH_MSG_CHANNEL_OPEN_CONFIRMATION |
| uint32 recipient channel |
| uint32 sender channel |
| uint32 initial window size |
| uint32 maximum packet size |
| .... channel type specific data follows |
| |
| The 'recipient channel' is the channel number given in the original |
| open request, and 'sender channel' is the channel number allocated by |
| the other side. |
| |
| byte SSH_MSG_CHANNEL_OPEN_FAILURE |
| uint32 recipient channel |
| uint32 reason code |
| string description in ISO-10646 UTF-8 encoding [RFC3629] |
| string language tag [RFC3066] |
| |
| If the recipient of the SSH_MSG_CHANNEL_OPEN message does not support |
| the specified 'channel type', it simply responds with |
| SSH_MSG_CHANNEL_OPEN_FAILURE. The client MAY show the 'description' |
| string to the user. If this is done, the client software should take |
| the precautions discussed in [SSH-ARCH]. |
| |
| The SSH_MSG_CHANNEL_OPEN_FAILURE 'reason code' values are defined in |
| the following table. Note that the values for the 'reason code' are |
| given in decimal format for readability, but they are actually uint32 |
| values. |
| |
| Symbolic name reason code |
| ------------- ----------- |
| SSH_OPEN_ADMINISTRATIVELY_PROHIBITED 1 |
| SSH_OPEN_CONNECT_FAILED 2 |
| SSH_OPEN_UNKNOWN_CHANNEL_TYPE 3 |
| SSH_OPEN_RESOURCE_SHORTAGE 4 |
| |
| Requests for assignments of new SSH_MSG_CHANNEL_OPEN 'reason code' |
| values (and associated 'description' text) in the range of 0x00000005 |
| to 0xFDFFFFFF MUST be done through the IETF CONSENSUS method, as |
| described in [RFC2434]. The IANA will not assign Channel Connection |
| Failure 'reason code' values in the range of 0xFE000000 to |
| 0xFFFFFFFF. Channel Connection Failure 'reason code' values in that |
| range are left for PRIVATE USE, as described in [RFC2434]. |
| |
| While it is understood that the IANA will have no control over the |
| range of 0xFE000000 to 0xFFFFFFFF, this range will be split in two |
| parts and administered by the following conventions. |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 6] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| o The range of 0xFE000000 to 0xFEFFFFFF is to be used in conjunction |
| with locally assigned channels. For example, if a channel is |
| proposed with a 'channel type' of "example_session@example.com", |
| but fails, then the response will contain either a 'reason code' |
| assigned by the IANA (as listed above and in the range of |
| 0x00000001 to 0xFDFFFFFF) or a locally assigned value in the range |
| of 0xFE000000 to 0xFEFFFFFF. Naturally, if the server does not |
| understand the proposed 'channel type', even if it is a locally |
| defined 'channel type', then the 'reason code' MUST be 0x00000003, |
| as described above, if the 'reason code' is sent. If the server |
| does understand the 'channel type', but the channel still fails to |
| open, then the server SHOULD respond with a locally assigned |
| 'reason code' value consistent with the proposed, local 'channel |
| type'. It is assumed that practitioners will first attempt to use |
| the IANA assigned 'reason code' values and then document their |
| locally assigned 'reason code' values. |
| |
| o There are no restrictions or suggestions for the range starting |
| with 0xFF. No interoperability is expected for anything used in |
| this range. Essentially, it is for experimentation. |
| |
| 5.2. Data Transfer |
| |
| The window size specifies how many bytes the other party can send |
| before it must wait for the window to be adjusted. Both parties use |
| the following message to adjust the window. |
| |
| byte SSH_MSG_CHANNEL_WINDOW_ADJUST |
| uint32 recipient channel |
| uint32 bytes to add |
| |
| After receiving this message, the recipient MAY send the given number |
| of bytes more than it was previously allowed to send; the window size |
| is incremented. Implementations MUST correctly handle window sizes |
| of up to 2^32 - 1 bytes. The window MUST NOT be increased above |
| 2^32 - 1 bytes. |
| |
| Data transfer is done with messages of the following type. |
| |
| byte SSH_MSG_CHANNEL_DATA |
| uint32 recipient channel |
| string data |
| |
| The maximum amount of data allowed is determined by the maximum |
| packet size for the channel, and the current window size, whichever |
| is smaller. The window size is decremented by the amount of data |
| sent. Both parties MAY ignore all extra data sent after the allowed |
| window is empty. |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 7] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| Implementations are expected to have some limit on the SSH transport |
| layer packet size (any limit for received packets MUST be 32768 bytes |
| or larger, as described in [SSH-TRANS]). The implementation of the |
| SSH connection layer |
| |
| o MUST NOT advertise a maximum packet size that would result in |
| transport packets larger than its transport layer is willing to |
| receive. |
| |
| o MUST NOT generate data packets larger than its transport layer is |
| willing to send, even if the remote end would be willing to accept |
| very large packets. |
| |
| Additionally, some channels can transfer several types of data. An |
| example of this is stderr data from interactive sessions. Such data |
| can be passed with SSH_MSG_CHANNEL_EXTENDED_DATA messages, where a |
| separate integer specifies the type of data. The available types and |
| their interpretation depend on the type of channel. |
| |
| byte SSH_MSG_CHANNEL_EXTENDED_DATA |
| uint32 recipient channel |
| uint32 data_type_code |
| string data |
| |
| Data sent with these messages consumes the same window as ordinary |
| data. |
| |
| Currently, only the following type is defined. Note that the value |
| for the 'data_type_code' is given in decimal format for readability, |
| but the values are actually uint32 values. |
| |
| Symbolic name data_type_code |
| ------------- -------------- |
| SSH_EXTENDED_DATA_STDERR 1 |
| |
| Extended Channel Data Transfer 'data_type_code' values MUST be |
| assigned sequentially. Requests for assignments of new Extended |
| Channel Data Transfer 'data_type_code' values and their associated |
| Extended Channel Data Transfer 'data' strings, in the range of |
| 0x00000002 to 0xFDFFFFFF, MUST be done through the IETF CONSENSUS |
| method as described in [RFC2434]. The IANA will not assign Extended |
| Channel Data Transfer 'data_type_code' values in the range of |
| 0xFE000000 to 0xFFFFFFFF. Extended Channel Data Transfer |
| 'data_type_code' values in that range are left for PRIVATE USE, as |
| described in [RFC2434]. As is noted, the actual instructions to the |
| IANA are in [SSH-NUMBERS]. |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 8] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| 5.3. Closing a Channel |
| |
| When a party will no longer send more data to a channel, it SHOULD |
| send SSH_MSG_CHANNEL_EOF. |
| |
| byte SSH_MSG_CHANNEL_EOF |
| uint32 recipient channel |
| |
| No explicit response is sent to this message. However, the |
| application may send EOF to whatever is at the other end of the |
| channel. Note that the channel remains open after this message, and |
| more data may still be sent in the other direction. This message |
| does not consume window space and can be sent even if no window space |
| is available. |
| |
| When either party wishes to terminate the channel, it sends |
| SSH_MSG_CHANNEL_CLOSE. Upon receiving this message, a party MUST |
| send back an SSH_MSG_CHANNEL_CLOSE unless it has already sent this |
| message for the channel. The channel is considered closed for a |
| party when it has both sent and received SSH_MSG_CHANNEL_CLOSE, and |
| the party may then reuse the channel number. A party MAY send |
| SSH_MSG_CHANNEL_CLOSE without having sent or received |
| SSH_MSG_CHANNEL_EOF. |
| |
| byte SSH_MSG_CHANNEL_CLOSE |
| uint32 recipient channel |
| |
| This message does not consume window space and can be sent even if no |
| window space is available. |
| |
| It is RECOMMENDED that all data sent before this message be delivered |
| to the actual destination, if possible. |
| |
| 5.4. Channel-Specific Requests |
| |
| Many 'channel type' values have extensions that are specific to that |
| particular 'channel type'. An example is requesting a pty (pseudo |
| terminal) for an interactive session. |
| |
| All channel-specific requests use the following format. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string request type in US-ASCII characters only |
| boolean want reply |
| .... type-specific data follows |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 9] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| If 'want reply' is FALSE, no response will be sent to the request. |
| Otherwise, the recipient responds with either |
| SSH_MSG_CHANNEL_SUCCESS, SSH_MSG_CHANNEL_FAILURE, or request-specific |
| continuation messages. If the request is not recognized or is not |
| supported for the channel, SSH_MSG_CHANNEL_FAILURE is returned. |
| |
| This message does not consume window space and can be sent even if no |
| window space is available. The values of 'request type' are local to |
| each channel type. |
| |
| The client is allowed to send further messages without waiting for |
| the response to the request. |
| |
| 'request type' names follow the DNS extensibility naming convention |
| outlined in [SSH-ARCH] and [SSH-NUMBERS]. |
| |
| byte SSH_MSG_CHANNEL_SUCCESS |
| uint32 recipient channel |
| |
| |
| byte SSH_MSG_CHANNEL_FAILURE |
| uint32 recipient channel |
| |
| These messages do not consume window space and can be sent even if no |
| window space is available. |
| |
| 6. Interactive Sessions |
| |
| A session is a remote execution of a program. The program may be a |
| shell, an application, a system command, or some built-in subsystem. |
| It may or may not have a tty, and may or may not involve X11 |
| forwarding. Multiple sessions can be active simultaneously. |
| |
| 6.1. Opening a Session |
| |
| A session is started by sending the following message. |
| |
| byte SSH_MSG_CHANNEL_OPEN |
| string "session" |
| uint32 sender channel |
| uint32 initial window size |
| uint32 maximum packet size |
| |
| Client implementations SHOULD reject any session channel open |
| requests to make it more difficult for a corrupt server to attack the |
| client. |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 10] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| 6.2. Requesting a Pseudo-Terminal |
| |
| A pseudo-terminal can be allocated for the session by sending the |
| following message. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string "pty-req" |
| boolean want_reply |
| string TERM environment variable value (e.g., vt100) |
| uint32 terminal width, characters (e.g., 80) |
| uint32 terminal height, rows (e.g., 24) |
| uint32 terminal width, pixels (e.g., 640) |
| uint32 terminal height, pixels (e.g., 480) |
| string encoded terminal modes |
| |
| The 'encoded terminal modes' are described in Section 8. Zero |
| dimension parameters MUST be ignored. The character/row dimensions |
| override the pixel dimensions (when nonzero). Pixel dimensions refer |
| to the drawable area of the window. |
| |
| The dimension parameters are only informational. |
| |
| The client SHOULD ignore pty requests. |
| |
| 6.3. X11 Forwarding |
| |
| 6.3.1. Requesting X11 Forwarding |
| |
| X11 forwarding may be requested for a session by sending a |
| SSH_MSG_CHANNEL_REQUEST message. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string "x11-req" |
| boolean want reply |
| boolean single connection |
| string x11 authentication protocol |
| string x11 authentication cookie |
| uint32 x11 screen number |
| |
| It is RECOMMENDED that the 'x11 authentication cookie' that is sent |
| be a fake, random cookie, and that the cookie be checked and replaced |
| by the real cookie when a connection request is received. |
| |
| X11 connection forwarding should stop when the session channel is |
| closed. However, already opened forwardings should not be |
| automatically closed when the session channel is closed. |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 11] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| If 'single connection' is TRUE, only a single connection should be |
| forwarded. No more connections will be forwarded after the first, or |
| after the session channel has been closed. |
| |
| The 'x11 authentication protocol' is the name of the X11 |
| authentication method used, e.g., "MIT-MAGIC-COOKIE-1". |
| |
| The 'x11 authentication cookie' MUST be hexadecimal encoded. |
| |
| The X Protocol is documented in [SCHEIFLER]. |
| |
| 6.3.2. X11 Channels |
| |
| X11 channels are opened with a channel open request. The resulting |
| channels are independent of the session, and closing the session |
| channel does not close the forwarded X11 channels. |
| |
| byte SSH_MSG_CHANNEL_OPEN |
| string "x11" |
| uint32 sender channel |
| uint32 initial window size |
| uint32 maximum packet size |
| string originator address (e.g., "192.168.7.38") |
| uint32 originator port |
| |
| The recipient should respond with SSH_MSG_CHANNEL_OPEN_CONFIRMATION |
| or SSH_MSG_CHANNEL_OPEN_FAILURE. |
| |
| Implementations MUST reject any X11 channel open requests if they |
| have not requested X11 forwarding. |
| |
| 6.4. Environment Variable Passing |
| |
| Environment variables may be passed to the shell/command to be |
| started later. Uncontrolled setting of environment variables in a |
| privileged process can be a security hazard. It is recommended that |
| implementations either maintain a list of allowable variable names or |
| only set environment variables after the server process has dropped |
| sufficient privileges. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string "env" |
| boolean want reply |
| string variable name |
| string variable value |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 12] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| 6.5. Starting a Shell or a Command |
| |
| Once the session has been set up, a program is started at the remote |
| end. The program can be a shell, an application program, or a |
| subsystem with a host-independent name. Only one of these requests |
| can succeed per channel. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string "shell" |
| boolean want reply |
| |
| This message will request that the user's default shell (typically |
| defined in /etc/passwd in UNIX systems) be started at the other end. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string "exec" |
| boolean want reply |
| string command |
| |
| This message will request that the server start the execution of the |
| given command. The 'command' string may contain a path. Normal |
| precautions MUST be taken to prevent the execution of unauthorized |
| commands. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string "subsystem" |
| boolean want reply |
| string subsystem name |
| |
| This last form executes a predefined subsystem. It is expected that |
| these will include a general file transfer mechanism, and possibly |
| other features. Implementations may also allow configuring more such |
| mechanisms. As the user's shell is usually used to execute the |
| subsystem, it is advisable for the subsystem protocol to have a |
| "magic cookie" at the beginning of the protocol transaction to |
| distinguish it from arbitrary output generated by shell |
| initialization scripts, etc. This spurious output from the shell may |
| be filtered out either at the server or at the client. |
| |
| The server SHOULD NOT halt the execution of the protocol stack when |
| starting a shell or a program. All input and output from these |
| SHOULD be redirected to the channel or to the encrypted tunnel. |
| |
| It is RECOMMENDED that the reply to these messages be requested and |
| checked. The client SHOULD ignore these messages. |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 13] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| Subsystem names follow the DNS extensibility naming convention |
| outlined in [SSH-NUMBERS]. |
| |
| 6.6. Session Data Transfer |
| |
| Data transfer for a session is done using SSH_MSG_CHANNEL_DATA and |
| SSH_MSG_CHANNEL_EXTENDED_DATA packets and the window mechanism. The |
| extended data type SSH_EXTENDED_DATA_STDERR has been defined for |
| stderr data. |
| |
| 6.7. Window Dimension Change Message |
| |
| When the window (terminal) size changes on the client side, it MAY |
| send a message to the other side to inform it of the new dimensions. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string "window-change" |
| boolean FALSE |
| uint32 terminal width, columns |
| uint32 terminal height, rows |
| uint32 terminal width, pixels |
| uint32 terminal height, pixels |
| |
| A response SHOULD NOT be sent to this message. |
| |
| 6.8. Local Flow Control |
| |
| On many systems, it is possible to determine if a pseudo-terminal is |
| using control-S/control-Q flow control. When flow control is |
| allowed, it is often desirable to do the flow control at the client |
| end to speed up responses to user requests. This is facilitated by |
| the following notification. Initially, the server is responsible for |
| flow control. (Here, again, client means the side originating the |
| session, and server means the other side.) |
| |
| The message below is used by the server to inform the client when it |
| can or cannot perform flow control (control-S/control-Q processing). |
| If 'client can do' is TRUE, the client is allowed to do flow control |
| using control-S and control-Q. The client MAY ignore this message. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string "xon-xoff" |
| boolean FALSE |
| boolean client can do |
| |
| No response is sent to this message. |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 14] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| 6.9. Signals |
| |
| A signal can be delivered to the remote process/service using the |
| following message. Some systems may not implement signals, in which |
| case they SHOULD ignore this message. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string "signal" |
| boolean FALSE |
| string signal name (without the "SIG" prefix) |
| |
| 'signal name' values will be encoded as discussed in the passage |
| describing SSH_MSG_CHANNEL_REQUEST messages using "exit-signal" in |
| this section. |
| |
| 6.10. Returning Exit Status |
| |
| When the command running at the other end terminates, the following |
| message can be sent to return the exit status of the command. |
| Returning the status is RECOMMENDED. No acknowledgement is sent for |
| this message. The channel needs to be closed with |
| SSH_MSG_CHANNEL_CLOSE after this message. |
| |
| The client MAY ignore these messages. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string "exit-status" |
| boolean FALSE |
| uint32 exit_status |
| |
| The remote command may also terminate violently due to a signal. |
| Such a condition can be indicated by the following message. A zero |
| 'exit_status' usually means that the command terminated successfully. |
| |
| byte SSH_MSG_CHANNEL_REQUEST |
| uint32 recipient channel |
| string "exit-signal" |
| boolean FALSE |
| string signal name (without the "SIG" prefix) |
| boolean core dumped |
| string error message in ISO-10646 UTF-8 encoding |
| string language tag [RFC3066] |
| |
| |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 15] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| The 'signal name' is one of the following (these are from [POSIX]). |
| |
| ABRT |
| ALRM |
| FPE |
| HUP |
| ILL |
| INT |
| KILL |
| PIPE |
| QUIT |
| SEGV |
| TERM |
| USR1 |
| USR2 |
| |
| Additional 'signal name' values MAY be sent in the format |
| "sig-name@xyz", where "sig-name" and "xyz" may be anything a |
| particular implementer wants (except the "@" sign). However, it is |
| suggested that if a 'configure' script is used, any non-standard |
| 'signal name' values it finds be encoded as "SIG@xyz.config.guess", |
| where "SIG" is the 'signal name' without the "SIG" prefix, and "xyz" |
| is the host type, as determined by "config.guess". |
| |
| The 'error message' contains an additional textual explanation of the |
| error message. The message may consist of multiple lines separated |
| by CRLF (Carriage Return - Line Feed) pairs. The client software MAY |
| display this message to the user. If this is done, the client |
| software should take the precautions discussed in [SSH-ARCH]. |
| |
| 7. TCP/IP Port Forwarding |
| |
| 7.1. Requesting Port Forwarding |
| |
| A party need not explicitly request forwardings from its own end to |
| the other direction. However, if it wishes that connections to a |
| port on the other side be forwarded to the local side, it must |
| explicitly request this. |
| |
| byte SSH_MSG_GLOBAL_REQUEST |
| string "tcpip-forward" |
| boolean want reply |
| string address to bind (e.g., "0.0.0.0") |
| uint32 port number to bind |
| |
| |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 16] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| The 'address to bind' and 'port number to bind' specify the IP |
| address (or domain name) and port on which connections for forwarding |
| are to be accepted. Some strings used for 'address to bind' have |
| special-case semantics. |
| |
| o "" means that connections are to be accepted on all protocol |
| families supported by the SSH implementation. |
| |
| o "0.0.0.0" means to listen on all IPv4 addresses. |
| |
| o "::" means to listen on all IPv6 addresses. |
| |
| o "localhost" means to listen on all protocol families supported by |
| the SSH implementation on loopback addresses only ([RFC3330] and |
| [RFC3513]). |
| |
| o "127.0.0.1" and "::1" indicate listening on the loopback |
| interfaces for IPv4 and IPv6, respectively. |
| |
| Note that the client can still filter connections based on |
| information passed in the open request. |
| |
| Implementations should only allow forwarding privileged ports if the |
| user has been authenticated as a privileged user. |
| |
| Client implementations SHOULD reject these messages; they are |
| normally only sent by the client. |
| |
| If a client passes 0 as port number to bind and has 'want reply' as |
| TRUE, then the server allocates the next available unprivileged port |
| number and replies with the following message; otherwise, there is no |
| response-specific data. |
| |
| byte SSH_MSG_REQUEST_SUCCESS |
| uint32 port that was bound on the server |
| |
| A port forwarding can be canceled with the following message. Note |
| that channel open requests may be received until a reply to this |
| message is received. |
| |
| byte SSH_MSG_GLOBAL_REQUEST |
| string "cancel-tcpip-forward" |
| boolean want reply |
| string address_to_bind (e.g., "127.0.0.1") |
| uint32 port number to bind |
| |
| Client implementations SHOULD reject these messages; they are |
| normally only sent by the client. |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 17] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| 7.2. TCP/IP Forwarding Channels |
| |
| When a connection comes to a port for which remote forwarding has |
| been requested, a channel is opened to forward the port to the other |
| side. |
| |
| byte SSH_MSG_CHANNEL_OPEN |
| string "forwarded-tcpip" |
| uint32 sender channel |
| uint32 initial window size |
| uint32 maximum packet size |
| string address that was connected |
| uint32 port that was connected |
| string originator IP address |
| uint32 originator port |
| |
| Implementations MUST reject these messages unless they have |
| previously requested a remote TCP/IP port forwarding with the given |
| port number. |
| |
| When a connection comes to a locally forwarded TCP/IP port, the |
| following packet is sent to the other side. Note that these messages |
| MAY also be sent for ports for which no forwarding has been |
| explicitly requested. The receiving side must decide whether to |
| allow the forwarding. |
| |
| byte SSH_MSG_CHANNEL_OPEN |
| string "direct-tcpip" |
| uint32 sender channel |
| uint32 initial window size |
| uint32 maximum packet size |
| string host to connect |
| uint32 port to connect |
| string originator IP address |
| uint32 originator port |
| |
| The 'host to connect' and 'port to connect' specify the TCP/IP host |
| and port where the recipient should connect the channel. The 'host |
| to connect' may be either a domain name or a numeric IP address. |
| |
| The 'originator IP address' is the numeric IP address of the machine |
| from where the connection request originates, and the 'originator |
| port' is the port on the host from where the connection originated. |
| |
| Forwarded TCP/IP channels are independent of any sessions, and |
| closing a session channel does not in any way imply that forwarded |
| connections should be closed. |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 18] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| Client implementations SHOULD reject direct TCP/IP open requests for |
| security reasons. |
| |
| 8. Encoding of Terminal Modes |
| |
| All 'encoded terminal modes' (as passed in a pty request) are encoded |
| into a byte stream. It is intended that the coding be portable |
| across different environments. The stream consists of opcode- |
| argument pairs wherein the opcode is a byte value. Opcodes 1 to 159 |
| have a single uint32 argument. Opcodes 160 to 255 are not yet |
| defined, and cause parsing to stop (they should only be used after |
| any other data). The stream is terminated by opcode TTY_OP_END |
| (0x00). |
| |
| The client SHOULD put any modes it knows about in the stream, and the |
| server MAY ignore any modes it does not know about. This allows some |
| degree of machine-independence, at least between systems that use a |
| POSIX-like tty interface. The protocol can support other systems as |
| well, but the client may need to fill reasonable values for a number |
| of parameters so the server pty gets set to a reasonable mode (the |
| server leaves all unspecified mode bits in their default values, and |
| only some combinations make sense). |
| |
| The naming of opcode values mostly follows the POSIX terminal mode |
| flags. The following opcode values have been defined. Note that the |
| values given below are in decimal format for readability, but they |
| are actually byte values. |
| |
| opcode mnemonic description |
| ------ -------- ----------- |
| 0 TTY_OP_END Indicates end of options. |
| 1 VINTR Interrupt character; 255 if none. Similarly |
| for the other characters. Not all of these |
| characters are supported on all systems. |
| 2 VQUIT The quit character (sends SIGQUIT signal on |
| POSIX systems). |
| 3 VERASE Erase the character to left of the cursor. |
| 4 VKILL Kill the current input line. |
| 5 VEOF End-of-file character (sends EOF from the |
| terminal). |
| 6 VEOL End-of-line character in addition to |
| carriage return and/or linefeed. |
| 7 VEOL2 Additional end-of-line character. |
| 8 VSTART Continues paused output (normally |
| control-Q). |
| 9 VSTOP Pauses output (normally control-S). |
| 10 VSUSP Suspends the current program. |
| 11 VDSUSP Another suspend character. |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 19] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| 12 VREPRINT Reprints the current input line. |
| 13 VWERASE Erases a word left of cursor. |
| 14 VLNEXT Enter the next character typed literally, |
| even if it is a special character |
| 15 VFLUSH Character to flush output. |
| 16 VSWTCH Switch to a different shell layer. |
| 17 VSTATUS Prints system status line (load, command, |
| pid, etc). |
| 18 VDISCARD Toggles the flushing of terminal output. |
| 30 IGNPAR The ignore parity flag. The parameter |
| SHOULD be 0 if this flag is FALSE, |
| and 1 if it is TRUE. |
| 31 PARMRK Mark parity and framing errors. |
| 32 INPCK Enable checking of parity errors. |
| 33 ISTRIP Strip 8th bit off characters. |
| 34 INLCR Map NL into CR on input. |
| 35 IGNCR Ignore CR on input. |
| 36 ICRNL Map CR to NL on input. |
| 37 IUCLC Translate uppercase characters to |
| lowercase. |
| 38 IXON Enable output flow control. |
| 39 IXANY Any char will restart after stop. |
| 40 IXOFF Enable input flow control. |
| 41 IMAXBEL Ring bell on input queue full. |
| 50 ISIG Enable signals INTR, QUIT, [D]SUSP. |
| 51 ICANON Canonicalize input lines. |
| 52 XCASE Enable input and output of uppercase |
| characters by preceding their lowercase |
| equivalents with "\". |
| 53 ECHO Enable echoing. |
| 54 ECHOE Visually erase chars. |
| 55 ECHOK Kill character discards current line. |
| 56 ECHONL Echo NL even if ECHO is off. |
| 57 NOFLSH Don't flush after interrupt. |
| 58 TOSTOP Stop background jobs from output. |
| 59 IEXTEN Enable extensions. |
| 60 ECHOCTL Echo control characters as ^(Char). |
| 61 ECHOKE Visual erase for line kill. |
| 62 PENDIN Retype pending input. |
| 70 OPOST Enable output processing. |
| 71 OLCUC Convert lowercase to uppercase. |
| 72 ONLCR Map NL to CR-NL. |
| 73 OCRNL Translate carriage return to newline |
| (output). |
| 74 ONOCR Translate newline to carriage |
| return-newline (output). |
| 75 ONLRET Newline performs a carriage return |
| (output). |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 20] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| 90 CS7 7 bit mode. |
| 91 CS8 8 bit mode. |
| 92 PARENB Parity enable. |
| 93 PARODD Odd parity, else even. |
| |
| 128 TTY_OP_ISPEED Specifies the input baud rate in |
| bits per second. |
| 129 TTY_OP_OSPEED Specifies the output baud rate in |
| bits per second. |
| |
| 9. Summary of Message Numbers |
| |
| The following is a summary of messages and their associated message |
| number. |
| |
| SSH_MSG_GLOBAL_REQUEST 80 |
| SSH_MSG_REQUEST_SUCCESS 81 |
| SSH_MSG_REQUEST_FAILURE 82 |
| SSH_MSG_CHANNEL_OPEN 90 |
| SSH_MSG_CHANNEL_OPEN_CONFIRMATION 91 |
| SSH_MSG_CHANNEL_OPEN_FAILURE 92 |
| SSH_MSG_CHANNEL_WINDOW_ADJUST 93 |
| SSH_MSG_CHANNEL_DATA 94 |
| SSH_MSG_CHANNEL_EXTENDED_DATA 95 |
| SSH_MSG_CHANNEL_EOF 96 |
| SSH_MSG_CHANNEL_CLOSE 97 |
| SSH_MSG_CHANNEL_REQUEST 98 |
| SSH_MSG_CHANNEL_SUCCESS 99 |
| SSH_MSG_CHANNEL_FAILURE 100 |
| |
| 10. IANA Considerations |
| |
| This document is part of a set. The IANA considerations for the SSH |
| protocol as defined in [SSH-ARCH], [SSH-TRANS], [SSH-USERAUTH], and |
| this document, are detailed in [SSH-NUMBERS]. |
| |
| 11. Security Considerations |
| |
| This protocol is assumed to run on top of a secure, authenticated |
| transport. User authentication and protection against network-level |
| attacks are assumed to be provided by the underlying protocols. |
| |
| Full security considerations for this protocol are provided in |
| [SSH-ARCH]. Specific to this document, it is RECOMMENDED that |
| implementations disable all the potentially dangerous features (e.g., |
| agent forwarding, X11 forwarding, and TCP/IP forwarding) if the host |
| key has changed without notice or explanation. |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 21] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| 12. References |
| |
| 12.1. Normative References |
| |
| [SSH-ARCH] Ylonen, T. and C. Lonvick, Ed., "The Secure Shell |
| (SSH) Protocol Architecture", RFC 4251, January 2006. |
| |
| [SSH-TRANS] Ylonen, T. and C. Lonvick, Ed., "The Secure Shell |
| (SSH) Transport Layer Protocol", RFC 4253, January |
| 2006. |
| |
| [SSH-USERAUTH] Ylonen, T. and C. Lonvick, Ed., "The Secure Shell |
| (SSH) Authentication Protocol", RFC 4252, January |
| 2006. |
| |
| [SSH-NUMBERS] Lehtinen, S. and C. Lonvick, Ed., "The Secure Shell |
| (SSH) Protocol Assigned Numbers", RFC 4250, January |
| 2006. |
| |
| [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate |
| Requirement Levels", BCP 14, RFC 2119, March 1997. |
| |
| [RFC2434] Narten, T. and H. Alvestrand, "Guidelines for Writing |
| an IANA Considerations Section in RFCs", BCP 26, RFC |
| 2434, October 1998. |
| |
| [RFC3066] Alvestrand, H., "Tags for the Identification of |
| Languages", BCP 47, RFC 3066, January 2001. |
| |
| [RFC3629] Yergeau, F., "UTF-8, a transformation format of ISO |
| 10646", STD 63, RFC 3629, November 2003. |
| |
| 12.2. Informative References |
| |
| [RFC3330] IANA, "Special-Use IPv4 Addresses", RFC 3330, |
| September 2002. |
| |
| [RFC3513] Hinden, R. and S. Deering, "Internet Protocol Version |
| 6 (IPv6) Addressing Architecture", RFC 3513, April |
| 2003. |
| |
| [SCHEIFLER] Scheifler, R., "X Window System : The Complete |
| Reference to Xlib, X Protocol, Icccm, Xlfd, 3rd |
| edition.", Digital Press ISBN 1555580882, February |
| 1992. |
| |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 22] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| [POSIX] ISO/IEC, 9945-1., "Information technology -- Portable |
| Operating System Interface (POSIX)-Part 1: System |
| Application Program Interface (API) C Language", ANSI/ |
| IEE Std 1003.1, July 1996. |
| |
| Authors' Addresses |
| |
| Tatu Ylonen |
| SSH Communications Security Corp |
| Valimotie 17 |
| 00380 Helsinki |
| Finland |
| |
| EMail: ylo@ssh.com |
| |
| |
| Chris Lonvick (editor) |
| Cisco Systems, Inc. |
| 12515 Research Blvd. |
| Austin 78759 |
| USA |
| |
| EMail: clonvick@cisco.com |
| |
| Trademark Notice |
| |
| "ssh" is a registered trademark in the United States and/or other |
| countries. |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 23] |
| |
| RFC 4254 SSH Connection Protocol January 2006 |
| |
| |
| Full Copyright Statement |
| |
| Copyright (C) The Internet Society (2006). |
| |
| This document is subject to the rights, licenses and restrictions |
| contained in BCP 78, and except as set forth therein, the authors |
| retain all their rights. |
| |
| This document and the information contained herein are provided on an |
| "AS IS" basis and THE CONTRIBUTOR, THE ORGANIZATION HE/SHE REPRESENTS |
| OR IS SPONSORED BY (IF ANY), THE INTERNET SOCIETY AND THE INTERNET |
| ENGINEERING TASK FORCE DISCLAIM ALL WARRANTIES, EXPRESS OR IMPLIED, |
| INCLUDING BUT NOT LIMITED TO ANY WARRANTY THAT THE USE OF THE |
| INFORMATION HEREIN WILL NOT INFRINGE ANY RIGHTS OR ANY IMPLIED |
| WARRANTIES OF MERCHANTABILITY OR FITNESS FOR A PARTICULAR PURPOSE. |
| |
| Intellectual Property |
| |
| The IETF takes no position regarding the validity or scope of any |
| Intellectual Property Rights or other rights that might be claimed to |
| pertain to the implementation or use of the technology described in |
| this document or the extent to which any license under such rights |
| might or might not be available; nor does it represent that it has |
| made any independent effort to identify any such rights. Information |
| on the procedures with respect to rights in RFC documents can be |
| found in BCP 78 and BCP 79. |
| |
| Copies of IPR disclosures made to the IETF Secretariat and any |
| assurances of licenses to be made available, or the result of an |
| attempt made to obtain a general license or permission for the use of |
| such proprietary rights by implementers or users of this |
| specification can be obtained from the IETF on-line IPR repository at |
| http://www.ietf.org/ipr. |
| |
| The IETF invites any interested party to bring to its attention any |
| copyrights, patents or patent applications, or other proprietary |
| rights that may cover technology that may be required to implement |
| this standard. Please address the information to the IETF at |
| ietf-ipr@ietf.org. |
| |
| Acknowledgement |
| |
| Funding for the RFC Editor function is provided by the IETF |
| Administrative Support Activity (IASA). |
| |
| |
| |
| |
| |
| |
| |
| Ylonen & Lonvick Standards Track [Page 24] |
| |