network: prevent dnsmasq from listening on localhost

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
753ff83a50. 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.
This commit is contained in:
Laine Stump 2012-12-13 01:46:40 -05:00
parent d0d3e92d0b
commit d66eb78667
13 changed files with 16 additions and 7 deletions

View File

@ -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.

View File

@ -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

View File

@ -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

View File

@ -7,6 +7,7 @@
strict-order
domain-needed
local=//
except-interface=lo
bind-dynamic
interface=virbr1
dhcp-range=192.168.122.1,static

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -7,6 +7,7 @@
strict-order
domain-needed
local=//
except-interface=lo
bind-dynamic
interface=virbr0
txt-record=example,example value

View File

@ -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

View File

@ -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

View File

@ -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

View File

@ -7,6 +7,7 @@
strict-order
domain-needed
local=//
except-interface=lo
bind-dynamic
interface=virbr1
addn-hosts=/var/lib/libvirt/dnsmasq/local.addnhosts