Description of the problem:
For a TCP-style socket, while processing the COOKIE_ECHO chunk in
sctp_sf_do_5_1D_ce(), after it has passed a series of sanity check, a
new association would be created in sctp_unpack_cookie(), but
afterwards, some processing maybe failed, and sctp_association_free()
will be called to free the previously allocated association, in
sctp_association_free(), sk_ack_backlog value is decremented for this
socket, since the initial value for sk_ack_backlog is 0, after
the decrement, it will be 65535, a wrap-around problem happens, and
if we want to establish new associations afterward in the same
socket, ABORT would be triggered since sctp deem the accept queue as
full.
A remote attacker can block further connection to the particular sctp
server socket by sending a specially crafted sctp packet.
Upstream patch:
https://git.kernel.org/cgit/linux/kernel/git/torvalds/linux.git/commit/?id=d3217b15a19a4779c39b212358a5c71d725822ee
diff --git a/net/sctp/associola.c b/net/sctp/associola.c
index 9e0509c..9de23a2 100644
--- a/net/sctp/associola.c
+++ b/net/sctp/associola.c
@@ -331,7 +331,7 @@ void sctp_association_free(struct sctp_association *asoc)
/* Only real associations count against the endpoint, so
* don't bother for if this is a temporary association.
*/
- if (!asoc->temp) {
+ if (!list_empty(&asoc->asocs)) {
list_del(&asoc->asocs);
/* Decrement the backlog value for a TCP-style listening
References:
https://bugzilla.redhat.com/show_bug.cgi?id=1113967
Thanks,
--
Petr Matousek / Red Hat Product Security