[libvirt] [PATCH] network: prevent dnsmasq from listening on localhost

Laine Stump laine at laine.org
Thu Dec 13 07:34:39 UTC 2012


This patch resolves the problem reported in:

   https://bugzilla.redhat.com/show_bug.cgi?id=886663

The source of the problem was the fix for CVE 2011-3411:

   https://bugzilla.redhat.com/show_bug.cgi?id=833033

which was originally committed upstream in commit
753ff83a50263d6975f88d6605d4b5ddfcc97560. That commit improperly
removed the "--except-interface lo" from dnsmasq commandlines when
--bind-dynamic was used (based on comments in the latter bug).

It turns out that the problem reported in the CVE could be eliminated
without removing "--except-interface lo", and removing it actually
caused each instance of dnsmasq to listen on localhost on port 53,
which created a new problem:

If another instance of dnsmasq using "bind-interfaces" (instead of
"bind-dynamic") had already been started (or if another instance
started later used "bind-dynamic"), this wouldn't have any immediately
visible ill effects, but if you tried to start another dnsmasq
instance using "bind-interfaces" *after* starting any libvirt
networks, the new dnsmasq would fail to start, because there was
already another process listening on port 53.

(Subsequent to the CVE fix, another patch changed the network driver
to put dnsmasq options in a conf file rather than directly on the
dnsmasq commandline, but preserved the same options.)

This patch changes the network driver to *always* add
"except-interface=lo" to dnsmasq conf files, regardless of whether we use
bind-dynamic or bind-interfaces. This way no libvirt dnsmasq instances
are listening on localhost (and the CVE is still fixed).

The actual code change is miniscule, but must be propogated through all
of the test files as well.
---
 src/network/bridge_driver.c                                       | 7 ++++---
 tests/networkxml2confdata/dhcp6-nat-network.conf                  | 1 +
 tests/networkxml2confdata/dhcp6-network.conf                      | 1 +
 tests/networkxml2confdata/dhcp6host-routed-network.conf           | 1 +
 tests/networkxml2confdata/isolated-network.conf                   | 2 +-
 tests/networkxml2confdata/nat-network-dns-hosts.conf              | 1 +
 tests/networkxml2confdata/nat-network-dns-srv-record-minimal.conf | 2 +-
 tests/networkxml2confdata/nat-network-dns-srv-record.conf         | 1 +
 tests/networkxml2confdata/nat-network-dns-txt-record.conf         | 1 +
 tests/networkxml2confdata/nat-network.conf                        | 1 +
 tests/networkxml2confdata/netboot-network.conf                    | 2 +-
 tests/networkxml2confdata/netboot-proxy-network.conf              | 2 +-
 tests/networkxml2confdata/routed-network.conf                     | 1 +
 13 files changed, 16 insertions(+), 7 deletions(-)

diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 4e1958d..a32755d 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -689,6 +689,9 @@ networkDnsmasqConfContents(virNetworkObjPtr network,
      if (pidfile)
         virBufferAsprintf(&configbuf, "pid-file=%s\n", pidfile);
 
+    /* dnsmasq will *always* listen on localhost unless told otherwise */
+    virBufferAddLit(&configbuf, "except-interface=lo\n");
+
     if (dnsmasqCapsGet(caps, DNSMASQ_CAPS_BIND_DYNAMIC)) {
         /* using --bind-dynamic with only --interface (no
          * --listen-address) prevents dnsmasq from responding to dns
@@ -702,9 +705,7 @@ networkDnsmasqConfContents(virNetworkObjPtr network,
                              "interface=%s\n",
                              network->def->bridge);
     } else {
-        virBufferAddLit(&configbuf,
-                             "bind-interfaces\n"
-                             "except-interface=lo\n");
+        virBufferAddLit(&configbuf, "bind-interfaces\n");
         /*
          * --interface does not actually work with dnsmasq < 2.47,
          * due to DAD for ipv6 addresses on the interface.
diff --git a/tests/networkxml2confdata/dhcp6-nat-network.conf b/tests/networkxml2confdata/dhcp6-nat-network.conf
index d488900..050f3db 100644
--- a/tests/networkxml2confdata/dhcp6-nat-network.conf
+++ b/tests/networkxml2confdata/dhcp6-nat-network.conf
@@ -7,6 +7,7 @@
 strict-order
 domain-needed
 local=//
+except-interface=lo
 bind-dynamic
 interface=virbr0
 dhcp-range=192.168.122.2,192.168.122.254
diff --git a/tests/networkxml2confdata/dhcp6-network.conf b/tests/networkxml2confdata/dhcp6-network.conf
index 5c1030c..5fde07f 100644
--- a/tests/networkxml2confdata/dhcp6-network.conf
+++ b/tests/networkxml2confdata/dhcp6-network.conf
@@ -9,6 +9,7 @@ domain-needed
 domain=mynet
 expand-hosts
 local=/mynet/
+except-interface=lo
 bind-dynamic
 interface=virbr0
 dhcp-range=2001:db8:ac10:fd01::1:10,2001:db8:ac10:fd01::1:ff
diff --git a/tests/networkxml2confdata/dhcp6host-routed-network.conf b/tests/networkxml2confdata/dhcp6host-routed-network.conf
index cb4d0cc..f8f05c2 100644
--- a/tests/networkxml2confdata/dhcp6host-routed-network.conf
+++ b/tests/networkxml2confdata/dhcp6host-routed-network.conf
@@ -7,6 +7,7 @@
 strict-order
 domain-needed
 local=//
+except-interface=lo
 bind-dynamic
 interface=virbr1
 dhcp-range=192.168.122.1,static
diff --git a/tests/networkxml2confdata/isolated-network.conf b/tests/networkxml2confdata/isolated-network.conf
index 55a44d3..f8997bd 100644
--- a/tests/networkxml2confdata/isolated-network.conf
+++ b/tests/networkxml2confdata/isolated-network.conf
@@ -7,8 +7,8 @@
 strict-order
 domain-needed
 local=//
-bind-interfaces
 except-interface=lo
+bind-interfaces
 listen-address=192.168.152.1
 dhcp-option=3
 no-resolv
diff --git a/tests/networkxml2confdata/nat-network-dns-hosts.conf b/tests/networkxml2confdata/nat-network-dns-hosts.conf
index ae8f8c5..2577882 100644
--- a/tests/networkxml2confdata/nat-network-dns-hosts.conf
+++ b/tests/networkxml2confdata/nat-network-dns-hosts.conf
@@ -9,6 +9,7 @@ domain-needed
 domain=example.com
 expand-hosts
 local=/example.com/
+except-interface=lo
 bind-dynamic
 interface=virbr0
 addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts
diff --git a/tests/networkxml2confdata/nat-network-dns-srv-record-minimal.conf b/tests/networkxml2confdata/nat-network-dns-srv-record-minimal.conf
index faa36e6..1e9b59c 100644
--- a/tests/networkxml2confdata/nat-network-dns-srv-record-minimal.conf
+++ b/tests/networkxml2confdata/nat-network-dns-srv-record-minimal.conf
@@ -7,8 +7,8 @@
 strict-order
 domain-needed
 local=//
-bind-interfaces
 except-interface=lo
+bind-interfaces
 listen-address=192.168.122.1
 listen-address=192.168.123.1
 listen-address=fc00:db8:ac10:fe01::1
diff --git a/tests/networkxml2confdata/nat-network-dns-srv-record.conf b/tests/networkxml2confdata/nat-network-dns-srv-record.conf
index 6079912..53d044a 100644
--- a/tests/networkxml2confdata/nat-network-dns-srv-record.conf
+++ b/tests/networkxml2confdata/nat-network-dns-srv-record.conf
@@ -7,6 +7,7 @@
 strict-order
 domain-needed
 local=//
+except-interface=lo
 bind-dynamic
 interface=virbr0
 srv-host=name.tcp.test-domain-name,.,1024,10,10
diff --git a/tests/networkxml2confdata/nat-network-dns-txt-record.conf b/tests/networkxml2confdata/nat-network-dns-txt-record.conf
index c448bdc..921cae1 100644
--- a/tests/networkxml2confdata/nat-network-dns-txt-record.conf
+++ b/tests/networkxml2confdata/nat-network-dns-txt-record.conf
@@ -7,6 +7,7 @@
 strict-order
 domain-needed
 local=//
+except-interface=lo
 bind-dynamic
 interface=virbr0
 txt-record=example,example value
diff --git a/tests/networkxml2confdata/nat-network.conf b/tests/networkxml2confdata/nat-network.conf
index 8f28fef..beb714b 100644
--- a/tests/networkxml2confdata/nat-network.conf
+++ b/tests/networkxml2confdata/nat-network.conf
@@ -7,6 +7,7 @@
 strict-order
 domain-needed
 local=//
+except-interface=lo
 bind-dynamic
 interface=virbr0
 dhcp-range=192.168.122.2,192.168.122.254
diff --git a/tests/networkxml2confdata/netboot-network.conf b/tests/networkxml2confdata/netboot-network.conf
index 83dd2b3..b6f3c23 100644
--- a/tests/networkxml2confdata/netboot-network.conf
+++ b/tests/networkxml2confdata/netboot-network.conf
@@ -9,8 +9,8 @@ domain-needed
 domain=example.com
 expand-hosts
 local=/example.com/
-bind-interfaces
 except-interface=lo
+bind-interfaces
 listen-address=192.168.122.1
 dhcp-range=192.168.122.2,192.168.122.254
 dhcp-no-override
diff --git a/tests/networkxml2confdata/netboot-proxy-network.conf b/tests/networkxml2confdata/netboot-proxy-network.conf
index b266d81..1e969fa 100644
--- a/tests/networkxml2confdata/netboot-proxy-network.conf
+++ b/tests/networkxml2confdata/netboot-proxy-network.conf
@@ -9,8 +9,8 @@ domain-needed
 domain=example.com
 expand-hosts
 local=/example.com/
-bind-interfaces
 except-interface=lo
+bind-interfaces
 listen-address=192.168.122.1
 dhcp-range=192.168.122.2,192.168.122.254
 dhcp-no-override
diff --git a/tests/networkxml2confdata/routed-network.conf b/tests/networkxml2confdata/routed-network.conf
index dc53a4e..62ffd7a 100644
--- a/tests/networkxml2confdata/routed-network.conf
+++ b/tests/networkxml2confdata/routed-network.conf
@@ -7,6 +7,7 @@
 strict-order
 domain-needed
 local=//
+except-interface=lo
 bind-dynamic
 interface=virbr1
 addn-hosts=/var/lib/libvirt/dnsmasq/local.addnhosts
-- 
1.7.11.7




More information about the libvir-list mailing list