diff options
Diffstat (limited to 'doc/rfc/rfc9327.txt')
-rw-r--r-- | doc/rfc/rfc9327.txt | 1148 |
1 files changed, 1148 insertions, 0 deletions
diff --git a/doc/rfc/rfc9327.txt b/doc/rfc/rfc9327.txt new file mode 100644 index 0000000..75fa23d --- /dev/null +++ b/doc/rfc/rfc9327.txt @@ -0,0 +1,1148 @@ + + + + +Internet Engineering Task Force (IETF) B. Haberman, Ed. +Request for Comments: 9327 JHU +Category: Historic November 2022 +ISSN: 2070-1721 + + + Control Messages Protocol for Use with Network Time Protocol Version 4 + +Abstract + + This document describes the structure of the control messages that + were historically used with the Network Time Protocol (NTP) before + the advent of more modern control and management approaches. These + control messages have been used to monitor and control the NTP + application running on any IP network attached computer. The + information in this document was originally described in Appendix B + of RFC 1305. The goal of this document is to provide an updated + description of the control messages described in RFC 1305 in order to + conform with the updated NTP specification documented in RFC 5905. + + The publication of this document is not meant to encourage the + development and deployment of these control messages. This document + is only providing a current reference for these control messages + given the current status of RFC 1305. + +Status of This Memo + + This document is not an Internet Standards Track specification; it is + published for the historical record. + + This document defines a Historic Document for the Internet community. + This document is a product of the Internet Engineering Task Force + (IETF). It represents the consensus of the IETF community. It has + received public review and has been approved for publication by the + Internet Engineering Steering Group (IESG). Not all documents + approved by the IESG are candidates for any level of Internet + Standard; see Section 2 of RFC 7841. + + Information about the current status of this document, any errata, + and how to provide feedback on it may be obtained at + https://www.rfc-editor.org/info/rfc9327. + +Copyright Notice + + Copyright (c) 2022 IETF Trust and the persons identified as the + document authors. All rights reserved. + + This document is subject to BCP 78 and the IETF Trust's Legal + Provisions Relating to IETF Documents + (https://trustee.ietf.org/license-info) in effect on the date of + publication of this document. Please review these documents + carefully, as they describe your rights and restrictions with respect + to this document. Code Components extracted from this document must + include Revised BSD License text as described in Section 4.e of the + Trust Legal Provisions and are provided without warranty as described + in the Revised BSD License. + + This document may contain material from IETF Documents or IETF + Contributions published or made publicly available before November + 10, 2008. The person(s) controlling the copyright in some of this + material may not have granted the IETF Trust the right to allow + modifications of such material outside the IETF Standards Process. + Without obtaining an adequate license from the person(s) controlling + the copyright in such materials, this document may not be modified + outside the IETF Standards Process, and derivative works of it may + not be created outside the IETF Standards Process, except to format + it for publication as an RFC or to translate it into languages other + than English. + +Table of Contents + + 1. Introduction + 1.1. Terminology + 1.2. Control Message Overview + 1.3. Remote Facility Message Overview + 2. NTP Control Message Format + 3. Status Words + 3.1. System Status Word + 3.2. Peer Status Word + 3.3. Clock Status Word + 3.4. Error Status Word + 4. Commands + 5. IANA Considerations + 6. Security Considerations + 7. References + 7.1. Normative References + 7.2. Informative References + Appendix A. NTP Remote Facility Message Format + Acknowledgements + Contributors + Author's Address + +1. Introduction + + [RFC1305] describes a set of control messages for use within the + Network Time Protocol (NTP) when a comprehensive network management + solution was not available. The definitions of these control + messages were not promulgated to [RFC5905] when NTP version 4 was + documented. These messages were intended for use only in systems + where no other management facilities were available or appropriate, + such as in dedicated-function bus peripherals. Support for these + messages is not required in order to conform to [RFC5905]. The + control messages are described here as a current reference for use + with an implementation of NTP from RFC 5905. + + The publication of this document is not meant to encourage the + development and deployment of these control messages. This document + is only providing a current reference for these control messages + given the current status of RFC 1305. + +1.1. Terminology + + The key words "MUST", "MUST NOT", "REQUIRED", "SHALL", "SHALL NOT", + "SHOULD", "SHOULD NOT", "RECOMMENDED", "NOT RECOMMENDED", "MAY", and + "OPTIONAL" in this document are to be interpreted as described in + BCP 14 [RFC2119] [RFC8174] when, and only when, they appear in all + capitals, as shown here. + +1.2. Control Message Overview + + The NTP mode 6 control messages are used by NTP management programs + (e.g., ntpq) when a more robust network management facility (e.g., + SNMP) is not available. These control messages provide rudimentary + control and monitoring functions to manage a running instance of an + NTP server. These commands are not designed to be used for + communication between instances of running NTP servers. + + The NTP control message has the value 6 specified in the mode field + of the first octet of the NTP header and is formatted as shown in + Figure 1. The format of the data field is specific to each command + or response; however, in most cases, the format is designed to be + constructed and viewed by humans and so is coded in free-form ASCII. + This facilitates the specification and implementation of simple + management tools in the absence of fully evolved network-management + facilities. As in ordinary NTP messages, the authenticator field + follows the data field. If the authenticator is used, the data field + is zero-padded to a 32-bit boundary, but the padding bits are not + considered part of the data field and are not included in the field + count. + + IP hosts are not required to reassemble datagrams over a certain size + (576 octets for IPv4 [RFC0791] and 1280 octets for IPv6 [RFC8200]); + however, some commands or responses may involve more data than will + fit into a single datagram. Accordingly, a simple reassembly feature + is included in which each octet of the message data is numbered + starting with zero. As each fragment is transmitted, the number of + its first octet is inserted in the offset field and the number of + octets is inserted in the count field. The more-data (M) bit is set + in all fragments except the last. + + Most control functions involve sending a command and receiving a + response, perhaps involving several fragments. The sender chooses a + distinct, nonzero sequence number and sets the status field, "R" bit, + and "E" bit to zero. The responder interprets the opcode and + additional information in the data field, updates the status field, + sets the "R" bit to one and returns the three 32-bit words of the + header along with additional information in the data field. In the + case of invalid message format or contents, the responder inserts a + code in the status field, sets the "R" and "E" bits to one and, + optionally, inserts a diagnostic message in the data field. + + Some commands read or write system variables (e.g., s.offset) and + peer variables (e.g., p.stratum) for an association identified in the + command. Others read or write variables associated with a radio + clock or other device directly connected to a source of primary + synchronization information. To identify which type of variable and + association, the Association ID is used. System variables are + indicated by the identifier zero. As each association is mobilized a + unique, nonzero identifier is created for it. These identifiers are + used in a cyclic fashion, so that the chance of using an old + identifier that matches a newly created association is remote. A + management entity can request a list of current identifiers and + subsequently use them to read and write variables for each + association. An attempt to use an expired identifier results in an + exception response, following which the list can be requested again. + + Some exception events, such as when a peer becomes reachable or + unreachable, occur spontaneously and are not necessarily associated + with a command. An implementation may elect to save the event + information for later retrieval, to send an asynchronous response + (called a trap), or both. In case of a trap, the IP address and port + number are determined by a previous command and the sequence field is + set as described below. Current status and summary information for + the latest exception event is returned in all normal responses. Bits + in the status field indicate whether an exception has occurred since + the last response and whether more than one exception has occurred. + + Commands need not necessarily be sent by an NTP peer, so ordinary + access-control procedures may not apply; however, the optional mask/ + match mechanism suggested in Section 6 provides the capability to + control access by mode number, so this could be used to limit access + for control messages (mode 6) to selected address ranges. + +1.3. Remote Facility Message Overview + + The original development of the NTP daemon included a Remote Facility + for monitoring and configuration. This facility used mode 7 commands + to communicate with the NTP daemon. This document illustrates the + mode 7 packet format only. The commands embedded in the mode 7 + messages are implementation specific and not standardized in any way. + The mode 7 message format is described in Appendix A. + +2. NTP Control Message Format + + The format of the NTP Control Message header, which immediately + follows the UDP header, is shown in Figure 1. Following the figure + is a description of its header fields. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |LI | VN |Mode |R|E|M| opcode | Sequence Number | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Status | Association ID | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Offset | Count | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + / Data (up to 468 bytes) / + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Padding (optional) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + / Authenticator (optional, 20 or 24 bits) / + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 1: NTP Control Message Header + + Leap Indicator (LI): + This is a 2-bit integer that is set to b00 for control message + requests and responses. The Leap Indicator value used at this + position in most NTP modes is in the system status word provided + in some control message responses. + + Version Number (VN): + This is a 3-bit integer indicating a minimum NTP version number. + NTP servers do not respond to control messages with an + unrecognized version number. Requests may intentionally use a + lower version number to enable interoperability with earlier + versions of NTP. Responses carry the same version as the + corresponding request. + + Mode: + This is a 3-bit integer indicating the mode. The value 6 + indicates an NTP control message. + + Response Bit (R): + Set to zero for commands; set to one for responses. + + Error Bit (E): + Set to zero for normal responses; set to one for an error + response. + + More Bit (M): + Set to zero for the last fragment; set to one for all others. + + Operation Code (opcode): + This is a 5-bit integer specifying the command function. Values + currently defined include the following: + + +=======+================================================+ + | Code | Meaning | + +=======+================================================+ + | 0 | reserved | + +-------+------------------------------------------------+ + | 1 | read status command/response | + +-------+------------------------------------------------+ + | 2 | read variables command/response | + +-------+------------------------------------------------+ + | 3 | write variables command/response | + +-------+------------------------------------------------+ + | 4 | read clock variables command/response | + +-------+------------------------------------------------+ + | 5 | write clock variables command/response | + +-------+------------------------------------------------+ + | 6 | set trap address/port command/response | + +-------+------------------------------------------------+ + | 7 | trap response | + +-------+------------------------------------------------+ + | 8 | runtime configuration command/response | + +-------+------------------------------------------------+ + | 9 | export configuration to file command/response | + +-------+------------------------------------------------+ + | 10 | retrieve remote address stats command/response | + +-------+------------------------------------------------+ + | 11 | retrieve ordered list command/response | + +-------+------------------------------------------------+ + | 12 | request client-specific nonce command/response | + +-------+------------------------------------------------+ + | 13-30 | reserved | + +-------+------------------------------------------------+ + | 31 | unset trap address/port command/response | + +-------+------------------------------------------------+ + + Table 1: Operation Codes + + Sequence Number: + This is a 16-bit integer indicating the sequence number of the + command or response. Each request uses a different sequence + number. Each response carries the same sequence number as its + corresponding request. For asynchronous trap responses, the + responder increments the sequence number by one for each response, + allowing trap receivers to detect missing trap responses. The + sequence number of each fragment of a multiple-datagram response + carries the same sequence number, copied from the request. + + Status: + This is a 16-bit code indicating the current status of the system, + peer, or clock with values coded as described in following + sections. + + Association ID: + This is a 16-bit unsigned integer identifying a valid association + or zero for the system clock. + + Offset: + This is a 16-bit unsigned integer indicating the offset, in + octets, of the first octet in the data area. The offset is set to + zero in requests. Responses spanning multiple datagrams use a + positive offset in all but the first datagram. + + Count: + This is a 16-bit unsigned integer indicating the length of the + data field, in octets. + + Data: + This contains the message data for the command or response. The + maximum number of data octets is 468. + + Padding (optional): + Contains zero to 3 octets with a value of zero, as needed to + ensure the overall control message size is a multiple of 4 octets. + + Authenticator (optional): + When the NTP authentication mechanism is implemented, this + contains the authenticator information defined in Appendix C of + [RFC1305]. + +3. Status Words + + Status words indicate the present status of the system, associations, + and clock. They are designed to be interpreted by network-monitoring + programs and are in one of four 16-bit formats shown in Figure 2 and + described in this section. System and peer status words are + associated with responses for all commands except the read clock + variables, write clock variables, and set trap address/port commands. + The association identifier zero specifies the system status word, + while a nonzero identifier specifies a particular peer association. + The status word returned in response to read clock variables and + write clock variables commands indicates the state of the clock + hardware and decoding software. A special error status word is used + to report malformed command fields or invalid values. + + 0 1 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | LI| Clock Src | Count | Code | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + System Status Word + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Status | SEL | Count | Code | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + Peer Status Word + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Clock Status | Code | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + Radio Status Word + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Error Code | Reserved | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + Error Status Word + + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Reserved | Count | Code | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + Clock Status Word + + Figure 2: Status Word Formats + +3.1. System Status Word + + The system status word appears in the status field of the response to + a read status or read variables command with a zero association + identifier. The format of the system status word is as follows: + + Leap Indicator (LI): + This is a 2-bit code warning of an impending leap second to be + inserted/deleted in the last minute of the current day, with bit 0 + and bit 1, respectively, coded as follows: + + +====+=================================================+ + | LI | Meaning | + +====+=================================================+ + | 00 | no warning | + +----+-------------------------------------------------+ + | 01 | insert second after 23:59:59 of the current day | + +----+-------------------------------------------------+ + | 10 | delete second 23:59:59 of the current day | + +----+-------------------------------------------------+ + | 11 | unsynchronized | + +----+-------------------------------------------------+ + + Table 2: Leap Indicator Codes + + Clock Source (Clock Src): + This is a 6-bit integer indicating the current synchronization + source, with values coded as follows: + + +=======+========================================================+ + | Code | Meaning | + +=======+========================================================+ + | 0 | unspecified or unknown | + +-------+--------------------------------------------------------+ + | 1 | Calibrated atomic clock (e.g., PPS, HP 5061) | + +-------+--------------------------------------------------------+ + | 2 | VLF (band 4) or LF (band 5) radio (e.g., OMEGA,, WWVB) | + +-------+--------------------------------------------------------+ + | 3 | HF (band 7) radio (e.g., CHU, MSF, WWV/H) | + +-------+--------------------------------------------------------+ + | 4 | UHF (band 9) satellite (e.g., GOES, GPS) | + +-------+--------------------------------------------------------+ + | 5 | local net (e.g., DCN, TSP, DTS) | + +-------+--------------------------------------------------------+ + | 6 | UDP/NTP | + +-------+--------------------------------------------------------+ + | 7 | UDP/TIME | + +-------+--------------------------------------------------------+ + | 8 | eyeball-and-wristwatch | + +-------+--------------------------------------------------------+ + | 9 | telephone modem (e.g., NIST) | + +-------+--------------------------------------------------------+ + | 10-63 | reserved | + +-------+--------------------------------------------------------+ + + Table 3: Clock Source Values + + System Event Counter (Count): + This is a 4-bit integer indicating the number of system events + occurring since the last time the System Event Code changed. Upon + reaching 15, subsequent events with the same code are not counted. + + System Event Code (Code): + This is a 4-bit integer identifying the latest system exception + event, with new values overwriting previous values, and coded as + follows: + + +======+============================================================+ + | Code | Meaning | + +======+============================================================+ + | 0 | unspecified | + +------+------------------------------------------------------------+ + | 1 | frequency correction (drift) file not available | + +------+------------------------------------------------------------+ + | 2 | frequency correction started (frequency stepped) | + +------+------------------------------------------------------------+ + | 3 | spike detected and ignored, starting stepout timer | + +------+------------------------------------------------------------+ + | 4 | frequency training started | + +------+------------------------------------------------------------+ + | 5 | clock synchronized | + +------+------------------------------------------------------------+ + | 6 | system restart | + +------+------------------------------------------------------------+ + | 7 | panic stop (required step greater than panic threshold) | + +------+------------------------------------------------------------+ + | 8 | no system peer | + +------+------------------------------------------------------------+ + | 9 | leap second insertion/deletion armed for the current | + | | month | + +------+------------------------------------------------------------+ + | 10 | leap second disarmed | + +------+------------------------------------------------------------+ + | 11 | leap second inserted or deleted | + +------+------------------------------------------------------------+ + | 12 | clock stepped (stepout timer expired) | + +------+------------------------------------------------------------+ + | 13 | kernel loop discipline status changed | + +------+------------------------------------------------------------+ + | 14 | leapseconds table loaded from file | + +------+------------------------------------------------------------+ + | 15 | leapseconds table outdated, updated file needed | + +------+------------------------------------------------------------+ + + Table 4: System Event Codes + +3.2. Peer Status Word + + A peer status word is returned in the status field of a response to a + read status, read variables, or write variables command and appears + in the list of Association IDs and status words returned by a read + status command with a zero Association ID. The format of a peer + status word is as follows: + + Peer Status (Status): + This is a 5-bit code indicating the status of the peer determined + by the packet procedure, with bits assigned as follows: + + +=================+==========================================+ + | Peer Status bit | Meaning | + +=================+==========================================+ + | 0 | configured (peer.config) | + +-----------------+------------------------------------------+ + | 1 | authentication enabled (peer.authenable) | + +-----------------+------------------------------------------+ + | 2 | authentication okay (peer.authentic) | + +-----------------+------------------------------------------+ + | 3 | reachability okay (peer.reach != 0) | + +-----------------+------------------------------------------+ + | 4 | broadcast association | + +-----------------+------------------------------------------+ + + Table 5: Peer Status Bits + + Peer Selection (SEL): + This is a 3-bit integer indicating the status of the peer + determined by the clock-selection procedure, with values coded as + follows: + + +=====+=======================================================+ + | Sel | Meaning | + +=====+=======================================================+ + | 0 | rejected | + +-----+-------------------------------------------------------+ + | 1 | discarded by intersection algorithm | + +-----+-------------------------------------------------------+ + | 2 | discarded by table overflow (not currently used) | + +-----+-------------------------------------------------------+ + | 3 | discarded by the cluster algorithm | + +-----+-------------------------------------------------------+ + | 4 | included by the combine algorithm | + +-----+-------------------------------------------------------+ + | 5 | backup source (with more than sys.maxclock survivors) | + +-----+-------------------------------------------------------+ + | 6 | system peer (synchronization source) | + +-----+-------------------------------------------------------+ + | 7 | PPS (pulse per second) peer | + +-----+-------------------------------------------------------+ + + Table 6: Peer Selection Values + + Peer Event Counter (Count): + This is a 4-bit integer indicating the number of peer exception + events that occurred since the last time the peer event code + changed. Upon reaching 15, subsequent events with the same code + are not counted. + + Peer Event Code (Code): + This is a 4-bit integer identifying the latest peer exception + event, with new values overwriting previous values, and coded as + follows: + + +=================+===================================+ + | Peer Event Code | Meaning | + +=================+===================================+ + | 0 | unspecified | + +-----------------+-----------------------------------+ + | 1 | association mobilized | + +-----------------+-----------------------------------+ + | 2 | association demobilized | + +-----------------+-----------------------------------+ + | 3 | peer unreachable (peer.reach was | + | | nonzero now zero) | + +-----------------+-----------------------------------+ + | 4 | peer reachable (peer.reach was | + | | zero now nonzero) | + +-----------------+-----------------------------------+ + | 5 | association restarted or timed | + | | out | + +-----------------+-----------------------------------+ + | 6 | no reply (only used with one-shot | + | | clock set command) | + +-----------------+-----------------------------------+ + | 7 | peer rate limit exceeded (kiss | + | | code RATE received) | + +-----------------+-----------------------------------+ + | 8 | access denied (kiss code DENY | + | | received) | + +-----------------+-----------------------------------+ + | 9 | leap second insertion/deletion at | + | | month's end armed by peer vote | + +-----------------+-----------------------------------+ + | 10 | became system peer (sys.peer) | + +-----------------+-----------------------------------+ + | 11 | reference clock event (see clock | + | | status word) | + +-----------------+-----------------------------------+ + | 12 | authentication failed | + +-----------------+-----------------------------------+ + | 13 | popcorn spike suppressed by peer | + | | clock filter register | + +-----------------+-----------------------------------+ + | 14 | entering interleaved mode | + +-----------------+-----------------------------------+ + | 15 | recovered from interleave error | + +-----------------+-----------------------------------+ + + Table 7: Peer Event Code Values + +3.3. Clock Status Word + + There are two ways a reference clock can be attached to an NTP + service host: as a dedicated device managed by the operating system + and as a synthetic peer managed by NTP. As in the read status + command, the Association ID is used to identify the correct variable + for each clock: zero for the system clock and nonzero for a peer + clock. Only one system clock is supported by the protocol, although + many peer clocks can be supported. A system or peer clock status + word appears in the status field of the response to a read clock + variables or write clock variables command. This word can be + considered to be an extension of the system status word or the peer + status word as appropriate. The format of the clock status word is + as follows: + + Reserved: + This is an 8-bit integer that is ignored by requesters and zeroed + by responders. + + Count: + This is a 4-bit integer indicating the number of clock events that + occurred since the last time the clock event code changed. Upon + reaching 15, subsequent events with the same code are not counted. + + Clock Code (Code): + This is a 4-bit integer indicating the current clock status, with + values coded as follows: + + +==============+=================================+ + | Clock Status | Meaning | + +==============+=================================+ + | 0 | clock operating within nominals | + +--------------+---------------------------------+ + | 1 | reply timeout | + +--------------+---------------------------------+ + | 2 | bad reply format | + +--------------+---------------------------------+ + | 3 | hardware or software fault | + +--------------+---------------------------------+ + | 4 | propagation failure | + +--------------+---------------------------------+ + | 5 | bad date format or value | + +--------------+---------------------------------+ + | 6 | bad time format or value | + +--------------+---------------------------------+ + | 7-15 | reserved | + +--------------+---------------------------------+ + + Table 8: Clock Code Values + +3.4. Error Status Word + + An error status word is returned in the status field of an error + response as the result of invalid message format or contents. Its + presence is indicated when the E (error) bit is set along with the + response (R) bit in the response. It consists of an 8-bit integer + coded as follows: + + +==============+==================================+ + | Error Status | Meaning | + +==============+==================================+ + | 0 | unspecified | + +--------------+----------------------------------+ + | 1 | authentication failure | + +--------------+----------------------------------+ + | 2 | invalid message length or format | + +--------------+----------------------------------+ + | 3 | invalid opcode | + +--------------+----------------------------------+ + | 4 | unknown Association ID | + +--------------+----------------------------------+ + | 5 | unknown variable name | + +--------------+----------------------------------+ + | 6 | invalid variable value | + +--------------+----------------------------------+ + | 7 | administratively prohibited | + +--------------+----------------------------------+ + | 8-255 | reserved | + +--------------+----------------------------------+ + + Table 9: Error Status Word Codes + +4. Commands + + Commands consist of the header and optional data field shown in + Figure 1. When present, the data field contains a list of + identifiers or assignments in the form + <<identifier>>[=<<value>>],<<identifier>>[=<<value>>],... where + <<identifier>> is the ASCII name of a system or peer variable such as + the ones specified in RFC 5905 and <<value>> is expressed as a + decimal, hexadecimal, or string constant in the syntax of the C + programming language. Where no ambiguity exists, the "sys." or + "peer." prefixes can be suppressed. Space characters (ASCII + nonprinting format effectors) can be added to improve readability for + simple monitoring programs that do not reformat the data field. + Representations of note are as follows: + + * IPv4 internet addresses are written in the form [n.n.n.n], where n + is in decimal notation and the brackets are optional + + * IPv6 internet addresses are formulated based on the guidelines + defined in [RFC5952]. + + * Timestamps (including reference, originate, receive, and transmit + values) and the logical clock are represented in units of seconds + and fractions, preferably in hexadecimal notation. + + * Delay, offset, dispersion, and distance values are represented in + units of milliseconds and fractions, preferably in decimal + notation. + + * All other values are represented as is, preferably in decimal + notation. + + Implementations may define variables other than those described in + RFC 5905; called "extramural variables", these are distinguished by + the inclusion of some character type other than alphanumeric or "." + in the name. For those commands that return a list of assignments in + the response data field, if the command data field is empty, it is + expected that all available variables defined in RFC 5905 will be + included in the response. For the read commands, if the command data + field is nonempty, an implementation may choose to process this field + to individually select which variables are to be returned. + + Commands are interpreted as follows: + + Read Status (1): + The command data field is empty or contains a list of identifiers + separated by commas. The command operates in two ways depending + on the value of the Association ID. If this identifier is + nonzero, the response includes the peer identifier and status + word. Optionally, the response data field may contain other + information, such as described in the Read Variables command. If + the association identifier is zero, the response includes the + system identifier (0) and status word; the data field contains a + list of binary-coded pairs <<Association ID>> <<status word>>, one + for each currently defined association. + + Read Variables (2): + The command data field is empty or contains a list of identifiers + separated by commas. If the Association ID is nonzero, the + response includes the requested peer identifier and status word; + the data field contains a list of peer variables and values as + described above. If the Association ID is zero, the data field + contains a list of system variables. If a peer has been selected + as the synchronization source, the response includes the peer + identifier and status word; otherwise, the response includes the + system identifier (0) and status word. + + Write Variables (3): + The command data field contains a list of assignments as described + above. The variables are updated as indicated. The response is + as described for the Read Variables command. + + Read Clock Variables (4): + The command data field is empty or contains a list of identifiers + separated by commas. The Association ID selects the system clock + variables or peer clock variables in the same way as in the Read + Variables command. The response includes the requested clock + identifier and status word; the data field contains a list of + clock variables and values, including the last timecode message + received from the clock. + + Write Clock Variables (5): + The command data field contains a list of assignments as described + above. The clock variables are updated as indicated. The + response is as described for the read clock variables command. + + Set Trap Address/Port (6): + The command Association ID, status, and data fields are ignored. + The address and port number for subsequent trap messages are taken + from the source address and port of the control message itself. + The initial trap counter for trap response messages is taken from + the sequence field of the command. The response association + identifier, status, and data fields are not significant. + Implementations should include logical timeouts that prevent trap + transmissions if the monitoring program does not renew this + information after a lengthy interval. + + Trap Response (7): + This message is sent when a system, peer, or clock exception event + occurs. The opcode field is 7 and the R bit is set. The trap + counter is incremented by one for each trap sent and the sequence + field set to that value. The trap message is sent using the IP + address and port fields established by the set trap address/port + command. If a system trap, the Association ID field is set to + zero and the status field contains the system status word. If a + peer trap, the Association ID field is set to that peer and the + status field contains the peer status word. Optional ASCII-coded + information can be included in the data field. + + Configure (8): + The command data is parsed and applied as if supplied in the + daemon configuration file. + + Save Configuration (9): + Writes a snapshot of the current configuration to the file name + supplied as the command data. Further, the command is refused + unless a directory in which to store the resulting files has been + explicitly configured by the operator. + + Read Most Recently Used (MRU) list (10): + Retrieves records of recently seen remote addresses and associated + statistics. This command supports all of the state variables + defined in Section 9 of [RFC5905]. Command data consists of + name=value pairs controlling the selection of records, as well as + a requestor-specific nonce previously retrieved using this command + or opcode 12 (Request Nonce). The response consists of name=value + pairs where some names can appear multiple times using a dot + followed by a zero-based index to distinguish them and to + associate elements of the same record with the same index. A new + nonce is provided with each successful response. + + Read ordered list (11): + Retrieves a list ordered by IP address (IPv4 information precedes + IPv6 information). If the command data is empty or is the seven + characters "ifstats", the associated statistics, status, and + counters for each local address are returned. If the command data + is the characters "addr_restrictions", then the set of IPv4 remote + address restrictions followed by the set of IPv6 remote address + restrictions (access control lists) are returned. Other command + data returns error code 5 (unknown variable name). Similar to + Read MRU, response information uses zero-based indexes as part of + the variable name preceding the equals sign and value, where each + index relates information for a single address or network. This + opcode requires authentication. + + Request Nonce (12): + Retrieves a 96-bit nonce specific to the requesting remote + address, which is valid for a limited period. Command data is not + used in the request. The nonce consists of a 64-bit NTP timestamp + and 32 bits of hash derived from that timestamp, the remote + address, and salt known only to the server, which varies between + daemon runs. Inclusion of the nonce by a management agent + demonstrates to the server that the agent can receive datagrams + sent to the source address of the request, making source address + "spoofing" more difficult in a similar way as TCP's three-way + handshake. + + Unset Trap (31): + Removes the requesting remote address and port from the list of + trap receivers. Command data is not used in the request. If the + address and port are not in the list of trap receivers, the error + code is 4 (bad association). + +5. IANA Considerations + + This document has no IANA actions. + +6. Security Considerations + + A number of security vulnerabilities have been identified with these + control messages. + + NTP's control query interface allows reading and writing of system, + peer, and clock variables remotely from arbitrary IP addresses using + commands mentioned in Section 4. Overwriting these variables, but + not reading them, requires authentication by default. However, this + document argues that an NTP host must authenticate all control + queries and not just ones that overwrite these variables. + Alternatively, the host can use an access control list to explicitly + list IP addresses that are allowed to control query the clients. + These access controls are required for the following reasons: + + NTP as a Distributed Denial-of-Service (DDoS) vector: + NTP timing query and response packets (modes 1-2, 3-4, and 5) are + usually short in size. However, some NTP control queries generate + a very long packet in response to a short query. As such, there + is a history of use of NTP's control queries, which exhibit such + behavior, to perform DoS attacks. These off-path attacks exploit + the large size of NTP control queries to cause UDP-based + amplification attacks (e.g., mode 7 monlist command generates a + very long packet in response to a small query [CVE-DOS]). These + attacks only use NTP as a vector for DoS attacks on other + protocols, but do not affect the time service on the NTP host + itself. To limit the sources of these malicious commands, NTP + server operators are recommended to deploy ingress filtering + [RFC3704]. + + Time-shifting attacks through information leakage/overwriting: + NTP hosts save important system and peer state variables. An off- + path attacker who can read these variables remotely can leverage + the information leaked by these control queries to perform time- + shifting and DDoS attacks on NTP clients. These attacks do affect + time synchronization on the NTP hosts. For instance: + + * In the client/server mode, the client stores its local time when + it sends the query to the server in its xmt peer variable. This + variable is used to perform TEST2 to non-cryptographically + authenticate the server (i.e., if the origin timestamp field in + the corresponding server response packet matches the xmt peer + variable, then the client accepts the packet). An off-path + attacker with the ability to read this variable can easily spoof + server response packets for the client, which will pass TEST2 and + can deny service or shift time on the NTP client. The specific + attack is described in [CVE-SPOOF]. + + * The client also stores its local time when the server response is + received in its rec peer variable. This variable is used for + authentication in interleaved-pivot mode. An off-path attacker + with the ability to read this state variable can easily shift time + on the client by passing this test. This attack is described in + [CVE-SHIFT]. + + Fast-Scanning: + NTP mode 6 control messages are usually small UDP packets. Fast- + scanning tools like ZMap can be used to spray the entire + (potentially reachable) Internet with these messages within hours + to identify vulnerable hosts. To make things worse, these attacks + can be extremely low-rate, only requiring a control query for + reconnaissance and a spoofed response to shift time on vulnerable + clients. + + The mode 6 and 7 messages are vulnerable to replay attacks + [CVE-Replay]: + If an attacker observes mode 6/7 packets that modify the + configuration of the server in any way, the attacker can apply the + same change at any time later by simply sending the packets to the + server again. The use of the nonce (Request Nonce command) + provides limited protection against replay attacks. + + NTP best practices recommend configuring NTP with the no-query + parameter. The no-query parameter blocks access to all remote + control queries. However, sometimes the hosts do not want to block + all queries and want to give access for certain control queries + remotely. This could be for the purpose of remote management and + configuration of the hosts in certain scenarios. Such hosts tend to + use firewalls or other middleboxes to blacklist certain queries + within the network. + + Significantly fewer hosts respond to mode 7 monlist queries as + compared to other control queries because it is a well-known and + exploited control query. These queries are likely blocked using + blacklists on firewalls and middleboxes rather than the no-query + option on NTP hosts. The remaining control queries that can be + exploited likely remain out of the blacklist because they are + undocumented in the current NTP specification [RFC5905]. + + This document describes all of the mode 6 control queries allowed by + NTP and can help administrators make informed decisions on security + measures to protect NTP devices from harmful queries and likely make + those systems less vulnerable. The use of the legacy mode 6 + interface is NOT RECOMMENDED. Regardless of which mode 6 commands an + administrator may elect to allow, remote access to this facility + needs to be protected from unauthorized access (e.g., strict Access + Control Lists (ACLs)). Additionally, the legacy interface for mode 6 + commands SHOULD NOT be utilized in new deployments or implementation + of NTP. + +7. References + +7.1. Normative References + + [RFC1305] Mills, D., "Network Time Protocol (Version 3) + Specification, Implementation and Analysis", RFC 1305, + DOI 10.17487/RFC1305, March 1992, + <https://www.rfc-editor.org/info/rfc1305>. + + [RFC2119] Bradner, S., "Key words for use in RFCs to Indicate + Requirement Levels", BCP 14, RFC 2119, + DOI 10.17487/RFC2119, March 1997, + <https://www.rfc-editor.org/info/rfc2119>. + + [RFC3704] Baker, F. and P. Savola, "Ingress Filtering for Multihomed + Networks", BCP 84, RFC 3704, DOI 10.17487/RFC3704, March + 2004, <https://www.rfc-editor.org/info/rfc3704>. + + [RFC5905] Mills, D., Martin, J., Ed., Burbank, J., and W. Kasch, + "Network Time Protocol Version 4: Protocol and Algorithms + Specification", RFC 5905, DOI 10.17487/RFC5905, June 2010, + <https://www.rfc-editor.org/info/rfc5905>. + + [RFC5952] Kawamura, S. and M. Kawashima, "A Recommendation for IPv6 + Address Text Representation", RFC 5952, + DOI 10.17487/RFC5952, August 2010, + <https://www.rfc-editor.org/info/rfc5952>. + + [RFC8174] Leiba, B., "Ambiguity of Uppercase vs Lowercase in RFC + 2119 Key Words", BCP 14, RFC 8174, DOI 10.17487/RFC8174, + May 2017, <https://www.rfc-editor.org/info/rfc8174>. + +7.2. Informative References + + [CVE-DOS] NIST National Vulnerability Database, "CVE-2013-5211 + Detail", 2 January 2014, + <https://nvd.nist.gov/vuln/detail/CVE-2013-5211>. + + [CVE-Replay] + NIST National Vulnerability Database, "CVE-2015-8140 + Detail", 30 January 2015, + <https://nvd.nist.gov/vuln/detail/CVE-2015-8140>. + + [CVE-SHIFT] + NIST National Vulnerability Database, "CVE-2016-1548 + Detail", 6 January 2017, + <https://nvd.nist.gov/vuln/detail/CVE-2016-1548>. + + [CVE-SPOOF] + NIST National Vulnerability Database, "CVE-2015-8139 + Detail", 30 January 2017, + <https://nvd.nist.gov/vuln/detail/CVE-2015-8139>. + + [RFC0791] Postel, J., "Internet Protocol", STD 5, RFC 791, + DOI 10.17487/RFC0791, September 1981, + <https://www.rfc-editor.org/info/rfc791>. + + [RFC8200] Deering, S. and R. Hinden, "Internet Protocol, Version 6 + (IPv6) Specification", STD 86, RFC 8200, + DOI 10.17487/RFC8200, July 2017, + <https://www.rfc-editor.org/info/rfc8200>. + +Appendix A. NTP Remote Facility Message Format + + The format of the NTP Remote Facility Message header, which + immediately follows the UDP header, is shown in Figure 3. A + description of its fields follows Figure 3. Bit positions marked as + zero are reserved and should always be transmitted as zero. + + 0 1 2 3 + 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 2 3 4 5 6 7 8 9 0 1 + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + |R|M| VN |Mode |A| Sequence | Implementation| Req Code | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Err | Count | MBZ | Size | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + / Data (up to 500 bytes) / + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | Encryption KeyID (when A bit set) | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + | | + / Message Authentication Code (when A bit set) / + | | + +-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+ + + Figure 3: NTP Remote Facility Message Header + + Response Bit (R): + Set to 0 if the packet is a request. Set to 1 if the packet is a + response. + + More Bit (M): + Set to 0 if this is the last packet in a response; otherwise, set + to 1 in responses requiring more than one packet. + + Version Number (VN): + Set to the version number of the NTP daemon. + + Mode: + Set to 7 for Remote Facility messages. + + Authenticated Bit (A): + If set to 1, this packet contains authentication information. + + Sequence: + For a multi-packet response, this field contains the sequence + number of this packet. Packets in a multi-packet response are + numbered starting with 0. The More Bit is set to 1 for all + packets but the last. + + Implementation: + The version number of the implementation that defined the request + code used in this message. An implementation number of 0 is used + for a request code supported by all versions of the NTP daemon. + The value 255 is reserved for future extensions. + + Request Code (Req Code): + An implementation-specific code that specifies the operation being + requested. A request code definition includes the format and + semantics of the data included in the packet. + + Error (Err): + Set to 0 for a request. For a response, this field contains an + error code relating to the request. If the Error is nonzero, the + operation requested wasn't performed. + + 0: no error + + 1: incompatible implementation number + + 2: unimplemented request code + + 3: format error + + 4: no data available + + 7: authentication failure + + Count: + The number of data items in the packet. Range is 0 to 500. + + Must Be Zero (MBZ): + A reserved field set to 0 in requests and responses. + + Size: + The size of each data item in the packet. Range is 0 to 500. + + Data: + A variable-sized field containing request/response data. For + requests and responses, the size in octets must be greater than or + equal to the product of the number of data items (Count) and the + size of a data item (Size). For requests, the data area is + exactly 40 octets in length. For responses, the data area will + range from 0 to 500 octets, inclusive. + + Encryption KeyID: + A 32-bit unsigned integer used to designate the key used for the + Message Authentication Code. This field is included only when the + A bit is set to 1. + + Message Authentication Code: + An optional Message Authentication Code defined by the version of + the NTP daemon indicated in the Implementation field. This field + is included only when the A bit is set to 1. + +Acknowledgements + + Tim Plunkett created the original version of this document. Aanchal + Malhotra provided the initial version of the Security Considerations + section. + + Karen O'Donoghue, David Hart, Harlan Stenn, and Philip Chimento + deserve credit for portions of this document due to their earlier + efforts to document these commands. + + Miroshav Lichvar, Ulrich Windl, Dieter Sibold, J Ignacio Alvarez- + Hamelin, and Alex Campbell provided valuable comments on various + draft versions of this document. + +Contributors + + Dr. David Mills specified the vast majority of the mode 6 commands + during the development of [RFC1305] and deserves the credit for their + existence and use. + +Author's Address + + Brian Haberman (editor) + JHU + Email: brian@innovationslab.net |