Permalink
Browse files

mac80211: fix fragmentation code, particularly for encryption

The "new" fragmentation code (since my rewrite almost 5 years ago)
erroneously sets skb->len rather than using skb_trim() to adjust
the length of the first fragment after copying out all the others.
This leaves the skb tail pointer pointing to after where the data
originally ended, and thus causes the encryption MIC to be written
at that point, rather than where it belongs: immediately after the
data.

The impact of this is that if software encryption is done, then
 a) encryption doesn't work for the first fragment, the connection
    becomes unusable as the first fragment will never be properly
    verified at the receiver, the MIC is practically guaranteed to
    be wrong
 b) we leak up to 8 bytes of plaintext (!) of the packet out into
    the air

This is only mitigated by the fact that many devices are capable
of doing encryption in hardware, in which case this can't happen
as the tail pointer is irrelevant in that case. Additionally,
fragmentation is not used very frequently and would normally have
to be configured manually.

Fix this by using skb_trim() properly.

Change-Id: I8d800e31b926a9e8b1cb9a3b6d15ebe1417a6a99
Cc: stable@vger.kernel.org
Fixes: 2de8e0d ("mac80211: rewrite fragmentation")
Reported-by: Jouni Malinen <j@w1.fi>
Signed-off-by: Johannes Berg <johannes.berg@intel.com>
  • Loading branch information...
jmberg authored and andi34 committed Jan 31, 2014
1 parent ecd7d68 commit 3cd78031a2406db8ecb69a9b36011261196bb621
Showing with 1 addition and 1 deletion.
  1. +1 −1 net/mac80211/tx.c
View
@@ -874,7 +874,7 @@ static int ieee80211_fragment(struct ieee80211_local *local,
pos += fraglen;
}
skb->len = hdrlen + per_fragm;
skb_trim(skb, hdrlen + per_fragm);
return 0;
}

0 comments on commit 3cd7803

Please sign in to comment.