Skip site navigation (1)Skip section navigation (2)
Date:      Fri, 19 Sep 2008 15:43:21 -0700
From:      "Maksim Yevmenkin" <maksim.yevmenkin@gmail.com>
To:        "Alexey Shuvaev" <shuvaev@physik.uni-wuerzburg.de>
Cc:        freebsd-current@freebsd.org
Subject:   Re: Interface auto-cloning bug or feature?
Message-ID:  <bb4a86c70809191543y7f3d38ex73c48186dfd163c5@mail.gmail.com>
In-Reply-To: <20080919203310.GA34131@localhost.my.domain>
References:  <48D2F942.4070801@FreeBSD.org> <20080919084201.GD44330@wep4035.physik.uni-wuerzburg.de> <48D38DFF.8000803@FreeBSD.org> <20080919203310.GA34131@localhost.my.domain>

next in thread | previous in thread | raw e-mail | index | archive | help

[-- Attachment #1 --]
[....]

>> That what has caused me to look into this issue. You can find patch for
>> security/vpnc to prevent unbounded interface cloning here:
>>
>> http://sobomax.sippysoft.com/~sobomax/vpnc.diff
>>
> Ok, the patch prevents interface cloning, but I think it doesn't solve
> the actual problem.
> Let's wait for Maksim :)

ok, how about attached patch. i put it together *very* quickly and
only gave it a light testing. its for tap(4), because i could compile
it as a module and tun(4) is compiled into kernel by default, but the
idea should identical for tun(4). should be even simpler for tun(4)
because it does not have to deal with 2 kind of devices (i.e. tap and
vmnet). give it a try, and see if it works. please try both cloning
paths, i.e.

1) cat /dev/tap (/dev/vmnet) with and/or without unit number

and

2) ifconfig tapX (vmnetX) create/destroy

in the mean time i will prepare something similar for tun(4).

thanks,
max

[-- Attachment #2 --]
--- if_tap.c.orig	2008-09-08 17:20:57.000000000 -0700
+++ if_tap.c	2008-09-19 15:35:02.000000000 -0700
@@ -94,6 +94,7 @@
 static int		tapifioctl(struct ifnet *, u_long, caddr_t);
 static void		tapifinit(void *);
 
+static int		tap_clone_lookup(struct cdev **, u_short);
 static int		tap_clone_create(struct if_clone *, int, caddr_t);
 static void		tap_clone_destroy(struct ifnet *);
 static int		vmnet_clone_create(struct if_clone *, int, caddr_t);
@@ -176,6 +177,28 @@
 DEV_MODULE(if_tap, tapmodevent, NULL);
 
 static int
+tap_clone_lookup(struct cdev **dev, u_short extra)
+{
+	struct tap_softc *tp;
+
+	mtx_lock(&tapmtx);
+	SLIST_FOREACH(tp, &taphead, tap_next) {
+		mtx_lock(&tp->tap_mtx);
+		if ((tp->tap_flags & (TAP_OPEN|extra)) == extra) {
+			*dev = tp->tap_dev;
+			mtx_unlock(&tp->tap_mtx);
+			mtx_unlock(&tapmtx);
+
+			return (1);
+		}
+		mtx_unlock(&tp->tap_mtx);
+	}
+	mtx_unlock(&tapmtx);
+
+	return (0);
+}
+
+static int
 tap_clone_create(struct if_clone *ifc, int unit, caddr_t params)
 {
 	struct cdev *dev;
@@ -353,8 +376,18 @@
 
 	/* We're interested in only tap/vmnet devices. */
 	if (strcmp(name, TAP) == 0) {
+		if (tap_clone_lookup(dev, 0)) {
+			dev_ref(*dev);
+			return;
+		}
+
 		unit = -1;
 	} else if (strcmp(name, VMNET) == 0) {
+		if (tap_clone_lookup(dev, TAP_VMNET)) {
+			dev_ref(*dev);
+			return;
+		}
+
 		unit = -1;
 		extra = VMNET_DEV_MASK;
 	} else if (dev_stdclone(name, NULL, TAP, &unit) != 1) {

Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?bb4a86c70809191543y7f3d38ex73c48186dfd163c5>