views:

276

answers:

3

We build sites that have a public (non-secured) area and secured (delivered over HTTPS) area and we use jQuery library.

Recently I suggested we use Google CDN for jQuery delivery. Some of my colleagues expressed concerns in regards to security aspect of this way of delivering JavaScript libraries. For example, they mention the scenario where someone might hijack DNS server and then inject maliciously modified library, opening the door for different security attacks. Now, if hacker can inject malicious code through Google CDN, then he can probably do the same if jQuery is served from the site itself, right?

It seems that google CDN supports serving libraries over SSL.

Is serving jQuery from CDN really less secure then serving it from the server itself? How serious is this threat?

+1  A: 

As your colleagues point out, hijacking a DNS server would be an issue here. It wouldn't be if you served the library from the same host as your site. However, if one uses HTTPS, it is unlikely that the attacker would have a valid certificate on the spoofed site. I do not know how browsers would react to this, but I suspect they would flag the site as unsafe (since some part of it can't be trusted) and act accordingly.

So in short; if the CDN is also accessed using HTTPS, there shouldn't be any large risks.

Edit: Also consider the privacy issue mentioned by Gert G.

You
you say it wouldn't be the issue if library is served from the same server as the site. But, if he can hijack DNS, than he can play Man in the Middle with the rest of the site as well.
Dan
But if he's hijacked *your* DNS record, the whole site is untrustworthy, regardless of where you get your jQuery library. The issue is then no longer related to the CDN.
You
well, exactly my point. If he hijacked DNS server, he can hijack my DNS record. In the end, CDN or not CDN, the security is the same.
Dan
+4  A: 

One way to mitigate the risk is to run a checksum against the file obtained from Google, and compare that to a known-good checksum already in your possession.

In response to a question about whether Google alters these files in any way, Google employee Ben Lisbakken suggested comparing MD5 checksums of a file provided by Google to the canonical version of that same file as obtained from its maintainers' home site. Read comment eight on the linked site for context.

If you're concerned about DNS hijacking, then of course the same concerns would apply to the file as obtained from the "original" site. You also probably don't want to incur the speed penalty of running a checksum against the jQuery file on every request -- unless you're incredibly paranoid. And of course, doing so would remove all advantages of using a CDN.

But assuming you're only somewhat paranoid, you could try something like this:

  • Make sure you're referencing a unique and specific version of the jQuery file from Google. For example, do this:

    http://ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js
    

    and not this:

    http://ajax.googleapis.com/ajax/libs/jquery/1.4/jquery.min.js
    

    The latter version may return 1.4.2 now, but 1.4.3 tomorrow. If you have a combination of http and https needs, you can use protocol-relative URLs, like this:

    //ajax.googleapis.com/ajax/libs/jquery/1.4.2/jquery.min.js
    
  • Initially generate and store your own checksum for this file.

  • Periodically repeat the process, and make sure the new checksum matches the old one. If it doesn't, sound the klaxons.

You can do this programmatically, of course. You decide what interval makes sense. Every minute? Every five? You now have the makings of an automatic kill-switch whose sensitivity you can adjust to your preference. The "monitor" routine certainly doesn't have to run synchronously within the application you're looking to secure; perhaps you run a small utility application on the same server just for this purpose.

It's easy enough to test: just alter the stored hash. Since you're referencing a specific file version, the panic button won't be pressed with every minor version update. When you do want to move to a new version of jQuery, change the AJAX API URL on your site and store the new hash.

Ken Redler
Protocol relative URLs aren't good to use due to bugs in IE where it will download the relatively referenced file twice: http://www.stevesouders.com/blog/2010/02/10/5a-missing-schema-double-download/
calvinf
Ah, IE, as always a breath of fresh air. However, that problem seems only to extend to stylesheets. From the referenced page: *"It turns out this only happens with stylesheets. The Missing schema, double download test page I created contains a stylesheet, an image, and a script that all have protocol relative URLs...The stylesheet is downloaded twice, but the image and script are only downloaded once."*
Ken Redler
A: 

If trust exists online then Google is the most trustworthy...

There is no doubt that Google CDN is secure, but problems always always come from user's/server's Internet connection quality.

BTW Google adds some small stat tracking code to it's CDN available JavaScript libraries (about +4kb, see in Firebug) that makes 20kb minified and compressed jQuery library a bit heavy, plus foresee SSL speed.

Anyway minifying/compressing/caching jQuery isn't a problem these days, I suggest make your own...

Otar
Google CDN version of JavaScript libraries contain no tracking code. The jQuery version from the official site is exactly the same file as the one Google hosts from CDN.
Juicy Scripter
If you include jQuery library with Google API loader script it will... <script type="text/javascript" src="http://www.google.com/jsapi?key=INSERT-YOUR-KEY"></script>then google.load('jquery', '1.4.2');
Otar