Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]
Groups > linux.kernel > #1630556
| Path | csiph.com!weretis.net!feeder4.news.weretis.net!news.unit0.net!news.panservice.it!bofh.it!news.nic.it!robomod |
|---|---|
| From | "Jason A. Donenfeld" <Jason@zx2c4.com> |
| Newsgroups | linux.kernel |
| Subject | [PATCH v3 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow |
| Date | Tue, 25 Apr 2017 16:30:02 +0200 |
| Message-ID | <tA9DA-5OC-19@gated-at.bofh.it> (permalink) |
| References | <tA9tU-5Lr-11@gated-at.bofh.it> |
| X-Original-To | netdev@vger.kernel.org, linux-kernel@vger.kernel.org, davem@davemloft.net, David.Laight@aculab.com, kernel-hardening@lists.openwall.com |
| Dkim-Signature | v=1; a=rsa-sha1; c=relaxed; d=zx2c4.com; h=from:to:cc :subject:date:message-id:in-reply-to:references; s=mail; bh=tOtz e5pcO+n4w6iuok8qlvMDPGg=; b=wzkbivGOK+CZN//+9H82oVAy359/+vPMPUxD XPGWcOyN1XZP0xeV9ubeuVK0tgNFGnkI/gAGuv35mkwJiGjNguuDmXRbZJuSUcFB XnxgP1tr+d8ymutuLIO8CCp5Gplmp1lW3ee3MkrUp0DAyTV99imluKfmRp/Xbhbk u0OZTLBno+4GNFfaNQOY9bIxIGOspoynYCe3zNfXxavr1NkJ4CLZOPfaF+nuVXo7 M6dQb+YBGc8xckwZ6pxyV2G5NxGNpou8qGN4DFXW1U5+eQmQTgjffAyZVuNh1g59 aED99Cack6Aws6AVBOwGn3rvIZGrqkI57EREnuA8toqqFTFVRQ== |
| X-Mailer | git-send-email 2.12.2 |
| Sender | robomod@news.nic.it |
| List-ID | <linux-kernel.vger.kernel.org> |
| X-Mailing-List | linux-kernel@vger.kernel.org |
| Approved | robomod@news.nic.it |
| Lines | 62 |
| Organization | linux.* mail to news gateway |
| X-Original-Cc | "Jason A. Donenfeld" <Jason@zx2c4.com> |
| X-Original-Date | Tue, 25 Apr 2017 16:21:12 +0200 |
| X-Original-Message-ID | <20170425142112.29702-1-Jason@zx2c4.com> |
| X-Original-References | <20170425141609.28459-1-Jason@zx2c4.com> |
| X-Original-Sender | linux-kernel-owner@vger.kernel.org |
| Xref | csiph.com linux.kernel:1630556 |
Show key headers only | View raw
This is a defense-in-depth measure in response to bugs like
4d6fa57b4dab0d77f4d8e9d9c73d1e63f6fe8fee.
Signed-off-by: Jason A. Donenfeld <Jason@zx2c4.com>
---
Sorry for the completely stupid amount of churn - v1,v2,v3 in the span of
two minutes. It's just that after noticing first that nsg needs to be checked,
I also noticed something a bit worse: that there was a bug (exploitable?) where
if skb_to_sgvec was called with empty values, there would be an out-of-bounds
write into sg[0 - 1]. So, this third (and hopefully final!) patch fixes that
bug while we're at it.
net/core/skbuff.c | 13 ++++++++++++-
1 file changed, 12 insertions(+), 1 deletion(-)
diff --git a/net/core/skbuff.c b/net/core/skbuff.c
index f86bf69cfb8d..d103134deddb 100644
--- a/net/core/skbuff.c
+++ b/net/core/skbuff.c
@@ -3489,7 +3489,9 @@ void __init skb_init(void)
* @len: Length of buffer space to be mapped
*
* Fill the specified scatter-gather list with mappings/pointers into a
- * region of the buffer space attached to a socket buffer.
+ * region of the buffer space attached to a socket buffer. Returns either
+ * the number of scatterlist items used, or -EMSGSIZE if the contents
+ * could not fit.
*/
static int
__skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
@@ -3512,6 +3514,9 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
for (i = 0; i < skb_shinfo(skb)->nr_frags; i++) {
int end;
+ if (elt && sg_is_last(&sg[elt - 1]))
+ return -EMSGSIZE;
+
WARN_ON(start > offset + len);
end = start + skb_frag_size(&skb_shinfo(skb)->frags[i]);
@@ -3535,6 +3540,9 @@ __skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int len)
WARN_ON(start > offset + len);
+ if (elt && sg_is_last(&sg[elt - 1]))
+ return -EMSGSIZE;
+
end = start + frag_iter->len;
if ((copy = end - offset) > 0) {
if (copy > len)
@@ -3581,6 +3589,9 @@ int skb_to_sgvec(struct sk_buff *skb, struct scatterlist *sg, int offset, int le
{
int nsg = __skb_to_sgvec(skb, sg, offset, len);
+ if (nsg <= 0)
+ return nsg;
+
sg_mark_end(&sg[nsg - 1]);
return nsg;
--
2.12.2
Back to linux.kernel | Previous | Next — Previous in thread | Next in thread | Find similar | Unroll thread
[PATCH 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 16:10 +0200
[PATCH v2 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 16:20 +0200
[PATCH v3 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 16:30 +0200
[PATCH 2/5] ipsec: check return value of skb_to_sgvec always "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 16:20 +0200
[PATCH 4/5] macsec: check return value of skb_to_sgvec always "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 16:20 +0200
Re: [PATCH 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow David Miller <davem@davemloft.net> - 2017-04-25 16:50 +0200
[PATCH v4 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 17:10 +0200
Re: [PATCH v4 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow David Miller <davem@davemloft.net> - 2017-04-25 17:20 +0200
[PATCH v5 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 18:00 +0200
[PATCH v5 3/5] rxrpc: check return value of skb_to_sgvec always "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 18:00 +0200
[PATCH v5 4/5] macsec: check return value of skb_to_sgvec always "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 18:00 +0200
[PATCH v5 2/5] ipsec: check return value of skb_to_sgvec always "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 18:00 +0200
[PATCH v5 5/5] virtio_net: check return value of skb_to_sgvec always "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 18:00 +0200
[PATCH v6 2/5] ipsec: check return value of skb_to_sgvec always "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 20:50 +0200
[PATCH v6 4/5] macsec: check return value of skb_to_sgvec always "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 20:50 +0200
[PATCH v6 5/5] virtio_net: check return value of skb_to_sgvec always "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 20:50 +0200
[PATCH v6 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 20:50 +0200
[PATCH v6 3/5] rxrpc: check return value of skb_to_sgvec always "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-25 20:50 +0200
Re: [PATCH v6 3/5] rxrpc: check return value of skb_to_sgvec always Sabrina Dubroca <sd@queasysnail.net> - 2017-04-28 13:50 +0200
Re: [PATCH v6 3/5] rxrpc: check return value of skb_to_sgvec always "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-28 15:40 +0200
Re: [PATCH v6 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-27 11:30 +0200
Re: [PATCH v6 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow Sabrina Dubroca <sd@queasysnail.net> - 2017-04-27 13:40 +0200
Re: [PATCH v6 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-27 14:10 +0200
RE: [PATCH v6 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow David Laight <David.Laight@ACULAB.COM> - 2017-04-27 17:00 +0200
Re: [PATCH v6 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow David Miller <davem@davemloft.net> - 2017-04-27 18:00 +0200
Re: [PATCH v6 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow Sabrina Dubroca <sd@queasysnail.net> - 2017-04-28 18:20 +0200
Re: [PATCH v6 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow "Jason A. Donenfeld" <Jason@zx2c4.com> - 2017-04-29 00:50 +0200
Re: [PATCH 1/5] skbuff: return -EMSGSIZE in skb_to_sgvec to prevent overflow Sergei Shtylyov <sergei.shtylyov@cogentembedded.com> - 2017-04-25 17:50 +0200
csiph-web