From 6e83ec0ed7d9906380c15dfcab79befdbcf0e620 Mon Sep 17 00:00:00 2001 From: Anthony Romano Date: Tue, 6 Sep 2016 15:30:51 -0700 Subject: [PATCH] etcdmain: reject binding listeners to domain names Fixes #6336 --- etcdmain/config.go | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) diff --git a/etcdmain/config.go b/etcdmain/config.go index 3d987b76648..9df9374d847 100644 --- a/etcdmain/config.go +++ b/etcdmain/config.go @@ -20,6 +20,7 @@ import ( "flag" "fmt" "io/ioutil" + "net" "net/url" "os" "runtime" @@ -410,6 +411,13 @@ func (cfg *config) configFromFile() error { } func (cfg *config) validateConfig(isSet func(field string) bool) error { + if err := checkBindURLs(cfg.lpurls); err != nil { + return err + } + if err := checkBindURLs(cfg.lcurls); err != nil { + return err + } + // when etcd runs in member mode user needs to set --advertise-client-urls if --listen-client-urls is set. // TODO(yichengq): check this for joining through discovery service case mayFallbackToProxy := isSet("discovery") && cfg.fallback.String() == fallbackFlagProxy @@ -456,3 +464,22 @@ func (cfg config) isReadonlyProxy() bool { return cfg.proxy.String() == pr func (cfg config) shouldFallbackToProxy() bool { return cfg.fallback.String() == fallbackFlagProxy } func (cfg config) electionTicks() int { return int(cfg.ElectionMs / cfg.TickMs) } + +// checkBindURLs returns an error if any URL uses a domain name. +func checkBindURLs(urls []url.URL) error { + for _, url := range urls { + if url.Scheme == "unix" || url.Scheme == "unixs" { + continue + } + host := strings.Split(url.Host, ":")[0] + if host == "localhost" { + // special case for local address + // TODO: support /etc/hosts ? + continue + } + if net.ParseIP(host) == nil { + return fmt.Errorf("expected IP in URL for binding (%s)", url.String()) + } + } + return nil +}