--- contrib/ntp/html/authentic.html.orig +++ contrib/ntp/html/authentic.html @@ -20,7 +20,7 @@ giffrom Alice's Adventures in Wonderland, Lewis Carroll

Our resident cryptographer; now you see him, now you don't.

Last update: - 1-Dec-2012 04:44 + 5-Feb-2016 09:13 UTC


Related Links

@@ -35,28 +35,28 @@

Introduction

-

This page describes the various cryptographic authentication provisions in NTPv4. Authentication support allows the NTP client to verify that servers are in fact known and trusted and not intruders intending accidentally or intentionally to masquerade as a legitimate server. A detailed discussion of the NTP multi-layer security model and vulnerability analysis is in the white paper NTP Security Analysis.

-

The NTPv3 specification (RFC-1305) defined an authentication scheme properly described as symmetric key cryptography. It used the Data Encryption Standard (DES) algorithm operating in cipher-block chaining (CBC) mode. Subsequently, this algorithm was replaced by the RSA Message Digest 5 (MD5) algorithm commonly called keyed-MD5. Either algorithm computes a message digest or one-way hash which can be used to verify the client has the same message digest as the server. The MD5 message digest algorithm is included in the distribution, so without further cryptographic support, the distribution can be freely exported.

-

If the OpenSSL cryptographic library is installed prior to building the distribution, all message digest algorithms included in the library may be used, including SHA and SHA1. However, if conformance to FIPS 140-2 is required, only a limited subset of these algorithms can be used. This library is available from http://www.openssl.org and can be installed using the procedures outlined in the Building and Installing the Distribution page. Once installed, the configure and build process automatically detects the library and links the library routines +

This page describes the various cryptographic authentication provisions in NTPv4. Authentication support allows the NTP client to verify that servers are in fact known and trusted and not intruders intending accidentally or intentionally to masquerade as a legitimate server. A detailed discussion of the NTP multi-layer security model and vulnerability analysis is in the white paper NTP Security Analysis.

+

The NTPv3 specification (RFC-1305) defined an authentication scheme properly described as symmetric key cryptography. It used the Data Encryption Standard (DES) algorithm operating in cipher-block chaining (CBC) mode. Subsequently, this algorithm was replaced by the RSA Message Digest 5 (MD5) algorithm commonly called keyed-MD5. Either algorithm computes a message digest or one-way hash which can be used to verify the client has the same message digest as the server. The MD5 message digest algorithm is included in the distribution, so without further cryptographic support, the distribution can be freely exported.

+

If the OpenSSL cryptographic library is installed prior to building the distribution, all message digest algorithms included in the library may be used, including SHA and SHA1. However, if conformance to FIPS 140-2 is required, only a limited subset of these algorithms can be used. This library is available from http://www.openssl.org and can be installed using the procedures outlined in the Building and Installing the Distribution page. Once installed, the configure and build process automatically detects the library and links the library routines required.

-

In addition to the symmetric key algorithms, this distribution includes support for the Autokey public key algorithms and protocol specified in RFC-5906 "Network Time Protocol Version 4: Autokey Specification". This support is available only if the OpenSSL library has been installed and the --enable-autokey option is used when the distribution is built.

-

Public key cryptography is generally considered more secure than symmetric key cryptography, since the security is based on private and public values which are generated by each participant and where the private value is never revealed. Autokey uses X.509 public certificates, which can be produced by commercial services, the OpenSSL application program, or the ntp-keygen utility program in the NTP software distribution.

-

Note that according to US law, NTP binaries including OpenSSL library components, including the OpenSSL library itself, cannot be exported outside the US without license from the US Department of Commerce. Builders outside the US are advised to obtain the OpenSSL library directly from OpenSSL, which is outside the US, and build outside the US.

-

Authentication is configured separately for each association using the key or autokey option of the server configuration command, as described in the Server Options page. The ntp-keygen page describes the files required for the various authentication schemes. Further details are in the briefings, papers and reports at the NTP project page linked from www.ntp.org.

-

By default, the client sends non-authenticated packets and the server responds with non-authenticated packets. If the client sends authenticated packets, the server responds with authenticated packets if correct, or a crypto-NAK packet if not.. In the case of unsolicited packets which might consume significant resources, such as broadcast or symmetric mode packets, , authentication is required, unless overridden by a disable auth command. In the current climate of targeted broadcast or "letterbomb" attacks, defeating this requirement would be decidedly dangerous. In any case, the notrust flag, described on the Access Control Options page, can be used to disable access to all but correctly authenticated clients..

+

In addition to the symmetric key algorithms, this distribution includes support for the Autokey public key algorithms and protocol specified in RFC-5906 "Network Time Protocol Version 4: Autokey Specification". This support is available only if the OpenSSL library has been installed and the --enable-autokey option is used when the distribution is built.

+

Public key cryptography is generally considered more secure than symmetric key cryptography, since the security is based on private and public values which are generated by each participant and where the private value is never revealed. Autokey uses X.509 public certificates, which can be produced by commercial services, the OpenSSL application program, or the ntp-keygen utility program in the NTP software distribution.

+

Note that according to US law, NTP binaries including OpenSSL library components, including the OpenSSL library itself, cannot be exported outside the US without license from the US Department of Commerce. Builders outside the US are advised to obtain the OpenSSL library directly from OpenSSL, which is outside the US, and build outside the US.

+

Authentication is configured separately for each association using the key or autokey option of the server configuration command, as described in the Server Options page. The ntp-keygen page describes the files required for the various authentication schemes. Further details are in the briefings, papers and reports at the NTP project page linked from www.ntp.org.

+

By default, the client sends non-authenticated packets and the server responds with non-authenticated packets. If the client sends authenticated packets, the server responds with authenticated packets if correct, or a crypto-NAK packet if not. In the case of unsolicited packets which might consume significant resources, such as broadcast or symmetric mode packets, authentication is required, unless overridden by a disable auth command. In the current climate of targeted broadcast or "letterbomb" attacks, defeating this requirement would be decidedly dangerous. In any case, the notrust flag, described on the Access Control Options page, can be used to disable access to all but correctly authenticated clients.

Symmetric Key Cryptography

-

The original NTPv3 specification (RFC-1305), as well as the current NTPv4 specification (RFC-5905), allows any one of possibly 65,534 message digest keys (excluding zero), each distinguished by a 32-bit key ID, to authenticate an association. The servers and clients involved must agree on the key ID, key type and key to authenticate NTP packets.

-

The message digest is a cryptographic hash computed by an algorithm such as MD5 or SHA. When authentication is specified, a message authentication code (MAC) is appended to the NTP packet header. The MAC consists of a 32-bit key identifier (key ID) followed by a 128- or 160-bit message digest. The algorithm computes the digest as the hash of a 128- or 160- bit message digest key concatenated with the NTP packet header fields with the exception of the MAC. On transmit, the message digest is computed and inserted in the MAC. On receive, the message digest is computed and compared with the MAC. The packet is accepted only if the two MACs are identical. If a discrepancy is found by the client, the client ignores the packet, but raises an alarm. If this happens at the server, the server returns a special message called a crypto-NAK. Since the crypto-NAK is protected by the loopback test, an intruder cannot disrupt the protocol by sending a bogus crypto-NAK.

-

Keys and related information are specified in a keys file, which must be distributed and stored using secure means beyond the scope of the NTP protocol itself. Besides the keys used for ordinary NTP associations, additional keys can be used as passwords for the ntpq and ntpdc utility programs. Ordinarily, the ntp.keys file is generated by the ntp-keygen program, but it can be constructed and edited using an ordinary text editor.

-

Each line of the keys file consists of three fields: a key ID in the range 1 to 65,534, inclusive, a key type, and a message digest key consisting of a printable ASCII string less than 40 characters, or a 40-character hex digit string. If the OpenSSL library is installed, the key type can be any message digest algorithm supported by the library. If the OpenSSL library is not installed, the only permitted key type is MD5.

+

The original NTPv3 specification (RFC-1305), as well as the current NTPv4 specification (RFC-5905), allows any one of possibly 65,534 message digest keys (excluding zero), each distinguished by a 32-bit key ID, to authenticate an association. The servers and clients involved must agree on the key ID, key type and key to authenticate NTP packets.

+

The message digest is a cryptographic hash computed by an algorithm such as MD5 or SHA. When authentication is specified, a message authentication code (MAC) is appended to the NTP packet header. The MAC consists of a 32-bit key identifier (key ID) followed by a 128- or 160-bit message digest. The algorithm computes the digest as the hash of a 128- or 160- bit message digest key concatenated with the NTP packet header fields with the exception of the MAC. On transmit, the message digest is computed and inserted in the MAC. On receive, the message digest is computed and compared with the MAC. The packet is accepted only if the two MACs are identical. If a discrepancy is found by the client, the client ignores the packet, but raises an alarm. If this happens at the server, the server returns a special message called a crypto-NAK. Since the crypto-NAK is protected by the loopback test, an intruder cannot disrupt the protocol by sending a bogus crypto-NAK.

+

Keys and related information are specified in a keys file, which must be distributed and stored using secure means beyond the scope of the NTP protocol itself. Besides the keys used for ordinary NTP associations, additional keys can be used as passwords for the ntpq and ntpdc utility programs. Ordinarily, the ntp.keys file is generated by the ntp-keygen program, but it can be constructed and edited using an ordinary text editor.

+

Each line of the keys file consists of three or four fields: a key ID in the range 1 to 65,534, inclusive, a key type, a message digest key consisting of a printable ASCII string less than 40 characters or a 40-character hex digit string, and an optional comma-separated list of IPs that are allowed to serve time. If the OpenSSL library is installed, the key type can be any message digest algorithm supported by the library. If the OpenSSL library is not installed, the only permitted key type is MD5.

gif

Figure 1. Typical Symmetric Key File

-

Figure 1 shows a typical keys file used by the reference implementation when the OpenSSL library is installed. In this figure, for key IDs in he range 1-10, the key is interpreted as a printable ASCII string. For key IDs in the range 11-20, the key is a 40-character hex digit string. The key is truncated or zero-filled internally to either 128 or 160 bits, depending on the key type. The line can be edited later or new lines can be added to change any field. The key can be change to a password, such as 2late4Me for key ID 10. Note that two or more keys files can be combined in any order as long as the key IDs are distinct.

-

When ntpd is started, it reads the keys file specified by the keys command and installs the keys in the key cache. However, individual keys must be activated with the trustedkey configuration command before use. This allows, for instance, the installation of possibly several batches of keys and then activating a key remotely using ntpq or ntpdc. The requestkey command selects the key ID used as the password for the ntpdc utility, while the controlkey command selects the key ID used as the password for the ntpq utility.

+

Figure 1 shows a typical keys file used by the reference implementation when the OpenSSL library is installed. In this figure, for key IDs in he range 1-10, the key is interpreted as a printable ASCII string. For key IDs in the range 11-20, the key is a 40-character hex digit string. The key is truncated or zero-filled internally to either 128 or 160 bits, depending on the key type. The line can be edited later or new lines can be added to change any field. The key can be change to a password, such as 2late4Me for key ID 10. Note that two or more keys files can be combined in any order as long as the key IDs are distinct.

+

When ntpd is started, it reads the keys file specified by the keys command and installs the keys in the key cache. However, individual keys must be activated with the trustedkey configuration command before use. This allows, for instance, the installation of possibly several batches of keys and then activating a key remotely using ntpq or ntpdc. The requestkey command selects the key ID used as the password for the ntpdc utility, while the controlkey command selects the key ID used as the password for the ntpq utility.

Microsoft Windows Authentication

-

In addition to the above means, ntpd now supports Microsoft Windows MS-SNTP authentication using Active Directory services. This support was contributed by the Samba Team and is still in development. It is enabled using the mssntp flag of the restrict command described on the Access Control Options page. Note: Potential users should be aware that these services involve a TCP connection to another process that could potentially block, denying services to other users. Therefore, this flag should be used only for a dedicated server with no clients other than MS-SNTP.

+

In addition to the above means, ntpd now supports Microsoft Windows MS-SNTP authentication using Active Directory services. This support was contributed by the Samba Team and is still in development. It is enabled using the mssntp flag of the restrict command described on the Access Control Options page. Note: Potential users should be aware that these services involve a TCP connection to another process that could potentially block, denying services to other users. Therefore, this flag should be used only for a dedicated server with no clients other than MS-SNTP.

Public Key Cryptography

See the Autokey Public-Key Authentication page.


--- contrib/ntp/html/monopt.html.orig +++ contrib/ntp/html/monopt.html @@ -11,7 +11,7 @@ gif from Pogo, Walt Kelly

Pig was hired to watch the logs.

Last update: - 31-Jan-2014 06:54 + 14-Feb-2016 09:38 UTC


Related Links

@@ -295,7 +295,7 @@
The status field is encoded in hex format as described in Appendix B of the NTP specification RFC 1305.
protostats
-
Record significant peer, system and [rptpcp; events. Each significant event +
Record significant peer, system and protocol events. Each significant event appends one line to the protostats file set:
49213 525.624 128.4.1.1 963a 8a message
--- contrib/ntp/html/xleave.html.orig +++ contrib/ntp/html/xleave.html @@ -11,17 +11,17 @@ giffrom Pogo, Walt Kelly

You need a little magic.

Last update: - 10-Mar-2014 05:25 + 6-Feb-2016 07:17 UTC



-

In the protocol described in the NTP specification and reference implementation up to now, the transmit timestamp, which is captured before the message digest is computed and the packet queued for output, is properly called as a softstamp The receive timestamp, which is captured after the input driver interrupt routine and before the packet is queued for input, is properly called a drivestamp. For enhanced accuracy it is desirable to capture the transmit timestamp as close to the wire as possible; for example, after the output driver interrupt routine.

-

In other words, we would like to replace the transmit softstamp with a drivestamp, but the problem is the transmit drivestamp is available only after the packet has been sent. A solution for this problem is the two-step or interleaved protocol described on this page and included in the the current reference implementation. In interleaved modes the transmit drivestamp for one packet is actually carried in the immediately following packet. The trick, however, is to implement the interleaved protocol without changing the NTP packet header format, without compromising backwards compatibility and without compromising the error recovery properties.

-

The reference implementation captures a softstamp before the message digest routine and a drivestamp after the output interrupt routine. In this design the latter timestamp can be considered most accurate, as it avoids the various queuing and transmission latencies. The difference between the two timestamps, which is called the interleaved or output delay, varies from 16 μs for a dual-core Pentium running FreeBSD 6.1 to 1100 μs for a Sun Blade 1500 running Solaris 10.

+

In the protocol described in the NTP specification and reference implementation up to now, the transmit timestamp, which is captured before the message digest is computed and the packet queued for output, is properly called as a softstamp. The receive timestamp, which is captured after the input driver interrupt routine and before the packet is queued for input, is properly called a drivestamp. For enhanced accuracy it is desirable to capture the transmit timestamp as close to the wire as possible; for example, after the output driver interrupt routine.

+

In other words, we would like to replace the transmit softstamp with a drivestamp, but the problem is the transmit drivestamp is available only after the packet has been sent. A solution for this problem is the two-step or interleaved protocol described on this page and included in the the current reference implementation. In interleaved modes the transmit drivestamp for one packet is actually carried in the immediately following packet. The trick, however, is to implement the interleaved protocol without changing the NTP packet header format, without compromising backwards compatibility and without compromising the error recovery properties.

+

The reference implementation captures a softstamp before the message digest routine and a drivestamp after the output interrupt routine. In this design the latter timestamp can be considered most accurate, as it avoids the various queuing and transmission latencies. The difference between the two timestamps, which is called the interleaved or output delay, varies from 16 μs (microseconds) for a dual-core Pentium running FreeBSD 6.1 to 1100 μs (microseconds) for a Sun Blade 1500 running Solaris 10.

Interleaved mode can be used only in NTP symmetric and broadcast modes. It is activated by the xleave option with the peer or broadcast configuration -commands. A broadcast server configured for interleaved mode is transparent to ordinary broadcast clients, so both ordinary and interleaved broadcast clients can use the same packets. An interleaved symmetric active peer automatically switches to ordinary symmetric mode if the other peer is not capable of operation in interleaved mode.

-

As demonstrated in the white paper Analysis and Simulation of the NTP On-Wire Protocols, the interleaved modes have the same resistance to lost packets, duplicate packets, packets crossed in flight and protocol restarts as the ordinary modes. An application of the interleaved symmetric mode in space missions is presented in the white paper Time Synchronization for Space Data Links.

+commands. A broadcast server configured for interleaved mode is transparent to ordinary broadcast clients, so both ordinary and interleaved broadcast clients can use the same packets. An interleaved symmetric active peer automatically switches to ordinary symmetric mode if the other peer is not capable of operation in interleaved mode.

+

As demonstrated in the white paper Analysis and Simulation of the NTP On-Wire Protocols, the interleaved modes have the same resistance to lost packets, duplicate packets, packets crossed in flight and protocol restarts as the ordinary modes. An application of the interleaved symmetric mode in space missions is presented in the white paper Time Synchronization for Space Data Links.


gif

--- contrib/ntp/include/ntp.h.orig +++ contrib/ntp/include/ntp.h @@ -175,6 +175,7 @@ struct interface { endpt * elink; /* endpt list link */ endpt * mclink; /* per-AF_* multicast list */ + void * ioreg_ctx; /* IO registration context */ SOCKET fd; /* socket descriptor */ SOCKET bfd; /* for receiving broadcasts */ u_int32 ifnum; /* endpt instance count */ @@ -242,6 +243,13 @@ #define PEER_TEST_MASK (TEST10 | TEST11 | TEST12 | TEST13) /* + * Unused flags + */ +#define TEST14 0x2000 +#define TEST15 0x4000 +#define TEST16 0x8000 + +/* * The peer structure. Holds state information relating to the guys * we are peering with. Most of this stuff is from section 3.2 of the * spec. @@ -391,6 +399,7 @@ u_long received; /* packets received */ u_long processed; /* packets processed */ u_long badauth; /* bad authentication (TEST5) */ + u_long badNAK; /* invalid crypto-NAK */ u_long bogusorg; /* bogus origin (TEST2, TEST3) */ u_long oldpkt; /* old duplicate (TEST1) */ u_long seldisptoolarge; /* bad header (TEST6, TEST7) */ @@ -545,6 +554,7 @@ l_fp rec; /* receive time stamp */ l_fp xmt; /* transmit time stamp */ +#define MIN_V4_PKT_LEN (12 * sizeof(u_int32)) /* min header length */ #define LEN_PKT_NOMAC (12 * sizeof(u_int32)) /* min header length */ #define MIN_MAC_LEN (1 * sizeof(u_int32)) /* crypto_NAK */ #define MAX_MD5_LEN (5 * sizeof(u_int32)) /* MD5 */ --- contrib/ntp/include/ntp_keyacc.h.orig +++ contrib/ntp/include/ntp_keyacc.h @@ -10,4 +10,10 @@ sockaddr_u addr; }; +extern KeyAccT* keyacc_new_push(KeyAccT *head, const sockaddr_u *addr); +extern KeyAccT* keyacc_pop_free(KeyAccT *head); +extern KeyAccT* keyacc_all_free(KeyAccT *head); +extern int keyacc_contains(const KeyAccT *head, const sockaddr_u *addr, + int res_on_empty_list); + #endif /* NTP_KEYACC_H */ --- contrib/ntp/include/ntp_refclock.h.orig +++ contrib/ntp/include/ntp_refclock.h @@ -105,7 +105,8 @@ int active; /* nonzero when in use */ #ifdef HAVE_IO_COMPLETION_PORT - void * device_context; /* device-related data for i/o subsystem */ + void * ioreg_ctx; /* IO registration context */ + void * device_ctx; /* device-related data for i/o subsystem */ #endif }; --- contrib/ntp/include/ntp_stdlib.h.orig +++ contrib/ntp/include/ntp_stdlib.h @@ -200,7 +200,7 @@ extern keyid_t cache_keyid; /* key identifier */ extern int cache_type; /* key type */ extern u_char * cache_secret; /* secret */ -extern u_short cache_secretsize; /* secret octets */ +extern size_t cache_secretsize; /* secret octets */ extern u_short cache_flags; /* KEY_ bit flags */ /* getopt.c */ --- contrib/ntp/include/ntp_types.h.orig +++ contrib/ntp/include/ntp_types.h @@ -35,6 +35,13 @@ # define FALSE 0 #endif +#ifdef HAVE_STDBOOL_H +# include +#else +typedef int bool; /* Can't use enum TRUE/FALSE because of above */ +#endif + + /* * This is another naming conflict. * On NetBSD for MAC the macro "mac" is defined as 1 --- contrib/ntp/include/ntp_worker.h.orig +++ contrib/ntp/include/ntp_worker.h @@ -119,11 +119,11 @@ int resp_write_pipe; /* child */ int ispipe; void * resp_read_ctx; /* child */ - volatile u_int resp_ready_seen; /* signal/scan */ - volatile u_int resp_ready_done; /* consumer/mainloop */ #else sem_ref responses_pending; /* signalling */ #endif + volatile u_int resp_ready_seen; /* signal/scan */ + volatile u_int resp_ready_done; /* consumer/mainloop */ sema_type sem_table[4]; thread_type thr_table[1]; } blocking_child; @@ -171,6 +171,8 @@ extern void kill_asyncio (int); #endif +extern void worker_global_lock(int inOrOut); + # ifdef WORK_PIPE typedef void (*addremove_io_fd_func)(int, int, int); extern addremove_io_fd_func addremove_io_fd; --- contrib/ntp/include/recvbuff.h.orig +++ contrib/ntp/include/recvbuff.h @@ -91,7 +91,7 @@ /* signal safe - no malloc */ extern struct recvbuf *get_free_recv_buffer(void); -/* signal unsafe - may malloc */ +/* signal unsafe - may malloc, never returs NULL */ extern struct recvbuf *get_free_recv_buffer_alloc(void); /* Add a buffer to the full list @@ -113,7 +113,7 @@ * purge_recv_buffers_for_fd() - purges any previously-received input * from a given file descriptor. */ -extern void purge_recv_buffers_for_fd(SOCKET); +extern void purge_recv_buffers_for_fd(int); /* * Checks to see if there are buffers to process --- contrib/ntp/lib/isc/include/isc/string.h.orig +++ contrib/ntp/lib/isc/include/isc/string.h @@ -199,6 +199,24 @@ * */ +int +isc_tsmemcmp(const void *p1, const void *p2, size_t len); +/* + * Lexicographic compare 'len' unsigned bytes from 'p1' and 'p2' + * like 'memcmp()'. + * + * This function is safe from timing attacks as it has a runtime that + * only depends on 'len' and has no early-out option. + * + * Use this to check MACs and other material that is security sensitive. + * + * Returns: + * (let x be the byte offset of the first different byte) + * -1 if (u_char)p1[x] < (u_char)p2[x] + * 1 if (u_char)p1[x] > (u_char)p2[x] + * 0 if byte series are equal + */ + char * isc_string_separate(char **stringp, const char *delim); --- contrib/ntp/lib/isc/hmacmd5.c.orig +++ contrib/ntp/lib/isc/hmacmd5.c @@ -145,5 +145,5 @@ REQUIRE(len <= ISC_MD5_DIGESTLENGTH); isc_hmacmd5_sign(ctx, newdigest); - return (ISC_TF(memcmp(digest, newdigest, len) == 0)); + return (ISC_TF(isc_tsmemcmp(digest, newdigest, len) == 0)); } --- contrib/ntp/lib/isc/hmacsha.c.orig +++ contrib/ntp/lib/isc/hmacsha.c @@ -538,7 +538,7 @@ REQUIRE(len <= ISC_SHA1_DIGESTLENGTH); isc_hmacsha1_sign(ctx, newdigest, ISC_SHA1_DIGESTLENGTH); - return (ISC_TF(memcmp(digest, newdigest, len) == 0)); + return (ISC_TF(isc_tsmemcmp(digest, newdigest, len) == 0)); } /* @@ -551,7 +551,7 @@ REQUIRE(len <= ISC_SHA224_DIGESTLENGTH); isc_hmacsha224_sign(ctx, newdigest, ISC_SHA224_DIGESTLENGTH); - return (ISC_TF(memcmp(digest, newdigest, len) == 0)); + return (ISC_TF(isc_tsmemcmp(digest, newdigest, len) == 0)); } /* @@ -564,7 +564,7 @@ REQUIRE(len <= ISC_SHA256_DIGESTLENGTH); isc_hmacsha256_sign(ctx, newdigest, ISC_SHA256_DIGESTLENGTH); - return (ISC_TF(memcmp(digest, newdigest, len) == 0)); + return (ISC_TF(isc_tsmemcmp(digest, newdigest, len) == 0)); } /* @@ -577,7 +577,7 @@ REQUIRE(len <= ISC_SHA384_DIGESTLENGTH); isc_hmacsha384_sign(ctx, newdigest, ISC_SHA384_DIGESTLENGTH); - return (ISC_TF(memcmp(digest, newdigest, len) == 0)); + return (ISC_TF(isc_tsmemcmp(digest, newdigest, len) == 0)); } /* @@ -590,5 +590,5 @@ REQUIRE(len <= ISC_SHA512_DIGESTLENGTH); isc_hmacsha512_sign(ctx, newdigest, ISC_SHA512_DIGESTLENGTH); - return (ISC_TF(memcmp(digest, newdigest, len) == 0)); + return (ISC_TF(isc_tsmemcmp(digest, newdigest, len) == 0)); } --- contrib/ntp/lib/isc/tsmemcmp.c.orig +++ contrib/ntp/lib/isc/tsmemcmp.c @@ -0,0 +1,55 @@ +/* + * Copyright (C) 2004-2007, 2011, 2012 Internet Systems Consortium, Inc. ("ISC") + * Copyright (C) 1999-2001, 2003 Internet Software Consortium. + * + * Permission to use, copy, modify, and/or distribute this software for any + * purpose with or without fee is hereby granted, provided that the above + * copyright notice and this permission notice appear in all copies. + * + * THE SOFTWARE IS PROVIDED "AS IS" AND ISC DISCLAIMS ALL WARRANTIES WITH + * REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY + * AND FITNESS. IN NO EVENT SHALL ISC BE LIABLE FOR ANY SPECIAL, DIRECT, + * INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM + * LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE + * OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR + * PERFORMANCE OF THIS SOFTWARE. + */ + +/* $Id$ */ + +/*! \file */ + +#include +#include +#include + +/* Making a portable memcmp that has no internal branches and loops always + * once for every byte without early-out shortcut has a few challenges. + * + * Inspired by 'timingsafe_memcmp()' from the BSD system and + * https://github.com/libressl-portable/openbsd/blob/master/src/lib/libc/string/timingsafe_memcmp.c + * + * Sadly, that one is not portable C: It makes assumptions on the representation + * of negative integers and assumes sign-preserving right-shift of negative + * signed values. This is a rewrite from scratch that should not suffer from + * such issues. + * + * 2015-12-12, J. Perlinger (perlinger-at-ntp-dot-org) + */ +int +isc_tsmemcmp(const void *p1, const void *p2, size_t nb) { + const unsigned char *ucp1 = p1; + const unsigned char *ucp2 = p2; + unsigned int isLT = 0u; + unsigned int isGT = 0u; + volatile unsigned int mask = (1u << CHAR_BIT); + + for (/*NOP*/; 0 != nb; --nb, ++ucp1, ++ucp2) { + isLT |= mask & + ((unsigned int)*ucp1 - (unsigned int)*ucp2); + isGT |= mask & + ((unsigned int)*ucp2 - (unsigned int)*ucp1); + mask &= ~(isLT | isGT); + } + return (int)(isGT >> CHAR_BIT) - (int)(isLT >> CHAR_BIT); +} --- contrib/ntp/libntp/Makefile.am.orig +++ contrib/ntp/libntp/Makefile.am @@ -36,6 +36,7 @@ $(srcdir)/../lib/isc/unix/time.c \ $(srcdir)/../lib/isc/sha1.c \ $(srcdir)/../lib/isc/sockaddr.c \ + $(srcdir)/../lib/isc/tsmemcmp.c \ $(NULL) if PTHREADS --- contrib/ntp/libntp/Makefile.in.orig +++ contrib/ntp/libntp/Makefile.in @@ -182,6 +182,7 @@ $(srcdir)/../lib/isc/$(LIBISC_PTHREADS_NOTHREADS)/thread.c \ $(srcdir)/../lib/isc/unix/time.c $(srcdir)/../lib/isc/sha1.c \ $(srcdir)/../lib/isc/sockaddr.c \ + $(srcdir)/../lib/isc/tsmemcmp.c \ $(srcdir)/../lib/isc/pthreads/mutex.c am__objects_1 = @PTHREADS_TRUE@am__objects_2 = mutex.$(OBJEXT) @@ -196,7 +197,7 @@ result.$(OBJEXT) stdio.$(OBJEXT) stdtime.$(OBJEXT) \ strerror.$(OBJEXT) task.$(OBJEXT) thread.$(OBJEXT) \ time.$(OBJEXT) sha1.$(OBJEXT) sockaddr.$(OBJEXT) \ - $(am__objects_1) $(am__objects_2) + tsmemcmp.$(OBJEXT) $(am__objects_1) $(am__objects_2) am__objects_4 = a_md5encrypt.$(OBJEXT) adjtime.$(OBJEXT) \ atoint.$(OBJEXT) atolfp.$(OBJEXT) atouint.$(OBJEXT) \ audio.$(OBJEXT) authkeys.$(OBJEXT) authreadkeys.$(OBJEXT) \ @@ -264,6 +265,7 @@ $(srcdir)/../lib/isc/$(LIBISC_PTHREADS_NOTHREADS)/thread.c \ $(srcdir)/../lib/isc/unix/time.c $(srcdir)/../lib/isc/sha1.c \ $(srcdir)/../lib/isc/sockaddr.c \ + $(srcdir)/../lib/isc/tsmemcmp.c \ $(srcdir)/../lib/isc/pthreads/mutex.c am_libntpsim_a_OBJECTS = systime_s.$(OBJEXT) $(am__objects_4) libntpsim_a_OBJECTS = $(am_libntpsim_a_OBJECTS) @@ -631,7 +633,8 @@ $(srcdir)/../lib/isc/task.c \ $(srcdir)/../lib/isc/$(LIBISC_PTHREADS_NOTHREADS)/thread.c \ $(srcdir)/../lib/isc/unix/time.c $(srcdir)/../lib/isc/sha1.c \ - $(srcdir)/../lib/isc/sockaddr.c $(NULL) $(am__append_1) + $(srcdir)/../lib/isc/sockaddr.c \ + $(srcdir)/../lib/isc/tsmemcmp.c $(NULL) $(am__append_1) libntp_a_SRCS = \ a_md5encrypt.c \ adjtime.c \ @@ -862,6 +865,7 @@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/time.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timetoa.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/timevalops.Po@am__quote@ +@AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/tsmemcmp.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/uglydate.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/vint64ops.Po@am__quote@ @AMDEP_TRUE@@am__include@ @am__quote@./$(DEPDIR)/work_fork.Po@am__quote@ @@ -1323,6 +1327,20 @@ @AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ @am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o sockaddr.obj `if test -f '$(srcdir)/../lib/isc/sockaddr.c'; then $(CYGPATH_W) '$(srcdir)/../lib/isc/sockaddr.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../lib/isc/sockaddr.c'; fi` +tsmemcmp.o: $(srcdir)/../lib/isc/tsmemcmp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tsmemcmp.o -MD -MP -MF $(DEPDIR)/tsmemcmp.Tpo -c -o tsmemcmp.o `test -f '$(srcdir)/../lib/isc/tsmemcmp.c' || echo '$(srcdir)/'`$(srcdir)/../lib/isc/tsmemcmp.c +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tsmemcmp.Tpo $(DEPDIR)/tsmemcmp.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../lib/isc/tsmemcmp.c' object='tsmemcmp.o' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tsmemcmp.o `test -f '$(srcdir)/../lib/isc/tsmemcmp.c' || echo '$(srcdir)/'`$(srcdir)/../lib/isc/tsmemcmp.c + +tsmemcmp.obj: $(srcdir)/../lib/isc/tsmemcmp.c +@am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT tsmemcmp.obj -MD -MP -MF $(DEPDIR)/tsmemcmp.Tpo -c -o tsmemcmp.obj `if test -f '$(srcdir)/../lib/isc/tsmemcmp.c'; then $(CYGPATH_W) '$(srcdir)/../lib/isc/tsmemcmp.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../lib/isc/tsmemcmp.c'; fi` +@am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/tsmemcmp.Tpo $(DEPDIR)/tsmemcmp.Po +@AMDEP_TRUE@@am__fastdepCC_FALSE@ $(AM_V_CC)source='$(srcdir)/../lib/isc/tsmemcmp.c' object='tsmemcmp.obj' libtool=no @AMDEPBACKSLASH@ +@AMDEP_TRUE@@am__fastdepCC_FALSE@ DEPDIR=$(DEPDIR) $(CCDEPMODE) $(depcomp) @AMDEPBACKSLASH@ +@am__fastdepCC_FALSE@ $(AM_V_CC@am__nodep@)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -c -o tsmemcmp.obj `if test -f '$(srcdir)/../lib/isc/tsmemcmp.c'; then $(CYGPATH_W) '$(srcdir)/../lib/isc/tsmemcmp.c'; else $(CYGPATH_W) '$(srcdir)/$(srcdir)/../lib/isc/tsmemcmp.c'; fi` + mutex.o: $(srcdir)/../lib/isc/pthreads/mutex.c @am__fastdepCC_TRUE@ $(AM_V_CC)$(CC) $(DEFS) $(DEFAULT_INCLUDES) $(INCLUDES) $(AM_CPPFLAGS) $(CPPFLAGS) $(AM_CFLAGS) $(CFLAGS) -MT mutex.o -MD -MP -MF $(DEPDIR)/mutex.Tpo -c -o mutex.o `test -f '$(srcdir)/../lib/isc/pthreads/mutex.c' || echo '$(srcdir)/'`$(srcdir)/../lib/isc/pthreads/mutex.c @am__fastdepCC_TRUE@ $(AM_V_at)$(am__mv) $(DEPDIR)/mutex.Tpo $(DEPDIR)/mutex.Po --- contrib/ntp/libntp/a_md5encrypt.c.orig +++ contrib/ntp/libntp/a_md5encrypt.c @@ -10,7 +10,7 @@ #include "ntp_stdlib.h" #include "ntp.h" #include "ntp_md5.h" /* provides OpenSSL digest API */ - +#include "isc/string.h" /* * MD5authencrypt - generate message digest * @@ -92,7 +92,7 @@ "MAC decrypt: MAC length error"); return (0); } - return !memcmp(digest, (const char *)pkt + length + 4, len); + return !isc_tsmemcmp(digest, (const char *)pkt + length + 4, len); } /* --- contrib/ntp/libntp/authkeys.c.orig +++ contrib/ntp/libntp/authkeys.c @@ -30,7 +30,7 @@ u_long lifetime; /* remaining lifetime */ keyid_t keyid; /* key identifier */ u_short type; /* OpenSSL digest NID */ - u_short secretsize; /* secret octets */ + size_t secretsize; /* secret octets */ u_short flags; /* KEY_ flags that wave */ }; @@ -51,12 +51,12 @@ #endif /* DEBUG */ static u_short auth_log2(size_t); -static void auth_resize_hashtable(void); -static void allocsymkey(symkey **, keyid_t, u_short, u_short, - u_long, u_short, u_char *, KeyAccT *); -static void freesymkey(symkey *, symkey **); +static void auth_resize_hashtable(void); +static void allocsymkey(keyid_t, u_short, + u_short, u_long, size_t, u_char *, KeyAccT *); +static void freesymkey(symkey *); #ifdef DEBUG -static void free_auth_mem(void); +static void free_auth_mem(void); #endif symkey key_listhead; /* list of all in-use keys */; @@ -93,15 +93,88 @@ /* * The key cache. We cache the last key we looked at here. + * Note: this should hold the last *trusted* key. Also the + * cache is only loaded when the digest type / MAC algorithm + * is valid. */ keyid_t cache_keyid; /* key identifier */ u_char *cache_secret; /* secret */ -u_short cache_secretsize; /* secret length */ +size_t cache_secretsize; /* secret length */ int cache_type; /* OpenSSL digest NID */ u_short cache_flags; /* flags that wave */ KeyAccT *cache_keyacclist; /* key access list */ +/* -------------------------------------------------------------------- + * manage key access lists + * -------------------------------------------------------------------- + */ +/* allocate and populate new access node and pushes it on the list. + * Returns the new head. + */ +KeyAccT* +keyacc_new_push( + KeyAccT * head, + const sockaddr_u * addr + ) +{ + KeyAccT * node = emalloc(sizeof(KeyAccT)); + + memcpy(&node->addr, addr, sizeof(sockaddr_u)); + node->next = head; + return node; +} +/* ----------------------------------------------------------------- */ +/* pop and deallocate the first node of a list of access nodes, if + * the list is not empty. Returns the tail of the list. + */ +KeyAccT* +keyacc_pop_free( + KeyAccT *head + ) +{ + KeyAccT * next = NULL; + if (head) { + next = head->next; + free(head); + } + return next; +} + +/* ----------------------------------------------------------------- */ +/* deallocate the list; returns an empty list. */ +KeyAccT* +keyacc_all_free( + KeyAccT * head + ) +{ + while (head) + head = keyacc_pop_free(head); + return head; +} + +/* ----------------------------------------------------------------- */ +/* scan a list to see if it contains a given address. Return the + * default result value in case of an empty list. + */ +int /*BOOL*/ +keyacc_contains( + const KeyAccT *head, + const sockaddr_u *addr, + int defv) +{ + if (head) { + do { + if (SOCK_EQ(&head->addr, addr)) + return TRUE; + } while (NULL != (head = head->next)); + return FALSE; + } else { + return !!defv; + } +} + + /* * init_auth - initialize internal data */ @@ -139,7 +212,7 @@ symkey_alloc * next_alloc; while (NULL != (sk = HEAD_DLIST(key_listhead, llink))) { - freesymkey(sk, &key_hash[KEYHASH(sk->keyid)]); + freesymkey(sk); } free(key_hash); key_hash = NULL; @@ -243,7 +316,22 @@ return (u_short)r; } +static void +authcache_flush_id( + keyid_t id + ) +{ + if (cache_keyid == id) { + cache_keyid = 0; + cache_type = 0; + cache_flags = 0; + cache_secret = NULL; + cache_secretsize = 0; + cache_keyacclist = NULL; + } +} + /* * auth_resize_hashtable * @@ -288,18 +376,21 @@ */ static void allocsymkey( - symkey ** bucket, keyid_t id, u_short flags, u_short type, u_long lifetime, - u_short secretsize, + size_t secretsize, u_char * secret, KeyAccT * ka ) { symkey * sk; + symkey ** bucket; + bucket = &key_hash[KEYHASH(id)]; + + if (authnumfreekeys < 1) auth_moremem(-1); UNLINK_HEAD_SLIST(sk, authfreekeys, llink.f); @@ -323,12 +414,19 @@ */ static void freesymkey( - symkey * sk, - symkey ** bucket + symkey * sk ) { + symkey ** bucket; symkey * unlinked; + if (NULL == sk) + return; + + authcache_flush_id(sk->keyid); + keyacc_all_free(sk->keyacclist); + + bucket = &key_hash[KEYHASH(sk->keyid)]; if (sk->secret != NULL) { memset(sk->secret, '\0', sk->secretsize); free(sk->secret); @@ -354,18 +452,16 @@ { symkey * sk; - for (sk = key_hash[KEYHASH(id)]; sk != NULL; sk = sk->hlink) { - if (id == sk->keyid) { + for (sk = key_hash[KEYHASH(id)]; sk != NULL; sk = sk->hlink) + if (id == sk->keyid) return sk; - } - } - return NULL; } /* - * auth_havekey - return TRUE if the key id is zero or known + * auth_havekey - return TRUE if the key id is zero or known. The + * key needs not to be trusted. */ int auth_havekey( @@ -372,19 +468,10 @@ keyid_t id ) { - symkey * sk; - - if (0 == id || cache_keyid == id) { - return TRUE; - } - - for (sk = key_hash[KEYHASH(id)]; sk != NULL; sk = sk->hlink) { - if (id == sk->keyid) { - return TRUE; - } - } - - return FALSE; + return + (0 == id) || + (cache_keyid == id) || + (NULL != auth_findkey(id)); } @@ -400,35 +487,25 @@ symkey * sk; authkeylookups++; - if (0 == id || cache_keyid == id) { - return TRUE; - } + if (0 == id || cache_keyid == id) + return !!(KEY_TRUSTED & cache_flags); /* - * Seach the bin for the key. If found and the key type - * is zero, somebody marked it trusted without specifying - * a key or key type. In this case consider the key missing. + * Search the bin for the key. If not found, or found but the key + * type is zero, somebody marked it trusted without specifying a + * key or key type. In this case consider the key missing. */ authkeyuncached++; - for (sk = key_hash[KEYHASH(id)]; sk != NULL; sk = sk->hlink) { - if (id == sk->keyid) { - if (0 == sk->type) { - authkeynotfound++; - return FALSE; - } - break; - } + sk = auth_findkey(id); + if ((sk == NULL) || (sk->type == 0)) { + authkeynotfound++; + return FALSE; } /* - * If the key is not found, or if it is found but not trusted, - * the key is not considered found. + * If the key is not trusted, the key is not considered found. */ - if (NULL == sk) { - authkeynotfound++; - return FALSE; - } - if (!(KEY_TRUSTED & sk->flags)) { + if ( ! (KEY_TRUSTED & sk->flags)) { authnokey++; return FALSE; } @@ -456,7 +533,6 @@ u_long trust ) { - symkey ** bucket; symkey * sk; u_long lifetime; @@ -464,12 +540,9 @@ * Search bin for key; if it does not exist and is untrusted, * forget it. */ - bucket = &key_hash[KEYHASH(id)]; - for (sk = *bucket; sk != NULL; sk = sk->hlink) { - if (id == sk->keyid) - break; - } - if (!trust && NULL == sk) + + sk = auth_findkey(id); + if (!trust && sk == NULL) return; /* @@ -478,16 +551,13 @@ * not to be trusted. */ if (sk != NULL) { - if (cache_keyid == id) { - cache_flags = 0; - cache_keyid = 0; - cache_keyacclist = NULL; - } - /* - * Key exists. If it is to be trusted, say so and - * update its lifetime. + * Key exists. If it is to be trusted, say so and update + * its lifetime. If no longer trusted, return it to the + * free list. Flush the cache first to be sure there are + * no discrepancies. */ + authcache_flush_id(id); if (trust > 0) { sk->flags |= KEY_TRUSTED; if (trust > 1) @@ -494,11 +564,9 @@ sk->lifetime = current_time + trust; else sk->lifetime = 0; - return; + } else { + freesymkey(sk); } - - /* No longer trusted, return it to the free list. */ - freesymkey(sk, bucket); return; } @@ -511,7 +579,7 @@ } else { lifetime = 0; } - allocsymkey(bucket, id, KEY_TRUSTED, 0, lifetime, 0, NULL, NULL); + allocsymkey(id, KEY_TRUSTED, 0, lifetime, 0, NULL, NULL); } @@ -520,22 +588,17 @@ */ int authistrusted( - keyid_t keyno + keyid_t id ) { symkey * sk; - symkey ** bucket; - if (keyno == cache_keyid) + if (id == cache_keyid) return !!(KEY_TRUSTED & cache_flags); authkeyuncached++; - bucket = &key_hash[KEYHASH(keyno)]; - for (sk = *bucket; sk != NULL; sk = sk->hlink) { - if (keyno == sk->keyid) - break; - } - if (NULL == sk || !(KEY_TRUSTED & sk->flags)) { + sk = auth_findkey(id); + if (sk == NULL || !(KEY_TRUSTED & sk->flags)) { authkeynotfound++; return FALSE; } @@ -553,38 +616,23 @@ ) { symkey * sk; - symkey ** bucket; - KeyAccT * kal; - KeyAccT * k; - if (keyno == cache_keyid) - kal = cache_keyacclist; - else { + /* That specific key was already used to authenticate the + * packet. Therefore, the key *must* exist... There's a chance + * that is not trusted, though. + */ + if (keyno == cache_keyid) { + return (KEY_TRUSTED & cache_flags) && + keyacc_contains(cache_keyacclist, sau, TRUE); + } else { authkeyuncached++; - bucket = &key_hash[KEYHASH(keyno)]; - for (sk = *bucket; sk != NULL; sk = sk->hlink) { - if (keyno == sk->keyid) - break; - } - if (NULL == sk || !(KEY_TRUSTED & sk->flags)) { - INSIST(!"authistrustedip: keyid not found/trusted!"); - return FALSE; - } - kal = sk->keyacclist; + sk = auth_findkey(keyno); + INSIST(NULL != sk); + return (KEY_TRUSTED & sk->flags) && + keyacc_contains(sk->keyacclist, sau, TRUE); } - - if (NULL == kal) - return TRUE; - - for (k = kal; k; k = k->next) { - if (SOCK_EQ(&k->addr, sau)) - return TRUE; - } - - return FALSE; } - /* Note: There are two locations below where 'strncpy()' is used. While * this function is a hazard by itself, it's essential that it is used * here. Bug 1243 involved that the secret was filled with NUL bytes @@ -601,55 +649,49 @@ keyid_t keyno, int keytype, const u_char *key, - size_t len, + size_t secretsize, KeyAccT *ka ) { symkey * sk; - symkey ** bucket; u_char * secret; - size_t secretsize; DEBUG_ENSURE(keytype <= USHRT_MAX); - DEBUG_ENSURE(len < 4 * 1024); + DEBUG_ENSURE(secretsize < 4 * 1024); /* * See if we already have the key. If so just stick in the * new value. */ - bucket = &key_hash[KEYHASH(keyno)]; - for (sk = *bucket; sk != NULL; sk = sk->hlink) { - if (keyno == sk->keyid) { + sk = auth_findkey(keyno); + if (sk != NULL && keyno == sk->keyid) { /* TALOS-CAN-0054: make sure we have a new buffer! */ - if (NULL != sk->secret) { - memset(sk->secret, 0, sk->secretsize); - free(sk->secret); - } - sk->secret = emalloc(len); - sk->type = (u_short)keytype; - secretsize = len; - sk->secretsize = (u_short)secretsize; + if (NULL != sk->secret) { + memset(sk->secret, 0, sk->secretsize); + free(sk->secret); + } + sk->secret = emalloc(secretsize + 1); + sk->type = (u_short)keytype; + sk->secretsize = secretsize; + /* make sure access lists don't leak here! */ + if (ka != sk->keyacclist) { + keyacc_all_free(sk->keyacclist); sk->keyacclist = ka; + } #ifndef DISABLE_BUG1243_FIX - memcpy(sk->secret, key, secretsize); + memcpy(sk->secret, key, secretsize); #else - /* >MUST< use 'strncpy()' here! See above! */ - strncpy((char *)sk->secret, (const char *)key, - secretsize); + /* >MUST< use 'strncpy()' here! See above! */ + strncpy((char *)sk->secret, (const char *)key, + secretsize); #endif - if (cache_keyid == keyno) { - cache_flags = 0; - cache_keyid = 0; - cache_keyacclist = NULL; - } - return; - } + authcache_flush_id(keyno); + return; } /* * Need to allocate new structure. Do it. */ - secretsize = len; - secret = emalloc(secretsize); + secret = emalloc(secretsize + 1); #ifndef DISABLE_BUG1243_FIX memcpy(secret, key, secretsize); #else @@ -656,8 +698,8 @@ /* >MUST< use 'strncpy()' here! See above! */ strncpy((char *)secret, (const char *)key, secretsize); #endif - allocsymkey(bucket, keyno, 0, (u_short)keytype, 0, - (u_short)secretsize, secret, ka); + allocsymkey(keyno, 0, (u_short)keytype, 0, + secretsize, secret, ka); #ifdef DEBUG if (debug >= 4) { size_t j; @@ -664,8 +706,9 @@ printf("auth_setkey: key %d type %d len %d ", (int)keyno, keytype, (int)secretsize); - for (j = 0; j < secretsize; j++) + for (j = 0; j < secretsize; j++) { printf("%02x", secret[j]); + } printf("\n"); } #endif @@ -697,10 +740,11 @@ free(sk->secret); sk->secret = NULL; /* TALOS-CAN-0054 */ } + sk->keyacclist = keyacc_all_free(sk->keyacclist); sk->secretsize = 0; sk->lifetime = 0; } else { - freesymkey(sk, &key_hash[KEYHASH(sk->keyid)]); + freesymkey(sk); } ITER_DLIST_END() } @@ -716,7 +760,7 @@ ITER_DLIST_BEGIN(key_listhead, sk, llink, symkey) if (sk->lifetime > 0 && current_time > sk->lifetime) { - freesymkey(sk, &key_hash[KEYHASH(sk->keyid)]); + freesymkey(sk); authkeyexpired++; } ITER_DLIST_END() --- contrib/ntp/libntp/authreadkeys.c.orig +++ contrib/ntp/libntp/authreadkeys.c @@ -101,7 +101,7 @@ ...) { va_list ap; - if (++(*pnerr) <= nerr_loglimit) { + if ((NULL == pnerr) || (++(*pnerr) <= nerr_loglimit)) { va_start(ap, fmt); mvsyslog(LOG_ERR, fmt, ap); va_end(ap); @@ -108,6 +108,26 @@ } } +static void +free_keydata( + KeyDataT *node + ) +{ + KeyAccT *kap; + + if (node) { + while (node->keyacclist) { + kap = node->keyacclist; + node->keyacclist = kap->next; + free(kap); + } + + /* purge secrets from memory before free()ing it */ + memset(node, 0, sizeof(*node) + node->seclen); + free(node); + } +} + /* * authreadkeys - (re)read keys from a file. */ @@ -156,7 +176,7 @@ * First is key number. See if it is okay. */ keyno = atoi(token); - if (keyno == 0) { + if (keyno < 1) { log_maybe(&nerr, "authreadkeys: cannot change key %s", token); @@ -180,6 +200,14 @@ keyno); continue; } + + /* We want to silently ignore keys where we do not + * support the requested digest type. OTOH, we want to + * make sure the file is well-formed. That means we + * have to process the line completely and have to + * finally throw away the result... This is a bit more + * work, but it also results in better error detection. + */ #ifdef OPENSSL /* * The key type is the NID used by the message digest @@ -189,30 +217,28 @@ */ keytype = keytype_from_text(token, NULL); if (keytype == 0) { - log_maybe(&nerr, + log_maybe(NULL, "authreadkeys: invalid type for key %d", keyno); - continue; - } - if (EVP_get_digestbynid(keytype) == NULL) { - log_maybe(&nerr, + } else if (EVP_get_digestbynid(keytype) == NULL) { + log_maybe(NULL, "authreadkeys: no algorithm for key %d", keyno); - continue; + keytype = 0; } #else /* !OPENSSL follows */ - /* * The key type is unused, but is required to be 'M' or * 'm' for compatibility. */ if (!(*token == 'M' || *token == 'm')) { - log_maybe(&nerr, + log_maybe(NULL, "authreadkeys: invalid type for key %d", keyno); - continue; + keytype = 0; + } else { + keytype = KEY_TYPE_MD5; } - keytype = KEY_TYPE_MD5; #endif /* !OPENSSL */ /* @@ -269,26 +295,22 @@ } token = nexttok(&line); -DPRINTF(0, ("authreadkeys: full access list <%s>\n", (token) ? token : "NULL")); + DPRINTF(0, ("authreadkeys: full access list <%s>\n", (token) ? token : "NULL")); if (token != NULL) { /* A comma-separated IP access list */ char *tp = token; while (tp) { char *i; - KeyAccT ka; + sockaddr_u addr; i = strchr(tp, (int)','); if (i) *i = '\0'; -DPRINTF(0, ("authreadkeys: access list: <%s>\n", tp)); + DPRINTF(0, ("authreadkeys: access list: <%s>\n", tp)); - if (is_ip_address(tp, AF_UNSPEC, &ka.addr)) { - KeyAccT *kap; - - kap = emalloc(sizeof(KeyAccT)); - memcpy(kap, &ka, sizeof ka); - kap->next = next->keyacclist; - next->keyacclist = kap; + if (is_ip_address(tp, AF_UNSPEC, &addr)) { + next->keyacclist = keyacc_new_push( + next->keyacclist, &addr); } else { log_maybe(&nerr, "authreadkeys: invalid IP address <%s> for key %d", @@ -303,21 +325,25 @@ } } + /* check if this has to be weeded out... */ + if (0 == keytype) { + free_keydata(next); + next = NULL; + continue; + } + INSIST(NULL != next); next->next = list; list = next; } fclose(fp); - if (nerr > nerr_maxlimit) { - msyslog(LOG_ERR, - "authreadkeys: rejecting file '%s' after %u errors (emergency break)", - file, nerr); - goto onerror; - } if (nerr > 0) { + const char * why = ""; + if (nerr > nerr_maxlimit) + why = " (emergency break)"; msyslog(LOG_ERR, - "authreadkeys: rejecting file '%s' after %u error(s)", - file, nerr); + "authreadkeys: rejecting file '%s' after %u error(s)%s", + file, nerr, why); goto onerror; } @@ -328,9 +354,8 @@ list = next->next; MD5auth_setkey(next->keyid, next->keytype, next->secbuf, next->seclen, next->keyacclist); - /* purge secrets from memory before free()ing it */ - memset(next, 0, sizeof(*next) + next->seclen); - free(next); + next->keyacclist = NULL; /* consumed by MD5auth_setkey */ + free_keydata(next); } return (1); @@ -338,17 +363,7 @@ /* Mop up temporary storage before bailing out. */ while (NULL != (next = list)) { list = next->next; - - while (next->keyacclist) { - KeyAccT *kap = next->keyacclist; - - next->keyacclist = kap->next; - free(kap); - } - - /* purge secrets from memory before free()ing it */ - memset(next, 0, sizeof(*next) + next->seclen); - free(next); + free_keydata(next); } return (0); } --- contrib/ntp/libntp/is_ip_address.c.orig +++ contrib/ntp/libntp/is_ip_address.c @@ -7,53 +7,13 @@ # include #endif -#if 0 -#include -#include -#ifdef HAVE_FNMATCH_H -# include -# if !defined(FNM_CASEFOLD) && defined(FNM_IGNORECASE) -# define FNM_CASEFOLD FNM_IGNORECASE -# endif -#endif -#ifdef HAVE_SYS_PARAM_H -# include -#endif -#ifdef HAVE_SYS_IOCTL_H -# include -#endif -#ifdef HAVE_SYS_SOCKIO_H /* UXPV: SIOC* #defines (Frank Vance ) */ -# include -#endif -#ifdef HAVE_SYS_UIO_H -# include -#endif -#endif - #include "ntp_assert.h" #include "ntp_stdlib.h" #include "safecast.h" -#if 0 -#include "ntp_machine.h" -#include "ntpd.h" -#include "ntp_io.h" -#include "iosignal.h" -#include "ntp_lists.h" -#include "ntp_refclock.h" -#include "ntp_worker.h" -#include "ntp_request.h" -#include "timevalops.h" -#include "timespecops.h" -#include "ntpd-opts.h" -#endif - /* Don't include ISC's version of IPv6 variables and structures */ #define ISC_IPV6_H 1 -#include -#include #include -#include #include --- contrib/ntp/libntp/ntp_intres.c.orig +++ contrib/ntp/libntp/ntp_intres.c @@ -201,8 +201,6 @@ /* === forward declarations === */ static u_int reserve_dnschild_ctx(void); static u_int get_dnschild_ctx(void); -static void alloc_dnsworker_context(u_int); -/* static void free_dnsworker_context(u_int); */ static dnsworker_ctx * get_worker_context(blocking_child *, u_int); static void scheduled_sleep(time_t, time_t, dnsworker_ctx *); @@ -949,18 +947,6 @@ } -static void -alloc_dnsworker_context( - u_int idx - ) -{ - const size_t worker_context_sz = sizeof(*dnsworker_contexts[0]); - - REQUIRE(NULL == dnsworker_contexts[idx]); - dnsworker_contexts[idx] = emalloc_zero(worker_context_sz); -} - - static dnsworker_ctx * get_worker_context( blocking_child * c, @@ -967,29 +953,35 @@ u_int idx ) { - static size_t ps = sizeof(dnsworker_contexts[0]); - u_int min_new_alloc; - u_int new_alloc; - size_t octets; - size_t new_octets; + u_int min_new_alloc; + u_int new_alloc; + size_t octets; + size_t new_octets; + dnsworker_ctx * retv; + worker_global_lock(TRUE); + if (dnsworker_contexts_alloc <= idx) { min_new_alloc = 1 + idx; /* round new_alloc up to nearest multiple of 4 */ new_alloc = (min_new_alloc + 4) & ~(4 - 1); - new_octets = new_alloc * ps; - octets = dnsworker_contexts_alloc * ps; + new_octets = new_alloc * sizeof(dnsworker_ctx*); + octets = dnsworker_contexts_alloc * sizeof(dnsworker_ctx*); dnsworker_contexts = erealloc_zero(dnsworker_contexts, new_octets, octets); dnsworker_contexts_alloc = new_alloc; + retv = emalloc_zero(sizeof(dnsworker_ctx)); + dnsworker_contexts[idx] = retv; + } else if (NULL == (retv = dnsworker_contexts[idx])) { + retv = emalloc_zero(sizeof(dnsworker_ctx)); + dnsworker_contexts[idx] = retv; } - - if (NULL == dnsworker_contexts[idx]) - alloc_dnsworker_context(idx); - ZERO(*dnsworker_contexts[idx]); - dnsworker_contexts[idx]->c = c; - - return dnsworker_contexts[idx]; + + worker_global_lock(FALSE); + + ZERO(*retv); + retv->c = c; + return retv; } --- contrib/ntp/libntp/ntp_worker.c.orig +++ contrib/ntp/libntp/ntp_worker.c @@ -267,7 +267,7 @@ void harvest_blocking_responses(void) { - int idx; + size_t idx; blocking_child* cp; u_int scseen, scdone; --- contrib/ntp/libntp/recvbuff.c.orig +++ contrib/ntp/libntp/recvbuff.c @@ -156,18 +156,15 @@ void freerecvbuf(recvbuf_t *rb) { - if (rb == NULL) { - msyslog(LOG_ERR, "freerecvbuff received NULL buffer"); - return; + if (rb) { + LOCK(); + rb->used--; + if (rb->used != 0) + msyslog(LOG_ERR, "******** freerecvbuff non-zero usage: %d *******", rb->used); + LINK_SLIST(free_recv_list, rb, link); + free_recvbufs++; + UNLOCK(); } - - LOCK(); - rb->used--; - if (rb->used != 0) - msyslog(LOG_ERR, "******** freerecvbuff non-zero usage: %d *******", rb->used); - LINK_SLIST(free_recv_list, rb, link); - free_recvbufs++; - UNLOCK(); } @@ -264,7 +261,7 @@ */ void purge_recv_buffers_for_fd( - SOCKET fd + int fd ) { recvbuf_t *rbufp; @@ -277,7 +274,12 @@ rbufp != NULL; rbufp = next) { next = rbufp->link; - if (rbufp->fd == fd) { +# ifdef HAVE_IO_COMPLETION_PORT + if (rbufp->dstadr == NULL && rbufp->fd == fd) +# else + if (rbufp->fd == fd) +# endif + { UNLINK_MID_FIFO(punlinked, full_recv_fifo, rbufp, link, recvbuf_t); INSIST(punlinked == rbufp); --- contrib/ntp/libntp/work_fork.c.orig +++ contrib/ntp/libntp/work_fork.c @@ -451,7 +451,7 @@ } } -#ifdef HAVE_DROPROOT +#if defined(HAVE_DROPROOT) && !defined(NEED_EARLY_FORK) /* defer the fork until after root is dropped */ if (droproot && !root_dropped) return; @@ -540,6 +540,11 @@ } +void worker_global_lock(int inOrOut) +{ + (void)inOrOut; +} + #else /* !WORK_FORK follows */ char work_fork_nonempty_compilation_unit; #endif --- contrib/ntp/libntp/work_thread.c.orig +++ contrib/ntp/libntp/work_thread.c @@ -88,8 +88,28 @@ static int queue_req_pointer(blocking_child *, blocking_pipe_header *); static void cleanup_after_child(blocking_child *); +static sema_type worker_mmutex; +static sem_ref worker_memlock; +/* -------------------------------------------------------------------- + * locking the global worker state table (and other global stuff) + */ void +worker_global_lock( + int inOrOut) +{ + if (worker_memlock) { + if (inOrOut) + wait_for_sem(worker_memlock, NULL); + else + tickle_sem(worker_memlock); + } +} + +/* -------------------------------------------------------------------- + * implementation isolation wrapper + */ +void exit_worker( int exitcode ) @@ -724,6 +744,9 @@ blocking_child *c ) { + if (NULL == worker_memlock) + worker_memlock = create_sema(&worker_mmutex, 1, 1); + c->accesslock = create_sema(&c->sem_table[0], 1, 1); c->workitems_pending = create_sema(&c->sem_table[1], 0, 0); c->wake_scheduled_sleep = create_sema(&c->sem_table[2], 0, 1); --- contrib/ntp/ntpd/invoke-ntp.conf.texi.orig +++ contrib/ntp/ntpd/invoke-ntp.conf.texi @@ -6,7 +6,7 @@ # # EDIT THIS FILE WITH CAUTION (invoke-ntp.conf.texi) # -# It has been AutoGen-ed January 20, 2016 at 04:17:59 AM by AutoGen 5.18.5 +# It has been AutoGen-ed April 26, 2016 at 08:28:27 PM by AutoGen 5.18.5 # From the definitions ntp.conf.def # and the template file agtexi-file.tpl @end ignore @@ -108,8 +108,14 @@ If the Basic Socket Interface Extensions for IPv6 (RFC-2553) is detected, support for the IPv6 address family is generated in addition to the default support of the IPv4 address family. -In a few cases, including the reslist billboard generated -by ntpdc, IPv6 addresses are automatically generated. +In a few cases, including the +@code{reslist} +billboard generated +by +@code{ntpq(1ntpqmdoc)} +or +@code{ntpdc(1ntpdcmdoc)}, +IPv6 addresses are automatically generated. IPv6 addresses can be identified by the presence of colons @quotedblleft{}:@quotedblright{} in the address field. @@ -129,9 +135,9 @@ equivalent classes for that address family. @table @asis @item @code{pool} @kbd{address} @code{[@code{burst}]} @code{[@code{iburst}]} @code{[@code{version} @kbd{version}]} @code{[@code{prefer}]} @code{[@code{minpoll} @kbd{minpoll}]} @code{[@code{maxpoll} @kbd{maxpoll}]} -@item @code{server} @kbd{address} @code{[@code{key} @kbd{key} @kbd{|} @code{autokey}]} @code{[@code{burst}]} @code{[@code{iburst}]} @code{[@code{version} @kbd{version}]} @code{[@code{prefer}]} @code{[@code{minpoll} @kbd{minpoll}]} @code{[@code{maxpoll} @kbd{maxpoll}]} -@item @code{peer} @kbd{address} @code{[@code{key} @kbd{key} @kbd{|} @code{autokey}]} @code{[@code{version} @kbd{version}]} @code{[@code{prefer}]} @code{[@code{minpoll} @kbd{minpoll}]} @code{[@code{maxpoll} @kbd{maxpoll}]} -@item @code{broadcast} @kbd{address} @code{[@code{key} @kbd{key} @kbd{|} @code{autokey}]} @code{[@code{version} @kbd{version}]} @code{[@code{prefer}]} @code{[@code{minpoll} @kbd{minpoll}]} @code{[@code{ttl} @kbd{ttl}]} +@item @code{server} @kbd{address} @code{[@code{key} @kbd{key} @kbd{|} @code{autokey}]} @code{[@code{burst}]} @code{[@code{iburst}]} @code{[@code{version} @kbd{version}]} @code{[@code{prefer}]} @code{[@code{minpoll} @kbd{minpoll}]} @code{[@code{maxpoll} @kbd{maxpoll}]} @code{[@code{true}]} +@item @code{peer} @kbd{address} @code{[@code{key} @kbd{key} @kbd{|} @code{autokey}]} @code{[@code{version} @kbd{version}]} @code{[@code{prefer}]} @code{[@code{minpoll} @kbd{minpoll}]} @code{[@code{maxpoll} @kbd{maxpoll}]} @code{[@code{true}]} @code{[@code{xleave}]} +@item @code{broadcast} @kbd{address} @code{[@code{key} @kbd{key} @kbd{|} @code{autokey}]} @code{[@code{version} @kbd{version}]} @code{[@code{prefer}]} @code{[@code{minpoll} @kbd{minpoll}]} @code{[@code{ttl} @kbd{ttl}]} @code{[@code{xleave}]} @item @code{manycastclient} @kbd{address} @code{[@code{key} @kbd{key} @kbd{|} @code{autokey}]} @code{[@code{version} @kbd{version}]} @code{[@code{prefer}]} @code{[@code{minpoll} @kbd{minpoll}]} @code{[@code{maxpoll} @kbd{maxpoll}]} @code{[@code{ttl} @kbd{ttl}]} @end table @@ -249,7 +255,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first and second packets -can be changed with the calldelay command to allow +can be changed with the +@code{calldelay} +command to allow additional time for a modem or ISDN call to complete. This is designed to improve timekeeping quality with the @@ -260,7 +268,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first two packets can be -changed with the calldelay command to allow +changed with the +@code{calldelay} +command to allow additional time for a modem or ISDN call to complete. This is designed to speed the initial synchronization acquisition with the @@ -293,6 +303,11 @@ @item @code{noselect} Marks the server as unused, except for display purposes. The server is discarded by the selection algroithm. +@item @code{preempt} +Says the association can be preempted. +@item @code{true} +Marks the server as a truechimer. +Use this option only for testing. @item @code{prefer} Marks the server as preferred. All other things being equal, @@ -305,6 +320,11 @@ provided in @file{/usr/share/doc/ntp}) for further information. +@item @code{true} +Forces the association to always survive the selection and clustering algorithms. +This option should almost certainly +@emph{only} +be used while testing an association. @item @code{ttl} @kbd{ttl} This option is used only with broadcast server and manycast client modes. @@ -323,6 +343,12 @@ packets. Versions 1-4 are the choices, with version 4 the default. +@item @code{xleave} +Valid in +@code{peer} +and +@code{broadcast} +modes only, this flag enables interleave mode. @end table @subsubsection Auxiliary Commands @table @asis @@ -469,7 +495,7 @@ commands and also by remote configuration commands sent by a @code{ntpdc(1ntpdcmdoc)} -program running in +program running on another machine. If this flag is enabled, which is the default case, new broadcast client and symmetric passive associations and @@ -649,7 +675,7 @@ all of which are bound together by the protocol specifically to deflect masquerade attacks. For this reason Autokey -includes the source and destinatino IP addresses in message digest +includes the source and destination IP addresses in message digest computations and so the same addresses must be available at both the server and client. For this reason operation @@ -836,8 +862,8 @@ @file{ntpkey_key_}@kbd{hostname} in the keys directory. @item @code{iffpar} @kbd{file} -Specifies the location of the optional IFF parameters file.This -overrides the link +Specifies the location of the optional IFF parameters file. +This overrides the link @file{ntpkey_iff_}@kbd{hostname} in the keys directory. @item @code{leap} @kbd{file} @@ -847,8 +873,7 @@ in the keys directory. @item @code{mvpar} @kbd{file} Specifies the location of the optional MV parameters file. -This -overrides the link +This overrides the link @file{ntpkey_mv_}@kbd{hostname} in the keys directory. @item @code{pw} @kbd{password} @@ -990,7 +1015,7 @@ Statistic files are managed using file generation sets and scripts in the @file{./scripts} -directory of this distribution. +directory of the source code distribution. Using these facilities and @sc{unix} @@ -1319,7 +1344,9 @@ the number of links of this file is one, it is renamed appending a dot, the letter @code{C}, -and the pid of the ntpd server process. +and the pid of the +@code{ntpd(1ntpdmdoc)} +server process. When the number of links is greater than one, the file is unlinked. This @@ -1363,7 +1390,9 @@ by a determined cracker. Clients can be denied service because they are explicitly -included in the restrict list created by the restrict command +included in the restrict list created by the +@code{restrict} +command or implicitly as the result of cryptographic or rate limit violations. Cryptographic violations include certificate @@ -1373,9 +1402,9 @@ Some violations cause denied service only for the offending packet, others cause denied service for a timed period and others cause the denied service for -an indefinate period. +an indefinite period. When a client or network is denied access -for an indefinate period, the only way at present to remove +for an indefinite period, the only way at present to remove the restrictions is by restarting the server. @subsubsection The Kiss-of-Death Packet Ordinarily, packets denied service are simply dropped with no @@ -1429,7 +1458,9 @@ and a kiss-o'-death packet returned if enabled. The default minimum average and minimum are 5 and 2, respectively. -The monitor subcommand specifies the probability of discard +The +@code{monitor} +subcommand specifies the probability of discard for packets that overflow the rate-control window. @item @code{restrict} @code{address} @code{[@code{mask} @kbd{mask}]} @code{[@kbd{flag} @kbd{...}]} The @@ -1485,7 +1516,9 @@ last one, the packet is dropped. @item @code{limited} Deny service if the packet spacing violates the lower limits specified -in the discard command. +in the +@code{discard} +command. A history of clients is kept using the monitoring capability of @code{ntpd(1ntpdmdoc)}. @@ -1545,7 +1578,9 @@ @item @code{notrap} Decline to provide mode 6 control message trap service to matching hosts. -The trap service is a subsystem of the ntpdq control message +The trap service is a subsystem of the +@code{ntpq(1ntpqmdoc)} +control message protocol which is intended for use by remote event logging programs. @item @code{notrust} Deny service unless the packet is cryptographically authenticated. @@ -1613,8 +1648,11 @@ as well and is highly recommended, especially for broadcast modes. A persistent manycast client association is configured -using the manycastclient command, which is similar to the -server command but with a multicast (IPv4 class +using the +@code{manycastclient} +command, which is similar to the +@code{server} +command but with a multicast (IPv4 class @code{D} or IPv6 prefix @code{FF}) @@ -1684,7 +1722,9 @@ @code{maxpolll} value specified in this command. Initially, the TTL is -set at the minimum hops specified by the ttl command. +set at the minimum hops specified by the +@code{ttl} +command. At each retransmission the TTL is increased until reaching the maximum hops specified by this command or a sufficient number client associations have been found. @@ -2293,7 +2333,8 @@ otherwise, should be avoided. @item @code{dscp} @kbd{value} This option specifies the Differentiated Services Control Point (DSCP) value, -a 6-bit code. The default value is 46, signifying Expedited Forwarding. +a 6-bit code. +The default value is 46, signifying Expedited Forwarding. @item @code{enable} @code{[@code{auth} | @code{bclient} | @code{calibrate} | @code{kernel} | @code{mode7} | @code{monitor} | @code{ntp} | @code{stats} | @code{unpeer_crypto_early} | @code{unpeer_crypto_nak_early} | @code{unpeer_digest_early}]} @item @code{disable} @code{[@code{auth} | @code{bclient} | @code{calibrate} | @code{kernel} | @code{mode7} | @code{monitor} | @code{ntp} | @code{stats} | @code{unpeer_crypto_early} | @code{unpeer_crypto_nak_early} | @code{unpeer_digest_early}]} Provides a way to enable or disable various server options. @@ -2502,7 +2543,8 @@ message class may also be followed by the @code{all} keyword to enable/disable all -messages of the respective message class.Thus, a minimal log configuration +messages of the respective message class. +Thus, a minimal log configuration could look like this: @verbatim logconfig =syncstatus +sysevents @@ -2526,7 +2568,9 @@ be used instead of the default system @code{syslog(3)} facility. -This is the same operation as the -l command line option. +This is the same operation as the +@code{-l} +command line option. @item @code{setvar} @kbd{variable} @code{[@code{default}]} This command adds an additional system variable. These @@ -2654,7 +2698,8 @@ function. Defaults to 50 4k pages (200 4k pages in OpenBSD). @item @code{filenum} @kbd{Nfiledescriptors} -Specifies the maximum number of file descriptors ntpd may have open at once. Defaults to the system default. +Specifies the maximum number of file descriptors ntpd may have open at once. +Defaults to the system default. @end table @item @code{trap} @kbd{host_address} @code{[@code{port} @kbd{port_number}]} @code{[@code{interface} @kbd{interface_address}]} This command configures a trap receiver at the given host --- contrib/ntp/ntpd/invoke-ntp.keys.texi.orig +++ contrib/ntp/ntpd/invoke-ntp.keys.texi @@ -6,7 +6,7 @@ # # EDIT THIS FILE WITH CAUTION (invoke-ntp.keys.texi) # -# It has been AutoGen-ed January 20, 2016 at 04:18:02 AM by AutoGen 5.18.5 +# It has been AutoGen-ed April 26, 2016 at 08:28:30 PM by AutoGen 5.18.5 # From the definitions ntp.keys.def # and the template file agtexi-file.tpl @end ignore --- contrib/ntp/ntpd/invoke-ntpd.texi.orig +++ contrib/ntp/ntpd/invoke-ntpd.texi @@ -6,7 +6,7 @@ # # EDIT THIS FILE WITH CAUTION (invoke-ntpd.texi) # -# It has been AutoGen-ed January 20, 2016 at 04:18:04 AM by AutoGen 5.18.5 +# It has been AutoGen-ed April 26, 2016 at 08:28:32 PM by AutoGen 5.18.5 # From the definitions ntpd-opts.def # and the template file agtexi-cmd.tpl @end ignore @@ -142,7 +142,7 @@ @exampleindent 0 @example -ntpd - NTP daemon program - Ver. 4.2.8p6 +ntpd - NTP daemon program - Ver. 4.2.8p7 Usage: ntpd [ - [] | --[@{=| @}] ]... \ [ ... ] Flg Arg Option-Name Description --- contrib/ntp/ntpd/ntp.conf.5man.orig +++ contrib/ntp/ntpd/ntp.conf.5man @@ -10,11 +10,11 @@ .ds B-Font B .ds I-Font I .ds R-Font R -.TH ntp.conf 5man "20 Jan 2016" "4.2.8p6" "File Formats" +.TH ntp.conf 5man "26 Apr 2016" "4.2.8p7" "File Formats" .\" -.\" EDIT THIS FILE WITH CAUTION (/tmp/.ag-gsaOxR/ag-XsaGwR) +.\" EDIT THIS FILE WITH CAUTION (/tmp/.ag-ana4jE/ag-QnaWiE) .\" -.\" It has been AutoGen-ed January 20, 2016 at 04:17:45 AM by AutoGen 5.18.5 +.\" It has been AutoGen-ed April 26, 2016 at 08:28:14 PM by AutoGen 5.18.5 .\" From the definitions ntp.conf.def .\" and the template file agman-cmd.tpl .SH NAME @@ -133,8 +133,14 @@ If the Basic Socket Interface Extensions for IPv6 (RFC-2553) is detected, support for the IPv6 address family is generated in addition to the default support of the IPv4 address family. -In a few cases, including the reslist billboard generated -by ntpdc, IPv6 addresses are automatically generated. +In a few cases, including the +\f\*[B-Font]reslist\f[] +billboard generated +by +\fCntpq\f[]\fR(1ntpqmdoc)\f[] +or +\fCntpdc\f[]\fR(1ntpdcmdoc)\f[], +IPv6 addresses are automatically generated. IPv6 addresses can be identified by the presence of colons \*[Lq]\&:\*[Rq] in the address field. @@ -157,11 +163,11 @@ .TP 7 .NOP \f\*[B-Font]pool\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]burst\f[]] [\f\*[B-Font]iburst\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] .TP 7 -.NOP \f\*[B-Font]server\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]burst\f[]] [\f\*[B-Font]iburst\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] +.NOP \f\*[B-Font]server\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]burst\f[]] [\f\*[B-Font]iburst\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] [\f\*[B-Font]true\f[]] .TP 7 -.NOP \f\*[B-Font]peer\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] +.NOP \f\*[B-Font]peer\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] [\f\*[B-Font]true\f[]] [\f\*[B-Font]xleave\f[]] .TP 7 -.NOP \f\*[B-Font]broadcast\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]ttl\f[] \f\*[I-Font]ttl\f[]] +.NOP \f\*[B-Font]broadcast\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]ttl\f[] \f\*[I-Font]ttl\f[]] [\f\*[B-Font]xleave\f[]] .TP 7 .NOP \f\*[B-Font]manycastclient\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] [\f\*[B-Font]ttl\f[] \f\*[I-Font]ttl\f[]] .PP @@ -289,7 +295,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first and second packets -can be changed with the calldelay command to allow +can be changed with the +\f\*[B-Font]calldelay\f[] +command to allow additional time for a modem or ISDN call to complete. This is designed to improve timekeeping quality with the @@ -301,7 +309,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first two packets can be -changed with the calldelay command to allow +changed with the +\f\*[B-Font]calldelay\f[] +command to allow additional time for a modem or ISDN call to complete. This is designed to speed the initial synchronization acquisition with the @@ -339,6 +349,13 @@ Marks the server as unused, except for display purposes. The server is discarded by the selection algroithm. .TP 7 +.NOP \f\*[B-Font]preempt\f[] +Says the association can be preempted. +.TP 7 +.NOP \f\*[B-Font]true\f[] +Marks the server as a truechimer. +Use this option only for testing. +.TP 7 .NOP \f\*[B-Font]prefer\f[] Marks the server as preferred. All other things being equal, @@ -352,6 +369,12 @@ \fI/usr/share/doc/ntp\f[]) for further information. .TP 7 +.NOP \f\*[B-Font]true\f[] +Forces the association to always survive the selection and clustering algorithms. +This option should almost certainly +\fIonly\f[] +be used while testing an association. +.TP 7 .NOP \f\*[B-Font]ttl\f[] \f\*[I-Font]ttl\f[] This option is used only with broadcast server and manycast client modes. @@ -371,6 +394,13 @@ packets. Versions 1-4 are the choices, with version 4 the default. +.TP 7 +.NOP \f\*[B-Font]xleave\f[] +Valid in +\f\*[B-Font]peer\f[] +and +\f\*[B-Font]broadcast\f[] +modes only, this flag enables interleave mode. .PP .SS Auxiliary Commands .TP 7 @@ -529,7 +559,7 @@ commands and also by remote configuration commands sent by a \fCntpdc\f[]\fR(1ntpdcmdoc)\f[] -program running in +program running on another machine. If this flag is enabled, which is the default case, new broadcast client and symmetric passive associations and @@ -735,7 +765,7 @@ all of which are bound together by the protocol specifically to deflect masquerade attacks. For this reason Autokey -includes the source and destinatino IP addresses in message digest +includes the source and destination IP addresses in message digest computations and so the same addresses must be available at both the server and client. For this reason operation @@ -942,8 +972,8 @@ in the keys directory. .TP 7 .NOP \f\*[B-Font]iffpar\f[] \f\*[I-Font]file\f[] -Specifies the location of the optional IFF parameters file.This -overrides the link +Specifies the location of the optional IFF parameters file. +This overrides the link \fIntpkey_iff_\f[]\f\*[I-Font]hostname\f[] in the keys directory. .TP 7 @@ -955,8 +985,7 @@ .TP 7 .NOP \f\*[B-Font]mvpar\f[] \f\*[I-Font]file\f[] Specifies the location of the optional MV parameters file. -This -overrides the link +This overrides the link \fIntpkey_mv_\f[]\f\*[I-Font]hostname\f[] in the keys directory. .TP 7 @@ -1118,7 +1147,7 @@ Statistic files are managed using file generation sets and scripts in the \fI./scripts\f[] -directory of this distribution. +directory of the source code distribution. Using these facilities and UNIX @@ -1511,7 +1540,9 @@ the number of links of this file is one, it is renamed appending a dot, the letter \f\*[B-Font]C\f[], -and the pid of the ntpd server process. +and the pid of the +\fCntpd\f[]\fR(1ntpdmdoc)\f[] +server process. When the number of links is greater than one, the file is unlinked. This @@ -1559,7 +1590,9 @@ .ne 2 Clients can be denied service because they are explicitly -included in the restrict list created by the restrict command +included in the restrict list created by the +\f\*[B-Font]restrict\f[] +command or implicitly as the result of cryptographic or rate limit violations. Cryptographic violations include certificate @@ -1569,9 +1602,9 @@ Some violations cause denied service only for the offending packet, others cause denied service for a timed period and others cause the denied service for -an indefinate period. +an indefinite period. When a client or network is denied access -for an indefinate period, the only way at present to remove +for an indefinite period, the only way at present to remove the restrictions is by restarting the server. .SS The Kiss-of-Death Packet Ordinarily, packets denied service are simply dropped with no @@ -1627,7 +1660,9 @@ and a kiss-o'-death packet returned if enabled. The default minimum average and minimum are 5 and 2, respectively. -The monitor subcommand specifies the probability of discard +The +\f\*[B-Font]monitor\f[] +subcommand specifies the probability of discard for packets that overflow the rate-control window. .TP 7 .NOP \f\*[B-Font]restrict\f[] \f\*[B-Font]address\f[] [\f\*[B-Font]mask\f[] \f\*[I-Font]mask\f[]] [\f\*[I-Font]flag\f[] \f\*[I-Font]...\f[]] @@ -1687,7 +1722,9 @@ .TP 7 .NOP \f\*[B-Font]limited\f[] Deny service if the packet spacing violates the lower limits specified -in the discard command. +in the +\f\*[B-Font]discard\f[] +command. A history of clients is kept using the monitoring capability of \fCntpd\f[]\fR(1ntpdmdoc)\f[]. @@ -1754,7 +1791,9 @@ .NOP \f\*[B-Font]notrap\f[] Decline to provide mode 6 control message trap service to matching hosts. -The trap service is a subsystem of the ntpdq control message +The trap service is a subsystem of the +\fCntpq\f[]\fR(1ntpqmdoc)\f[] +control message protocol which is intended for use by remote event logging programs. .TP 7 .NOP \f\*[B-Font]notrust\f[] @@ -1832,8 +1871,11 @@ .ne 2 A persistent manycast client association is configured -using the manycastclient command, which is similar to the -server command but with a multicast (IPv4 class +using the +\f\*[B-Font]manycastclient\f[] +command, which is similar to the +\f\*[B-Font]server\f[] +command but with a multicast (IPv4 class \f\*[B-Font]D\f[] or IPv6 prefix \f\*[B-Font]FF\f[]) @@ -1909,7 +1951,9 @@ \f\*[B-Font]maxpolll\f[] value specified in this command. Initially, the TTL is -set at the minimum hops specified by the ttl command. +set at the minimum hops specified by the +\f\*[B-Font]ttl\f[] +command. At each retransmission the TTL is increased until reaching the maximum hops specified by this command or a sufficient number client associations have been found. @@ -2571,7 +2615,8 @@ .TP 7 .NOP \f\*[B-Font]dscp\f[] \f\*[I-Font]value\f[] This option specifies the Differentiated Services Control Point (DSCP) value, -a 6-bit code. The default value is 46, signifying Expedited Forwarding. +a 6-bit code. +The default value is 46, signifying Expedited Forwarding. .TP 7 .NOP \f\*[B-Font]enable\f[] [\f\*[B-Font]auth\f[] | \f\*[B-Font]bclient\f[] | \f\*[B-Font]calibrate\f[] | \f\*[B-Font]kernel\f[] | \f\*[B-Font]mode7\f[] | \f\*[B-Font]monitor\f[] | \f\*[B-Font]ntp\f[] | \f\*[B-Font]stats\f[] | \f\*[B-Font]unpeer_crypto_early\f[] | \f\*[B-Font]unpeer_crypto_nak_early\f[] | \f\*[B-Font]unpeer_digest_early\f[]] .TP 7 @@ -2798,7 +2843,8 @@ message class may also be followed by the \f\*[B-Font]all\f[] keyword to enable/disable all -messages of the respective message class.Thus, a minimal log configuration +messages of the respective message class. +Thus, a minimal log configuration could look like this: .br .in +4 @@ -2833,7 +2879,9 @@ be used instead of the default system \fCsyslog\f[]\fR(3)\f[] facility. -This is the same operation as the \-l command line option. +This is the same operation as the +\f\*[B-Font]\-l\f[] +command line option. .TP 7 .NOP \f\*[B-Font]setvar\f[] \f\*[I-Font]variable\f[] [\f\*[B-Font]default\f[]] This command adds an additional system variable. @@ -2978,7 +3026,8 @@ Defaults to 50 4k pages (200 4k pages in OpenBSD). .TP 7 .NOP \f\*[B-Font]filenum\f[] \f\*[I-Font]Nfiledescriptors\f[] -Specifies the maximum number of file descriptors ntpd may have open at once. Defaults to the system default. +Specifies the maximum number of file descriptors ntpd may have open at once. +Defaults to the system default. .RE .TP 7 .NOP \f\*[B-Font]trap\f[] \f\*[I-Font]host_address\f[] [\f\*[B-Font]port\f[] \f\*[I-Font]port_number\f[]] [\f\*[B-Font]interface\f[] \f\*[I-Font]interface_address\f[]] --- contrib/ntp/ntpd/ntp.conf.5mdoc.orig +++ contrib/ntp/ntpd/ntp.conf.5mdoc @@ -1,9 +1,9 @@ -.Dd January 20 2016 +.Dd April 26 2016 .Dt NTP_CONF 5mdoc File Formats .Os .\" EDIT THIS FILE WITH CAUTION (ntp.mdoc) .\" -.\" It has been AutoGen-ed January 20, 2016 at 04:18:07 AM by AutoGen 5.18.5 +.\" It has been AutoGen-ed April 26, 2016 at 08:28:36 PM by AutoGen 5.18.5 .\" From the definitions ntp.conf.def .\" and the template file agmdoc-cmd.tpl .Sh NAME @@ -111,8 +111,14 @@ If the Basic Socket Interface Extensions for IPv6 (RFC\-2553) is detected, support for the IPv6 address family is generated in addition to the default support of the IPv4 address family. -In a few cases, including the reslist billboard generated -by ntpdc, IPv6 addresses are automatically generated. +In a few cases, including the +.Cm reslist +billboard generated +by +.Xr ntpq 1ntpqmdoc +or +.Xr ntpdc 1ntpdcmdoc , +IPv6 addresses are automatically generated. IPv6 addresses can be identified by the presence of colons .Dq \&: in the address field. @@ -147,6 +153,7 @@ .Op Cm prefer .Op Cm minpoll Ar minpoll .Op Cm maxpoll Ar maxpoll +.Op Cm true .Xc .It Xo Ic peer Ar address .Op Cm key Ar key \&| Cm autokey @@ -154,6 +161,8 @@ .Op Cm prefer .Op Cm minpoll Ar minpoll .Op Cm maxpoll Ar maxpoll +.Op Cm true +.Op Cm xleave .Xc .It Xo Ic broadcast Ar address .Op Cm key Ar key \&| Cm autokey @@ -161,6 +170,7 @@ .Op Cm prefer .Op Cm minpoll Ar minpoll .Op Cm ttl Ar ttl +.Op Cm xleave .Xc .It Xo Ic manycastclient Ar address .Op Cm key Ar key \&| Cm autokey @@ -286,7 +296,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first and second packets -can be changed with the calldelay command to allow +can be changed with the +.Ic calldelay +command to allow additional time for a modem or ISDN call to complete. This is designed to improve timekeeping quality with the @@ -297,7 +309,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first two packets can be -changed with the calldelay command to allow +changed with the +.Ic calldelay +command to allow additional time for a modem or ISDN call to complete. This is designed to speed the initial synchronization acquisition with the @@ -330,6 +344,11 @@ .It Cm noselect Marks the server as unused, except for display purposes. The server is discarded by the selection algroithm. +.It Cm preempt +Says the association can be preempted. +.It Cm true +Marks the server as a truechimer. +Use this option only for testing. .It Cm prefer Marks the server as preferred. All other things being equal, @@ -342,6 +361,11 @@ provided in .Pa /usr/share/doc/ntp ) for further information. +.It Cm true +Forces the association to always survive the selection and clustering algorithms. +This option should almost certainly +.Em only +be used while testing an association. .It Cm ttl Ar ttl This option is used only with broadcast server and manycast client modes. @@ -360,6 +384,12 @@ packets. Versions 1\-4 are the choices, with version 4 the default. +.It Cm xleave +Valid in +.Cm peer +and +.Cm broadcast +modes only, this flag enables interleave mode. .El .Ss Auxiliary Commands .Bl -tag -width indent @@ -505,7 +535,7 @@ commands and also by remote configuration commands sent by a .Xr ntpdc 1ntpdcmdoc -program running in +program running on another machine. If this flag is enabled, which is the default case, new broadcast client and symmetric passive associations and @@ -695,7 +725,7 @@ all of which are bound together by the protocol specifically to deflect masquerade attacks. For this reason Autokey -includes the source and destinatino IP addresses in message digest +includes the source and destination IP addresses in message digest computations and so the same addresses must be available at both the server and client. For this reason operation @@ -893,8 +923,8 @@ .Pa ntpkey_key_ Ns Ar hostname in the keys directory. .It Cm iffpar Ar file -Specifies the location of the optional IFF parameters file.This -overrides the link +Specifies the location of the optional IFF parameters file. +This overrides the link .Pa ntpkey_iff_ Ns Ar hostname in the keys directory. .It Cm leap Ar file @@ -904,8 +934,7 @@ in the keys directory. .It Cm mvpar Ar file Specifies the location of the optional MV parameters file. -This -overrides the link +This overrides the link .Pa ntpkey_mv_ Ns Ar hostname in the keys directory. .It Cm pw Ar password @@ -1046,7 +1075,7 @@ Statistic files are managed using file generation sets and scripts in the .Pa ./scripts -directory of this distribution. +directory of the source code distribution. Using these facilities and .Ux @@ -1380,7 +1409,9 @@ the number of links of this file is one, it is renamed appending a dot, the letter .Cm C , -and the pid of the ntpd server process. +and the pid of the +.Xr ntpd 1ntpdmdoc +server process. When the number of links is greater than one, the file is unlinked. This @@ -1423,7 +1454,9 @@ by a determined cracker. .Pp Clients can be denied service because they are explicitly -included in the restrict list created by the restrict command +included in the restrict list created by the +.Ic restrict +command or implicitly as the result of cryptographic or rate limit violations. Cryptographic violations include certificate @@ -1433,9 +1466,9 @@ Some violations cause denied service only for the offending packet, others cause denied service for a timed period and others cause the denied service for -an indefinate period. +an indefinite period. When a client or network is denied access -for an indefinate period, the only way at present to remove +for an indefinite period, the only way at present to remove the restrictions is by restarting the server. .Ss The Kiss\-of\-Death Packet Ordinarily, packets denied service are simply dropped with no @@ -1493,7 +1526,9 @@ and a kiss\-o'\-death packet returned if enabled. The default minimum average and minimum are 5 and 2, respectively. -The monitor subcommand specifies the probability of discard +The +.Ic monitor +subcommand specifies the probability of discard for packets that overflow the rate\-control window. .It Xo Ic restrict address .Op Cm mask Ar mask @@ -1552,7 +1587,9 @@ last one, the packet is dropped. .It Cm limited Deny service if the packet spacing violates the lower limits specified -in the discard command. +in the +.Ic discard +command. A history of clients is kept using the monitoring capability of .Xr ntpd 1ntpdmdoc . @@ -1612,7 +1649,9 @@ .It Cm notrap Decline to provide mode 6 control message trap service to matching hosts. -The trap service is a subsystem of the ntpdq control message +The trap service is a subsystem of the +.Xr ntpq 1ntpqmdoc +control message protocol which is intended for use by remote event logging programs. .It Cm notrust Deny service unless the packet is cryptographically authenticated. @@ -1679,8 +1718,11 @@ as well and is highly recommended, especially for broadcast modes. .Pp A persistent manycast client association is configured -using the manycastclient command, which is similar to the -server command but with a multicast (IPv4 class +using the +.Ic manycastclient +command, which is similar to the +.Ic server +command but with a multicast (IPv4 class .Cm D or IPv6 prefix .Cm FF ) @@ -1750,7 +1792,9 @@ .Cm maxpolll value specified in this command. Initially, the TTL is -set at the minimum hops specified by the ttl command. +set at the minimum hops specified by the +.Ic ttl +command. At each retransmission the TTL is increased until reaching the maximum hops specified by this command or a sufficient number client associations have been found. @@ -2388,7 +2432,8 @@ otherwise, should be avoided. .It Ic dscp Ar value This option specifies the Differentiated Services Control Point (DSCP) value, -a 6\-bit code. The default value is 46, signifying Expedited Forwarding. +a 6\-bit code. +The default value is 46, signifying Expedited Forwarding. .It Xo Ic enable .Oo .Cm auth | Cm bclient | @@ -2627,7 +2672,8 @@ message class may also be followed by the .Cm all keyword to enable/disable all -messages of the respective message class.Thus, a minimal log configuration +messages of the respective message class. +Thus, a minimal log configuration could look like this: .Bd -literal logconfig =syncstatus +sysevents @@ -2651,7 +2697,9 @@ be used instead of the default system .Xr syslog 3 facility. -This is the same operation as the \-l command line option. +This is the same operation as the +.Fl l +command line option. .It Ic setvar Ar variable Op Cm default This command adds an additional system variable. These @@ -2803,7 +2851,8 @@ function. Defaults to 50 4k pages (200 4k pages in OpenBSD). .It Cm filenum Ar Nfiledescriptors -Specifies the maximum number of file descriptors ntpd may have open at once. Defaults to the system default. +Specifies the maximum number of file descriptors ntpd may have open at once. +Defaults to the system default. .El .It Xo Ic trap Ar host_address .Op Cm port Ar port_number --- contrib/ntp/ntpd/ntp.conf.def.orig +++ contrib/ntp/ntpd/ntp.conf.def @@ -113,8 +113,14 @@ If the Basic Socket Interface Extensions for IPv6 (RFC-2553) is detected, support for the IPv6 address family is generated in addition to the default support of the IPv4 address family. -In a few cases, including the reslist billboard generated -by ntpdc, IPv6 addresses are automatically generated. +In a few cases, including the +.Cm reslist +billboard generated +by +.Xr ntpq 1ntpqmdoc +or +.Xr ntpdc 1ntpdcmdoc , +IPv6 addresses are automatically generated. IPv6 addresses can be identified by the presence of colons .Dq \&: in the address field. @@ -149,6 +155,7 @@ .Op Cm prefer .Op Cm minpoll Ar minpoll .Op Cm maxpoll Ar maxpoll +.Op Cm true .Xc .It Xo Ic peer Ar address .Op Cm key Ar key \&| Cm autokey @@ -156,6 +163,8 @@ .Op Cm prefer .Op Cm minpoll Ar minpoll .Op Cm maxpoll Ar maxpoll +.Op Cm true +.Op Cm xleave .Xc .It Xo Ic broadcast Ar address .Op Cm key Ar key \&| Cm autokey @@ -163,6 +172,7 @@ .Op Cm prefer .Op Cm minpoll Ar minpoll .Op Cm ttl Ar ttl +.Op Cm xleave .Xc .It Xo Ic manycastclient Ar address .Op Cm key Ar key \&| Cm autokey @@ -288,7 +298,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first and second packets -can be changed with the calldelay command to allow +can be changed with the +.Ic calldelay +command to allow additional time for a modem or ISDN call to complete. This is designed to improve timekeeping quality with the @@ -299,7 +311,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first two packets can be -changed with the calldelay command to allow +changed with the +.Ic calldelay +command to allow additional time for a modem or ISDN call to complete. This is designed to speed the initial synchronization acquisition with the @@ -332,6 +346,11 @@ .It Cm noselect Marks the server as unused, except for display purposes. The server is discarded by the selection algroithm. +.It Cm preempt +Says the association can be preempted. +.It Cm true +Marks the server as a truechimer. +Use this option only for testing. .It Cm prefer Marks the server as preferred. All other things being equal, @@ -344,6 +363,11 @@ provided in .Pa /usr/share/doc/ntp ) for further information. +.It Cm true +Forces the association to always survive the selection and clustering algorithms. +This option should almost certainly +.Em only +be used while testing an association. .It Cm ttl Ar ttl This option is used only with broadcast server and manycast client modes. @@ -362,6 +386,12 @@ packets. Versions 1-4 are the choices, with version 4 the default. +.It Cm xleave +Valid in +.Cm peer +and +.Cm broadcast +modes only, this flag enables interleave mode. .El .Ss Auxiliary Commands .Bl -tag -width indent @@ -507,7 +537,7 @@ commands and also by remote configuration commands sent by a .Xr ntpdc 1ntpdcmdoc -program running in +program running on another machine. If this flag is enabled, which is the default case, new broadcast client and symmetric passive associations and @@ -697,7 +727,7 @@ all of which are bound together by the protocol specifically to deflect masquerade attacks. For this reason Autokey -includes the source and destinatino IP addresses in message digest +includes the source and destination IP addresses in message digest computations and so the same addresses must be available at both the server and client. For this reason operation @@ -895,8 +925,8 @@ .Pa ntpkey_key_ Ns Ar hostname in the keys directory. .It Cm iffpar Ar file -Specifies the location of the optional IFF parameters file.This -overrides the link +Specifies the location of the optional IFF parameters file. +This overrides the link .Pa ntpkey_iff_ Ns Ar hostname in the keys directory. .It Cm leap Ar file @@ -906,8 +936,7 @@ in the keys directory. .It Cm mvpar Ar file Specifies the location of the optional MV parameters file. -This -overrides the link +This overrides the link .Pa ntpkey_mv_ Ns Ar hostname in the keys directory. .It Cm pw Ar password @@ -1048,7 +1077,7 @@ Statistic files are managed using file generation sets and scripts in the .Pa ./scripts -directory of this distribution. +directory of the source code distribution. Using these facilities and .Ux @@ -1382,7 +1411,9 @@ the number of links of this file is one, it is renamed appending a dot, the letter .Cm C , -and the pid of the ntpd server process. +and the pid of the +.Xr ntpd 1ntpdmdoc +server process. When the number of links is greater than one, the file is unlinked. This @@ -1425,7 +1456,9 @@ by a determined cracker. .Pp Clients can be denied service because they are explicitly -included in the restrict list created by the restrict command +included in the restrict list created by the +.Ic restrict +command or implicitly as the result of cryptographic or rate limit violations. Cryptographic violations include certificate @@ -1435,9 +1468,9 @@ Some violations cause denied service only for the offending packet, others cause denied service for a timed period and others cause the denied service for -an indefinate period. +an indefinite period. When a client or network is denied access -for an indefinate period, the only way at present to remove +for an indefinite period, the only way at present to remove the restrictions is by restarting the server. .Ss The Kiss-of-Death Packet Ordinarily, packets denied service are simply dropped with no @@ -1495,7 +1528,9 @@ and a kiss-o'-death packet returned if enabled. The default minimum average and minimum are 5 and 2, respectively. -The monitor subcommand specifies the probability of discard +The +.Ic monitor +subcommand specifies the probability of discard for packets that overflow the rate-control window. .It Xo Ic restrict address .Op Cm mask Ar mask @@ -1554,7 +1589,9 @@ last one, the packet is dropped. .It Cm limited Deny service if the packet spacing violates the lower limits specified -in the discard command. +in the +.Ic discard +command. A history of clients is kept using the monitoring capability of .Xr ntpd 1ntpdmdoc . @@ -1614,7 +1651,9 @@ .It Cm notrap Decline to provide mode 6 control message trap service to matching hosts. -The trap service is a subsystem of the ntpdq control message +The trap service is a subsystem of the +.Xr ntpq 1ntpqmdoc +control message protocol which is intended for use by remote event logging programs. .It Cm notrust Deny service unless the packet is cryptographically authenticated. @@ -1681,8 +1720,11 @@ as well and is highly recommended, especially for broadcast modes. .Pp A persistent manycast client association is configured -using the manycastclient command, which is similar to the -server command but with a multicast (IPv4 class +using the +.Ic manycastclient +command, which is similar to the +.Ic server +command but with a multicast (IPv4 class .Cm D or IPv6 prefix .Cm FF ) @@ -1752,7 +1794,9 @@ .Cm maxpolll value specified in this command. Initially, the TTL is -set at the minimum hops specified by the ttl command. +set at the minimum hops specified by the +.Ic ttl +command. At each retransmission the TTL is increased until reaching the maximum hops specified by this command or a sufficient number client associations have been found. @@ -2390,7 +2434,8 @@ otherwise, should be avoided. .It Ic dscp Ar value This option specifies the Differentiated Services Control Point (DSCP) value, -a 6-bit code. The default value is 46, signifying Expedited Forwarding. +a 6-bit code. +The default value is 46, signifying Expedited Forwarding. .It Xo Ic enable .Oo .Cm auth | Cm bclient | @@ -2629,7 +2674,8 @@ message class may also be followed by the .Cm all keyword to enable/disable all -messages of the respective message class.Thus, a minimal log configuration +messages of the respective message class. +Thus, a minimal log configuration could look like this: .Bd -literal logconfig =syncstatus +sysevents @@ -2653,7 +2699,9 @@ be used instead of the default system .Xr syslog 3 facility. -This is the same operation as the -l command line option. +This is the same operation as the +.Fl l +command line option. .It Ic setvar Ar variable Op Cm default This command adds an additional system variable. These @@ -2805,7 +2853,8 @@ function. Defaults to 50 4k pages (200 4k pages in OpenBSD). .It Cm filenum Ar Nfiledescriptors -Specifies the maximum number of file descriptors ntpd may have open at once. Defaults to the system default. +Specifies the maximum number of file descriptors ntpd may have open at once. +Defaults to the system default. .El .It Xo Ic trap Ar host_address .Op Cm port Ar port_number --- contrib/ntp/ntpd/ntp.conf.html.orig +++ contrib/ntp/ntpd/ntp.conf.html @@ -33,7 +33,7 @@

This document describes the configuration file for the NTP Project's ntpd program. -

This document applies to version 4.2.8p6 of ntp.conf. +

This document applies to version 4.2.8p7 of ntp.conf.

Short Contents

@@ -296,7 +296,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first and second packets -can be changed with the calldelay command to allow +can be changed with the +calldelay +command to allow additional time for a modem or ISDN call to complete. This is designed to improve timekeeping quality with the @@ -306,7 +308,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first two packets can be -changed with the calldelay command to allow +changed with the +calldelay +command to allow additional time for a modem or ISDN call to complete. This is designed to speed the initial synchronization acquisition with the @@ -335,6 +339,8 @@ option to a lower limit of 4 (16 s).
noselect
Marks the server as unused, except for display purposes. The server is discarded by the selection algroithm. +
preempt
Says the association can be preempted. +
true
Marks the server as a truechimer.
prefer
Marks the server as preferred. All other things being equal, this host will be chosen for synchronization among a set of @@ -362,6 +368,11 @@ packets. Versions 1-4 are the choices, with version 4 the default. +
xleave
Valid in +peer +and +broadcast +modes only, this flag enables interleave mode.
Auxiliary Commands
@@ -1369,7 +1380,9 @@ by a determined cracker.

Clients can be denied service because they are explicitly -included in the restrict list created by the restrict command +included in the restrict list created by the +restrict +command or implicitly as the result of cryptographic or rate limit violations. Cryptographic violations include certificate @@ -1438,7 +1451,9 @@ and a kiss-o'-death packet returned if enabled. The default minimum average and minimum are 5 and 2, respectively. -The monitor subcommand specifies the probability of discard +The +monitor +subcommand specifies the probability of discard for packets that overflow the rate-control window.

restrict address [mask mask] [flag ...]
The address @@ -1490,7 +1505,9 @@ If another KoD packet occurs within one second after the last one, the packet is dropped.
limited
Deny service if the packet spacing violates the lower limits specified -in the discard command. +in the +discard +command. A history of clients is kept using the monitoring capability of ntpd(1ntpdmdoc). @@ -1615,8 +1632,11 @@ as well and is highly recommended, especially for broadcast modes.

A persistent manycast client association is configured -using the manycastclient command, which is similar to the -server command but with a multicast (IPv4 class +using the +manycastclient +command, which is similar to the +server +command but with a multicast (IPv4 class D or IPv6 prefix FF) @@ -1686,7 +1706,9 @@ maxpolll value specified in this command. Initially, the TTL is -set at the minimum hops specified by the ttl command. +set at the minimum hops specified by the +ttl +command. At each retransmission the TTL is increased until reaching the maximum hops specified by this command or a sufficient number client associations have been found. @@ -2503,7 +2525,9 @@ be used instead of the default system syslog(3) facility. -This is the same operation as the -l command line option. +This is the same operation as the +-l +command line option.

setvar variable [default]
This command adds an additional system variable. These variables can be used to distribute additional information such as --- contrib/ntp/ntpd/ntp.conf.man.in.orig +++ contrib/ntp/ntpd/ntp.conf.man.in @@ -10,11 +10,11 @@ .ds B-Font B .ds I-Font I .ds R-Font R -.TH ntp.conf 5 "20 Jan 2016" "4.2.8p6" "File Formats" +.TH ntp.conf 5 "26 Apr 2016" "4.2.8p7" "File Formats" .\" -.\" EDIT THIS FILE WITH CAUTION (/tmp/.ag-gsaOxR/ag-XsaGwR) +.\" EDIT THIS FILE WITH CAUTION (/tmp/.ag-ana4jE/ag-QnaWiE) .\" -.\" It has been AutoGen-ed January 20, 2016 at 04:17:45 AM by AutoGen 5.18.5 +.\" It has been AutoGen-ed April 26, 2016 at 08:28:14 PM by AutoGen 5.18.5 .\" From the definitions ntp.conf.def .\" and the template file agman-cmd.tpl .SH NAME @@ -133,8 +133,14 @@ If the Basic Socket Interface Extensions for IPv6 (RFC-2553) is detected, support for the IPv6 address family is generated in addition to the default support of the IPv4 address family. -In a few cases, including the reslist billboard generated -by ntpdc, IPv6 addresses are automatically generated. +In a few cases, including the +\f\*[B-Font]reslist\f[] +billboard generated +by +\fCntpq\f[]\fR(@NTPQ_MS@)\f[] +or +\fCntpdc\f[]\fR(@NTPDC_MS@)\f[], +IPv6 addresses are automatically generated. IPv6 addresses can be identified by the presence of colons \*[Lq]\&:\*[Rq] in the address field. @@ -157,11 +163,11 @@ .TP 7 .NOP \f\*[B-Font]pool\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]burst\f[]] [\f\*[B-Font]iburst\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] .TP 7 -.NOP \f\*[B-Font]server\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]burst\f[]] [\f\*[B-Font]iburst\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] +.NOP \f\*[B-Font]server\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]burst\f[]] [\f\*[B-Font]iburst\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] [\f\*[B-Font]true\f[]] .TP 7 -.NOP \f\*[B-Font]peer\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] +.NOP \f\*[B-Font]peer\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] [\f\*[B-Font]true\f[]] [\f\*[B-Font]xleave\f[]] .TP 7 -.NOP \f\*[B-Font]broadcast\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]ttl\f[] \f\*[I-Font]ttl\f[]] +.NOP \f\*[B-Font]broadcast\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]ttl\f[] \f\*[I-Font]ttl\f[]] [\f\*[B-Font]xleave\f[]] .TP 7 .NOP \f\*[B-Font]manycastclient\f[] \f\*[I-Font]address\f[] [\f\*[B-Font]key\f[] \f\*[I-Font]key\f[] \f\*[I-Font]\&|\f[] \f\*[B-Font]autokey\f[]] [\f\*[B-Font]version\f[] \f\*[I-Font]version\f[]] [\f\*[B-Font]prefer\f[]] [\f\*[B-Font]minpoll\f[] \f\*[I-Font]minpoll\f[]] [\f\*[B-Font]maxpoll\f[] \f\*[I-Font]maxpoll\f[]] [\f\*[B-Font]ttl\f[] \f\*[I-Font]ttl\f[]] .PP @@ -289,7 +295,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first and second packets -can be changed with the calldelay command to allow +can be changed with the +\f\*[B-Font]calldelay\f[] +command to allow additional time for a modem or ISDN call to complete. This is designed to improve timekeeping quality with the @@ -301,7 +309,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first two packets can be -changed with the calldelay command to allow +changed with the +\f\*[B-Font]calldelay\f[] +command to allow additional time for a modem or ISDN call to complete. This is designed to speed the initial synchronization acquisition with the @@ -339,6 +349,13 @@ Marks the server as unused, except for display purposes. The server is discarded by the selection algroithm. .TP 7 +.NOP \f\*[B-Font]preempt\f[] +Says the association can be preempted. +.TP 7 +.NOP \f\*[B-Font]true\f[] +Marks the server as a truechimer. +Use this option only for testing. +.TP 7 .NOP \f\*[B-Font]prefer\f[] Marks the server as preferred. All other things being equal, @@ -352,6 +369,12 @@ \fI/usr/share/doc/ntp\f[]) for further information. .TP 7 +.NOP \f\*[B-Font]true\f[] +Forces the association to always survive the selection and clustering algorithms. +This option should almost certainly +\fIonly\f[] +be used while testing an association. +.TP 7 .NOP \f\*[B-Font]ttl\f[] \f\*[I-Font]ttl\f[] This option is used only with broadcast server and manycast client modes. @@ -371,6 +394,13 @@ packets. Versions 1-4 are the choices, with version 4 the default. +.TP 7 +.NOP \f\*[B-Font]xleave\f[] +Valid in +\f\*[B-Font]peer\f[] +and +\f\*[B-Font]broadcast\f[] +modes only, this flag enables interleave mode. .PP .SS Auxiliary Commands .TP 7 @@ -529,7 +559,7 @@ commands and also by remote configuration commands sent by a \fCntpdc\f[]\fR(@NTPDC_MS@)\f[] -program running in +program running on another machine. If this flag is enabled, which is the default case, new broadcast client and symmetric passive associations and @@ -735,7 +765,7 @@ all of which are bound together by the protocol specifically to deflect masquerade attacks. For this reason Autokey -includes the source and destinatino IP addresses in message digest +includes the source and destination IP addresses in message digest computations and so the same addresses must be available at both the server and client. For this reason operation @@ -942,8 +972,8 @@ in the keys directory. .TP 7 .NOP \f\*[B-Font]iffpar\f[] \f\*[I-Font]file\f[] -Specifies the location of the optional IFF parameters file.This -overrides the link +Specifies the location of the optional IFF parameters file. +This overrides the link \fIntpkey_iff_\f[]\f\*[I-Font]hostname\f[] in the keys directory. .TP 7 @@ -955,8 +985,7 @@ .TP 7 .NOP \f\*[B-Font]mvpar\f[] \f\*[I-Font]file\f[] Specifies the location of the optional MV parameters file. -This -overrides the link +This overrides the link \fIntpkey_mv_\f[]\f\*[I-Font]hostname\f[] in the keys directory. .TP 7 @@ -1118,7 +1147,7 @@ Statistic files are managed using file generation sets and scripts in the \fI./scripts\f[] -directory of this distribution. +directory of the source code distribution. Using these facilities and UNIX @@ -1511,7 +1540,9 @@ the number of links of this file is one, it is renamed appending a dot, the letter \f\*[B-Font]C\f[], -and the pid of the ntpd server process. +and the pid of the +\fCntpd\f[]\fR(@NTPD_MS@)\f[] +server process. When the number of links is greater than one, the file is unlinked. This @@ -1559,7 +1590,9 @@ .ne 2 Clients can be denied service because they are explicitly -included in the restrict list created by the restrict command +included in the restrict list created by the +\f\*[B-Font]restrict\f[] +command or implicitly as the result of cryptographic or rate limit violations. Cryptographic violations include certificate @@ -1569,9 +1602,9 @@ Some violations cause denied service only for the offending packet, others cause denied service for a timed period and others cause the denied service for -an indefinate period. +an indefinite period. When a client or network is denied access -for an indefinate period, the only way at present to remove +for an indefinite period, the only way at present to remove the restrictions is by restarting the server. .SS The Kiss-of-Death Packet Ordinarily, packets denied service are simply dropped with no @@ -1627,7 +1660,9 @@ and a kiss-o'-death packet returned if enabled. The default minimum average and minimum are 5 and 2, respectively. -The monitor subcommand specifies the probability of discard +The +\f\*[B-Font]monitor\f[] +subcommand specifies the probability of discard for packets that overflow the rate-control window. .TP 7 .NOP \f\*[B-Font]restrict\f[] \f\*[B-Font]address\f[] [\f\*[B-Font]mask\f[] \f\*[I-Font]mask\f[]] [\f\*[I-Font]flag\f[] \f\*[I-Font]...\f[]] @@ -1687,7 +1722,9 @@ .TP 7 .NOP \f\*[B-Font]limited\f[] Deny service if the packet spacing violates the lower limits specified -in the discard command. +in the +\f\*[B-Font]discard\f[] +command. A history of clients is kept using the monitoring capability of \fCntpd\f[]\fR(@NTPD_MS@)\f[]. @@ -1754,7 +1791,9 @@ .NOP \f\*[B-Font]notrap\f[] Decline to provide mode 6 control message trap service to matching hosts. -The trap service is a subsystem of the ntpdq control message +The trap service is a subsystem of the +\fCntpq\f[]\fR(@NTPQ_MS@)\f[] +control message protocol which is intended for use by remote event logging programs. .TP 7 .NOP \f\*[B-Font]notrust\f[] @@ -1832,8 +1871,11 @@ .ne 2 A persistent manycast client association is configured -using the manycastclient command, which is similar to the -server command but with a multicast (IPv4 class +using the +\f\*[B-Font]manycastclient\f[] +command, which is similar to the +\f\*[B-Font]server\f[] +command but with a multicast (IPv4 class \f\*[B-Font]D\f[] or IPv6 prefix \f\*[B-Font]FF\f[]) @@ -1909,7 +1951,9 @@ \f\*[B-Font]maxpolll\f[] value specified in this command. Initially, the TTL is -set at the minimum hops specified by the ttl command. +set at the minimum hops specified by the +\f\*[B-Font]ttl\f[] +command. At each retransmission the TTL is increased until reaching the maximum hops specified by this command or a sufficient number client associations have been found. @@ -2571,7 +2615,8 @@ .TP 7 .NOP \f\*[B-Font]dscp\f[] \f\*[I-Font]value\f[] This option specifies the Differentiated Services Control Point (DSCP) value, -a 6-bit code. The default value is 46, signifying Expedited Forwarding. +a 6-bit code. +The default value is 46, signifying Expedited Forwarding. .TP 7 .NOP \f\*[B-Font]enable\f[] [\f\*[B-Font]auth\f[] | \f\*[B-Font]bclient\f[] | \f\*[B-Font]calibrate\f[] | \f\*[B-Font]kernel\f[] | \f\*[B-Font]mode7\f[] | \f\*[B-Font]monitor\f[] | \f\*[B-Font]ntp\f[] | \f\*[B-Font]stats\f[] | \f\*[B-Font]unpeer_crypto_early\f[] | \f\*[B-Font]unpeer_crypto_nak_early\f[] | \f\*[B-Font]unpeer_digest_early\f[]] .TP 7 @@ -2798,7 +2843,8 @@ message class may also be followed by the \f\*[B-Font]all\f[] keyword to enable/disable all -messages of the respective message class.Thus, a minimal log configuration +messages of the respective message class. +Thus, a minimal log configuration could look like this: .br .in +4 @@ -2833,7 +2879,9 @@ be used instead of the default system \fCsyslog\f[]\fR(3)\f[] facility. -This is the same operation as the \-l command line option. +This is the same operation as the +\f\*[B-Font]\-l\f[] +command line option. .TP 7 .NOP \f\*[B-Font]setvar\f[] \f\*[I-Font]variable\f[] [\f\*[B-Font]default\f[]] This command adds an additional system variable. @@ -2978,7 +3026,8 @@ Defaults to 50 4k pages (200 4k pages in OpenBSD). .TP 7 .NOP \f\*[B-Font]filenum\f[] \f\*[I-Font]Nfiledescriptors\f[] -Specifies the maximum number of file descriptors ntpd may have open at once. Defaults to the system default. +Specifies the maximum number of file descriptors ntpd may have open at once. +Defaults to the system default. .RE .TP 7 .NOP \f\*[B-Font]trap\f[] \f\*[I-Font]host_address\f[] [\f\*[B-Font]port\f[] \f\*[I-Font]port_number\f[]] [\f\*[B-Font]interface\f[] \f\*[I-Font]interface_address\f[]] --- contrib/ntp/ntpd/ntp.conf.mdoc.in.orig +++ contrib/ntp/ntpd/ntp.conf.mdoc.in @@ -1,9 +1,9 @@ -.Dd January 20 2016 +.Dd April 26 2016 .Dt NTP_CONF 5 File Formats .Os .\" EDIT THIS FILE WITH CAUTION (ntp.mdoc) .\" -.\" It has been AutoGen-ed January 20, 2016 at 04:18:07 AM by AutoGen 5.18.5 +.\" It has been AutoGen-ed April 26, 2016 at 08:28:36 PM by AutoGen 5.18.5 .\" From the definitions ntp.conf.def .\" and the template file agmdoc-cmd.tpl .Sh NAME @@ -111,8 +111,14 @@ If the Basic Socket Interface Extensions for IPv6 (RFC\-2553) is detected, support for the IPv6 address family is generated in addition to the default support of the IPv4 address family. -In a few cases, including the reslist billboard generated -by ntpdc, IPv6 addresses are automatically generated. +In a few cases, including the +.Cm reslist +billboard generated +by +.Xr ntpq @NTPQ_MS@ +or +.Xr ntpdc @NTPDC_MS@ , +IPv6 addresses are automatically generated. IPv6 addresses can be identified by the presence of colons .Dq \&: in the address field. @@ -147,6 +153,7 @@ .Op Cm prefer .Op Cm minpoll Ar minpoll .Op Cm maxpoll Ar maxpoll +.Op Cm true .Xc .It Xo Ic peer Ar address .Op Cm key Ar key \&| Cm autokey @@ -154,6 +161,8 @@ .Op Cm prefer .Op Cm minpoll Ar minpoll .Op Cm maxpoll Ar maxpoll +.Op Cm true +.Op Cm xleave .Xc .It Xo Ic broadcast Ar address .Op Cm key Ar key \&| Cm autokey @@ -161,6 +170,7 @@ .Op Cm prefer .Op Cm minpoll Ar minpoll .Op Cm ttl Ar ttl +.Op Cm xleave .Xc .It Xo Ic manycastclient Ar address .Op Cm key Ar key \&| Cm autokey @@ -286,7 +296,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first and second packets -can be changed with the calldelay command to allow +can be changed with the +.Ic calldelay +command to allow additional time for a modem or ISDN call to complete. This is designed to improve timekeeping quality with the @@ -297,7 +309,9 @@ instead of the usual one. The packet spacing is normally 2 s; however, the spacing between the first two packets can be -changed with the calldelay command to allow +changed with the +.Ic calldelay +command to allow additional time for a modem or ISDN call to complete. This is designed to speed the initial synchronization acquisition with the @@ -330,6 +344,11 @@ .It Cm noselect Marks the server as unused, except for display purposes. The server is discarded by the selection algroithm. +.It Cm preempt +Says the association can be preempted. +.It Cm true +Marks the server as a truechimer. +Use this option only for testing. .It Cm prefer Marks the server as preferred. All other things being equal, @@ -342,6 +361,11 @@ provided in .Pa /usr/share/doc/ntp ) for further information. +.It Cm true +Forces the association to always survive the selection and clustering algorithms. +This option should almost certainly +.Em only +be used while testing an association. .It Cm ttl Ar ttl This option is used only with broadcast server and manycast client modes. @@ -360,6 +384,12 @@ packets. Versions 1\-4 are the choices, with version 4 the default. +.It Cm xleave +Valid in +.Cm peer +and +.Cm broadcast +modes only, this flag enables interleave mode. .El .Ss Auxiliary Commands .Bl -tag -width indent @@ -505,7 +535,7 @@ commands and also by remote configuration commands sent by a .Xr ntpdc @NTPDC_MS@ -program running in +program running on another machine. If this flag is enabled, which is the default case, new broadcast client and symmetric passive associations and @@ -695,7 +725,7 @@ all of which are bound together by the protocol specifically to deflect masquerade attacks. For this reason Autokey -includes the source and destinatino IP addresses in message digest +includes the source and destination IP addresses in message digest computations and so the same addresses must be available at both the server and client. For this reason operation @@ -893,8 +923,8 @@ .Pa ntpkey_key_ Ns Ar hostname in the keys directory. .It Cm iffpar Ar file -Specifies the location of the optional IFF parameters file.This -overrides the link +Specifies the location of the optional IFF parameters file. +This overrides the link .Pa ntpkey_iff_ Ns Ar hostname in the keys directory. .It Cm leap Ar file @@ -904,8 +934,7 @@ in the keys directory. .It Cm mvpar Ar file Specifies the location of the optional MV parameters file. -This -overrides the link +This overrides the link .Pa ntpkey_mv_ Ns Ar hostname in the keys directory. .It Cm pw Ar password @@ -1046,7 +1075,7 @@ Statistic files are managed using file generation sets and scripts in the .Pa ./scripts -directory of this distribution. +directory of the source code distribution. Using these facilities and .Ux @@ -1380,7 +1409,9 @@ the number of links of this file is one, it is renamed appending a dot, the letter .Cm C , -and the pid of the ntpd server process. +and the pid of the +.Xr ntpd @NTPD_MS@ +server process. When the number of links is greater than one, the file is unlinked. This @@ -1423,7 +1454,9 @@ by a determined cracker. .Pp Clients can be denied service because they are explicitly -included in the restrict list created by the restrict command +included in the restrict list created by the +.Ic restrict +command or implicitly as the result of cryptographic or rate limit violations. Cryptographic violations include certificate @@ -1433,9 +1466,9 @@ Some violations cause denied service only for the offending packet, others cause denied service for a timed period and others cause the denied service for -an indefinate period. +an indefinite period. When a client or network is denied access -for an indefinate period, the only way at present to remove +for an indefinite period, the only way at present to remove the restrictions is by restarting the server. .Ss The Kiss\-of\-Death Packet Ordinarily, packets denied service are simply dropped with no @@ -1493,7 +1526,9 @@ and a kiss\-o'\-death packet returned if enabled. The default minimum average and minimum are 5 and 2, respectively. -The monitor subcommand specifies the probability of discard +The +.Ic monitor +subcommand specifies the probability of discard for packets that overflow the rate\-control window. .It Xo Ic restrict address .Op Cm mask Ar mask @@ -1552,7 +1587,9 @@ last one, the packet is dropped. .It Cm limited Deny service if the packet spacing violates the lower limits specified -in the discard command. +in the +.Ic discard +command. A history of clients is kept using the monitoring capability of .Xr ntpd @NTPD_MS@ . @@ -1612,7 +1649,9 @@ .It Cm notrap Decline to provide mode 6 control message trap service to matching hosts. -The trap service is a subsystem of the ntpdq control message +The trap service is a subsystem of the +.Xr ntpq @NTPQ_MS@ +control message protocol which is intended for use by remote event logging programs. .It Cm notrust Deny service unless the packet is cryptographically authenticated. @@ -1679,8 +1718,11 @@ as well and is highly recommended, especially for broadcast modes. .Pp A persistent manycast client association is configured -using the manycastclient command, which is similar to the -server command but with a multicast (IPv4 class +using the +.Ic manycastclient +command, which is similar to the +.Ic server +command but with a multicast (IPv4 class .Cm D or IPv6 prefix .Cm FF ) @@ -1750,7 +1792,9 @@ .Cm maxpolll value specified in this command. Initially, the TTL is -set at the minimum hops specified by the ttl command. +set at the minimum hops specified by the +.Ic ttl +command. At each retransmission the TTL is increased until reaching the maximum hops specified by this command or a sufficient number client associations have been found. @@ -2388,7 +2432,8 @@ otherwise, should be avoided. .It Ic dscp Ar value This option specifies the Differentiated Services Control Point (DSCP) value, -a 6\-bit code. The default value is 46, signifying Expedited Forwarding. +a 6\-bit code. +The default value is 46, signifying Expedited Forwarding. .It Xo Ic enable .Oo .Cm auth | Cm bclient | @@ -2627,7 +2672,8 @@ message class may also be followed by the .Cm all keyword to enable/disable all -messages of the respective message class.Thus, a minimal log configuration +messages of the respective message class. +Thus, a minimal log configuration could look like this: .Bd -literal logconfig =syncstatus +sysevents @@ -2651,7 +2697,9 @@ be used instead of the default system .Xr syslog 3 facility. -This is the same operation as the \-l command line option. +This is the same operation as the +.Fl l +command line option. .It Ic setvar Ar variable Op Cm default This command adds an additional system variable. These @@ -2803,7 +2851,8 @@ function. Defaults to 50 4k pages (200 4k pages in OpenBSD). .It Cm filenum Ar Nfiledescriptors -Specifies the maximum number of file descriptors ntpd may have open at once. Defaults to the system default. +Specifies the maximum number of file descriptors ntpd may have open at once. +Defaults to the system default. .El .It Xo Ic trap Ar host_address .Op Cm port Ar port_number --- contrib/ntp/ntpd/ntp.keys.5man.orig +++ contrib/ntp/ntpd/ntp.keys.5man @@ -1,8 +1,8 @@ -.TH ntp.keys 5man "20 Jan 2016" "4.2.8p6" "File Formats" +.TH ntp.keys 5man "26 Apr 2016" "4.2.8p7" "File Formats" .\" .\" EDIT THIS FILE WITH CAUTION (ntp.man) .\" -.\" It has been AutoGen-ed January 20, 2016 at 04:17:51 AM by AutoGen 5.18.5 +.\" It has been AutoGen-ed April 26, 2016 at 08:28:19 PM by AutoGen 5.18.5 .\" From the definitions ntp.keys.def .\" and the template file agman-file.tpl .Sh NAME --- contrib/ntp/ntpd/ntp.keys.5mdoc.orig +++ contrib/ntp/ntpd/ntp.keys.5mdoc @@ -1,9 +1,9 @@ -.Dd January 20 2016 +.Dd April 26 2016 .Dt NTP_KEYS 5mdoc File Formats .Os SunOS 5.10 .\" EDIT THIS FILE WITH CAUTION (ntp.mdoc) .\" -.\" It has been AutoGen-ed January 20, 2016 at 04:18:10 AM by AutoGen 5.18.5 +.\" It has been AutoGen-ed April 26, 2016 at 08:28:39 PM by AutoGen 5.18.5 .\" From the definitions ntp.keys.def .\" and the template file agmdoc-file.tpl .Sh NAME --- contrib/ntp/ntpd/ntp.keys.html.orig +++ contrib/ntp/ntpd/ntp.keys.html @@ -33,7 +33,7 @@

This document describes the symmetric key file for the NTP Project's ntpd program. -

This document applies to version 4.2.8p6 of ntp.keys. +

This document applies to version 4.2.8p7 of ntp.keys.

Short Contents

--- contrib/ntp/ntpd/ntp.keys.man.in.orig +++ contrib/ntp/ntpd/ntp.keys.man.in @@ -1,8 +1,8 @@ -.TH ntp.keys 5 "20 Jan 2016" "4.2.8p6" "File Formats" +.TH ntp.keys 5 "26 Apr 2016" "4.2.8p7" "File Formats" .\" .\" EDIT THIS FILE WITH CAUTION (ntp.man) .\" -.\" It has been AutoGen-ed January 20, 2016 at 04:17:51 AM by AutoGen 5.18.5 +.\" It has been AutoGen-ed April 26, 2016 at 08:28:19 PM by AutoGen 5.18.5 .\" From the definitions ntp.keys.def .\" and the template file agman-file.tpl .Sh NAME --- contrib/ntp/ntpd/ntp.keys.mdoc.in.orig +++ contrib/ntp/ntpd/ntp.keys.mdoc.in @@ -1,9 +1,9 @@ -.Dd January 20 2016 +.Dd April 26 2016 .Dt NTP_KEYS 5 File Formats .Os SunOS 5.10 .\" EDIT THIS FILE WITH CAUTION (ntp.mdoc) .\" -.\" It has been AutoGen-ed January 20, 2016 at 04:18:10 AM by AutoGen 5.18.5 +.\" It has been AutoGen-ed April 26, 2016 at 08:28:39 PM by AutoGen 5.18.5 .\" From the definitions ntp.keys.def .\" and the template file agmdoc-file.tpl .Sh NAME --- contrib/ntp/ntpd/ntp_control.c.orig +++ contrib/ntp/ntpd/ntp_control.c @@ -911,7 +911,7 @@ }; u_int widx, bidx, mask; - if (!*name) + if ( ! (name && *name)) return FALSE; mask = 1u; @@ -918,11 +918,11 @@ while (0 != (widx = (u_char)*name++)) { bidx = (widx & 15) << 1; widx = widx >> 4; - if (widx >= sizeof(chclass)) + if (widx >= sizeof(chclass)/sizeof(chclass[0])) return FALSE; if (0 == ((chclass[widx] >> bidx) & mask)) return FALSE; - mask |= 2u; + mask = 2u; } return TRUE; } @@ -3081,17 +3081,25 @@ char **data ) { + /* [Bug 3008] First check the packet data sanity, then search + * the key. This improves the consistency of result values: If + * the result is NULL once, it will never be EOV again for this + * packet; If it's EOV, it will never be NULL again until the + * variable is found and processed in a given 'var_list'. (That + * is, a result is returned that is neither NULL nor EOV). + */ static const struct ctl_var eol = { 0, EOV, NULL }; static char buf[128]; static u_long quiet_until; const struct ctl_var *v; - const char *pch; char *cp; char *tp; /* - * Delete leading commas and white space + * Part One: Validate the packet state */ + + /* Delete leading commas and white space */ while (reqpt < reqend && (*reqpt == ',' || isspace((unsigned char)*reqpt))) reqpt++; @@ -3098,66 +3106,92 @@ if (reqpt >= reqend) return NULL; + /* Scan the string in the packet until we hit comma or + * EoB. Register position of first '=' on the fly. */ + for (tp = NULL, cp = reqpt; cp != reqend; ++cp) { + if (*cp == '=' && tp == NULL) + tp = cp; + if (*cp == ',') + break; + } + + /* Process payload, if any. */ + *data = NULL; + if (NULL != tp) { + /* eventually strip white space from argument. */ + const char *plhead = tp + 1; /* skip the '=' */ + const char *pltail = cp; + size_t plsize; + + while (plhead != pltail && isspace((u_char)plhead[0])) + ++plhead; + while (plhead != pltail && isspace((u_char)pltail[-1])) + --pltail; + + /* check payload size, terminate packet on overflow */ + plsize = (size_t)(pltail - plhead); + if (plsize >= sizeof(buf)) + goto badpacket; + + /* copy data, NUL terminate, and set result data ptr */ + memcpy(buf, plhead, plsize); + buf[plsize] = '\0'; + *data = buf; + } else { + /* no payload, current end --> current name termination */ + tp = cp; + } + + /* Part Two + * + * Now we're sure that the packet data itself is sane. Scan the + * list now. Make sure a NULL list is properly treated by + * returning a synthetic End-Of-Values record. We must not + * return NULL pointers after this point, or the behaviour would + * become inconsistent if called several times with different + * variable lists after an EoV was returned. (Such a behavior + * actually caused Bug 3008.) + */ + if (NULL == var_list) return &eol; - /* - * Look for a first character match on the tag. If we find - * one, see if it is a full match. - */ - cp = reqpt; - for (v = var_list; !(EOV & v->flags); v++) { - if (!(PADDING & v->flags) && *cp == *(v->text)) { - pch = v->text; - while ('\0' != *pch && '=' != *pch && cp < reqend - && *cp == *pch) { - cp++; - pch++; + for (v = var_list; !(EOV & v->flags); ++v) + if (!(PADDING & v->flags)) { + /* check if the var name matches the buffer */ + const char *sp1 = reqpt; + const char *sp2 = v->text; + + while ((sp1 != tp) && *sp2 && (*sp1 == *sp2)) { + ++sp1; + ++sp2; } - if ('\0' == *pch || '=' == *pch) { - while (cp < reqend && isspace((u_char)*cp)) - cp++; - if (cp == reqend || ',' == *cp) { - buf[0] = '\0'; - *data = buf; - if (cp < reqend) - cp++; - reqpt = cp; - return v; - } - if ('=' == *cp) { - cp++; - tp = buf; - while (cp < reqend && isspace((u_char)*cp)) - cp++; - while (cp < reqend && *cp != ',') { - *tp++ = *cp++; - if ((size_t)(tp - buf) >= sizeof(buf)) { - ctl_error(CERR_BADFMT); - numctlbadpkts++; - NLOG(NLOG_SYSEVENT) - if (quiet_until <= current_time) { - quiet_until = current_time + 300; - msyslog(LOG_WARNING, -"Possible 'ntpdx' exploit from %s#%u (possibly spoofed)", stoa(rmt_addr), SRCPORT(rmt_addr)); - } - return NULL; - } - } - if (cp < reqend) - cp++; - *tp-- = '\0'; - while (tp >= buf && isspace((u_char)*tp)) - *tp-- = '\0'; - reqpt = cp; - *data = buf; - return v; - } - } - cp = reqpt; + if (sp1 == tp && !*sp2) + break; } - } + + /* See if we have found a valid entry or not. If found, advance + * the request pointer for the next round; if not, clear the + * data pointer so we have no dangling garbage here. + */ + if (EOV & v->flags) + *data = NULL; + else + reqpt = cp + (cp != reqend); return v; + + badpacket: + /*TODO? somehow indicate this packet was bad, apart from syslog? */ + numctlbadpkts++; + NLOG(NLOG_SYSEVENT) + if (quiet_until <= current_time) { + quiet_until = current_time + 300; + msyslog(LOG_WARNING, + "Possible 'ntpdx' exploit from %s#%u (possibly spoofed)", + stoa(rmt_addr), SRCPORT(rmt_addr)); + } + reqpt = reqend; /* never again for this packet! */ + return NULL; } @@ -3334,7 +3368,11 @@ gotvar = 1; } else { v = ctl_getitem(ext_sys_var, &valuep); - INSIST(v != NULL); + if (NULL == v) { + ctl_error(CERR_BADVALUE); + free(wants); + return; + } if (EOV & v->flags) { ctl_error(CERR_UNKNOWNVAR); free(wants); @@ -4575,7 +4613,12 @@ gotvar = TRUE; } else { v = ctl_getitem(kv, &valuep); - INSIST(NULL != v); + if (NULL == v) { + ctl_error(CERR_BADVALUE); + free(wants); + free_varlist(cs.kv_list); + return; + } if (EOV & v->flags) { ctl_error(CERR_UNKNOWNVAR); free(wants); --- contrib/ntp/ntpd/ntp_io.c.orig +++ contrib/ntp/ntpd/ntp_io.c @@ -62,10 +62,6 @@ # endif #endif -#if defined(HAVE_SIGNALED_IO) && defined(DEBUG_TIMING) -# undef DEBUG_TIMING -#endif - /* * setsockopt does not always have the same arg declaration * across all platforms. If it's not defined we make it empty @@ -778,6 +774,12 @@ iface->ifnum = sys_ifnum++; iface->starttime = current_time; +# ifdef HAVE_IO_COMPLETION_PORT + if (!io_completion_port_add_interface(iface)) { + msyslog(LOG_EMERG, "cannot register interface with IO engine -- will exit now"); + exit(1); + } +# endif return iface; } @@ -785,11 +787,14 @@ /* * return interface storage into free memory pool */ -static inline void +static void delete_interface( endpt *ep ) { +# ifdef HAVE_IO_COMPLETION_PORT + io_completion_port_remove_interface(ep); +# endif free(ep); } @@ -1007,6 +1012,9 @@ ep->sent, ep->notsent, current_time - ep->starttime); +# ifdef HAVE_IO_COMPLETION_PORT + io_completion_port_remove_socket(ep->fd, ep); +# endif close_and_delete_fd_from_list(ep->fd); ep->fd = INVALID_SOCKET; } @@ -1015,10 +1023,15 @@ msyslog(LOG_INFO, "stop listening for broadcasts to %s on interface #%d %s", stoa(&ep->bcast), ep->ifnum, ep->name); +# ifdef HAVE_IO_COMPLETION_PORT + io_completion_port_remove_socket(ep->bfd, ep); +# endif close_and_delete_fd_from_list(ep->bfd); ep->bfd = INVALID_SOCKET; - ep->flags &= ~INT_BCASTOPEN; } +# ifdef HAVE_IO_COMPLETION_PORT + io_completion_port_remove_interface(ep); +# endif ninterfaces--; mon_clearinterface(ep); @@ -2569,7 +2582,7 @@ continue; /* Only IPv4 addresses are valid for broadcast */ - REQUIRE(IS_IPV4(&interf->sin)); + REQUIRE(IS_IPV4(&interf->bcast)); /* Do we already have the broadcast address open? */ if (interf->flags & INT_BCASTOPEN) { @@ -2597,13 +2610,31 @@ msyslog(LOG_INFO, "Listen for broadcasts to %s on interface #%d %s", stoa(&interf->bcast), interf->ifnum, interf->name); - } else { - /* silently ignore EADDRINUSE as we probably opened - the socket already for an address in the same network */ - if (errno != EADDRINUSE) - msyslog(LOG_INFO, - "failed to listen for broadcasts to %s on interface #%d %s", - stoa(&interf->bcast), interf->ifnum, interf->name); + } else switch (errno) { + /* Silently ignore EADDRINUSE as we probably + * opened the socket already for an address in + * the same network */ + case EADDRINUSE: + /* Some systems cannot bind a socket to a broadcast + * address, as that is not a valid host address. */ + case EADDRNOTAVAIL: +# ifdef SYS_WINNT /*TODO: use for other systems, too? */ + /* avoid recurrence here -- if we already have a + * regular socket, it's quite useless to try this + * again. + */ + if (interf->fd != INVALID_SOCKET) { + interf->flags |= INT_BCASTOPEN; + nif++; + } +# endif + break; + + default: + msyslog(LOG_INFO, + "failed to listen for broadcasts to %s on interface #%d %s", + stoa(&interf->bcast), interf->ifnum, interf->name); + break; } } set_reuseaddr(0); @@ -2641,10 +2672,13 @@ msyslog(LOG_INFO, "stop listening for broadcasts to %s on interface #%d %s", stoa(&ep->bcast), ep->ifnum, ep->name); +# ifdef HAVE_IO_COMPLETION_PORT + io_completion_port_remove_socket(ep->bfd, ep); +# endif close_and_delete_fd_from_list(ep->bfd); ep->bfd = INVALID_SOCKET; - ep->flags &= ~INT_BCASTOPEN; } + ep->flags &= ~INT_BCASTOPEN; } broadcast_client_enabled = ISC_FALSE; } @@ -3020,11 +3054,11 @@ fcntl(fd, F_GETFL, 0))); #endif /* SYS_WINNT || VMS */ -#if defined (HAVE_IO_COMPLETION_PORT) +#if defined(HAVE_IO_COMPLETION_PORT) /* * Add the socket to the completion port */ - if (io_completion_port_add_socket(fd, interf)) { + if (!io_completion_port_add_socket(fd, interf, bcast)) { msyslog(LOG_ERR, "unable to set up io completion port - EXITING"); exit(1); } @@ -3033,10 +3067,6 @@ } -#ifdef SYS_WINNT -#define sendto(fd, buf, len, flags, dest, destsz) \ - io_completion_port_sendto(fd, buf, len, (sockaddr_u *)(dest)) -#endif /* XXX ELIMINATE sendpkt similar in ntpq.c, ntpdc.c, ntp_io.c, ntptrace.c */ /* @@ -3124,6 +3154,9 @@ #ifdef SIM cc = simulate_server(dest, src, pkt); +#elif defined(HAVE_IO_COMPLETION_PORT) + cc = io_completion_port_sendto(src, src->fd, pkt, + (size_t)len, (sockaddr_u *)&dest->sa); #else cc = sendto(src->fd, (char *)pkt, (u_int)len, 0, &dest->sa, SOCKLEN(dest)); @@ -3141,7 +3174,8 @@ } -#if !defined(HAVE_IO_COMPLETION_PORT) && !defined(HAVE_SIGNALED_IO) +#if !defined(HAVE_IO_COMPLETION_PORT) +#if !defined(HAVE_SIGNALED_IO) /* * fdbits - generate ascii representation of fd_set (FAU debug support) * HFDF format - highest fd first. @@ -3450,6 +3484,18 @@ DPRINTF(3, ("read_network_packet: fd=%d length %d from %s\n", fd, buflen, stoa(&rb->recv_srcadr))); +#ifdef ENABLE_BUG3020_FIX + if (ISREFCLOCKADR(&rb->recv_srcadr)) { + msyslog(LOG_ERR, "recvfrom(%s) fd=%d: refclock srcadr on a network interface!", + stoa(&rb->recv_srcadr), fd); + DPRINTF(1, ("read_network_packet: fd=%d dropped (refclock srcadr))\n", + fd)); + packets_dropped++; + freerecvbuf(rb); + return (buflen); + } +#endif + /* ** Bug 2672: Some OSes (MacOSX and Linux) don't block spoofed ::1 */ @@ -3789,8 +3835,8 @@ lfptoms(&ts_e, 6)); #endif /* DEBUG_TIMING */ } +#endif /* !HAVE_IO_COMPLETION_PORT */ - /* * find an interface suitable for the src address */ @@ -4279,7 +4325,7 @@ return 0; } # elif defined(HAVE_IO_COMPLETION_PORT) - if (io_completion_port_add_clock_io(rio)) { + if (!io_completion_port_add_clock_io(rio)) { UNBLOCKIO(); return 0; } @@ -4318,13 +4364,23 @@ rio->active = FALSE; UNLINK_SLIST(unlinked, refio, rio, next, struct refclockio); if (NULL != unlinked) { - purge_recv_buffers_for_fd(rio->fd); - /* - * Close the descriptor. + /* Close the descriptor. The order of operations is + * important here in case of async / overlapped IO: + * only after we have removed the clock from the + * IO completion port we can be sure no further + * input is queued. So... + * - we first disable feeding to the queu by removing + * the clock from the IO engine + * - close the file (which brings down any IO on it) + * - clear the buffer from results for this fd */ +# ifdef HAVE_IO_COMPLETION_PORT + io_completion_port_remove_clock_io(rio); +# endif close_and_delete_fd_from_list(rio->fd); + purge_recv_buffers_for_fd(rio->fd); + rio->fd = -1; } - rio->fd = -1; UNBLOCKIO(); } --- contrib/ntp/ntpd/ntp_proto.c.orig +++ contrib/ntp/ntpd/ntp_proto.c @@ -25,6 +25,11 @@ #include #endif +/* [Bug 3031] define automatic broadcastdelay cutoff preset */ +#ifndef BDELAY_DEFAULT +# define BDELAY_DEFAULT (-0.050) +#endif + /* * This macro defines the authentication state. If x is 1 authentication * is required; othewise it is optional. @@ -50,6 +55,12 @@ UNKNOWNKISS /* Unknown Kiss Code */ }; +enum nak_error_codes { + NONAK, /* No NAK seen */ + INVALIDNAK, /* NAK cannot be used */ + VALIDNAK /* NAK is valid */ +}; + /* * traffic shaping parameters */ @@ -166,7 +177,10 @@ int unpeer_crypto_nak_early = 1; /* crypto_NAK (TEST5) */ int unpeer_digest_early = 1; /* bad digest (TEST5) */ -static int kiss_code_check(u_char hisleap, u_char hisstratum, u_char hismode, u_int32 refid); +int dynamic_interleave = DYNAMIC_INTERLEAVE; /* Bug 2978 mitigation */ + +int kiss_code_check(u_char hisleap, u_char hisstratum, u_char hismode, u_int32 refid); +enum nak_error_codes valid_NAK(struct peer *peer, struct recvbuf *rbufp, u_char hismode); static double root_distance (struct peer *); static void clock_combine (peer_select *, int, int); static void peer_xmit (struct peer *); @@ -253,6 +267,68 @@ } +/* + * Check that NAK is valid + */ +enum nak_error_codes +valid_NAK( + struct peer *peer, + struct recvbuf *rbufp, + u_char hismode + ) +{ + int base_packet_length = MIN_V4_PKT_LEN; + int remainder_size; + struct pkt *rpkt; + int keyid; + + /* + * Check to see if there is something beyond the basic packet + */ + if (rbufp->recv_length == base_packet_length) { + return NONAK; + } + + remainder_size = rbufp->recv_length - base_packet_length; + /* + * Is this a potential NAK? + */ + if (remainder_size != 4) { + return NONAK; + } + + /* + * Only server responses can contain NAK's + */ + + if (hismode != MODE_SERVER && + hismode != MODE_ACTIVE && + hismode != MODE_PASSIVE + ) { + return (INVALIDNAK); + } + + /* + * Make sure that the extra field in the packet is all zeros + */ + rpkt = &rbufp->recv_pkt; + keyid = ntohl(((u_int32 *)rpkt)[base_packet_length / 4]); + if (keyid != 0) { + return (INVALIDNAK); + } + + /* + * Only valid if peer uses a key + */ + if (peer->keyid > 0 || peer->flags & FLAG_SKEY) { + return (VALIDNAK); + } + else { + return (INVALIDNAK); + } +} + + /* * transmit - transmit procedure called by poll timeout */ @@ -493,6 +569,7 @@ int has_mac; /* length of MAC field */ int authlen; /* offset of MAC field */ int is_authentic = 0; /* cryptosum ok */ + int crypto_nak_test; /* result of crypto-NAK check */ int retcode = AM_NOMATCH; /* match code */ keyid_t skeyid = 0; /* key IDs */ u_int32 opcode = 0; /* extension field opcode */ @@ -617,6 +694,7 @@ * extension field is present, so we subtract the length of the * field and go around again. */ + authlen = LEN_PKT_NOMAC; has_mac = rbufp->recv_length - authlen; while (has_mac > 0) { @@ -767,7 +845,21 @@ * is zero, acceptable outcomes of y are NONE and OK. If x is * one, the only acceptable outcome of y is OK. */ + crypto_nak_test = valid_NAK(peer, rbufp, hismode); + /* + * Drop any invalid crypto-NAKs + */ + if (crypto_nak_test == INVALIDNAK) { + report_event(PEVNT_AUTH, peer, "Invalid_NAK"); + if (0 != peer) { + peer->badNAK++; + } + msyslog(LOG_ERR, "Invalid-NAK error at %ld %s<-%s", + current_time, stoa(dstadr_sin), stoa(&rbufp->recv_srcadr)); + return; + } + if (has_mac == 0) { restrict_mask &= ~RES_MSSNTP; is_authentic = AUTH_NONE; /* not required */ @@ -777,7 +869,7 @@ authlen, ntohl(pkt->org.l_ui), ntohl(pkt->org.l_uf), ntohl(pkt->xmt.l_ui), ntohl(pkt->xmt.l_uf))); - } else if (has_mac == 4) { + } else if (crypto_nak_test == VALIDNAK) { restrict_mask &= ~RES_MSSNTP; is_authentic = AUTH_CRYPTO; /* crypto-NAK */ DPRINTF(2, ("receive: at %ld %s<-%s mode %d/%s:%s keyid %08x len %d auth %d org %#010x.%08x xmt %#010x.%08x MAC4\n", @@ -1144,7 +1236,7 @@ /* * Determine whether to execute the initial volley. */ - if (sys_bdelay != 0) { + if (sys_bdelay > 0.0) { #ifdef AUTOKEY /* * If a two-way exchange is not possible, @@ -1303,9 +1395,9 @@ #endif /* AUTOKEY */ if (MODE_BROADCAST == hismode) { - u_char poll; - int bail = 0; - l_fp tdiff; + int bail = 0; + l_fp tdiff; + u_long deadband; DPRINTF(2, ("receive: PROCPKT/BROADCAST: prev pkt %ld seconds ago, ppoll: %d, %d secs\n", (current_time - peer->timelastrec), @@ -1327,11 +1419,9 @@ peer->ppoll, pkt->ppoll); } - poll = min(peer->maxpoll, - max(peer->minpoll, pkt->ppoll)); - /* This is error-worthy */ - if (pkt->ppoll != poll) { + if (pkt->ppoll < peer->minpoll || + pkt->ppoll > peer->maxpoll ) { msyslog(LOG_INFO, "receive: broadcast poll of %ud from %s is out-of-range (%d to %d)!", pkt->ppoll, stoa(&rbufp->recv_srcadr), peer->minpoll, peer->maxpoll); @@ -1338,16 +1428,19 @@ ++bail; } - if ( (current_time - peer->timelastrec) - < (1 << pkt->ppoll)) { - msyslog(LOG_INFO, "receive: broadcast packet from %s arrived after %ld, not %d seconds!", + /* too early? worth an error, too! */ + deadband = (1u << pkt->ppoll); + if (FLAG_BC_VOL & peer->flags) + deadband -= 3; /* allow greater fuzz after volley */ + if ((current_time - peer->timelastrec) < deadband) { + msyslog(LOG_INFO, "receive: broadcast packet from %s arrived after %lu, not %lu seconds!", stoa(&rbufp->recv_srcadr), (current_time - peer->timelastrec), - (1 << pkt->ppoll) - ); + deadband); ++bail; } + /* Alert if time from the server is non-monotonic */ tdiff = p_xmt; L_SUB(&tdiff, &peer->bxmt); if (tdiff.l_i < 0) { @@ -1401,6 +1494,7 @@ return; } #endif /* AUTOKEY */ + peer->received++; peer->flash &= ~PKT_TEST_MASK; if (peer->flags & FLAG_XBOGUS) { @@ -1412,12 +1506,22 @@ * Next comes a rigorous schedule of timestamp checking. If the * transmit timestamp is zero, the server has not initialized in * interleaved modes or is horribly broken. + * + * A KoD packet we pay attention to cannot have a 0 transmit + * timestamp. */ if (L_ISZERO(&p_xmt)) { peer->flash |= TEST3; /* unsynch */ + if (0 == hisstratum) { /* KoD packet */ + peer->bogusorg++; /* for TEST2 or TEST3 */ + msyslog(LOG_INFO, + "receive: Unexpected zero transmit timestamp in KoD from %s", + ntoa(&peer->srcadr)); + return; + } /* - * If the transmit timestamp duplicates a previous one, the + * If the transmit timestamp duplicates our previous one, the * packet is a replay. This prevents the bad guys from replaying * the most recent packet, authenticated or not. */ @@ -1442,14 +1546,66 @@ } /* + * Basic KoD validation checking: + * + * KoD packets are a mixed-blessing. Forged KoD packets + * are DoS attacks. There are rare situations where we might + * get a valid KoD response, though. Since KoD packets are + * a special case that complicate the checks we do next, we + * handle the basic KoD checks here. + * + * Note that we expect the incoming KoD packet to have its + * (nonzero) org, rec, and xmt timestamps set to the xmt timestamp + * that we have previously sent out. Watch interleave mode. + */ + } else if (0 == hisstratum) { + DEBUG_INSIST(!L_ISZERO(&p_xmt)); + if ( L_ISZERO(&p_org) /* We checked p_xmt above */ + || L_ISZERO(&p_rec)) { + peer->bogusorg++; + msyslog(LOG_INFO, + "receive: KoD packet from %s has a zero org or rec timestamp. Ignoring.", + ntoa(&peer->srcadr)); + return; + } + + if ( !L_ISEQU(&p_xmt, &p_org) + || !L_ISEQU(&p_xmt, &p_rec)) { + peer->bogusorg++; + msyslog(LOG_INFO, + "receive: KoD packet from %s has inconsistent xmt/org/rec timestamps. Ignoring.", + ntoa(&peer->srcadr)); + return; + } + + /* Be conservative */ + if (peer->flip == 0 && !L_ISEQU(&p_org, &peer->aorg)) { + peer->bogusorg++; + msyslog(LOG_INFO, + "receive: flip 0 KoD origin timestamp %#010x.%08x from %s does not match %#010x.%08x - ignoring.", + p_org.l_ui, p_org.l_uf, + ntoa(&peer->srcadr), + peer->aorg.l_ui, peer->aorg.l_uf); + return; + } else if (peer->flip == 1 && !L_ISEQU(&p_org, &peer->borg)) { + peer->bogusorg++; + msyslog(LOG_INFO, + "receive: flip 1 KoD origin timestamp %#010x.%08x from %s does not match interleave %#010x.%08x - ignoring.", + p_org.l_ui, p_org.l_uf, + ntoa(&peer->srcadr), + peer->borg.l_ui, peer->borg.l_uf); + return; + } + + /* * Basic mode checks: * * If there is no origin timestamp, it's either an initial packet * or we've already received a response to our query. Of course, * should 'aorg' be all-zero because this really was the original - * transmit timestamp, we'll drop the reply. There is a window of - * one nanosecond once every 136 years' time where this is possible. - * We currently ignore this situation. + * transmit timestamp, we'll ignore this reply. There is a window + * of one nanosecond once every 136 years' time where this is + * possible. We currently ignore this situation. * * Otherwise, check for bogus packet in basic mode. * If it is bogus, switch to interleaved mode and resynchronize, @@ -1460,24 +1616,37 @@ * be from us, attempting to cause our server to KoD us. */ } else if (peer->flip == 0) { - if (0 < hisstratum && L_ISZERO(&p_org)) { + INSIST(0 != hisstratum); + if (0) { + } else if (L_ISZERO(&p_org)) { + msyslog(LOG_INFO, + "receive: Got 0 origin timestamp from %s@%s xmt %#010x.%08x", + hm_str, ntoa(&peer->srcadr), + ntohl(pkt->xmt.l_ui), ntohl(pkt->xmt.l_uf)); L_CLR(&peer->aorg); - } else if ( L_ISZERO(&peer->aorg) - || !L_ISEQU(&p_org, &peer->aorg)) { + } else if (!L_ISEQU(&p_org, &peer->aorg)) { + /* are there cases here where we should bail? */ + /* Should we set TEST2 if we decide to try xleave? */ peer->bogusorg++; peer->flash |= TEST2; /* bogus */ msyslog(LOG_INFO, - "receive: Unexpected origin timestamp %#010x.%08x from %s xmt %#010x.%08x", + "receive: Unexpected origin timestamp %#010x.%08x does not match aorg %#010x.%08x from %s@%s xmt %#010x.%08x", ntohl(pkt->org.l_ui), ntohl(pkt->org.l_uf), - ntoa(&peer->srcadr), + peer->aorg.l_ui, peer->aorg.l_uf, + hm_str, ntoa(&peer->srcadr), ntohl(pkt->xmt.l_ui), ntohl(pkt->xmt.l_uf)); if ( !L_ISZERO(&peer->dst) && L_ISEQU(&p_org, &peer->dst)) { /* Might be the start of an interleave */ - peer->flip = 1; - report_event(PEVNT_XLEAVE, peer, NULL); + if (dynamic_interleave) { + peer->flip = 1; + report_event(PEVNT_XLEAVE, peer, NULL); + } else { + msyslog(LOG_INFO, + "receive: Dynamic interleave from %s@%s denied", + hm_str, ntoa(&peer->srcadr)); + } } - return; /* Bogus or possible interleave packet */ } else { L_CLR(&peer->aorg); } @@ -1507,7 +1676,7 @@ * client packet. The server might have just changed keys. Clear * the association and restart the protocol. */ - if (is_authentic == AUTH_CRYPTO) { + if (crypto_nak_test == VALIDNAK) { report_event(PEVNT_AUTH, peer, "crypto_NAK"); peer->flash |= TEST5; /* bad auth */ peer->badauth++; @@ -1600,10 +1769,12 @@ /* * If: * - this is a *cast (uni-, broad-, or m-) server packet - * - and it's authenticated + * - and it's symmetric-key authenticated * then see if the sender's IP is trusted for this keyid. * If it is, great - nothing special to do here. * Otherwise, we should report and bail. + * + * Autokey-authenticated packets are accepted. */ switch (hismode) { @@ -1610,7 +1781,10 @@ case MODE_SERVER: /* server mode */ case MODE_BROADCAST: /* broadcast mode */ case MODE_ACTIVE: /* symmetric active mode */ + case MODE_PASSIVE: /* symmetric passive mode */ if ( is_authentic == AUTH_OK + && skeyid + && skeyid <= NTP_MAXKEY && !authistrustedip(skeyid, &peer->srcadr)) { report_event(PEVNT_AUTH, peer, "authIP"); peer->badauth++; @@ -1618,8 +1792,6 @@ } break; - case MODE_UNSPEC: /* unspecified (old version) */ - case MODE_PASSIVE: /* symmetric passive mode */ case MODE_CLIENT: /* client mode */ #if 0 /* At this point, MODE_CONTROL is overloaded by MODE_BCLIENT */ case MODE_CONTROL: /* control mode */ @@ -1627,7 +1799,12 @@ case MODE_PRIVATE: /* private mode */ case MODE_BCLIENT: /* broadcast client mode */ break; + + case MODE_UNSPEC: /* unspecified (old version) */ default: + msyslog(LOG_INFO, + "receive: Unexpected mode (%d) in packet from %s", + hismode, ntoa(&peer->srcadr)); break; } @@ -1958,6 +2135,9 @@ peer->aorg = p_xmt; peer->borg = peer->dst; if (t34 < 0 || t34 > 1.) { + /* drop all if in the initial volley */ + if (FLAG_BC_VOL & peer->flags) + goto bcc_init_volley_fail; snprintf(statstr, sizeof(statstr), "offset %.6f delay %.6f", t21, t34); report_event(PEVNT_XERR, peer, statstr); @@ -1983,11 +2163,23 @@ * between the unicast timestamp and the broadcast * timestamp. This works for both basic and interleaved * modes. + * [Bug 3031] Don't keep this peer when the delay + * calculation gives reason to suspect clock steps. + * This is assumed for delays > 50ms. */ if (FLAG_BC_VOL & peer->flags) { peer->flags &= ~FLAG_BC_VOL; peer->delay = fabs(peer->offset - p_offset) * 2; + DPRINTF(2, ("broadcast volley: initial delay=%.6f\n", + peer->delay)); + if (peer->delay > fabs(sys_bdelay)) { + bcc_init_volley_fail: + DPRINTF(2, ("%s", "broadcast volley: initial delay exceeds limit\n")); + unpeer(peer); + return; + } } + peer->nextdate = current_time + (1u << peer->ppoll) - 2u; p_del = peer->delay; p_offset += p_del / 2; @@ -4018,6 +4210,7 @@ } #endif /* AUTOKEY */ + #ifdef WORKER void pool_name_resolved( @@ -4333,7 +4526,7 @@ sys_survivors = 0; sys_manycastserver = 0; sys_bclient = 0; - sys_bdelay = 0; + sys_bdelay = BDELAY_DEFAULT; /*[Bug 3031] delay cutoff */ sys_authenticate = 1; sys_stattime = current_time; orphwait = current_time + sys_orphwait; @@ -4426,7 +4619,7 @@ break; case PROTO_BROADDELAY: /* default broadcast delay (bdelay) */ - sys_bdelay = dvalue; + sys_bdelay = (dvalue ? dvalue : BDELAY_DEFAULT); break; case PROTO_CEILING: /* stratum ceiling (ceiling) */ --- contrib/ntp/ntpd/ntp_request.c.orig +++ contrib/ntp/ntpd/ntp_request.c @@ -1342,11 +1342,38 @@ peeraddr.sa.sa_len = SOCKLEN(&peeraddr); #endif - /* XXX W2DO? minpoll/maxpoll arguments ??? */ + /* check mode value: 0 <= hmode <= 6 + * + * There's no good global define for that limit, and + * using a magic define is as good (or bad, actually) as + * a magic number. So we use the highest possible peer + * mode, and that is MODE_BCLIENT. + * + * [Bug 3009] claims that a problem occurs for hmode > 7, + * but the code in ntp_peer.c indicates trouble for any + * hmode > 6 ( --> MODE_BCLIENT). + */ + if (temp_cp.hmode > MODE_BCLIENT) { + req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); + return; + } + + /* Any more checks on the values? Unchecked at this + * point: + * - version + * - ttl + * - keyid + * + * - minpoll/maxpoll, but they are treated properly + * for all cases internally. Checking not necessary. + */ + + /* finally create the peer */ if (peer_config(&peeraddr, NULL, NULL, temp_cp.hmode, temp_cp.version, temp_cp.minpoll, temp_cp.maxpoll, fl, temp_cp.ttl, temp_cp.keyid, - NULL) == 0) { + NULL) == 0) + { req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); return; } @@ -1373,8 +1400,7 @@ struct conf_unpeer temp_cp; struct peer * p; sockaddr_u peeraddr; - int bad; - int found; + int loops; /* * This is a bit unstructured, but I like to be careful. @@ -1381,95 +1407,66 @@ * We check to see that every peer exists and is actually * configured. If so, we remove them. If not, we return * an error. + * + * [Bug 3011] Even if we checked all peers given in the request + * in a dry run, there's still a chance that the caller played + * unfair and gave the same peer multiple times. So we still + * have to be prepared for nasty surprises in the second run ;) */ - items = INFO_NITEMS(inpkt->err_nitems); + + /* basic consistency checks */ item_sz = INFO_ITEMSIZE(inpkt->mbz_itemsize); - datap = inpkt->u.data; if (item_sz > sizeof(temp_cp)) { req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); return; } - bad = FALSE; - while (items-- > 0 && !bad) { - ZERO(temp_cp); - memcpy(&temp_cp, datap, item_sz); - ZERO_SOCK(&peeraddr); - if (client_v6_capable && temp_cp.v6_flag) { - AF(&peeraddr) = AF_INET6; - SOCK_ADDR6(&peeraddr) = temp_cp.peeraddr6; - } else { - AF(&peeraddr) = AF_INET; - NSRCADR(&peeraddr) = temp_cp.peeraddr; - } - SET_PORT(&peeraddr, NTP_PORT); + /* now do two runs: first a dry run, then a busy one */ + for (loops = 0; loops != 2; ++loops) { + items = INFO_NITEMS(inpkt->err_nitems); + datap = inpkt->u.data; + while (items-- > 0) { + /* copy from request to local */ + ZERO(temp_cp); + memcpy(&temp_cp, datap, item_sz); + /* get address structure */ + ZERO_SOCK(&peeraddr); + if (client_v6_capable && temp_cp.v6_flag) { + AF(&peeraddr) = AF_INET6; + SOCK_ADDR6(&peeraddr) = temp_cp.peeraddr6; + } else { + AF(&peeraddr) = AF_INET; + NSRCADR(&peeraddr) = temp_cp.peeraddr; + } + SET_PORT(&peeraddr, NTP_PORT); #ifdef ISC_PLATFORM_HAVESALEN - peeraddr.sa.sa_len = SOCKLEN(&peeraddr); + peeraddr.sa.sa_len = SOCKLEN(&peeraddr); #endif - found = FALSE; - p = NULL; + DPRINTF(1, ("searching for %s\n", + stoa(&peeraddr))); - DPRINTF(1, ("searching for %s\n", stoa(&peeraddr))); - - while (!found) { - p = findexistingpeer(&peeraddr, NULL, p, -1, 0); - if (NULL == p) - break; - if (FLAG_CONFIG & p->flags) - found = TRUE; + /* search for matching configred(!) peer */ + p = NULL; + do { + p = findexistingpeer( + &peeraddr, NULL, p, -1, 0); + } while (p && !(FLAG_CONFIG & p->flags)); + + if (!loops && !p) { + /* Item not found in dry run -- bail! */ + req_ack(srcadr, inter, inpkt, + INFO_ERR_NODATA); + return; + } else if (loops && p) { + /* Item found in busy run -- remove! */ + peer_clear(p, "GONE"); + unpeer(p); + } + datap += item_sz; } - if (!found) - bad = TRUE; - - datap += item_sz; } - if (bad) { - req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); - return; - } - - /* - * Now do it in earnest. - */ - - items = INFO_NITEMS(inpkt->err_nitems); - datap = inpkt->u.data; - - while (items-- > 0) { - ZERO(temp_cp); - memcpy(&temp_cp, datap, item_sz); - ZERO(peeraddr); - if (client_v6_capable && temp_cp.v6_flag) { - AF(&peeraddr) = AF_INET6; - SOCK_ADDR6(&peeraddr) = temp_cp.peeraddr6; - } else { - AF(&peeraddr) = AF_INET; - NSRCADR(&peeraddr) = temp_cp.peeraddr; - } - SET_PORT(&peeraddr, NTP_PORT); -#ifdef ISC_PLATFORM_HAVESALEN - peeraddr.sa.sa_len = SOCKLEN(&peeraddr); -#endif - found = FALSE; - p = NULL; - - while (!found) { - p = findexistingpeer(&peeraddr, NULL, p, -1, 0); - if (NULL == p) - break; - if (FLAG_CONFIG & p->flags) - found = TRUE; - } - INSIST(found); - INSIST(NULL != p); - - peer_clear(p, "GONE"); - unpeer(p); - - datap += item_sz; - } - + /* report success */ req_ack(srcadr, inter, inpkt, INFO_OKAY); } @@ -2297,36 +2294,64 @@ return; } - - /* - * set_request_keyid - set the keyid used to authenticate requests + * Validate a request packet for a new request or control key: + * - only one item allowed + * - key must be valid (that is, known, and not in the autokey range) */ static void -set_request_keyid( - sockaddr_u *srcadr, - endpt *inter, +set_keyid_checked( + keyid_t *into, + const char *what, + sockaddr_u *srcadr, + endpt *inter, struct req_pkt *inpkt ) { keyid_t *pkeyid; + keyid_t tmpkey; - /* - * Restrict ourselves to one item only. - */ + /* restrict ourselves to one item only */ if (INFO_NITEMS(inpkt->err_nitems) > 1) { - msyslog(LOG_ERR, "set_request_keyid: err_nitems > 1"); + msyslog(LOG_ERR, "set_keyid_checked[%s]: err_nitems > 1", + what); req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); return; } + /* plug the new key from the packet */ pkeyid = (keyid_t *)&inpkt->u; - info_auth_keyid = ntohl(*pkeyid); + tmpkey = ntohl(*pkeyid); + + /* validate the new key id, claim data error on failure */ + if (tmpkey < 1 || tmpkey > NTP_MAXKEY || !auth_havekey(tmpkey)) { + msyslog(LOG_ERR, "set_keyid_checked[%s]: invalid key id: %ld", + what, (long)tmpkey); + req_ack(srcadr, inter, inpkt, INFO_ERR_NODATA); + return; + } + + /* if we arrive here, the key is good -- use it */ + *into = tmpkey; req_ack(srcadr, inter, inpkt, INFO_OKAY); } +/* + * set_request_keyid - set the keyid used to authenticate requests + */ +static void +set_request_keyid( + sockaddr_u *srcadr, + endpt *inter, + struct req_pkt *inpkt + ) +{ + set_keyid_checked(&info_auth_keyid, "request", + srcadr, inter, inpkt); +} + /* * set_control_keyid - set the keyid used to authenticate requests */ @@ -2337,20 +2362,8 @@ struct req_pkt *inpkt ) { - keyid_t *pkeyid; - - /* - * Restrict ourselves to one item only. - */ - if (INFO_NITEMS(inpkt->err_nitems) > 1) { - msyslog(LOG_ERR, "set_control_keyid: err_nitems > 1"); - req_ack(srcadr, inter, inpkt, INFO_ERR_FMT); - return; - } - - pkeyid = (keyid_t *)&inpkt->u; - ctl_auth_keyid = ntohl(*pkeyid); - req_ack(srcadr, inter, inpkt, INFO_OKAY); + set_keyid_checked(&ctl_auth_keyid, "control", + srcadr, inter, inpkt); } --- contrib/ntp/ntpd/ntp_timer.c.orig +++ contrib/ntp/ntpd/ntp_timer.c @@ -276,6 +276,12 @@ u_int seconds /* 0 cancels */ ) { +#if defined(HAVE_DROPROOT) && defined(NEED_EARLY_FORK) + if (droproot) { + worker_idle_timer = 0; + return; + } +#endif if (0 == seconds) { worker_idle_timer = 0; return; --- contrib/ntp/ntpd/ntpd-opts.c.orig +++ contrib/ntp/ntpd/ntpd-opts.c @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntpd-opts.c) * - * It has been AutoGen-ed January 20, 2016 at 04:15:45 AM by AutoGen 5.18.5 + * It has been AutoGen-ed April 26, 2016 at 08:26:14 PM by AutoGen 5.18.5 * From the definitions ntpd-opts.def * and the template file options * @@ -75,7 +75,7 @@ * static const strings for ntpd options */ static char const ntpd_opt_strs[3129] = -/* 0 */ "ntpd 4.2.8p6\n" +/* 0 */ "ntpd 4.2.8p7\n" "Copyright (C) 1992-2016 The University of Delaware and Network Time Foundation, all rights reserved.\n" "This is free software. It is licensed for use, modification and\n" "redistribution under the terms of the NTP License, copies of which\n" @@ -205,12 +205,12 @@ /* 2900 */ "output version information and exit\0" /* 2936 */ "version\0" /* 2944 */ "NTPD\0" -/* 2949 */ "ntpd - NTP daemon program - Ver. 4.2.8p6\n" +/* 2949 */ "ntpd - NTP daemon program - Ver. 4.2.8p7\n" "Usage: %s [ - [] | --[{=| }] ]... \\\n" "\t\t[ ... ]\n\0" /* 3080 */ "http://bugs.ntp.org, bugs@ntp.org\0" /* 3114 */ "\n\0" -/* 3116 */ "ntpd 4.2.8p6"; +/* 3116 */ "ntpd 4.2.8p7"; /** * ipv4 option description with @@ -1529,7 +1529,7 @@ translate option names. */ /* referenced via ntpdOptions.pzCopyright */ - puts(_("ntpd 4.2.8p6\n\ + puts(_("ntpd 4.2.8p7\n\ Copyright (C) 1992-2016 The University of Delaware and Network Time Foundation, all rights reserved.\n\ This is free software. It is licensed for use, modification and\n\ redistribution under the terms of the NTP License, copies of which\n\ @@ -1670,7 +1670,7 @@ puts(_("output version information and exit")); /* referenced via ntpdOptions.pzUsageTitle */ - puts(_("ntpd - NTP daemon program - Ver. 4.2.8p6\n\ + puts(_("ntpd - NTP daemon program - Ver. 4.2.8p7\n\ Usage: %s [ - [] | --[{=| }] ]... \\\n\ \t\t[ ... ]\n")); @@ -1678,7 +1678,7 @@ puts(_("\n")); /* referenced via ntpdOptions.pzFullVersion */ - puts(_("ntpd 4.2.8p6")); + puts(_("ntpd 4.2.8p7")); /* referenced via ntpdOptions.pzFullUsage */ puts(_("<<>>")); --- contrib/ntp/ntpd/ntpd-opts.h.orig +++ contrib/ntp/ntpd/ntpd-opts.h @@ -1,7 +1,7 @@ /* * EDIT THIS FILE WITH CAUTION (ntpd-opts.h) * - * It has been AutoGen-ed January 20, 2016 at 04:15:43 AM by AutoGen 5.18.5 + * It has been AutoGen-ed April 26, 2016 at 08:26:13 PM by AutoGen 5.18.5 * From the definitions ntpd-opts.def * and the template file options * @@ -106,9 +106,9 @@ /** count of all options for ntpd */ #define OPTION_CT 38 /** ntpd version */ -#define NTPD_VERSION "4.2.8p6" +#define NTPD_VERSION "4.2.8p7" /** Full ntpd version text */ -#define NTPD_FULL_VERSION "ntpd 4.2.8p6" +#define NTPD_FULL_VERSION "ntpd 4.2.8p7" /** * Interface defines for all options. Replace "n" with the UPPER_CASED --- contrib/ntp/ntpd/ntpd.1ntpdman.orig +++ contrib/ntp/ntpd/ntpd.1ntpdman @@ -10,11 +10,11 @@ .ds B-Font B .ds I-Font I .ds R-Font R -.TH ntpd 1ntpdman "20 Jan 2016" "4.2.8p6" "User Commands" +.TH ntpd 1ntpdman "26 Apr 2016" "4.2.8p7" "User Commands" .\" -.\" EDIT THIS FILE WITH CAUTION (/tmp/.ag-9JaiRS/ag-jKaaQS) +.\" EDIT THIS FILE WITH CAUTION (/tmp/.ag-0uayDF/ag-avaqCF) .\" -.\" It has been AutoGen-ed January 20, 2016 at 04:17:54 AM by AutoGen 5.18.5 +.\" It has been AutoGen-ed April 26, 2016 at 08:28:23 PM by AutoGen 5.18.5 .\" From the definitions ntpd-opts.def .\" and the template file agman-cmd.tpl .SH NAME --- contrib/ntp/ntpd/ntpd.1ntpdmdoc.orig +++ contrib/ntp/ntpd/ntpd.1ntpdmdoc @@ -1,9 +1,9 @@ -.Dd January 20 2016 +.Dd April 26 2016 .Dt NTPD 1ntpdmdoc User Commands .Os .\" EDIT THIS FILE WITH CAUTION (ntpd-opts.mdoc) .\" -.\" It has been AutoGen-ed January 20, 2016 at 04:18:12 AM by AutoGen 5.18.5 +.\" It has been AutoGen-ed April 26, 2016 at 08:28:41 PM by AutoGen 5.18.5 .\" From the definitions ntpd-opts.def .\" and the template file agmdoc-cmd.tpl .Sh NAME --- contrib/ntp/ntpd/ntpd.c.orig +++ contrib/ntp/ntpd/ntpd.c @@ -332,7 +332,17 @@ #endif /*defined(NEED_PTHREAD_WARMUP)*/ +#ifdef NEED_EARLY_FORK +static void +dummy_callback(void) { return; } +static void +fork_nonchroot_worker(void) { + getaddrinfo_sometime("localhost", "ntp", NULL, INITIAL_DNS_RETRY, + (gai_sometime_callback)&dummy_callback, NULL); +} +#endif /* NEED_EARLY_FORK */ + void parse_cmdline_opts( int * pargc, @@ -931,6 +941,11 @@ # ifdef HAVE_DROPROOT if (droproot) { + +#ifdef NEED_EARLY_FORK + fork_nonchroot_worker(); +#endif + /* Drop super-user privileges and chroot now if the OS supports this */ # ifdef HAVE_LINUX_CAPABILITIES --- contrib/ntp/ntpd/ntpd.html.orig +++ contrib/ntp/ntpd/ntpd.html @@ -39,7 +39,7 @@ symmetric and broadcast modes, and with both symmetric-key and public-key cryptography. -

This document applies to version 4.2.8p6 of ntpd. +

This document applies to version 4.2.8p7 of ntpd.