[libvirt] [PATCH v0.10.2-maint] network: prevent dnsmasq from listening on localhost

Laine Stump laine at laine.org
Thu Dec 13 09:00:52 UTC 2012


(I'm sending this v0.10.2-maint "backport" of the upstream patch to
the list because the code in question was completely replaced, so it
required a new patch rather than a backport. The backport for
0.9.11-maint is nearly identical to this, so I won't be sending that
one)

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.

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.

(This is *not* a cherry-pick of the upstream commit, because
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.)
---
 src/network/bridge_driver.c                                       | 8 ++++----
 tests/networkxml2argvdata/isolated-network.argv                   | 2 +-
 tests/networkxml2argvdata/nat-network-dns-hosts.argv              | 2 +-
 tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv | 2 +-
 tests/networkxml2argvdata/nat-network-dns-srv-record.argv         | 2 +-
 tests/networkxml2argvdata/nat-network-dns-txt-record.argv         | 2 +-
 tests/networkxml2argvdata/nat-network.argv                        | 2 +-
 tests/networkxml2argvdata/netboot-network.argv                    | 2 +-
 tests/networkxml2argvdata/netboot-proxy-network.argv              | 2 +-
 tests/networkxml2argvdata/routed-network.argv                     | 2 +-
 10 files changed, 13 insertions(+), 13 deletions(-)

diff --git a/src/network/bridge_driver.c b/src/network/bridge_driver.c
index 1fa7cd0..ff11364 100644
--- a/src/network/bridge_driver.c
+++ b/src/network/bridge_driver.c
@@ -672,6 +672,9 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
     /* *no* conf file */
     virCommandAddArg(cmd, "--conf-file=");
 
+    /* dnsmasq will *always* listen on localhost unless told otherwise */
+    virCommandAddArgList(cmd, "--except-interface", "lo", NULL);
+
     if (dnsmasqCapsGet(caps, DNSMASQ_CAPS_BIND_DYNAMIC)) {
         /* using --bind-dynamic with only --interface (no
          * --listen-address) prevents dnsmasq from responding to dns
@@ -685,10 +688,7 @@ networkBuildDnsmasqArgv(virNetworkObjPtr network,
                              "--interface", network->def->bridge,
                              NULL);
     } else {
-        virCommandAddArgList(cmd,
-                             "--bind-interfaces",
-                             "--except-interface", "lo",
-                             NULL);
+        virCommandAddArg(cmd, "--bind-interfaces");
         /*
          * --interface does not actually work with dnsmasq < 2.47,
          * due to DAD for ipv6 addresses on the interface.
diff --git a/tests/networkxml2argvdata/isolated-network.argv b/tests/networkxml2argvdata/isolated-network.argv
index 3d8601e..861fd74 100644
--- a/tests/networkxml2argvdata/isolated-network.argv
+++ b/tests/networkxml2argvdata/isolated-network.argv
@@ -1,6 +1,6 @@
 @DNSMASQ@ --strict-order \
 --local=// --domain-needed --conf-file= \
---bind-interfaces --except-interface lo \
+--except-interface lo --bind-interfaces \
 --listen-address 192.168.152.1 \
 --dhcp-option=3 --no-resolv \
 --dhcp-range 192.168.152.2,192.168.152.254 \
diff --git a/tests/networkxml2argvdata/nat-network-dns-hosts.argv b/tests/networkxml2argvdata/nat-network-dns-hosts.argv
index e5143ac..431e987 100644
--- a/tests/networkxml2argvdata/nat-network-dns-hosts.argv
+++ b/tests/networkxml2argvdata/nat-network-dns-hosts.argv
@@ -1,5 +1,5 @@
 @DNSMASQ@ --strict-order --domain=example.com \
 --local=/example.com/ --domain-needed \
 --conf-file= \
---bind-dynamic --interface virbr0 \
+--except-interface lo --bind-dynamic --interface virbr0 \
 --expand-hosts --addn-hosts=/var/lib/libvirt/dnsmasq/default.addnhosts\
diff --git a/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
index 031da3f..24d88ad 100644
--- a/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record-minimal.argv
@@ -1,7 +1,7 @@
 @DNSMASQ@ \
 --strict-order \
 --local=// --domain-needed --conf-file= \
---bind-interfaces --except-interface lo \
+--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/networkxml2argvdata/nat-network-dns-srv-record.argv b/tests/networkxml2argvdata/nat-network-dns-srv-record.argv
index beff591..f417af8 100644
--- a/tests/networkxml2argvdata/nat-network-dns-srv-record.argv
+++ b/tests/networkxml2argvdata/nat-network-dns-srv-record.argv
@@ -1,7 +1,7 @@
 @DNSMASQ@ \
 --strict-order \
 --local=// --domain-needed --conf-file= \
---bind-dynamic --interface virbr0 \
+--except-interface lo --bind-dynamic --interface virbr0 \
 --srv-host=name.tcp.test-domain-name,.,1024,10,10 \
 --dhcp-range 192.168.122.2,192.168.122.254 \
 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
diff --git a/tests/networkxml2argvdata/nat-network-dns-txt-record.argv b/tests/networkxml2argvdata/nat-network-dns-txt-record.argv
index fc164f6..86b7ba3 100644
--- a/tests/networkxml2argvdata/nat-network-dns-txt-record.argv
+++ b/tests/networkxml2argvdata/nat-network-dns-txt-record.argv
@@ -1,6 +1,6 @@
 @DNSMASQ@ --strict-order \
 --local=// --domain-needed --conf-file= \
---bind-dynamic --interface virbr0 \
+--except-interface lo --bind-dynamic --interface virbr0 \
 '--txt-record=example,example value' \
 --dhcp-range 192.168.122.2,192.168.122.254 \
 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
diff --git a/tests/networkxml2argvdata/nat-network.argv b/tests/networkxml2argvdata/nat-network.argv
index 6303f76..8a540d5 100644
--- a/tests/networkxml2argvdata/nat-network.argv
+++ b/tests/networkxml2argvdata/nat-network.argv
@@ -1,6 +1,6 @@
 @DNSMASQ@ --strict-order \
 --local=// --domain-needed --conf-file= \
---bind-dynamic --interface virbr0 \
+--except-interface lo --bind-dynamic --interface virbr0 \
 --dhcp-range 192.168.122.2,192.168.122.254 \
 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/default.leases \
 --dhcp-lease-max=253 --dhcp-no-override \
diff --git a/tests/networkxml2argvdata/netboot-network.argv b/tests/networkxml2argvdata/netboot-network.argv
index 9699e5c..0e17a71 100644
--- a/tests/networkxml2argvdata/netboot-network.argv
+++ b/tests/networkxml2argvdata/netboot-network.argv
@@ -1,6 +1,6 @@
 @DNSMASQ@ --strict-order --domain=example.com \
 --local=/example.com/ --domain-needed --conf-file= \
---bind-interfaces --except-interface lo --listen-address 192.168.122.1 \
+--except-interface lo --bind-interfaces --listen-address 192.168.122.1 \
 --dhcp-range 192.168.122.2,192.168.122.254 \
 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases \
 --dhcp-lease-max=253 --dhcp-no-override --expand-hosts \
diff --git a/tests/networkxml2argvdata/netboot-proxy-network.argv b/tests/networkxml2argvdata/netboot-proxy-network.argv
index 9ac3018..8764ef5 100644
--- a/tests/networkxml2argvdata/netboot-proxy-network.argv
+++ b/tests/networkxml2argvdata/netboot-proxy-network.argv
@@ -1,6 +1,6 @@
 @DNSMASQ@ --strict-order --domain=example.com \
 --local=/example.com/ --domain-needed --conf-file= \
---bind-interfaces --except-interface lo \
+--except-interface lo --bind-interfaces \
 --listen-address 192.168.122.1 \
 --dhcp-range 192.168.122.2,192.168.122.254 \
 --dhcp-leasefile=/var/lib/libvirt/dnsmasq/netboot.leases \
diff --git a/tests/networkxml2argvdata/routed-network.argv b/tests/networkxml2argvdata/routed-network.argv
index 700c904..3221f65 100644
--- a/tests/networkxml2argvdata/routed-network.argv
+++ b/tests/networkxml2argvdata/routed-network.argv
@@ -1,4 +1,4 @@
 @DNSMASQ@ --strict-order \
 --local=// --domain-needed --conf-file= \
---bind-dynamic --interface virbr1 \
+--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