be97f7
From 74061958f56a4626a3a146c72f16e43012e828f1 Mon Sep 17 00:00:00 2001
be97f7
From: Phil Sutter <psutter@redhat.com>
be97f7
Date: Thu, 14 Sep 2017 15:39:23 +0200
be97f7
Subject: [PATCH] netns: avoid directory traversal
be97f7
be97f7
Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=1468529
be97f7
Upstream Status: iproute2.git commit 79928fd0552b5
be97f7
be97f7
commit 79928fd0552b520aa36a22e71144d10a32f7e4fe
be97f7
Author: Matteo Croce <mcroce@redhat.com>
be97f7
Date:   Thu Jul 20 00:36:32 2017 +0200
be97f7
be97f7
    netns: avoid directory traversal
be97f7
be97f7
    ip netns keeps track of created namespaces with bind mounts named
be97f7
    /var/run/netns/<namespace>. No input sanitization is done, allowing creation and
be97f7
    deletion of files relatives to /var/run/netns or, if the path is non existent or
be97f7
    invalid, allows to create "untracked" namespaces (invisible to the tool).
be97f7
be97f7
    This commit denies creation or deletion of namespaces with names contaning
be97f7
    "/" or matching exactly "." or "..".
be97f7
be97f7
    Signed-off-by: Matteo Croce <mcroce@redhat.com>
be97f7
---
be97f7
 ip/ipnetns.c | 10 ++++++++++
be97f7
 1 file changed, 10 insertions(+)
be97f7
be97f7
diff --git a/ip/ipnetns.c b/ip/ipnetns.c
be97f7
index 0b0378a..4254994 100644
be97f7
--- a/ip/ipnetns.c
be97f7
+++ b/ip/ipnetns.c
be97f7
@@ -766,6 +766,11 @@ static int netns_monitor(int argc, char **argv)
be97f7
 	return 0;
be97f7
 }
be97f7
 
be97f7
+static int invalid_name(const char *name)
be97f7
+{
be97f7
+	return strchr(name, '/') || !strcmp(name, ".") || !strcmp(name, "..");
be97f7
+}
be97f7
+
be97f7
 int do_netns(int argc, char **argv)
be97f7
 {
be97f7
 	netns_nsid_socket_init();
be97f7
@@ -775,6 +780,11 @@ int do_netns(int argc, char **argv)
be97f7
 		return netns_list(0, NULL);
be97f7
 	}
be97f7
 
be97f7
+	if (argc > 1 && invalid_name(argv[1])) {
be97f7
+		fprintf(stderr, "Invalid netns name \"%s\"\n", argv[1]);
be97f7
+		exit(-1);
be97f7
+	}
be97f7
+
be97f7
 	if ((matches(*argv, "list") == 0) || (matches(*argv, "show") == 0) ||
be97f7
 	    (matches(*argv, "lst") == 0)) {
be97f7
 		netns_map_init();
be97f7
-- 
be97f7
1.8.3.1
be97f7