Skip to contentSkip to conversation

Add test for CVE-2017-7308 on a raw socket's ring buffer

PATCH Superseded Richard Palethorpe 2 participants 3 messages Jul 25, 2017 – Oct 2, 2017

v1 of 9 Superseded Latest is v9 →

lore
Share & tools
lore
#0 lore raw

PATCH 1/1 Add test for CVE-2017-7308 on a raw socket's ring buffer

This test uses a Linux only interface which has not been fully integrated into glibc and it is not clear if it ever will be. So I have kept the fallback logic relatively simple and use only the Linux headers if they are present or just define what is needed in the test.

---
 configure.ac                  |   3 ++
 m4/ltp-tpacket-v3.m4          |  22 +++++++++
 runtest/cve                   |   1 +
 testcases/cve/.gitignore      |   1 +
 testcases/cve/cve-2017-7308.c | 107 ++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 134 insertions(+)
 create mode 100644 m4/ltp-tpacket-v3.m4
 create mode 100644 testcases/cve/cve-2017-7308.c
configure.ac +3 -0
index 658003972..22b884078 100644
@@ -38,6 +38,8 @@ AC_CHECK_HEADERS([ \
     pthread.h \
     sys/xattr.h \
     linux/genetlink.h \
+    linux/if_packet.h \
+    linux/if_ether.h \
     linux/mempolicy.h \
     linux/module.h \
     linux/netlink.h \
@@ -194,5 +196,6 @@ LTP_CHECK_SYNC_ADD_AND_FETCH
 LTP_CHECK_BUILTIN_CLEAR_CACHE
 LTP_CHECK_MMSGHDR
 LTP_CHECK_UNAME_DOMAINNAME
+LTP_CHECK_TPACKET_V3
 
 AC_OUTPUT
m4/ltp-tpacket-v3.m4 new file +22 -0
new file mode 100644
index 000000000..fce2e0ebf
@@ -0,0 +1,22 @@
+dnl Copyright (c) 2017 Richard Palethorpe <[email protected]>
+dnl
+dnl This program is free software;  you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY;  without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+dnl the GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+AC_DEFUN([LTP_CHECK_TPACKET_V3],[
+AC_CHECK_TYPES([struct tpacket_req3],,,[
+#ifdef HAVE_LINUX_IF_PACKET_H
+# include <linux/if_packet.h>
+#endif
+])
+])
runtest/cve +1 -0
index ee0614a9c..24062cfa6 100644
@@ -6,3 +6,4 @@ cve-2016-5195 dirtyc0w
 cve-2016-7117 cve-2016-7117
 cve-2017-5669 cve-2017-5669
 cve-2017-6951 cve-2017-6951
+cve-2017-7308 cve-2017-7308
testcases/cve/.gitignore +1 -0
index bdb73f33b..eb2e0af5f 100644
@@ -4,3 +4,4 @@ cve-2016-4997
 cve-2016-7117
 cve-2017-6951
 cve-2017-5669
+cve-2017-7308
testcases/cve/cve-2017-7308.c new file +107 -0

107 lines not on this page · raw message

Signature · 1 line
2.13.3
#1 lore raw

PATCH v2 1/1 Add test for CVE-2017-7308 on a raw socket's ring buffer

This test uses a Linux only interface which has not been fully integrated into glibc and it is not clear if it ever will be. So I have kept the fallback logic relatively simple and use only the Linux headers if they are present or just define what is needed in the test.

---

V2: I forgot to do socket cleanup, so the new version fixes that. Also
seperated the test into two runs.

 configure.ac                  |   3 ++
 m4/ltp-tpacket-v3.m4          |  22 ++++++++
 runtest/cve                   |   1 +
 testcases/cve/.gitignore      |   1 +
 testcases/cve/cve-2017-7308.c | 120 ++++++++++++++++++++++++++++++++++++++++++
 5 files changed, 147 insertions(+)
 create mode 100644 m4/ltp-tpacket-v3.m4
 create mode 100644 testcases/cve/cve-2017-7308.c
configure.ac +3 -0
index 658003972..22b884078 100644
@@ -38,6 +38,8 @@ AC_CHECK_HEADERS([ \
     pthread.h \
     sys/xattr.h \
     linux/genetlink.h \
+    linux/if_packet.h \
+    linux/if_ether.h \
     linux/mempolicy.h \
     linux/module.h \
     linux/netlink.h \
@@ -194,5 +196,6 @@ LTP_CHECK_SYNC_ADD_AND_FETCH
 LTP_CHECK_BUILTIN_CLEAR_CACHE
 LTP_CHECK_MMSGHDR
 LTP_CHECK_UNAME_DOMAINNAME
+LTP_CHECK_TPACKET_V3
 
 AC_OUTPUT
m4/ltp-tpacket-v3.m4 new file +22 -0
new file mode 100644
index 000000000..fce2e0ebf
@@ -0,0 +1,22 @@
+dnl Copyright (c) 2017 Richard Palethorpe <[email protected]>
+dnl
+dnl This program is free software;  you can redistribute it and/or modify
+dnl it under the terms of the GNU General Public License as published by
+dnl the Free Software Foundation; either version 2 of the License, or
+dnl (at your option) any later version.
+dnl
+dnl This program is distributed in the hope that it will be useful,
+dnl but WITHOUT ANY WARRANTY;  without even the implied warranty of
+dnl MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See
+dnl the GNU General Public License for more details.
+dnl
+dnl You should have received a copy of the GNU General Public License
+dnl along with this program. If not, see <http://www.gnu.org/licenses/>.
+
+AC_DEFUN([LTP_CHECK_TPACKET_V3],[
+AC_CHECK_TYPES([struct tpacket_req3],,,[
+#ifdef HAVE_LINUX_IF_PACKET_H
+# include <linux/if_packet.h>
+#endif
+])
+])
runtest/cve +1 -0
index ee0614a9c..24062cfa6 100644
@@ -6,3 +6,4 @@ cve-2016-5195 dirtyc0w
 cve-2016-7117 cve-2016-7117
 cve-2017-5669 cve-2017-5669
 cve-2017-6951 cve-2017-6951
+cve-2017-7308 cve-2017-7308
testcases/cve/.gitignore +1 -0
index bdb73f33b..eb2e0af5f 100644
@@ -4,3 +4,4 @@ cve-2016-4997
 cve-2016-7117
 cve-2017-6951
 cve-2017-5669
+cve-2017-7308
testcases/cve/cve-2017-7308.c new file +120 -0

120 lines not on this page · raw message

Signature · 1 line
2.13.3
#2 lore raw

PATCH v2 1/1 Add test for CVE-2017-7308 on a raw socket's ring buffer

Hi!

Quoted 69 lines
testcases/cve/cve-2017-7308.c new file +69 -0
+#include <errno.h>
+#include "tst_test.h"
+#include "tst_safe_net.h"
+#include "config.h"
+
+#ifdef HAVE_LINUX_IF_PACKET_H
+# include <linux/if_packet.h>
+#endif
+
+#ifdef HAVE_LINUX_IF_ETHER_H
+# include <linux/if_ether.h>
+#endif
+
+#ifndef ETH_P_ALL
+# define ETH_P_ALL 0x0003
+#endif
+
+#ifndef PACKET_RX_RING
+# define PACKET_RX_RING 5
+#endif
+
+#ifndef PACKET_VERSION
+# define PACKET_VERSION 10
+#endif
+
+#ifndef HAVE_STRUCT_TPACKET_REQ3
+# define TPACKET_V3 2
+
+struct tpacket_req3 {
+	unsigned int	tp_block_size;
+	unsigned int	tp_block_nr;
+	unsigned int	tp_frame_size;
+	unsigned int	tp_frame_nr;
+	unsigned int	tp_retire_blk_tov;
+	unsigned int	tp_sizeof_priv;
+	unsigned int	tp_feature_req_word;
+};
+#endif
+
+static int sk;
+
+static void cleanup(void)
+{
+	if (sk > 0)
+		SAFE_CLOSE(sk);
+}
+
+static void run(unsigned int i)
+{
+	int ver = TPACKET_V3;
+	struct tpacket_req3 req = {};
+
+	req.tp_block_size = 4096;
+	req.tp_block_nr = 2;
+	req.tp_frame_size = req.tp_block_size;
+	req.tp_frame_nr = req.tp_block_nr;
+	req.tp_retire_blk_tov = 100;
+
+	if (i == 0)
+		req.tp_sizeof_priv = 1024;
+	else
+		req.tp_sizeof_priv += (3U << 30);
+
+	sk = SAFE_SOCKET(AF_PACKET, SOCK_RAW, htons(ETH_P_ALL));
+	SAFE_SETSOCKOPT(sk, SOL_PACKET, PACKET_VERSION, &ver, sizeof(ver));
+
+	TEST(setsockopt(sk, SOL_PACKET, PACKET_RX_RING, &req, sizeof(req)));
+	if (i == 0 && TEST_RETURN) {
+		tst_brk(TBROK | TTERRNO,

testcases/cve/cve-2017-7308.c line 110

Quoted 10 lines
testcases/cve/cve-2017-7308.c new file +10 -0
+			"Can't create ring buffer with good settings");
+	} else if (i == 0) {
+		tst_res(TPASS, "Can create ring buffer with good settinegs");
+	} else if (TEST_RETURN && TEST_ERRNO == EINVAL) {
+		tst_res(TPASS | TTERRNO, "Refused bad tp_sizeof_priv value");
+	} else if (TEST_RETURN) {
+		tst_brk(TBROK | TTERRNO, "Unexpected setsockopt() error");
+	} else {
+		tst_res(TFAIL, "Allowed bad tp_sizeof_priv value");
+	}

I guess I would be happier if we split the test function into two in order to avoid this maze with i == 0 here. If we put the code that initializes the request and socket into a separate function we would have avoided 99% of the code duplication anyway.

Review

Quoted 2 lines
(quoted diff) +2 -0
+	SAFE_CLOSE(sk);
+	sk = 0;

The SAFE_CLOSE() resets the fd to -1, there is no need to clear it yourself here.

Quoted 14 lines
testcases/cve/cve-2017-7308.c new file +8 -0
+}
+
+static struct tst_test test = {
+	.test = run,
+	.tcnt = 2,
+	.needs_root = 1,
+	.cleanup = cleanup,
+};
Signature · 5 lines
2.13.3


-- 
Mailing list info: https://lists.linux.it/listinfo/ltp
Signature · 2 lines
Cyril Hrubis
[email protected]