Skip to content

Commit

Permalink
Remove --no-replay option
Browse files Browse the repository at this point in the history
Officially deprecated since v2.4.
We have warned about using this forever.
It is time to pull the plug.

Change-Id: I58706019add6d348483ba222dd74e1466ff6c709
Signed-off-by: Frank Lichtenheld <[email protected]>
Acked-by: Heiko Hund <[email protected]>
Message-Id: <[email protected]>
URL: https://www.mail-archive.com/[email protected]/msg27059.html
Signed-off-by: Gert Doering <[email protected]>
  • Loading branch information
flichtenheld authored and cron2 committed Sep 22, 2023
1 parent e363b39 commit 6d76218
Show file tree
Hide file tree
Showing 12 changed files with 22 additions and 90 deletions.
3 changes: 1 addition & 2 deletions doc/man-sections/link-options.rst
Original file line number Diff line number Diff line change
Expand Up @@ -366,8 +366,7 @@ the local and the remote host.
order they were received to the TCP/IP protocol stack, provided they
satisfy several constraints.

(a) The packet cannot be a replay (unless ``--no-replay`` is
specified, which disables replay protection altogether).
(a) The packet cannot be a replay.

(b) If a packet arrives out of order, it will only be accepted if
the difference between its sequence number and the highest sequence
Expand Down
2 changes: 1 addition & 1 deletion doc/man-sections/server-options.rst
Original file line number Diff line number Diff line change
Expand Up @@ -406,7 +406,7 @@ fast hardware. SSL/TLS authentication must be used in this mode.
Options that will be compared for compatibility include ``dev-type``,
``link-mtu``, ``tun-mtu``, ``proto``, ``ifconfig``,
``comp-lzo``, ``fragment``, ``keydir``, ``cipher``,
``auth``, ``keysize``, ``secret``, ``no-replay``,
``auth``, ``keysize``, ``secret``,
``tls-auth``, ``key-method``, ``tls-server``
and ``tls-client``.

Expand Down
5 changes: 3 additions & 2 deletions doc/man-sections/unsupported-options.rst
Original file line number Diff line number Diff line change
Expand Up @@ -30,8 +30,9 @@ longer supported
VPN tunnel security. This has been a NOOP option since OpenVPN 2.4.

--no-replay
Removed in OpenVPN 2.5. This option should not be used as it weakens the
VPN tunnel security.
Removed in OpenVPN 2.7. This option should not be used as it weakens the
VPN tunnel security. Previously we claimed to have removed this in
OpenVPN 2.5, but this wasn't actually the case.

--ns-cert-type
Removed in OpenVPN 2.5. The ``nsCertType`` field is no longer supported
Expand Down
14 changes: 1 addition & 13 deletions src/openvpn/crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -328,7 +328,7 @@ crypto_check_replay(struct crypto_options *opt,
if (!(opt->flags & CO_MUTE_REPLAY_WARNINGS))
{
msg(D_REPLAY_ERRORS, "%s: bad packet ID (may be a replay): %s -- "
"see the man page entry for --no-replay and --replay-window for "
"see the man page entry for --replay-window for "
"more info or silence this warning with --mute-replay-warnings",
error_prefix, packet_id_net_print(pin, true, gc));
}
Expand Down Expand Up @@ -942,18 +942,6 @@ check_key(struct key *key, const struct key_type *kt)
return true;
}

void
check_replay_consistency(const struct key_type *kt, bool packet_id)
{
ASSERT(kt);

if (!packet_id && (cipher_kt_mode_ofb_cfb(kt->cipher)
|| cipher_kt_mode_aead(kt->cipher)))
{
msg(M_FATAL, "--no-replay cannot be used with a CFB, OFB or AEAD mode cipher");
}
}

/*
* Generate a random key.
*/
Expand Down
6 changes: 2 additions & 4 deletions src/openvpn/crypto.h
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,7 @@
* HMAC at all.
* - \b Ciphertext \b IV. The IV size depends on the \c \-\-cipher option.
* - \b Packet \b ID, a 32-bit incrementing packet counter that provides replay
* protection (if not disabled by \c \-\-no-replay).
* protection.
* - \b Timestamp, a 32-bit timestamp of the current time.
* - \b Payload, the plain text network packet to be encrypted (unless
* encryption is disabled by using \c \-\-cipher \c none). The payload might
Expand Down Expand Up @@ -304,8 +304,6 @@ void read_key_file(struct key2 *key2, const char *file, const unsigned int flags
*/
int write_key_file(const int nkeys, const char *filename);

void check_replay_consistency(const struct key_type *kt, bool packet_id);

bool check_key(struct key *key, const struct key_type *kt);

bool write_key(const struct key *key, const struct key_type *kt,
Expand Down Expand Up @@ -445,7 +443,7 @@ void crypto_adjust_frame_parameters(struct frame *frame,
* this and add it themselves.
*
* @param kt Struct with the crypto algorithm to use
* @param packet_id_size Size of the packet id, can be 0 if no-replay is used
* @param packet_id_size Size of the packet id
* @param occ if true calculates the overhead for crypto in the same
* incorrect way as all previous OpenVPN versions did, to
* end up with identical numbers for OCC compatibility
Expand Down
31 changes: 8 additions & 23 deletions src/openvpn/init.c
Original file line number Diff line number Diff line change
Expand Up @@ -3019,17 +3019,14 @@ do_init_crypto_static(struct context *c, const unsigned int flags)
}

/* Initialize packet ID tracking */
if (options->replay)
{
packet_id_init(&c->c2.crypto_options.packet_id,
options->replay_window,
options->replay_time,
"STATIC", 0);
c->c2.crypto_options.pid_persist = &c->c1.pid_persist;
c->c2.crypto_options.flags |= CO_PACKET_ID_LONG_FORM;
packet_id_persist_load_obj(&c->c1.pid_persist,
&c->c2.crypto_options.packet_id);
}
packet_id_init(&c->c2.crypto_options.packet_id,
options->replay_window,
options->replay_time,
"STATIC", 0);
c->c2.crypto_options.pid_persist = &c->c1.pid_persist;
c->c2.crypto_options.flags |= CO_PACKET_ID_LONG_FORM;
packet_id_persist_load_obj(&c->c1.pid_persist,
&c->c2.crypto_options.packet_id);

if (!key_ctx_bi_defined(&c->c1.ks.static_key))
{
Expand All @@ -3051,9 +3048,6 @@ do_init_crypto_static(struct context *c, const unsigned int flags)

/* Get key schedule */
c->c2.crypto_options.key_ctx_bi = c->c1.ks.static_key;

/* Sanity check on sequence number, and cipher mode options */
check_replay_consistency(&c->c1.ks.key_type, options->replay);
}

/*
Expand Down Expand Up @@ -3256,9 +3250,6 @@ do_init_crypto_tls(struct context *c, const unsigned int flags)
return;
}

/* Sanity check on sequence number, and cipher mode options */
check_replay_consistency(&c->c1.ks.key_type, options->replay);

/* In short form, unique datagram identifier is 32 bits, in long form 64 bits */
packet_id_long_form = cipher_kt_mode_ofb_cfb(c->c1.ks.key_type.cipher);

Expand All @@ -3279,7 +3270,6 @@ do_init_crypto_tls(struct context *c, const unsigned int flags)
to.ssl_ctx = c->c1.ks.ssl_ctx;
to.key_type = c->c1.ks.key_type;
to.server = options->tls_server;
to.replay = options->replay;
to.replay_window = options->replay_window;
to.replay_time = options->replay_time;
to.tcp_mode = link_socket_proto_connection_oriented(options->ce.proto);
Expand Down Expand Up @@ -3645,11 +3635,6 @@ do_option_warnings(struct context *c)
}
}

if (!o->replay)
{
msg(M_WARN, "WARNING: You have disabled Replay Protection (--no-replay) which may make " PACKAGE_NAME " less secure");
}

if (o->tls_server)
{
warn_on_use_of_common_subnets(&c->net_ctx);
Expand Down
7 changes: 0 additions & 7 deletions src/openvpn/mtu.c
Original file line number Diff line number Diff line change
Expand Up @@ -52,13 +52,6 @@ alloc_buf_sock_tun(struct buffer *buf,
unsigned int
calc_packet_id_size_dc(const struct options *options, const struct key_type *kt)
{
/* Unless no-replay is enabled, we have a packet id, no matter if
* encryption is used or not */
if (!options->replay)
{
return 0;
}

bool tlsmode = options->tls_server || options->tls_client;

bool packet_id_long_form = !tlsmode || cipher_kt_mode_ofb_cfb(kt->cipher);
Expand Down
22 changes: 3 additions & 19 deletions src/openvpn/options.c
Original file line number Diff line number Diff line change
Expand Up @@ -549,7 +549,6 @@ static const char usage_message[] =
#ifndef ENABLE_CRYPTO_MBEDTLS
"--engine [name] : Enable OpenSSL hardware crypto engine functionality.\n"
#endif
"--no-replay : (DEPRECATED) Disable replay protection.\n"
"--mute-replay-warnings : Silence the output of replay warnings to log file.\n"
"--replay-window n [t] : Use a replay protection sliding window of size n\n"
" and a time window of t seconds.\n"
Expand Down Expand Up @@ -868,7 +867,6 @@ init_options(struct options *o, const bool init_gc)
o->ifconfig_pool_persist_refresh_freq = 600;
o->scheduled_exit_interval = 5;
o->authname = "SHA1";
o->replay = true;
o->replay_window = DEFAULT_SEQ_BACKTRACK;
o->replay_time = DEFAULT_TIME_BACKTRACK;
o->key_direction = KEY_DIRECTION_BIDIRECTIONAL;
Expand Down Expand Up @@ -1954,7 +1952,6 @@ show_settings(const struct options *o)
#ifndef ENABLE_CRYPTO_MBEDTLS
SHOW_BOOL(engine);
#endif /* ENABLE_CRYPTO_MBEDTLS */
SHOW_BOOL(replay);
SHOW_BOOL(mute_replay_warnings);
SHOW_INT(replay_window);
SHOW_INT(replay_time);
Expand Down Expand Up @@ -2816,16 +2813,6 @@ options_postprocess_verify_ce(const struct options *options,
}
}

/*
* Check consistency of replay options
*/
if (!options->replay
&& (options->replay_window != defaults.replay_window
|| options->replay_time != defaults.replay_time))
{
msg(M_USAGE, "--replay-window doesn't make sense when replay protection is disabled with --no-replay");
}

/*
* SSL/TLS mode sanity checks.
*/
Expand Down Expand Up @@ -4198,7 +4185,6 @@ options_postprocess_pull(struct options *o, struct env_set *es)
* --cipher
* --auth
* --secret
* --no-replay
*
* SSL Options:
*
Expand Down Expand Up @@ -4364,10 +4350,6 @@ options_string(const struct options *o,
{
buf_printf(&out, ",secret");
}
if (!o->replay)
{
buf_printf(&out, ",no-replay");
}

#ifdef ENABLE_PREDICTION_RESISTANCE
if (o->use_prediction_resistance)
Expand Down Expand Up @@ -8670,7 +8652,9 @@ add_option(struct options *options,
else if (streq(p[0], "no-replay") && !p[1])
{
VERIFY_PERMISSION(OPT_P_GENERAL);
options->replay = false;
/* always error out, this breaks the connection */
msg(M_FATAL, "--no-replay was removed in OpenVPN 2.7. "
"Update your configuration.");
}
else if (streq(p[0], "replay-window") && !p[3])
{
Expand Down
1 change: 0 additions & 1 deletion src/openvpn/options.h
Original file line number Diff line number Diff line change
Expand Up @@ -560,7 +560,6 @@ struct options
const char *authname;
const char *engine;
struct provider_list providers;
bool replay;
bool mute_replay_warnings;
int replay_window;
int replay_time;
Expand Down
9 changes: 3 additions & 6 deletions src/openvpn/ssl.c
Original file line number Diff line number Diff line change
Expand Up @@ -1007,12 +1007,9 @@ key_state_init(struct tls_session *session, struct key_state *ks)
reliable_set_timeout(ks->send_reliable, session->opt->packet_timeout);

/* init packet ID tracker */
if (session->opt->replay)
{
packet_id_init(&ks->crypto_options.packet_id,
session->opt->replay_window, session->opt->replay_time, "SSL",
ks->key_id);
}
packet_id_init(&ks->crypto_options.packet_id,
session->opt->replay_window, session->opt->replay_time, "SSL",
ks->key_id);

ks->crypto_options.pid_persist = NULL;

Expand Down
1 change: 0 additions & 1 deletion src/openvpn/ssl_common.h
Original file line number Diff line number Diff line change
Expand Up @@ -310,7 +310,6 @@ struct tls_options
const char *remote_options;

/* from command line */
bool replay;
bool single_session;
bool disable_occ;
int mode;
Expand Down
11 changes: 0 additions & 11 deletions tests/unit_tests/openvpn/test_crypto.c
Original file line number Diff line number Diff line change
Expand Up @@ -247,7 +247,6 @@ test_occ_mtu_calculation(void **state)

/* common defaults */
o.ce.tun_mtu = 1400;
o.replay = true;
o.ce.proto = PROTO_UDP;

/* No crypto at all */
Expand Down Expand Up @@ -334,15 +333,6 @@ test_occ_mtu_calculation(void **state)
linkmtu = calc_options_string_link_mtu(&o, &f);
assert_int_equal(linkmtu, 1405);

/* tls client, auth none, cipher none, no-replay */
o.replay = false;

linkmtu = calc_options_string_link_mtu(&o, &f);
assert_int_equal(linkmtu, 1401);


o.replay = true;

/* tls client, auth SHA1, cipher AES-256-GCM */
o.authname = "SHA1";
o.ciphername = "AES-256-GCM";
Expand Down Expand Up @@ -378,7 +368,6 @@ test_mssfix_mtu_calculation(void **state)
/* common defaults */
o.ce.tun_mtu = 1400;
o.ce.mssfix = 1000;
o.replay = true;
o.ce.proto = PROTO_UDP;

/* No crypto at all */
Expand Down

0 comments on commit 6d76218

Please sign in to comment.