[Acked] [Lucid][CVE-2014-8709] mac80211: fix fragmentation code, particularly for encryption
Andy Whitcroft
apw at canonical.com
Mon Nov 24 12:54:29 UTC 2014
On Mon, Nov 24, 2014 at 12:16:18PM +0000, Luis Henriques wrote:
> From: Johannes Berg <johannes.berg at intel.com>
>
> 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.
>
> Cc: stable at vger.kernel.org
> Fixes: 2de8e0d999b8 ("mac80211: rewrite fragmentation")
> Reported-by: Jouni Malinen <j at w1.fi>
> Signed-off-by: Johannes Berg <johannes.berg at intel.com>
> (backported from commit 338f977f4eb441e69bb9a46eaa0ac715c931a67f)
> CVE-2014-8709
> BugLink: http://bugs.launchpad.net/bugs/1392013
> Signed-off-by: Luis Henriques <luis.henriques at canonical.com>
> ---
> net/mac80211/tx.c | 2 +-
> 1 file changed, 1 insertion(+), 1 deletion(-)
>
> diff --git a/net/mac80211/tx.c b/net/mac80211/tx.c
> index b1d79046257b..687fc8ec71ba 100644
> --- a/net/mac80211/tx.c
> +++ b/net/mac80211/tx.c
> @@ -770,7 +770,7 @@ static int ieee80211_fragment(struct ieee80211_local *local,
> pos += fraglen;
> }
>
> - skb->len = hdrlen + per_fragm;
> + skb_trim(skb, hdrlen + per_fragm);
> return 0;
> }
Looks to do what is claimed, is simple, self-contained, therefore:
Acked-by: Andy Whitcroft <apw at canonical.com>
-apw
More information about the kernel-team
mailing list