From: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
To: linux-kernel@vger.kernel.org
Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org>,
stable@vger.kernel.org,
Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>,
Xin Long <lucien.xin@gmail.com>,
Neil Horman <nhorman@tuxdriver.com>,
"David S. Miller" <davem@davemloft.net>
Subject: [PATCH 4.16 23/55] sctp: delay the authentication for the duplicated cookie-echo chunk
Date: Fri, 18 May 2018 10:15:19 +0200 [thread overview]
Message-ID: <20180518081458.579107395@linuxfoundation.org> (raw)
In-Reply-To: <20180518081457.428920292@linuxfoundation.org>
4.16-stable review patch. If anyone has any objections, please let me know.
------------------
From: Xin Long <lucien.xin@gmail.com>
[ Upstream commit 59d8d4434f429b4fa8a346fd889058bda427a837 ]
Now sctp only delays the authentication for the normal cookie-echo
chunk by setting chunk->auth_chunk in sctp_endpoint_bh_rcv(). But
for the duplicated one with auth, in sctp_assoc_bh_rcv(), it does
authentication first based on the old asoc, which will definitely
fail due to the different auth info in the old asoc.
The duplicated cookie-echo chunk will create a new asoc with the
auth info from this chunk, and the authentication should also be
done with the new asoc's auth info for all of the collision 'A',
'B' and 'D'. Otherwise, the duplicated cookie-echo chunk with auth
will never pass the authentication and create the new connection.
This issue exists since very beginning, and this fix is to make
sctp_assoc_bh_rcv() follow the way sctp_endpoint_bh_rcv() does
for the normal cookie-echo chunk to delay the authentication.
While at it, remove the unused params from sctp_sf_authenticate()
and define sctp_auth_chunk_verify() used for all the places that
do the delayed authentication.
v1->v2:
fix the typo in changelog as Marcelo noticed.
Acked-by: Marcelo Ricardo Leitner <marcelo.leitner@gmail.com>
Signed-off-by: Xin Long <lucien.xin@gmail.com>
Acked-by: Neil Horman <nhorman@tuxdriver.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
---
net/sctp/associola.c | 30 ++++++++++++++++
net/sctp/sm_statefuns.c | 86 +++++++++++++++++++++++++-----------------------
2 files changed, 75 insertions(+), 41 deletions(-)
--- a/net/sctp/associola.c
+++ b/net/sctp/associola.c
@@ -1024,8 +1024,9 @@ static void sctp_assoc_bh_rcv(struct wor
struct sctp_endpoint *ep;
struct sctp_chunk *chunk;
struct sctp_inq *inqueue;
- int state;
+ int first_time = 1; /* is this the first time through the loop */
int error = 0;
+ int state;
/* The association should be held so we should be safe. */
ep = asoc->ep;
@@ -1036,6 +1037,30 @@ static void sctp_assoc_bh_rcv(struct wor
state = asoc->state;
subtype = SCTP_ST_CHUNK(chunk->chunk_hdr->type);
+ /* If the first chunk in the packet is AUTH, do special
+ * processing specified in Section 6.3 of SCTP-AUTH spec
+ */
+ if (first_time && subtype.chunk == SCTP_CID_AUTH) {
+ struct sctp_chunkhdr *next_hdr;
+
+ next_hdr = sctp_inq_peek(inqueue);
+ if (!next_hdr)
+ goto normal;
+
+ /* If the next chunk is COOKIE-ECHO, skip the AUTH
+ * chunk while saving a pointer to it so we can do
+ * Authentication later (during cookie-echo
+ * processing).
+ */
+ if (next_hdr->type == SCTP_CID_COOKIE_ECHO) {
+ chunk->auth_chunk = skb_clone(chunk->skb,
+ GFP_ATOMIC);
+ chunk->auth = 1;
+ continue;
+ }
+ }
+
+normal:
/* SCTP-AUTH, Section 6.3:
* The receiver has a list of chunk types which it expects
* to be received only after an AUTH-chunk. This list has
@@ -1074,6 +1099,9 @@ static void sctp_assoc_bh_rcv(struct wor
/* If there is an error on chunk, discard this packet. */
if (error && chunk)
chunk->pdiscard = 1;
+
+ if (first_time)
+ first_time = 0;
}
sctp_association_put(asoc);
}
--- a/net/sctp/sm_statefuns.c
+++ b/net/sctp/sm_statefuns.c
@@ -153,10 +153,7 @@ static enum sctp_disposition sctp_sf_vio
struct sctp_cmd_seq *commands);
static enum sctp_ierror sctp_sf_authenticate(
- struct net *net,
- const struct sctp_endpoint *ep,
const struct sctp_association *asoc,
- const union sctp_subtype type,
struct sctp_chunk *chunk);
static enum sctp_disposition __sctp_sf_do_9_1_abort(
@@ -621,6 +618,38 @@ enum sctp_disposition sctp_sf_do_5_1C_ac
return SCTP_DISPOSITION_CONSUME;
}
+static bool sctp_auth_chunk_verify(struct net *net, struct sctp_chunk *chunk,
+ const struct sctp_association *asoc)
+{
+ struct sctp_chunk auth;
+
+ if (!chunk->auth_chunk)
+ return true;
+
+ /* SCTP-AUTH: auth_chunk pointer is only set when the cookie-echo
+ * is supposed to be authenticated and we have to do delayed
+ * authentication. We've just recreated the association using
+ * the information in the cookie and now it's much easier to
+ * do the authentication.
+ */
+
+ /* Make sure that we and the peer are AUTH capable */
+ if (!net->sctp.auth_enable || !asoc->peer.auth_capable)
+ return false;
+
+ /* set-up our fake chunk so that we can process it */
+ auth.skb = chunk->auth_chunk;
+ auth.asoc = chunk->asoc;
+ auth.sctp_hdr = chunk->sctp_hdr;
+ auth.chunk_hdr = (struct sctp_chunkhdr *)
+ skb_push(chunk->auth_chunk,
+ sizeof(struct sctp_chunkhdr));
+ skb_pull(chunk->auth_chunk, sizeof(struct sctp_chunkhdr));
+ auth.transport = chunk->transport;
+
+ return sctp_sf_authenticate(asoc, &auth) == SCTP_IERROR_NO_ERROR;
+}
+
/*
* Respond to a normal COOKIE ECHO chunk.
* We are the side that is being asked for an association.
@@ -758,37 +787,9 @@ enum sctp_disposition sctp_sf_do_5_1D_ce
if (error)
goto nomem_init;
- /* SCTP-AUTH: auth_chunk pointer is only set when the cookie-echo
- * is supposed to be authenticated and we have to do delayed
- * authentication. We've just recreated the association using
- * the information in the cookie and now it's much easier to
- * do the authentication.
- */
- if (chunk->auth_chunk) {
- struct sctp_chunk auth;
- enum sctp_ierror ret;
-
- /* Make sure that we and the peer are AUTH capable */
- if (!net->sctp.auth_enable || !new_asoc->peer.auth_capable) {
- sctp_association_free(new_asoc);
- return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
- }
-
- /* set-up our fake chunk so that we can process it */
- auth.skb = chunk->auth_chunk;
- auth.asoc = chunk->asoc;
- auth.sctp_hdr = chunk->sctp_hdr;
- auth.chunk_hdr = (struct sctp_chunkhdr *)
- skb_push(chunk->auth_chunk,
- sizeof(struct sctp_chunkhdr));
- skb_pull(chunk->auth_chunk, sizeof(struct sctp_chunkhdr));
- auth.transport = chunk->transport;
-
- ret = sctp_sf_authenticate(net, ep, new_asoc, type, &auth);
- if (ret != SCTP_IERROR_NO_ERROR) {
- sctp_association_free(new_asoc);
- return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
- }
+ if (!sctp_auth_chunk_verify(net, chunk, new_asoc)) {
+ sctp_association_free(new_asoc);
+ return sctp_sf_pdiscard(net, ep, asoc, type, arg, commands);
}
repl = sctp_make_cookie_ack(new_asoc, chunk);
@@ -1758,13 +1759,15 @@ static enum sctp_disposition sctp_sf_do_
GFP_ATOMIC))
goto nomem;
+ if (!sctp_auth_chunk_verify(net, chunk, new_asoc))
+ return SCTP_DISPOSITION_DISCARD;
+
/* Make sure no new addresses are being added during the
* restart. Though this is a pretty complicated attack
* since you'd have to get inside the cookie.
*/
- if (!sctp_sf_check_restart_addrs(new_asoc, asoc, chunk, commands)) {
+ if (!sctp_sf_check_restart_addrs(new_asoc, asoc, chunk, commands))
return SCTP_DISPOSITION_CONSUME;
- }
/* If the endpoint is in the SHUTDOWN-ACK-SENT state and recognizes
* the peer has restarted (Action A), it MUST NOT setup a new
@@ -1870,6 +1873,9 @@ static enum sctp_disposition sctp_sf_do_
GFP_ATOMIC))
goto nomem;
+ if (!sctp_auth_chunk_verify(net, chunk, new_asoc))
+ return SCTP_DISPOSITION_DISCARD;
+
/* Update the content of current association. */
sctp_add_cmd_sf(commands, SCTP_CMD_UPDATE_ASSOC, SCTP_ASOC(new_asoc));
sctp_add_cmd_sf(commands, SCTP_CMD_NEW_STATE,
@@ -1964,6 +1970,9 @@ static enum sctp_disposition sctp_sf_do_
* a COOKIE ACK.
*/
+ if (!sctp_auth_chunk_verify(net, chunk, asoc))
+ return SCTP_DISPOSITION_DISCARD;
+
/* Don't accidentally move back into established state. */
if (asoc->state < SCTP_STATE_ESTABLISHED) {
sctp_add_cmd_sf(commands, SCTP_CMD_TIMER_STOP,
@@ -4108,10 +4117,7 @@ gen_shutdown:
* The return value is the disposition of the chunk.
*/
static enum sctp_ierror sctp_sf_authenticate(
- struct net *net,
- const struct sctp_endpoint *ep,
const struct sctp_association *asoc,
- const union sctp_subtype type,
struct sctp_chunk *chunk)
{
struct sctp_authhdr *auth_hdr;
@@ -4209,7 +4215,7 @@ enum sctp_disposition sctp_sf_eat_auth(s
commands);
auth_hdr = (struct sctp_authhdr *)chunk->skb->data;
- error = sctp_sf_authenticate(net, ep, asoc, type, chunk);
+ error = sctp_sf_authenticate(asoc, chunk);
switch (error) {
case SCTP_IERROR_AUTH_BAD_HMAC:
/* Generate the ERROR chunk and discard the rest
next prev parent reply other threads:[~2018-05-18 8:15 UTC|newest]
Thread overview: 63+ messages / expand[flat|nested] mbox.gz Atom feed top
2018-05-18 8:14 [PATCH 4.16 00/55] 4.16.10-stable review Greg Kroah-Hartman
2018-05-18 8:14 ` [PATCH 4.16 01/55] 8139too: Use disable_irq_nosync() in rtl8139_poll_controller() Greg Kroah-Hartman
2018-05-18 8:14 ` [PATCH 4.16 02/55] bridge: check iface upper dev when setting master via ioctl Greg Kroah-Hartman
2018-05-18 8:14 ` [PATCH 4.16 03/55] dccp: fix tasklet usage Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 04/55] ipv4: fix fnhe usage by non-cached routes Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 05/55] ipv4: fix memory leaks in udp_sendmsg, ping_v4_sendmsg Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 06/55] llc: better deal with too small mtu Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 07/55] net: ethernet: sun: niu set correct packet size in skb Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 08/55] net: ethernet: ti: cpsw: fix packet leaking in dual_mac mode Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 09/55] net/mlx4_en: Fix an error handling path in mlx4_en_init_netdev() Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 10/55] net/mlx4_en: Verify coalescing parameters are in range Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 11/55] net/mlx5e: Err if asked to offload TC match on frag being first Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 12/55] net/mlx5: E-Switch, Include VF RDMA stats in vport statistics Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 13/55] net sched actions: fix refcnt leak in skbmod Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 14/55] net_sched: fq: take care of throttled flows before reuse Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 15/55] net/smc: restrict non-blocking connect finish Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 16/55] net: support compat 64-bit time in {s,g}etsockopt Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 17/55] net/tls: Dont recursively call push_record during tls_write_space callbacks Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 18/55] net/tls: Fix connection stall on partial tls record Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 19/55] openvswitch: Dont swap table in nlattr_set() after OVS_ATTR_NESTED is found Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 20/55] qmi_wwan: do not steal interfaces from class drivers Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 21/55] r8169: fix powering up RTL8168h Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 22/55] rds: do not leak kernel memory to user land Greg Kroah-Hartman
2018-05-18 8:15 ` Greg Kroah-Hartman [this message]
2018-05-18 8:15 ` [PATCH 4.16 24/55] sctp: fix the issue that the cookie-ack with auth cant get processed Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 25/55] sctp: handle two v4 addrs comparison in sctp_inet6_cmp_addr Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 26/55] sctp: remove sctp_chunk_put from fail_mark err path in sctp_ulpevent_make_rcvmsg Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 27/55] sctp: use the old asoc when making the cookie-ack chunk in dupcook_d Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 28/55] tcp_bbr: fix to zero idle_restart only upon S/ACKed data Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 29/55] tcp: ignore Fast Open on repair mode Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 30/55] tg3: Fix vunmap() BUG_ON() triggered from tg3_free_consistent() Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 31/55] bonding: do not allow rlb updates to invalid mac Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 32/55] bonding: send learning packets for vlans on slave Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 33/55] net: sched: fix error path in tcf_proto_create() when modules are not configured Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 34/55] net/mlx5e: TX, Use correct counter in dma_map error flow Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 35/55] net/mlx5: Avoid cleaning flow steering table twice during " Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 36/55] hv_netvsc: set master device Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 37/55] ipv6: fix uninit-value in ip6_multipath_l3_keys() Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 38/55] net/mlx5e: Allow offloading ipv4 header re-write for icmp Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 39/55] nsh: fix infinite loop Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 40/55] udp: fix SO_BINDTODEVICE Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 41/55] mlxsw: spectrum_switchdev: Do not remove mrouter port from MDBs ports list Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 42/55] net/mlx5e: DCBNL fix min inline header size for dscp Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 43/55] net: systemport: Correclty disambiguate driver instances Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 44/55] nfp: flower: set tunnel ttl value to net default Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 45/55] sctp: clear the new asocs stream outcnt in sctp_stream_update Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 46/55] tcp: restore autocorking Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 47/55] tipc: fix one byte leak in tipc_sk_set_orig_addr() Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 48/55] hv_netvsc: Fix net device attach on older Windows hosts Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 49/55] ipv4: reset fnhe_mtu_locked after cache route flushed Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 50/55] mlxsw: core: Fix an error handling path in mlxsw_core_bus_device_register() Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 51/55] net/mlx5: Fix mlx5_get_vector_affinity function Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 52/55] net: phy: sfp: fix the BR,min computation Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 53/55] net/smc: keep clcsock reference in smc_tcp_listen_work() Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 54/55] scsi: aacraid: Correct hba_send to include iu_type Greg Kroah-Hartman
2018-05-18 8:15 ` [PATCH 4.16 55/55] proc: do not access cmdline nor environ from file-backed areas Greg Kroah-Hartman
2018-05-18 12:05 ` [PATCH 4.16 00/55] 4.16.10-stable review kernelci.org bot
2018-05-18 13:29 ` Guenter Roeck
2018-05-18 13:56 ` Greg Kroah-Hartman
2018-05-18 19:25 ` Naresh Kamboju
2018-05-19 7:43 ` Greg Kroah-Hartman
2018-05-18 20:45 ` Shuah Khan
2018-05-19 7:42 ` Greg Kroah-Hartman
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20180518081458.579107395@linuxfoundation.org \
--to=gregkh@linuxfoundation.org \
--cc=davem@davemloft.net \
--cc=linux-kernel@vger.kernel.org \
--cc=lucien.xin@gmail.com \
--cc=marcelo.leitner@gmail.com \
--cc=nhorman@tuxdriver.com \
--cc=stable@vger.kernel.org \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox