ppp: mppe: discard late packet in stateless mode
authorSylvain Rochet <sylvain.rochet@finsecur.com>
Sun, 26 Apr 2015 18:40:53 +0000 (20:40 +0200)
committerDavid S. Miller <davem@davemloft.net>
Mon, 27 Apr 2015 03:25:13 +0000 (23:25 -0400)
When PPP is used over a link which does not guarantee packet ordering,
we might get late MPPE packets. This is a problem because MPPE must be
kept synchronized and the current implementation does not drop them and
rekey 4095 times instead of 0, which is wrong.

In order to prevent rekeying about a whole count space times (~ 4095
times), drop packets which are not within the forward 4096/2 window and
increase sanity error counter.

Signed-off-by: Sylvain Rochet <sylvain.rochet@finsecur.com>
Signed-off-by: David S. Miller <davem@davemloft.net>
drivers/net/ppp/ppp_mppe.c

index 692ee0ff0db1ce9a0be5b36965f9441e7c7ecace..05005c660d4d954527d278130824f232383c2d49 100644 (file)
@@ -533,6 +533,13 @@ mppe_decompress(void *arg, unsigned char *ibuf, int isize, unsigned char *obuf,
         */
 
        if (!state->stateful) {
+               /* Discard late packet */
+               if ((ccount - state->ccount) % MPPE_CCOUNT_SPACE
+                                               > MPPE_CCOUNT_SPACE / 2) {
+                       state->sanity_errors++;
+                       goto sanity_error;
+               }
+
                /* RFC 3078, sec 8.1.  Rekey for every packet. */
                while (state->ccount != ccount) {
                        mppe_rekey(state, 0);