* [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks
@ 2023-07-27 15:00 Martin Doucha
2023-07-27 15:00 ` [LTP] [PATCH 2/3] tst_netdevice: Add helper functions for qdisc and filter management Martin Doucha
` (4 more replies)
0 siblings, 5 replies; 15+ messages in thread
From: Martin Doucha @ 2023-07-27 15:00 UTC (permalink / raw)
To: ltp
Signed-off-by: Martin Doucha <mdoucha@suse.cz>
---
lib/tst_netdevice.c | 6 ++++++
1 file changed, 6 insertions(+)
diff --git a/lib/tst_netdevice.c b/lib/tst_netdevice.c
index 4a0442932..a57f506e9 100644
--- a/lib/tst_netdevice.c
+++ b/lib/tst_netdevice.c
@@ -332,6 +332,9 @@ static int change_ns(const char *file, const int lineno, const char *ifname,
ctx = create_request(file, lineno, RTM_NEWLINK, 0, &info, sizeof(info));
+ if (!ctx)
+ return 0;
+
if (!tst_rtnl_add_attr_string(file, lineno, ctx, IFLA_IFNAME, ifname)) {
tst_rtnl_destroy_context(file, lineno, ctx);
return 0;
@@ -411,6 +414,9 @@ static int modify_route(const char *file, const int lineno, unsigned int action,
ctx = create_request(file, lineno, action, flags, &info, sizeof(info));
+ if (!ctx)
+ return 0;
+
if (srcaddr && !tst_rtnl_add_attr(file, lineno, ctx, RTA_SRC, srcaddr,
srclen)) {
tst_rtnl_destroy_context(file, lineno, ctx);
--
2.41.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [LTP] [PATCH 2/3] tst_netdevice: Add helper functions for qdisc and filter management
2023-07-27 15:00 [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks Martin Doucha
@ 2023-07-27 15:00 ` Martin Doucha
2023-07-28 7:53 ` Cyril Hrubis
2023-07-28 12:09 ` Petr Vorel
2023-07-27 15:00 ` [LTP] [PATCH 3/3] Add test for CVE 2023-1829 Martin Doucha
` (3 subsequent siblings)
4 siblings, 2 replies; 15+ messages in thread
From: Martin Doucha @ 2023-07-27 15:00 UTC (permalink / raw)
To: ltp
Signed-off-by: Martin Doucha <mdoucha@suse.cz>
---
include/tst_netdevice.h | 62 ++++++++++++++++++++++
lib/tst_netdevice.c | 114 ++++++++++++++++++++++++++++++++++++++++
2 files changed, 176 insertions(+)
diff --git a/include/tst_netdevice.h b/include/tst_netdevice.h
index f02661208..95544814e 100644
--- a/include/tst_netdevice.h
+++ b/include/tst_netdevice.h
@@ -5,6 +5,8 @@
#ifndef TST_NETDEVICE_H
#define TST_NETDEVICE_H
+#include "tst_rtnetlink.h"
+
/* Find device index for given network interface name. */
int tst_netdev_index_by_name(const char *file, const int lineno,
const char *ifname);
@@ -122,4 +124,64 @@ int tst_netdev_remove_route_inet(const char *file, const int lineno,
tst_netdev_remove_route_inet(__FILE__, __LINE__, (ifname), (srcaddr), \
(srcprefix), (dstaddr), (dstprefix), (gateway))
+/*
+ * Add queueing discipline. Network interface name is optional.
+ */
+int tst_netdev_add_qdisc(const char *file, const int lineno,
+ const char *ifname, unsigned int family, unsigned int parent,
+ unsigned int handle, const char *qd_kind,
+ const struct tst_rtnl_attr_list *config);
+#define NETDEV_ADD_QDISC(ifname, family, parent, handle, qd_kind, config) \
+ tst_netdev_add_qdisc(__FILE__, __LINE__, (ifname), (family), \
+ (parent), (handle), (qd_kind), (config))
+
+/*
+ * Remove queueing discipline.
+ */
+int tst_netdev_remove_qdisc(const char *file, const int lineno,
+ const char *ifname, unsigned int family, unsigned int parent,
+ unsigned int handle, const char *qd_kind);
+#define NETDEV_REMOVE_QDISC(ifname, family, parent, handle, qd_kind) \
+ tst_netdev_remove_qdisc(__FILE__, __LINE__, (ifname), (family), \
+ (parent), (handle), (qd_kind))
+
+/*
+ * Add traffic class to queueing discipline. Network interface name is
+ * optional.
+ */
+int tst_netdev_add_traffic_class(const char *file, const int lineno,
+ const char *ifname, unsigned int parent, unsigned int handle,
+ const char *qd_kind, const struct tst_rtnl_attr_list *config);
+#define NETDEV_ADD_TRAFFIC_CLASS(ifname, parent, handle, qd_kind, config) \
+ tst_netdev_add_traffic_class(__FILE__, __LINE__, (ifname), (parent), \
+ (handle), (qd_kind), (config))
+
+int tst_netdev_remove_traffic_class(const char *file, const int lineno,
+ const char *ifname, unsigned int parent, unsigned int handle,
+ const char *qd_kind);
+#define NETDEV_REMOVE_TRAFFIC_CLASS(ifname, parent, handle, qd_kind) \
+ tst_netdev_remove_traffic_class(__FILE__, __LINE__, (ifname), \
+ (parent), (handle), (qd_kind))
+
+/*
+ * Add traffic filter to queueing discipline. Protocol should be en ETH_P_*
+ * constant in host byte order. Network interface name is optional.
+ */
+int tst_netdev_add_traffic_filter(const char *file, const int lineno,
+ const char *ifname, unsigned int parent, unsigned int handle,
+ unsigned int protocol, unsigned int priority, const char *f_kind,
+ const struct tst_rtnl_attr_list *config);
+#define NETDEV_ADD_TRAFFIC_FILTER(ifname, parent, handle, protocol, priority, \
+ f_kind, config) \
+ tst_netdev_add_traffic_filter(__FILE__, __LINE__, (ifname), (parent), \
+ (handle), (protocol), (priority), (f_kind), (config))
+
+int tst_netdev_remove_traffic_filter(const char *file, const int lineno,
+ const char *ifname, unsigned int parent, unsigned int handle,
+ unsigned int protocol, unsigned int priority, const char *f_kind);
+#define NETDEV_REMOVE_TRAFFIC_FILTER(ifname, parent, handle, protocol, \
+ priority, f_kind) \
+ tst_netdev_remove_traffic_filter(__FILE__, __LINE__, (ifname), \
+ (parent), (handle), (protocol), (priority), (f_kind))
+
#endif /* TST_NETDEVICE_H */
diff --git a/lib/tst_netdevice.c b/lib/tst_netdevice.c
index a57f506e9..9701110a4 100644
--- a/lib/tst_netdevice.c
+++ b/lib/tst_netdevice.c
@@ -7,6 +7,7 @@
#include <linux/veth.h>
#include <sys/socket.h>
#include <net/if.h>
+#include <linux/pkt_sched.h>
#include "lapi/rtnetlink.h"
#define TST_NO_DEFAULT_MAIN
@@ -518,3 +519,116 @@ int tst_netdev_remove_route_inet(const char *file, const int lineno,
return modify_route_inet(file, lineno, RTM_DELROUTE, 0, ifname,
srcaddr, srcprefix, dstaddr, dstprefix, gateway);
}
+
+static int modify_qdisc(const char *file, const int lineno, const char *object,
+ unsigned int action, unsigned int nl_flags, const char *ifname,
+ unsigned int family, unsigned int parent, unsigned int handle,
+ unsigned int info, const char *qd_kind,
+ const struct tst_rtnl_attr_list *config)
+{
+ struct tst_rtnl_context *ctx;
+ int ret;
+ struct tcmsg msg = {
+ .tcm_family = family,
+ .tcm_handle = handle,
+ .tcm_parent = parent,
+ .tcm_info = info
+ };
+
+ if (!qd_kind) {
+ tst_brk_(file, lineno, TBROK,
+ "Queueing discipline name required");
+ return 0;
+ }
+
+ if (ifname) {
+ msg.tcm_ifindex = tst_netdev_index_by_name(file, lineno,
+ ifname);
+
+ if (msg.tcm_ifindex < 0) {
+ tst_brk_(file, lineno, TBROK, "Interface %s not found",
+ ifname);
+ return 0;
+ }
+ }
+
+ ctx = create_request(file, lineno, action, nl_flags, &msg, sizeof(msg));
+
+ if (!ctx)
+ return 0;
+
+ if (!tst_rtnl_add_attr_string(file, lineno, ctx, TCA_KIND, qd_kind)) {
+ tst_rtnl_destroy_context(file, lineno, ctx);
+ return 0;
+ }
+
+ if (config && !tst_rtnl_add_attr_list(file, lineno, ctx, config)) {
+ tst_rtnl_destroy_context(file, lineno, ctx);
+ return 0;
+ }
+
+ ret = tst_rtnl_send_validate(file, lineno, ctx);
+ tst_rtnl_destroy_context(file, lineno, ctx);
+
+ if (!ret) {
+ tst_brk_(file, lineno, TBROK,
+ "Failed to modify %s: %s", object,
+ tst_strerrno(tst_rtnl_errno));
+ }
+
+ return ret;
+}
+
+int tst_netdev_add_qdisc(const char *file, const int lineno,
+ const char *ifname, unsigned int family, unsigned int parent,
+ unsigned int handle, const char *qd_kind,
+ const struct tst_rtnl_attr_list *config)
+{
+ return modify_qdisc(file, lineno, "queueing discipline", RTM_NEWQDISC,
+ NLM_F_CREATE | NLM_F_EXCL, ifname, family, parent, handle, 0,
+ qd_kind, config);
+}
+
+int tst_netdev_remove_qdisc(const char *file, const int lineno,
+ const char *ifname, unsigned int family, unsigned int parent,
+ unsigned int handle, const char *qd_kind)
+{
+ return modify_qdisc(file, lineno, "queueing discipline", RTM_DELQDISC,
+ 0, ifname, family, parent, handle, 0, qd_kind, NULL);
+}
+
+int tst_netdev_add_traffic_class(const char *file, const int lineno,
+ const char *ifname, unsigned int parent, unsigned int handle,
+ const char *qd_kind, const struct tst_rtnl_attr_list *config)
+{
+ return modify_qdisc(file, lineno, "traffic class", RTM_NEWTCLASS,
+ NLM_F_CREATE | NLM_F_EXCL, ifname, AF_UNSPEC, parent, handle,
+ 0, qd_kind, config);
+}
+
+int tst_netdev_remove_traffic_class(const char *file, const int lineno,
+ const char *ifname, unsigned int parent, unsigned int handle,
+ const char *qd_kind)
+{
+ return modify_qdisc(file, lineno, "traffic class", RTM_DELTCLASS, 0,
+ ifname, AF_UNSPEC, parent, handle, 0, qd_kind, NULL);
+}
+
+int tst_netdev_add_traffic_filter(const char *file, const int lineno,
+ const char *ifname, unsigned int parent, unsigned int handle,
+ unsigned int protocol, unsigned int priority, const char *f_kind,
+ const struct tst_rtnl_attr_list *config)
+{
+ return modify_qdisc(file, lineno, "traffic filter", RTM_NEWTFILTER,
+ NLM_F_CREATE | NLM_F_EXCL, ifname, AF_UNSPEC, parent, handle,
+ TC_H_MAKE(priority << 16, htons(protocol)), f_kind, config);
+}
+
+int tst_netdev_remove_traffic_filter(const char *file, const int lineno,
+ const char *ifname, unsigned int parent, unsigned int handle,
+ unsigned int protocol, unsigned int priority, const char *f_kind)
+{
+ return modify_qdisc(file, lineno, "traffic filter", RTM_DELTFILTER,
+ 0, ifname, AF_UNSPEC, parent, handle,
+ TC_H_MAKE(priority << 16, htons(protocol)), f_kind, NULL);
+}
--
2.41.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 15+ messages in thread
* [LTP] [PATCH 3/3] Add test for CVE 2023-1829
2023-07-27 15:00 [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks Martin Doucha
2023-07-27 15:00 ` [LTP] [PATCH 2/3] tst_netdevice: Add helper functions for qdisc and filter management Martin Doucha
@ 2023-07-27 15:00 ` Martin Doucha
2023-07-28 8:36 ` Petr Vorel
2023-08-04 9:23 ` Martin Doucha
2023-07-28 7:46 ` [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks Cyril Hrubis
` (2 subsequent siblings)
4 siblings, 2 replies; 15+ messages in thread
From: Martin Doucha @ 2023-07-27 15:00 UTC (permalink / raw)
To: ltp
Signed-off-by: Martin Doucha <mdoucha@suse.cz>
---
runtest/cve | 1 +
testcases/cve/.gitignore | 1 +
testcases/cve/tcindex01.c | 156 ++++++++++++++++++++++++++++++++++++++
3 files changed, 158 insertions(+)
create mode 100644 testcases/cve/tcindex01.c
diff --git a/runtest/cve b/runtest/cve
index 7d1e84f89..f9b36a182 100644
--- a/runtest/cve
+++ b/runtest/cve
@@ -84,6 +84,7 @@ cve-2021-38604 mq_notify03
cve-2022-0847 dirtypipe
cve-2022-2590 dirtyc0w_shmem
cve-2022-23222 bpf_prog07
+cve-2023-1829 tcindex01
# Tests below may cause kernel memory leak
cve-2020-25704 perf_event_open03
cve-2022-0185 fsconfig03
diff --git a/testcases/cve/.gitignore b/testcases/cve/.gitignore
index 90e8b191c..389354eaf 100644
--- a/testcases/cve/.gitignore
+++ b/testcases/cve/.gitignore
@@ -12,3 +12,4 @@ cve-2017-16939
cve-2017-17053
cve-2022-4378
icmp_rate_limit01
+tcindex01.c
diff --git a/testcases/cve/tcindex01.c b/testcases/cve/tcindex01.c
new file mode 100644
index 000000000..89569d1f7
--- /dev/null
+++ b/testcases/cve/tcindex01.c
@@ -0,0 +1,156 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2023 SUSE LLC <mdoucha@suse.cz>
+ */
+
+/*\
+ * CVE-2023-1829
+ *
+ * Test for use-after-free after removing tcindex traffic filter with certain
+ * parameters.
+ *
+ * Tcindex filter removed in:
+ *
+ * commit 8c710f75256bb3cf05ac7b1672c82b92c43f3d28
+ * Author: Jamal Hadi Salim <jhs@mojatatu.com>
+ * Date: Tue Feb 14 08:49:14 2023 -0500
+ *
+ * net/sched: Retire tcindex classifier
+ */
+
+#include <linux/netlink.h>
+#include <linux/pkt_sched.h>
+#include <linux/pkt_cls.h>
+#include <linux/tc_act/tc_gact.h>
+#include "tst_test.h"
+#include "tst_rtnetlink.h"
+#include "tst_netdevice.h"
+#include "lapi/sched.h"
+#include "lapi/if_ether.h"
+#include "lapi/rtnetlink.h"
+
+#define DEVNAME "ltp_dummy1"
+
+static const uint32_t qd_handle = TC_H_MAKE(1 << 16, 0);
+static const uint32_t clsid = TC_H_MAKE(1 << 16, 1);
+static const uint32_t shift = 10;
+static const uint16_t mask = 0xffff;
+
+/* rtnetlink payloads */
+static const struct tc_htb_glob qd_opt = {
+ .rate2quantum = 10,
+ .version = 3,
+ .defcls = 30
+};
+static const struct tc_gact f_gact_param = {
+ .action = TC_ACT_SHOT
+};
+static struct tc_htb_opt cls_opt = {};
+
+/* htb qdisc and class options */
+static const struct tst_rtnl_attr_list qd_config[] = {
+ {TCA_OPTIONS, NULL, 0, (const struct tst_rtnl_attr_list[]){
+ {TCA_HTB_INIT, &qd_opt, sizeof(qd_opt), NULL},
+ {0, NULL, -1, NULL}
+ }},
+ {0, NULL, -1, NULL}
+};
+static const struct tst_rtnl_attr_list cls_config[] = {
+ {TCA_OPTIONS, NULL, 0, (const struct tst_rtnl_attr_list[]){
+ {TCA_HTB_PARMS, &cls_opt, sizeof(cls_opt), NULL},
+ {0, NULL, -1, NULL}
+ }},
+ {0, NULL, -1, NULL}
+};
+
+/* tcindex filter options */
+static const struct tst_rtnl_attr_list f_actopts[] = {
+ {TCA_GACT_PARMS, &f_gact_param, sizeof(f_gact_param), NULL},
+ {0, NULL, -1, NULL}
+};
+static const struct tst_rtnl_attr_list f_action[] = {
+ {1, NULL, 0, (const struct tst_rtnl_attr_list[]){
+ {TCA_ACT_KIND, "gact", 5, NULL},
+ {TCA_ACT_OPTIONS | NLA_F_NESTED, NULL, 0, f_actopts},
+ {0, NULL, -1, NULL}
+ }},
+ {0, NULL, -1, NULL}
+};
+static const struct tst_rtnl_attr_list f_config[] = {
+ {TCA_OPTIONS, NULL, 0, (const struct tst_rtnl_attr_list[]){
+ {TCA_TCINDEX_MASK, &mask, sizeof(mask), NULL},
+ {TCA_TCINDEX_SHIFT, &shift, sizeof(shift), NULL},
+ {TCA_TCINDEX_CLASSID, &clsid, sizeof(clsid), NULL},
+ {TCA_TCINDEX_ACT, &clsid, sizeof(clsid), f_action},
+ {0, NULL, -1, NULL}
+ }},
+ {0, NULL, -1, NULL}
+};
+
+static void setup(void)
+{
+ tst_setup_netns();
+ NETDEV_ADD_DEVICE(DEVNAME, "dummy");
+
+ cls_opt.rate.rate = cls_opt.ceil.rate = 256000;
+ cls_opt.buffer = 1000000 * 1600 / cls_opt.rate.rate;
+ cls_opt.cbuffer = 1000000 * 1600 / cls_opt.ceil.rate;
+}
+
+static void run(void)
+{
+ unsigned int i;
+
+ for (i = 0; i < 100; i++) {
+ NETDEV_ADD_QDISC(DEVNAME, AF_UNSPEC, TC_H_ROOT, qd_handle,
+ "htb", qd_config);
+ NETDEV_ADD_TRAFFIC_CLASS(DEVNAME, qd_handle, clsid, "htb",
+ cls_config);
+ NETDEV_ADD_TRAFFIC_FILTER(DEVNAME, qd_handle, 10, ETH_P_IP, 1,
+ "tcindex", f_config);
+ NETDEV_REMOVE_TRAFFIC_FILTER(DEVNAME, qd_handle, 10, ETH_P_IP,
+ 1, "tcindex");
+
+ /* Wait at least one jiffy for use-after-free */
+ usleep(10000);
+
+ NETDEV_REMOVE_QDISC(DEVNAME, AF_UNSPEC, TC_H_ROOT, qd_handle,
+ "htb");
+ }
+
+ if (tst_taint_check()) {
+ tst_res(TFAIL, "Kernel is vulnerable");
+ return;
+ }
+
+ tst_res(TPASS, "Nothing bad happened (yet)");
+}
+
+static void cleanup(void)
+{
+ NETDEV_REMOVE_DEVICE(DEVNAME);
+}
+
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .cleanup = cleanup,
+ .taint_check = TST_TAINT_W | TST_TAINT_D,
+ .needs_kconfigs = (const char *[]) {
+ "CONFIG_VETH",
+ "CONFIG_USER_NS=y",
+ "CONFIG_NET_NS=y",
+ "CONFIG_NET_SCH_HTB",
+ "CONFIG_NET_CLS_TCINDEX",
+ NULL
+ },
+ .save_restore = (const struct tst_path_val[]) {
+ {"/proc/sys/user/max_user_namespaces", "1024", TST_SR_SKIP},
+ {}
+ },
+ .tags = (const struct tst_tag[]) {
+ {"linux-git", "8c710f75256b"},
+ {"CVE", "2023-1829"},
+ {}
+ }
+};
--
2.41.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks
2023-07-27 15:00 [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks Martin Doucha
2023-07-27 15:00 ` [LTP] [PATCH 2/3] tst_netdevice: Add helper functions for qdisc and filter management Martin Doucha
2023-07-27 15:00 ` [LTP] [PATCH 3/3] Add test for CVE 2023-1829 Martin Doucha
@ 2023-07-28 7:46 ` Cyril Hrubis
2023-07-28 8:17 ` Martin Doucha
2023-07-28 11:43 ` Petr Vorel
2023-08-04 13:28 ` [LTP] [PATCH v2 3/3] Add test for CVE 2023-1829 Martin Doucha
4 siblings, 1 reply; 15+ messages in thread
From: Cyril Hrubis @ 2023-07-28 7:46 UTC (permalink / raw)
To: Martin Doucha; +Cc: ltp
Hi!
> Signed-off-by: Martin Doucha <mdoucha@suse.cz>
> ---
> lib/tst_netdevice.c | 6 ++++++
> 1 file changed, 6 insertions(+)
>
> diff --git a/lib/tst_netdevice.c b/lib/tst_netdevice.c
> index 4a0442932..a57f506e9 100644
> --- a/lib/tst_netdevice.c
> +++ b/lib/tst_netdevice.c
> @@ -332,6 +332,9 @@ static int change_ns(const char *file, const int lineno, const char *ifname,
>
> ctx = create_request(file, lineno, RTM_NEWLINK, 0, &info, sizeof(info));
>
> + if (!ctx)
> + return 0;
> +
> if (!tst_rtnl_add_attr_string(file, lineno, ctx, IFLA_IFNAME, ifname)) {
> tst_rtnl_destroy_context(file, lineno, ctx);
> return 0;
> @@ -411,6 +414,9 @@ static int modify_route(const char *file, const int lineno, unsigned int action,
>
> ctx = create_request(file, lineno, action, flags, &info, sizeof(info));
>
> + if (!ctx)
> + return 0;
> +
> if (srcaddr && !tst_rtnl_add_attr(file, lineno, ctx, RTA_SRC, srcaddr,
> srclen)) {
> tst_rtnl_destroy_context(file, lineno, ctx);
Shouldn't we tst_brk_() in these cases? This function is a base for
NETDEV_CHANGE_NS_*() which is used as a safe macro without checking it's
return value.
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [LTP] [PATCH 2/3] tst_netdevice: Add helper functions for qdisc and filter management
2023-07-27 15:00 ` [LTP] [PATCH 2/3] tst_netdevice: Add helper functions for qdisc and filter management Martin Doucha
@ 2023-07-28 7:53 ` Cyril Hrubis
2023-07-28 8:21 ` Martin Doucha
2023-07-28 12:09 ` Petr Vorel
1 sibling, 1 reply; 15+ messages in thread
From: Cyril Hrubis @ 2023-07-28 7:53 UTC (permalink / raw)
To: Martin Doucha; +Cc: ltp
Hi!
> --- a/lib/tst_netdevice.c
> +++ b/lib/tst_netdevice.c
> @@ -7,6 +7,7 @@
> #include <linux/veth.h>
> #include <sys/socket.h>
> #include <net/if.h>
> +#include <linux/pkt_sched.h>
> #include "lapi/rtnetlink.h"
>
> #define TST_NO_DEFAULT_MAIN
> @@ -518,3 +519,116 @@ int tst_netdev_remove_route_inet(const char *file, const int lineno,
> return modify_route_inet(file, lineno, RTM_DELROUTE, 0, ifname,
> srcaddr, srcprefix, dstaddr, dstprefix, gateway);
> }
> +
> +static int modify_qdisc(const char *file, const int lineno, const char *object,
> + unsigned int action, unsigned int nl_flags, const char *ifname,
> + unsigned int family, unsigned int parent, unsigned int handle,
> + unsigned int info, const char *qd_kind,
> + const struct tst_rtnl_attr_list *config)
> +{
> + struct tst_rtnl_context *ctx;
> + int ret;
> + struct tcmsg msg = {
> + .tcm_family = family,
> + .tcm_handle = handle,
> + .tcm_parent = parent,
> + .tcm_info = info
> + };
> +
> + if (!qd_kind) {
> + tst_brk_(file, lineno, TBROK,
> + "Queueing discipline name required");
> + return 0;
> + }
> +
> + if (ifname) {
> + msg.tcm_ifindex = tst_netdev_index_by_name(file, lineno,
> + ifname);
> +
> + if (msg.tcm_ifindex < 0) {
> + tst_brk_(file, lineno, TBROK, "Interface %s not found",
> + ifname);
> + return 0;
> + }
> + }
> +
> + ctx = create_request(file, lineno, action, nl_flags, &msg, sizeof(msg));
> +
> + if (!ctx)
> + return 0;
> +
> + if (!tst_rtnl_add_attr_string(file, lineno, ctx, TCA_KIND, qd_kind)) {
> + tst_rtnl_destroy_context(file, lineno, ctx);
> + return 0;
> + }
> +
> + if (config && !tst_rtnl_add_attr_list(file, lineno, ctx, config)) {
> + tst_rtnl_destroy_context(file, lineno, ctx);
> + return 0;
> + }
Here as well, shouldn't we tst_brk_() consistently if we fail to prepare
the context?
> + ret = tst_rtnl_send_validate(file, lineno, ctx);
> + tst_rtnl_destroy_context(file, lineno, ctx);
> +
> + if (!ret) {
> + tst_brk_(file, lineno, TBROK,
> + "Failed to modify %s: %s", object,
> + tst_strerrno(tst_rtnl_errno));
> + }
> +
> + return ret;
> +}
> +
> +int tst_netdev_add_qdisc(const char *file, const int lineno,
> + const char *ifname, unsigned int family, unsigned int parent,
> + unsigned int handle, const char *qd_kind,
> + const struct tst_rtnl_attr_list *config)
> +{
> + return modify_qdisc(file, lineno, "queueing discipline", RTM_NEWQDISC,
> + NLM_F_CREATE | NLM_F_EXCL, ifname, family, parent, handle, 0,
> + qd_kind, config);
> +}
> +
> +int tst_netdev_remove_qdisc(const char *file, const int lineno,
> + const char *ifname, unsigned int family, unsigned int parent,
> + unsigned int handle, const char *qd_kind)
> +{
> + return modify_qdisc(file, lineno, "queueing discipline", RTM_DELQDISC,
> + 0, ifname, family, parent, handle, 0, qd_kind, NULL);
> +}
> +
> +int tst_netdev_add_traffic_class(const char *file, const int lineno,
> + const char *ifname, unsigned int parent, unsigned int handle,
> + const char *qd_kind, const struct tst_rtnl_attr_list *config)
> +{
> + return modify_qdisc(file, lineno, "traffic class", RTM_NEWTCLASS,
> + NLM_F_CREATE | NLM_F_EXCL, ifname, AF_UNSPEC, parent, handle,
> + 0, qd_kind, config);
> +}
> +
> +int tst_netdev_remove_traffic_class(const char *file, const int lineno,
> + const char *ifname, unsigned int parent, unsigned int handle,
> + const char *qd_kind)
> +{
> + return modify_qdisc(file, lineno, "traffic class", RTM_DELTCLASS, 0,
> + ifname, AF_UNSPEC, parent, handle, 0, qd_kind, NULL);
> +}
> +
> +int tst_netdev_add_traffic_filter(const char *file, const int lineno,
> + const char *ifname, unsigned int parent, unsigned int handle,
> + unsigned int protocol, unsigned int priority, const char *f_kind,
> + const struct tst_rtnl_attr_list *config)
> +{
> + return modify_qdisc(file, lineno, "traffic filter", RTM_NEWTFILTER,
> + NLM_F_CREATE | NLM_F_EXCL, ifname, AF_UNSPEC, parent, handle,
> + TC_H_MAKE(priority << 16, htons(protocol)), f_kind, config);
> +}
> +
> +int tst_netdev_remove_traffic_filter(const char *file, const int lineno,
> + const char *ifname, unsigned int parent, unsigned int handle,
> + unsigned int protocol, unsigned int priority, const char *f_kind)
> +{
> + return modify_qdisc(file, lineno, "traffic filter", RTM_DELTFILTER,
> + 0, ifname, AF_UNSPEC, parent, handle,
> + TC_H_MAKE(priority << 16, htons(protocol)), f_kind, NULL);
> +}
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks
2023-07-28 7:46 ` [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks Cyril Hrubis
@ 2023-07-28 8:17 ` Martin Doucha
2023-07-28 8:45 ` Cyril Hrubis
0 siblings, 1 reply; 15+ messages in thread
From: Martin Doucha @ 2023-07-28 8:17 UTC (permalink / raw)
To: Cyril Hrubis; +Cc: ltp
On 28. 07. 23 9:46, Cyril Hrubis wrote:
> Hi!
>> Signed-off-by: Martin Doucha <mdoucha@suse.cz>
>> ---
>> lib/tst_netdevice.c | 6 ++++++
>> 1 file changed, 6 insertions(+)
>>
>> diff --git a/lib/tst_netdevice.c b/lib/tst_netdevice.c
>> index 4a0442932..a57f506e9 100644
>> --- a/lib/tst_netdevice.c
>> +++ b/lib/tst_netdevice.c
>> @@ -332,6 +332,9 @@ static int change_ns(const char *file, const int lineno, const char *ifname,
>>
>> ctx = create_request(file, lineno, RTM_NEWLINK, 0, &info, sizeof(info));
>>
>> + if (!ctx)
>> + return 0;
>> +
>> if (!tst_rtnl_add_attr_string(file, lineno, ctx, IFLA_IFNAME, ifname)) {
>> tst_rtnl_destroy_context(file, lineno, ctx);
>> return 0;
>> @@ -411,6 +414,9 @@ static int modify_route(const char *file, const int lineno, unsigned int action,
>>
>> ctx = create_request(file, lineno, action, flags, &info, sizeof(info));
>>
>> + if (!ctx)
>> + return 0;
>> +
>> if (srcaddr && !tst_rtnl_add_attr(file, lineno, ctx, RTA_SRC, srcaddr,
>> srclen)) {
>> tst_rtnl_destroy_context(file, lineno, ctx);
>
> Shouldn't we tst_brk_() in these cases? This function is a base for
> NETDEV_CHANGE_NS_*() which is used as a safe macro without checking it's
> return value.
The tst_brk_() gets called by the safe_*() functions deeper in the call
tree. But tst_netdevice functions may be called from cleanup() where
explicit return is necessary even after tst_brk_().
--
Martin Doucha mdoucha@suse.cz
SW Quality Engineer
SUSE LINUX, s.r.o.
CORSO IIa
Krizikova 148/34
186 00 Prague 8
Czech Republic
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [LTP] [PATCH 2/3] tst_netdevice: Add helper functions for qdisc and filter management
2023-07-28 7:53 ` Cyril Hrubis
@ 2023-07-28 8:21 ` Martin Doucha
0 siblings, 0 replies; 15+ messages in thread
From: Martin Doucha @ 2023-07-28 8:21 UTC (permalink / raw)
To: Cyril Hrubis; +Cc: ltp
On 28. 07. 23 9:53, Cyril Hrubis wrote:
> Hi!
>> --- a/lib/tst_netdevice.c
>> +++ b/lib/tst_netdevice.c
>> @@ -7,6 +7,7 @@
>> #include <linux/veth.h>
>> #include <sys/socket.h>
>> #include <net/if.h>
>> +#include <linux/pkt_sched.h>
>> #include "lapi/rtnetlink.h"
>>
>> #define TST_NO_DEFAULT_MAIN
>> @@ -518,3 +519,116 @@ int tst_netdev_remove_route_inet(const char *file, const int lineno,
>> return modify_route_inet(file, lineno, RTM_DELROUTE, 0, ifname,
>> srcaddr, srcprefix, dstaddr, dstprefix, gateway);
>> }
>> +
>> +static int modify_qdisc(const char *file, const int lineno, const char *object,
>> + unsigned int action, unsigned int nl_flags, const char *ifname,
>> + unsigned int family, unsigned int parent, unsigned int handle,
>> + unsigned int info, const char *qd_kind,
>> + const struct tst_rtnl_attr_list *config)
>> +{
>> + struct tst_rtnl_context *ctx;
>> + int ret;
>> + struct tcmsg msg = {
>> + .tcm_family = family,
>> + .tcm_handle = handle,
>> + .tcm_parent = parent,
>> + .tcm_info = info
>> + };
>> +
>> + if (!qd_kind) {
>> + tst_brk_(file, lineno, TBROK,
>> + "Queueing discipline name required");
>> + return 0;
>> + }
>> +
>> + if (ifname) {
>> + msg.tcm_ifindex = tst_netdev_index_by_name(file, lineno,
>> + ifname);
>> +
>> + if (msg.tcm_ifindex < 0) {
>> + tst_brk_(file, lineno, TBROK, "Interface %s not found",
>> + ifname);
>> + return 0;
>> + }
>> + }
>> +
>> + ctx = create_request(file, lineno, action, nl_flags, &msg, sizeof(msg));
>> +
>> + if (!ctx)
>> + return 0;
>> +
>> + if (!tst_rtnl_add_attr_string(file, lineno, ctx, TCA_KIND, qd_kind)) {
>> + tst_rtnl_destroy_context(file, lineno, ctx);
>> + return 0;
>> + }
>> +
>> + if (config && !tst_rtnl_add_attr_list(file, lineno, ctx, config)) {
>> + tst_rtnl_destroy_context(file, lineno, ctx);
>> + return 0;
>> + }
>
>
> Here as well, shouldn't we tst_brk_() consistently if we fail to prepare
> the context?
Same as in the previous patch. If we get into the failure branch here,
tst_brk_() was already called somewhere in create_request() or
tst_rtnl_add_attr_*() and it didn't terminate the process because we're
in the cleanup phase.
--
Martin Doucha mdoucha@suse.cz
SW Quality Engineer
SUSE LINUX, s.r.o.
CORSO IIa
Krizikova 148/34
186 00 Prague 8
Czech Republic
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [LTP] [PATCH 3/3] Add test for CVE 2023-1829
2023-07-27 15:00 ` [LTP] [PATCH 3/3] Add test for CVE 2023-1829 Martin Doucha
@ 2023-07-28 8:36 ` Petr Vorel
2023-08-03 12:51 ` Cyril Hrubis
2023-08-04 9:23 ` Martin Doucha
1 sibling, 1 reply; 15+ messages in thread
From: Petr Vorel @ 2023-07-28 8:36 UTC (permalink / raw)
To: Martin Doucha; +Cc: ltp
Hi Martin,
> +static struct tst_test test = {
> + .test_all = run,
> + .setup = setup,
> + .cleanup = cleanup,
> + .taint_check = TST_TAINT_W | TST_TAINT_D,
> + .needs_kconfigs = (const char *[]) {
> + "CONFIG_VETH",
> + "CONFIG_USER_NS=y",
> + "CONFIG_NET_NS=y",
> + "CONFIG_NET_SCH_HTB",
> + "CONFIG_NET_CLS_TCINDEX",
Interesting, CONFIG_NET_CLS_TCINDEX has been removed in 8c710f75256b
(in v6.3-rc1), therefore the test is only for older kernels.
Kind regards,
Petr
> + NULL
> + },
> + .save_restore = (const struct tst_path_val[]) {
> + {"/proc/sys/user/max_user_namespaces", "1024", TST_SR_SKIP},
> + {}
> + },
> + .tags = (const struct tst_tag[]) {
> + {"linux-git", "8c710f75256b"},
> + {"CVE", "2023-1829"},
> + {}
> + }
> +};
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks
2023-07-28 8:17 ` Martin Doucha
@ 2023-07-28 8:45 ` Cyril Hrubis
0 siblings, 0 replies; 15+ messages in thread
From: Cyril Hrubis @ 2023-07-28 8:45 UTC (permalink / raw)
To: Martin Doucha; +Cc: ltp
Hi!
> The tst_brk_() gets called by the safe_*() functions deeper in the call
> tree. But tst_netdevice functions may be called from cleanup() where
> explicit return is necessary even after tst_brk_().
Ah, missed that. Checked once more and indeed it all ends up tst_brk_()
deeper in the call chain, or calls safe_malloc/safe_realloc.
For both patches:
Reviewed-by: Cyril Hrubis <chrubis@suse.cz>
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks
2023-07-27 15:00 [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks Martin Doucha
` (2 preceding siblings ...)
2023-07-28 7:46 ` [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks Cyril Hrubis
@ 2023-07-28 11:43 ` Petr Vorel
2023-08-04 13:28 ` [LTP] [PATCH v2 3/3] Add test for CVE 2023-1829 Martin Doucha
4 siblings, 0 replies; 15+ messages in thread
From: Petr Vorel @ 2023-07-28 11:43 UTC (permalink / raw)
To: Martin Doucha; +Cc: ltp
Hi Martin,
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Kind regards,
Petr
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [LTP] [PATCH 2/3] tst_netdevice: Add helper functions for qdisc and filter management
2023-07-27 15:00 ` [LTP] [PATCH 2/3] tst_netdevice: Add helper functions for qdisc and filter management Martin Doucha
2023-07-28 7:53 ` Cyril Hrubis
@ 2023-07-28 12:09 ` Petr Vorel
1 sibling, 0 replies; 15+ messages in thread
From: Petr Vorel @ 2023-07-28 12:09 UTC (permalink / raw)
To: Martin Doucha; +Cc: ltp
Hi Martin,
...
nit: missing comment here, but the meaning is obvious. Also
NETDEV_REMOVE_TRAFFIC_CLASS() (and tst_netdev_remove_traffic_filter()) look to
be unused, but I guess you expect to use it in another reproducer.
> +int tst_netdev_remove_traffic_class(const char *file, const int lineno,
> + const char *ifname, unsigned int parent, unsigned int handle,
> + const char *qd_kind);
> +#define NETDEV_REMOVE_TRAFFIC_CLASS(ifname, parent, handle, qd_kind) \
> + tst_netdev_remove_traffic_class(__FILE__, __LINE__, (ifname), \
> + (parent), (handle), (qd_kind))
Reviewed-by: Petr Vorel <pvorel@suse.cz>
Kind regards,
Petr
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [LTP] [PATCH 3/3] Add test for CVE 2023-1829
2023-07-28 8:36 ` Petr Vorel
@ 2023-08-03 12:51 ` Cyril Hrubis
0 siblings, 0 replies; 15+ messages in thread
From: Cyril Hrubis @ 2023-08-03 12:51 UTC (permalink / raw)
To: Petr Vorel; +Cc: ltp
Hi!
> > +static struct tst_test test = {
> > + .test_all = run,
> > + .setup = setup,
> > + .cleanup = cleanup,
> > + .taint_check = TST_TAINT_W | TST_TAINT_D,
> > + .needs_kconfigs = (const char *[]) {
> > + "CONFIG_VETH",
> > + "CONFIG_USER_NS=y",
> > + "CONFIG_NET_NS=y",
> > + "CONFIG_NET_SCH_HTB",
> > + "CONFIG_NET_CLS_TCINDEX",
> Interesting, CONFIG_NET_CLS_TCINDEX has been removed in 8c710f75256b
> (in v6.3-rc1), therefore the test is only for older kernels.
Nothing wrong with that I suppose, we will have to maintain kernels with
that module for a decade from now anyways...
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 15+ messages in thread
* Re: [LTP] [PATCH 3/3] Add test for CVE 2023-1829
2023-07-27 15:00 ` [LTP] [PATCH 3/3] Add test for CVE 2023-1829 Martin Doucha
2023-07-28 8:36 ` Petr Vorel
@ 2023-08-04 9:23 ` Martin Doucha
1 sibling, 0 replies; 15+ messages in thread
From: Martin Doucha @ 2023-08-04 9:23 UTC (permalink / raw)
To: ltp
Hi,
I've noticed some kernel messages complaining that there's leftover data
at the end of the filter setup rtnetlink query. I need to investigate a
bit more and I'll send v2 for this patch. The other two patches can be
merged as is.
On 27. 07. 23 17:00, Martin Doucha wrote:
> Signed-off-by: Martin Doucha <mdoucha@suse.cz>
> ---
> runtest/cve | 1 +
> testcases/cve/.gitignore | 1 +
> testcases/cve/tcindex01.c | 156 ++++++++++++++++++++++++++++++++++++++
> 3 files changed, 158 insertions(+)
> create mode 100644 testcases/cve/tcindex01.c
>
> diff --git a/runtest/cve b/runtest/cve
> index 7d1e84f89..f9b36a182 100644
> --- a/runtest/cve
> +++ b/runtest/cve
> @@ -84,6 +84,7 @@ cve-2021-38604 mq_notify03
> cve-2022-0847 dirtypipe
> cve-2022-2590 dirtyc0w_shmem
> cve-2022-23222 bpf_prog07
> +cve-2023-1829 tcindex01
> # Tests below may cause kernel memory leak
> cve-2020-25704 perf_event_open03
> cve-2022-0185 fsconfig03
> diff --git a/testcases/cve/.gitignore b/testcases/cve/.gitignore
> index 90e8b191c..389354eaf 100644
> --- a/testcases/cve/.gitignore
> +++ b/testcases/cve/.gitignore
> @@ -12,3 +12,4 @@ cve-2017-16939
> cve-2017-17053
> cve-2022-4378
> icmp_rate_limit01
> +tcindex01.c
> diff --git a/testcases/cve/tcindex01.c b/testcases/cve/tcindex01.c
> new file mode 100644
> index 000000000..89569d1f7
> --- /dev/null
> +++ b/testcases/cve/tcindex01.c
> @@ -0,0 +1,156 @@
> +// SPDX-License-Identifier: GPL-2.0-or-later
> +/*
> + * Copyright (C) 2023 SUSE LLC <mdoucha@suse.cz>
> + */
> +
> +/*\
> + * CVE-2023-1829
> + *
> + * Test for use-after-free after removing tcindex traffic filter with certain
> + * parameters.
> + *
> + * Tcindex filter removed in:
> + *
> + * commit 8c710f75256bb3cf05ac7b1672c82b92c43f3d28
> + * Author: Jamal Hadi Salim <jhs@mojatatu.com>
> + * Date: Tue Feb 14 08:49:14 2023 -0500
> + *
> + * net/sched: Retire tcindex classifier
> + */
> +
> +#include <linux/netlink.h>
> +#include <linux/pkt_sched.h>
> +#include <linux/pkt_cls.h>
> +#include <linux/tc_act/tc_gact.h>
> +#include "tst_test.h"
> +#include "tst_rtnetlink.h"
> +#include "tst_netdevice.h"
> +#include "lapi/sched.h"
> +#include "lapi/if_ether.h"
> +#include "lapi/rtnetlink.h"
> +
> +#define DEVNAME "ltp_dummy1"
> +
> +static const uint32_t qd_handle = TC_H_MAKE(1 << 16, 0);
> +static const uint32_t clsid = TC_H_MAKE(1 << 16, 1);
> +static const uint32_t shift = 10;
> +static const uint16_t mask = 0xffff;
> +
> +/* rtnetlink payloads */
> +static const struct tc_htb_glob qd_opt = {
> + .rate2quantum = 10,
> + .version = 3,
> + .defcls = 30
> +};
> +static const struct tc_gact f_gact_param = {
> + .action = TC_ACT_SHOT
> +};
> +static struct tc_htb_opt cls_opt = {};
> +
> +/* htb qdisc and class options */
> +static const struct tst_rtnl_attr_list qd_config[] = {
> + {TCA_OPTIONS, NULL, 0, (const struct tst_rtnl_attr_list[]){
> + {TCA_HTB_INIT, &qd_opt, sizeof(qd_opt), NULL},
> + {0, NULL, -1, NULL}
> + }},
> + {0, NULL, -1, NULL}
> +};
> +static const struct tst_rtnl_attr_list cls_config[] = {
> + {TCA_OPTIONS, NULL, 0, (const struct tst_rtnl_attr_list[]){
> + {TCA_HTB_PARMS, &cls_opt, sizeof(cls_opt), NULL},
> + {0, NULL, -1, NULL}
> + }},
> + {0, NULL, -1, NULL}
> +};
> +
> +/* tcindex filter options */
> +static const struct tst_rtnl_attr_list f_actopts[] = {
> + {TCA_GACT_PARMS, &f_gact_param, sizeof(f_gact_param), NULL},
> + {0, NULL, -1, NULL}
> +};
> +static const struct tst_rtnl_attr_list f_action[] = {
> + {1, NULL, 0, (const struct tst_rtnl_attr_list[]){
> + {TCA_ACT_KIND, "gact", 5, NULL},
> + {TCA_ACT_OPTIONS | NLA_F_NESTED, NULL, 0, f_actopts},
> + {0, NULL, -1, NULL}
> + }},
> + {0, NULL, -1, NULL}
> +};
> +static const struct tst_rtnl_attr_list f_config[] = {
> + {TCA_OPTIONS, NULL, 0, (const struct tst_rtnl_attr_list[]){
> + {TCA_TCINDEX_MASK, &mask, sizeof(mask), NULL},
> + {TCA_TCINDEX_SHIFT, &shift, sizeof(shift), NULL},
> + {TCA_TCINDEX_CLASSID, &clsid, sizeof(clsid), NULL},
> + {TCA_TCINDEX_ACT, &clsid, sizeof(clsid), f_action},
> + {0, NULL, -1, NULL}
> + }},
> + {0, NULL, -1, NULL}
> +};
> +
> +static void setup(void)
> +{
> + tst_setup_netns();
> + NETDEV_ADD_DEVICE(DEVNAME, "dummy");
> +
> + cls_opt.rate.rate = cls_opt.ceil.rate = 256000;
> + cls_opt.buffer = 1000000 * 1600 / cls_opt.rate.rate;
> + cls_opt.cbuffer = 1000000 * 1600 / cls_opt.ceil.rate;
> +}
> +
> +static void run(void)
> +{
> + unsigned int i;
> +
> + for (i = 0; i < 100; i++) {
> + NETDEV_ADD_QDISC(DEVNAME, AF_UNSPEC, TC_H_ROOT, qd_handle,
> + "htb", qd_config);
> + NETDEV_ADD_TRAFFIC_CLASS(DEVNAME, qd_handle, clsid, "htb",
> + cls_config);
> + NETDEV_ADD_TRAFFIC_FILTER(DEVNAME, qd_handle, 10, ETH_P_IP, 1,
> + "tcindex", f_config);
> + NETDEV_REMOVE_TRAFFIC_FILTER(DEVNAME, qd_handle, 10, ETH_P_IP,
> + 1, "tcindex");
> +
> + /* Wait at least one jiffy for use-after-free */
> + usleep(10000);
> +
> + NETDEV_REMOVE_QDISC(DEVNAME, AF_UNSPEC, TC_H_ROOT, qd_handle,
> + "htb");
> + }
> +
> + if (tst_taint_check()) {
> + tst_res(TFAIL, "Kernel is vulnerable");
> + return;
> + }
> +
> + tst_res(TPASS, "Nothing bad happened (yet)");
> +}
> +
> +static void cleanup(void)
> +{
> + NETDEV_REMOVE_DEVICE(DEVNAME);
> +}
> +
> +static struct tst_test test = {
> + .test_all = run,
> + .setup = setup,
> + .cleanup = cleanup,
> + .taint_check = TST_TAINT_W | TST_TAINT_D,
> + .needs_kconfigs = (const char *[]) {
> + "CONFIG_VETH",
> + "CONFIG_USER_NS=y",
> + "CONFIG_NET_NS=y",
> + "CONFIG_NET_SCH_HTB",
> + "CONFIG_NET_CLS_TCINDEX",
> + NULL
> + },
> + .save_restore = (const struct tst_path_val[]) {
> + {"/proc/sys/user/max_user_namespaces", "1024", TST_SR_SKIP},
> + {}
> + },
> + .tags = (const struct tst_tag[]) {
> + {"linux-git", "8c710f75256b"},
> + {"CVE", "2023-1829"},
> + {}
> + }
> +};
--
Martin Doucha mdoucha@suse.cz
SW Quality Engineer
SUSE LINUX, s.r.o.
CORSO IIa
Krizikova 148/34
186 00 Prague 8
Czech Republic
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 15+ messages in thread
* [LTP] [PATCH v2 3/3] Add test for CVE 2023-1829
2023-07-27 15:00 [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks Martin Doucha
` (3 preceding siblings ...)
2023-07-28 11:43 ` Petr Vorel
@ 2023-08-04 13:28 ` Martin Doucha
2023-08-04 13:38 ` Cyril Hrubis
4 siblings, 1 reply; 15+ messages in thread
From: Martin Doucha @ 2023-08-04 13:28 UTC (permalink / raw)
To: ltp
Fixes #1053
Signed-off-by: Martin Doucha <mdoucha@suse.cz>
---
Changes since v1:
- Fixed typo in .gitignore
- Removed unnecessary TCA_TCINDEX_ACT attribute tree from filter config
- Added credit for the original reproducer
Reproducer was tested on both affected and fixed SLE-15SP5 kernels.
runtest/cve | 1 +
testcases/cve/.gitignore | 1 +
testcases/cve/tcindex01.c | 141 ++++++++++++++++++++++++++++++++++++++
3 files changed, 143 insertions(+)
create mode 100644 testcases/cve/tcindex01.c
diff --git a/runtest/cve b/runtest/cve
index 7d1e84f89..f9b36a182 100644
--- a/runtest/cve
+++ b/runtest/cve
@@ -84,6 +84,7 @@ cve-2021-38604 mq_notify03
cve-2022-0847 dirtypipe
cve-2022-2590 dirtyc0w_shmem
cve-2022-23222 bpf_prog07
+cve-2023-1829 tcindex01
# Tests below may cause kernel memory leak
cve-2020-25704 perf_event_open03
cve-2022-0185 fsconfig03
diff --git a/testcases/cve/.gitignore b/testcases/cve/.gitignore
index 90e8b191c..3a2b2bed6 100644
--- a/testcases/cve/.gitignore
+++ b/testcases/cve/.gitignore
@@ -12,3 +12,4 @@ cve-2017-16939
cve-2017-17053
cve-2022-4378
icmp_rate_limit01
+tcindex01
diff --git a/testcases/cve/tcindex01.c b/testcases/cve/tcindex01.c
new file mode 100644
index 000000000..9bd7de9dd
--- /dev/null
+++ b/testcases/cve/tcindex01.c
@@ -0,0 +1,141 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
+/*
+ * Copyright (C) 2023 SUSE LLC
+ * Author: Marcos Paulo de Souza <mpdesouza@suse.com>
+ * LTP port: Martin Doucha <mdoucha@suse.cz>
+ */
+
+/*\
+ * CVE-2023-1829
+ *
+ * Test for use-after-free after removing tcindex traffic filter with certain
+ * parameters.
+ *
+ * Tcindex filter removed in:
+ *
+ * commit 8c710f75256bb3cf05ac7b1672c82b92c43f3d28
+ * Author: Jamal Hadi Salim <jhs@mojatatu.com>
+ * Date: Tue Feb 14 08:49:14 2023 -0500
+ *
+ * net/sched: Retire tcindex classifier
+ */
+
+#include <linux/netlink.h>
+#include <linux/pkt_sched.h>
+#include <linux/pkt_cls.h>
+#include "tst_test.h"
+#include "tst_rtnetlink.h"
+#include "tst_netdevice.h"
+#include "lapi/sched.h"
+#include "lapi/if_ether.h"
+#include "lapi/rtnetlink.h"
+
+#define DEVNAME "ltp_dummy1"
+
+static const uint32_t qd_handle = TC_H_MAKE(1 << 16, 0);
+static const uint32_t clsid = TC_H_MAKE(1 << 16, 1);
+static const uint32_t shift = 10;
+static const uint16_t mask = 0xffff;
+
+/* rtnetlink payloads */
+static const struct tc_htb_glob qd_opt = {
+ .rate2quantum = 10,
+ .version = 3,
+ .defcls = 30
+};
+static struct tc_htb_opt cls_opt = {};
+
+/* htb qdisc and class options */
+static const struct tst_rtnl_attr_list qd_config[] = {
+ {TCA_OPTIONS, NULL, 0, (const struct tst_rtnl_attr_list[]){
+ {TCA_HTB_INIT, &qd_opt, sizeof(qd_opt), NULL},
+ {0, NULL, -1, NULL}
+ }},
+ {0, NULL, -1, NULL}
+};
+static const struct tst_rtnl_attr_list cls_config[] = {
+ {TCA_OPTIONS, NULL, 0, (const struct tst_rtnl_attr_list[]){
+ {TCA_HTB_PARMS, &cls_opt, sizeof(cls_opt), NULL},
+ {0, NULL, -1, NULL}
+ }},
+ {0, NULL, -1, NULL}
+};
+
+/* tcindex filter options */
+static const struct tst_rtnl_attr_list f_config[] = {
+ {TCA_OPTIONS, NULL, 0, (const struct tst_rtnl_attr_list[]){
+ {TCA_TCINDEX_MASK, &mask, sizeof(mask), NULL},
+ {TCA_TCINDEX_SHIFT, &shift, sizeof(shift), NULL},
+ {TCA_TCINDEX_CLASSID, &clsid, sizeof(clsid), NULL},
+ {0, NULL, -1, NULL}
+ }},
+ {0, NULL, -1, NULL}
+};
+
+static void setup(void)
+{
+ tst_setup_netns();
+ NETDEV_ADD_DEVICE(DEVNAME, "dummy");
+
+ cls_opt.rate.rate = cls_opt.ceil.rate = 256000;
+ cls_opt.buffer = 1000000 * 1600 / cls_opt.rate.rate;
+ cls_opt.cbuffer = 1000000 * 1600 / cls_opt.ceil.rate;
+}
+
+static void run(void)
+{
+ unsigned int i;
+
+ for (i = 0; i < 100; i++) {
+ NETDEV_ADD_QDISC(DEVNAME, AF_UNSPEC, TC_H_ROOT, qd_handle,
+ "htb", qd_config);
+ NETDEV_ADD_TRAFFIC_CLASS(DEVNAME, qd_handle, clsid, "htb",
+ cls_config);
+ NETDEV_ADD_TRAFFIC_FILTER(DEVNAME, qd_handle, 10, ETH_P_IP, 1,
+ "tcindex", f_config);
+ NETDEV_REMOVE_TRAFFIC_FILTER(DEVNAME, qd_handle, 10, ETH_P_IP,
+ 1, "tcindex");
+
+ /* Wait at least one jiffy for use-after-free */
+ usleep(10000);
+
+ NETDEV_REMOVE_QDISC(DEVNAME, AF_UNSPEC, TC_H_ROOT, qd_handle,
+ "htb");
+ }
+
+ if (tst_taint_check()) {
+ tst_res(TFAIL, "Kernel is vulnerable");
+ return;
+ }
+
+ tst_res(TPASS, "Nothing bad happened (yet)");
+}
+
+static void cleanup(void)
+{
+ NETDEV_REMOVE_DEVICE(DEVNAME);
+}
+
+static struct tst_test test = {
+ .test_all = run,
+ .setup = setup,
+ .cleanup = cleanup,
+ .taint_check = TST_TAINT_W | TST_TAINT_D,
+ .needs_kconfigs = (const char *[]) {
+ "CONFIG_VETH",
+ "CONFIG_USER_NS=y",
+ "CONFIG_NET_NS=y",
+ "CONFIG_NET_SCH_HTB",
+ "CONFIG_NET_CLS_TCINDEX",
+ NULL
+ },
+ .save_restore = (const struct tst_path_val[]) {
+ {"/proc/sys/user/max_user_namespaces", "1024", TST_SR_SKIP},
+ {}
+ },
+ .tags = (const struct tst_tag[]) {
+ {"linux-git", "8c710f75256b"},
+ {"CVE", "2023-1829"},
+ {}
+ }
+};
--
2.41.0
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply related [flat|nested] 15+ messages in thread
* Re: [LTP] [PATCH v2 3/3] Add test for CVE 2023-1829
2023-08-04 13:28 ` [LTP] [PATCH v2 3/3] Add test for CVE 2023-1829 Martin Doucha
@ 2023-08-04 13:38 ` Cyril Hrubis
0 siblings, 0 replies; 15+ messages in thread
From: Cyril Hrubis @ 2023-08-04 13:38 UTC (permalink / raw)
To: Martin Doucha; +Cc: ltp
Hi!
Patchset pushed, thanks.
--
Cyril Hrubis
chrubis@suse.cz
--
Mailing list info: https://lists.linux.it/listinfo/ltp
^ permalink raw reply [flat|nested] 15+ messages in thread
end of thread, other threads:[~2023-08-04 13:38 UTC | newest]
Thread overview: 15+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2023-07-27 15:00 [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks Martin Doucha
2023-07-27 15:00 ` [LTP] [PATCH 2/3] tst_netdevice: Add helper functions for qdisc and filter management Martin Doucha
2023-07-28 7:53 ` Cyril Hrubis
2023-07-28 8:21 ` Martin Doucha
2023-07-28 12:09 ` Petr Vorel
2023-07-27 15:00 ` [LTP] [PATCH 3/3] Add test for CVE 2023-1829 Martin Doucha
2023-07-28 8:36 ` Petr Vorel
2023-08-03 12:51 ` Cyril Hrubis
2023-08-04 9:23 ` Martin Doucha
2023-07-28 7:46 ` [LTP] [PATCH 1/3] tst_netdevice: Add missing rtnetlink context allocation checks Cyril Hrubis
2023-07-28 8:17 ` Martin Doucha
2023-07-28 8:45 ` Cyril Hrubis
2023-07-28 11:43 ` Petr Vorel
2023-08-04 13:28 ` [LTP] [PATCH v2 3/3] Add test for CVE 2023-1829 Martin Doucha
2023-08-04 13:38 ` Cyril Hrubis
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox