Skip to contentSkip to conversation

SCTP: Fix possible memory leak while process INIT chunk with AUTH paramters

PATCH In review Wei Yongjun 2 participants 4 messages Mar 20, 2008 – Mar 25, 2008

Subsystems (3)
lore
Share & tools
lore
#0 lore raw

PATCH 1/1 SCTP: Fix possible memory leak while process INIT chunk with AUTH paramters

While endpoint received INIT/INIT-ACK chunk with AUTH parameters, such as RANDOM, HMAC_ALGO, CHUNKS parameter, if those parameters appear more then once, memory for store those parameters will be malloc more then once and not free.

This patch change to used the first parameter and ignore the others.

net/sctp/sm_make_chunk.c +0 -0
@@ -2458,6 +2458,9 @@ static int sctp_process_param(struct sct
		if (!sctp_auth_enable)
			goto fall_through;

+ if (asoc->peer.peer_random)
+ break;
+

		/* Save peer's random parameter */
		asoc->peer.peer_random = kmemdup(param.p,
					    ntohs(param.p->length), gfp);
@@ -2471,6 +2474,9 @@ static int sctp_process_param(struct sct
		if (!sctp_auth_enable)
			goto fall_through;

+ if (asoc->peer.peer_hmacs) + break;
+

		/* Save peer's HMAC list */
		asoc->peer.peer_hmacs = kmemdup(param.p,
					    ntohs(param.p->length), gfp);
@@ -2487,6 +2493,9 @@ static int sctp_process_param(struct sct
		if (!sctp_auth_enable)
			goto fall_through;

+ if (asoc->peer.peer_chunks)
+ break;
+

		asoc->peer.peer_chunks = kmemdup(param.p,
					    ntohs(param.p->length), gfp);
		if (!asoc->peer.peer_chunks)
#1 lore raw

Hi Wei

Quoted 2 lines · Wei Yongjun

While endpoint received INIT/INIT-ACK chunk with AUTH parameters, such as RANDOM, HMAC_ALGO, CHUNKS parameter, if those parameters appear more then once, memory for store those parameters will be malloc more then once and not free.

All these parameters must be included only once in the packet.

If these things are included more then once, we should either ABORT or completely ignore the packet. I haven't decided which one makes more sense yet.

If someone when to the trouble of violating the protocol, we should not establish the association with them.

-vlad

Quoted 38 lines

This patch change to used the first parameter and ignore the others.

net/sctp/sm_make_chunk.c 2008-02-14 03:57:58.000000000 -0500 renamed from net/sctp/sm_make_chunk.c 2008-02-11 17:14:05.000000000 -0500 +8 -0
@@ -2458,6 +2458,9 @@ static int sctp_process_param(struct sct
        if (!sctp_auth_enable)
            goto fall_through;
 
+        if (asoc->peer.peer_random)
+            break;
+
        /* Save peer's random parameter */
        asoc->peer.peer_random = kmemdup(param.p,
                        ntohs(param.p->length), gfp);
@@ -2471,6 +2474,9 @@ static int sctp_process_param(struct sct
        if (!sctp_auth_enable)
            goto fall_through;
 
+        if (asoc->peer.peer_hmacs) +            break;
+
        /* Save peer's HMAC list */
        asoc->peer.peer_hmacs = kmemdup(param.p,
                        ntohs(param.p->length), gfp);
@@ -2487,6 +2493,9 @@ static int sctp_process_param(struct sct
        if (!sctp_auth_enable)
            goto fall_through;
 
+        if (asoc->peer.peer_chunks)
+            break;
+
        asoc->peer.peer_chunks = kmemdup(param.p,
                        ntohs(param.p->length), gfp);
        if (!asoc->peer.peer_chunks)
#2 lore raw

Hi Vlad:

Quoted 7 lines · Vlad Yasevich

Hi Wei

Quoted 2 lines · Wei Yongjun

While endpoint received INIT/INIT-ACK chunk with AUTH parameters, such as RANDOM, HMAC_ALGO, CHUNKS parameter, if those parameters appear more then once, memory for store those parameters will be malloc more then once and not free.

All these parameters must be included only once in the packet.

RFC 4890 has the following text:

The RANDOM parameter MUST be included once in the INIT or INIT-ACK chunk, if the sender wants to send or receive authenticated chunks, to provide a 32-byte Random Number. For 32-byte Random Numbers, the Padding is empty.

It said *MUST be included once*, not *only once*, is this right?

Quoted 7 lines

If these things are included more then once, we should either ABORT or completely ignore the packet. I haven't decided which one makes more sense yet.

If someone when to the trouble of violating the protocol, we should not establish the association with them.

I think do ABORT with protocol violation is better, do the same thing as the other protocol violation case do.

Wei Yongjun

#3 lore raw
Quoted 13 lines · Wei Yongjun

Hi Vlad:

Quoted 7 lines · Vlad Yasevich

Hi Wei

Quoted 2 lines · Wei Yongjun

While endpoint received INIT/INIT-ACK chunk with AUTH parameters, such as RANDOM, HMAC_ALGO, CHUNKS parameter, if those parameters appear more then once, memory for store those parameters will be malloc more then once and not free.

All these parameters must be included only once in the packet.

RFC 4890 has the following text:

Quoted 7 lines

The RANDOM parameter MUST be included once in the INIT or INIT-ACK chunk, if the sender wants to send or receive authenticated chunks, to provide a 32-byte Random Number. For 32-byte Random Numbers, the Padding is empty.

It said *MUST be included once*, not *only once*, is this right?

I guess it depends on the interpretation. If they are allowed more then once, then which parameter should be used. The spec leaves that undefined.

Undefined behavior on a security extension is usually treated as an exploit. That's my take on this.

Quoted 10 lines
Quoted 8 lines

If these things are included more then once, we should either ABORT or completely ignore the packet. I haven't decided which one makes more sense yet.

If someone when to the trouble of violating the protocol, we should not establish the association with them.

I think do ABORT with protocol violation is better, do the same thing as the other protocol violation case do.

Yes.

-vlad

Quoted 3 lines

Wei Yongjun