Closed Bug 174590 Opened 22 years ago Closed 21 years ago

DNS "Pinning" behavior leads to security hole

Categories

(Core :: Security, defect)

defect
Not set
critical

Tracking

()

VERIFIED FIXED

People

(Reporter: eliasen, Assigned: darin.moz)

References

Details

The current behavior for DNS "pinning" leads to a security hole which allows
information to be sent to the wrong server, even without evil intent.  Scenario
is described below.

I believe that the current behavior to cache DNS entries forever is a standards
violation.  The standard for DNS, RFC 1035 states:

   - With the proper search procedures, authoritative data in zones
     will always "hide", and hence take precedence over, cached
     data.

   - Cached data should never be used in preference to
     authoritative data, so if caching would cause this to happen
     the data should not be cached.

DNS TTL information is not something that a single application should decide it
doesn't want to abide by.  

There has been some discussion that the current behavior is in response to a
"security" issue.  The current behavior, however, exchanges this for a more
common security problem, which occurs even if nobody is actively trying to steal
information.

 Refusing to abide by the TTL parameter from a DNS lookup is every bit as large
of a security hole, perhaps larger.  Using a cached, expired DNS lookup (such as
for those users using dynamic DNS services,) will end up sending the wrong
information to the wrong server, possibly an e-vil server.

Scenario:

1.  My home server, using DHCP, receives a dynamic IP address of 12.13.14.15

2.  I register the dynamic service myhome.dyndns.org to point to 12.13.14.15

3.  User Alice visits my web site, using Mozilla, and begins a transaction.

4.  My DHCP lease expires and I am given a new IP address of 12.200.200.200

5.  My server detects the change and automatically registers myhome.dyndns.org
to 12.200.200.200

6.  My old DHCP address, 12.13.14.15 is given to Bob Evil's computer.

7.  Alice finishes filling out a web form in Mozilla and submits it.  Mozilla
erroneously uses the cached IP address 12.13.14.15, and the data is incorrectly
sent to Bob Evil's computer.  

   The information sent may be stored in the HTTP log or may generate errors. 
Private cookies that allow the Bad Guys to forge Alice's session or impersonate
Alice will also be sent.

This bug also creates two major usability problems for Mozilla:

1.) I run a server from home on my DSL line.  My IP address changes
periodically, so I use a dynamic DNS service like dyndns.org.  This allows me to
use the same fully-qualified domain name that always maps to my home server.  It
works perfectly in every single application *except* Mozilla, which gives "Could
not connect to server" errors because it caches DNS entries forever.  Shutting
down the browser works, but it makes everyone think that my server is actually
down.  No other browser has this problem.

   This happens quite commonly with a dynamic IP address.  I've ended up hitting
other peoples' DSL routers (if they have no web site set up) instead of my own
server with Mozilla, even though I've registered a new IP address, and DNS
lookup gives the proper new address.

2.) Load-balanced or fail-safe corporate server farms that use round-robin DNS
are actually made *less* reliable using Mozilla's DNS caching mechanism.  If one
server is overloaded, taken down, or crashes, Mozilla is unable to connect using
the old, expired DNS entry.  This is one reason that some companies don't like
to use Mozilla.  It makes it appear that their web servers are down, when
they're actually available all the time due to clever fail-over and DNS-based
load balancing.
Severity: major → critical
Status: UNCONFIRMED → NEW
Ever confirmed: true
Dupe of bug 162871. See also bug 151929 comment 7 : the 'pinning' is the result
of some security fix a while ago.
Oop, I misread. This was split off bug 162871 ofcourse.

BTW : my daytime job is for a for telecommunciations manufacturer (I'm the
developer of one the largest access servers in the world). Our software also
shows this 'pinning' behaviour for a very good reason : security. We monitor
remote clients and servers continuously for any change. We're not even fully
respecting the TTL, we'll query the real DNS-server at least once an hour just
to be sure if we can catch any change in address (TTL is basically useless if
it's too large).

But the difference is that we're *not* going to switch to the new ip-address
directly. We could easily have a DNS-server that was hijacked (already
happened), or that was misconfigured (happens even more :-). No, if the
ip-address is changed, we'll warn the operators to double-check if the change is
allowed (the remote address is controlled by a another network provider).

I agree that we have a problem with load-balancing webservers and webserver with
multiple addresses. We really should try all existing ip-addresses before
deciding that a webserver is unreachable.

But when the ip-address of your webserver changes (when we fixed bug 151929), we
should *not* use the new address automatically. What we should do is to warn the
user that the ip-address is changed, and ask permission to continue. This should
especially happen when we're in the middle of a transaction !
That behavior would cause a lot of user confusion. Most users don't even know
what DNS is; they will be annoyed to be prompted with warnings they don't
understand. When companies use products like Cisco DistributedDirector, DNS
information for a given hostname can change often. I really don't think we want
to pop an error or warning every time a user runs across this.
No, load balancing wouldn't be affected, you get only the warning when a
DNS-lookup changes to a completely different address, most likely because it
dynamic DNS address. A name that maps to 2 or more ip-addresses (poor-man load
balancing) won't trigger such a dialog. A hardware ip-switch hides several
servers behind 1 static ip-address - that won't change. A redirector that uses
regualar http-redirects to implement load-balancing (like used by Hotmail) won't
be affected.

If you really hate these dialogs to pop up, then I guess you want to remove
those security popups that occur on https-sites too (untrusted certificate, etc...).

I only want an extra dialog-box to warn me when an ip-address changes, so we can
avoid the Princeton exploit (see bug 149943), while avoiding the security
problem I see almost every week in my daytime job. The black-hat community is
really using these exploit to attacks access-servers all over the Internet.
Holding an ip-address in memory forever is a security problem, but allowing it
to be transparently changed is a security problem too! 
DistributedDirectors can and do change the IP address returned for a given
hostname on a regular basis (with a short TTL on the A record). That is one of
their features, and people do use it. It WILL cause your proposed dialog to be
triggered under normal circumstances. 

If the SSL cert matches, you're fine (or you have bigger problems). If you're
not using SSL, you have no assurance that you're talking to who you think you're
talking to anyway. There's no security to begin with when you're relying on DNS
alone.

This problem manifests itself at http://www.techtv.com/ which sends rather
short-lived TTL information for its A record.  After going for food and trying
to reload a page, I got "could not connect to server" errors.  From
packet-sniffing my connection, I could see that Mozilla was trying to use an
incorrect IP address that did not match authoritative DNS data.  Other browsers
worked fine.

Restarting Mozilla fixed the problem.
This bug also occured today on the extremely popular sites
http://www.amazon.com/ and http://us.imdb.com/

These sites use Coyote Systems Equalizer which tends to hand out DNS records
with a TTL of about 60 seconds.  Verified via packet sniffer that Mozilla was
not sending to the authoritative IP address as returned by DNS.  Repeatedly got
"could not connect to server" error.  Other browsers were able to connect.
I'm curious as to how the current security "fix" improves matters any.  If the
DNS record is already compromised when you start up Mozilla, then this will
"pin" to the compromised address for the whole time Mozilla is running.  If the
DNS server gets "uncompromised," you'll be pinned to the evil server and never
pick up the right one! 

There is no reason to believe that the address returned at whatever random
moment you first did a DNS lookup of a site is secure and other subsequent times
would be more insecure.  The "security fix" seems valueless, as it is based on
flawed assumptions.

The timing is completely random, based on the time you start Mozilla.  This is
the worst type of "security fix," one that not only leads to a false sense of
security, but is simply unable to improve security, and a violation of
standards, and opens other, more common security holes and usability problems
that don't require evil intent.  The "security fix" should simply be removed as
its benefit is purely illusory.
Re: Comment #8.

You've mis-understood the problem pinning fixes. The problem is this: Let's say
that I, an evil attacker at www.evil.com, want to connect to a host behind your
firewall. Well, my problem is that darn firewall blocking me.

One day, I notice that JavaScript could be used to do it, except that JavaScript
can only make connections to the host it was downloaded from. So, being the Evil
Attacker that I am, I wonder "what exactly is defined as the 'same host'?" I
find out that it is a DNS based definition, so same host means 'same hostname'.
I then realize that I could set up an evil DNS server, with the following
behavior: On the first hit from your IP address, it returns 208.225.90.120, my
Evil IP Address; on the second hit, it returns 192.168.1.1, the
behind-the-firewall IP I want to attack.

So, here's what happens:
   1) You visit www.evilporn.com (or whatever)
   1(a) The IP address is 208.225.90.120
   2) You download some javascript from www.evilporn.com. This javascript
      sets itself up to do some stuff after the TTL on www.evilporn.com
      expires.
   3) The JavaScript timer fires. It attempts to access 'www.evilporn.com'
   4) Security policies see that javascript is trying to access its own
      server, which is OK.
   5) you resolve www.evilporn.com
   5(a) The IP address is 192.168.1.1
   6) Javascript hacks your host 192.168.1.1.

Pinning stops 5(a) by making the IP address still be 208.225.90.120, so I wind
up attacking myself.
How about, when a page is retrieved, the hostname/ip address of where that page
was retrieved from is cached with that page, and any javascript on that page
will always use that cached ip address for any 'same host' communication.  

I've been bit by this a couple of times, just recently with sourceforge when
they changed to a new IP.
How does pinning of hostname->address help security anyway?

I guess that (please correct me if I'm wrong) JavaScript in a document from host
www.evil.com can not only access the DOM of documents from the same host, but
also from evil.com. If that is true, slightly modifying the attack that led to
the implementation of pinning would render that countermeasure completely
useless (leaving only its ugly side-effects):

In the DNS, attacker has:

www.evil.com A 1.0.0.1 ; address in the attacker's network
evil.com     A 10.0.0.1 ; some address in the internal network of $victim

Now, when $victim loads <URL:http://www.evil.com/>, a JavaScript on that page
could (if my assumption is correct) access evil.com, which is a host on
$victim's network. No changes of IP-addresses involved, hence pinning won't
defeat this attack.
> please correct me if I'm wrong

You are wrong.  www.evil.com and evil.com are totally distinct for security
purposes; the only way for one to access the other is if they both set
document.domain to evil.com.
>> please correct me if I'm wrong

> You are wrong.  www.evil.com and evil.com are totally distinct
> for security purposes; the only way for one to access the other
> is if they both set document.domain to evil.com.

I am sorry, I need to insist. According to the documentation at
<URL:http://www.mozilla.org/projects/security/components/same-origin.html>, in
my example, the attacker on http://www.evil.com could legally set
document.domain="evil.com"; making his evil pages' equivalent origin the *same*
as the origin of the $victim's internal server at http://evil.com, eventually
allowing him access.

I hope I'm not still mistaken with this extended description.

Thank you for replying during your vacation, btw.
Boris is right, both pages have to set document.domain="evil.com" explicitly
(even if that's the implicit value for one of the sites) in order to prevent
just the attack you propose. This was not always the case and old documentation
may not have caught up. IE 6.0 SP1 reportedly also made the change to require
both pages to have set document.domain explicitly. That's a completely different
problem so please don't drag it into the discussion on DNS pinning.
*** Bug 205148 has been marked as a duplicate of this bug. ***
->darin
Assignee: mstoltz → darin
Note that the patch in bug 205726 (nsDnsService rewrite) contains a preference
to disable DNS pinning (default remains enabled).
Depends on: 205726
ok, now that the patch for bug 205726 has landed, DNS pinning is now a think of
the past.  this bug is fixed (note: on the trunk only).
Status: NEW → RESOLVED
Closed: 21 years ago
Resolution: --- → FIXED
V fixed.
Status: RESOLVED → VERIFIED
QA Contact: bsharma → benc
You need to log in before you can comment on or make changes to this bug.