0% found this document useful (0 votes)
48 views11 pages

Client-Side Web Security Insights

The lecture discusses the evolution of web security, highlighting the shift from a server-centric model to a more complex client-side architecture where browsers now execute rich interactive content. It emphasizes the increased threat surface due to the diverse technologies and origins involved in modern web applications, making security verification challenging. The lecture also covers the importance of isolating content from different providers within the same browser to mitigate security risks.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd
0% found this document useful (0 votes)
48 views11 pages

Client-Side Web Security Insights

The lecture discusses the evolution of web security, highlighting the shift from a server-centric model to a more complex client-side architecture where browsers now execute rich interactive content. It emphasizes the increased threat surface due to the diverse technologies and origins involved in modern web applications, making security verification challenging. The lecture also covers the importance of isolating content from different providers within the same browser to mitigate security risks.
Copyright
© © All Rights Reserved
We take content rights seriously. If you suspect this is your content, claim it here.
Available Formats
Download as PDF, TXT or read online on Scribd

6.

858 Lecture 8
Web  Security

What is the web? In the old days, it was a simple client/server architecture (client
was your web browser, server was a machine on the network that could deliver
static text and images to your browser).
• In the old days,  the server-­‐side  was much more complex than the client-­‐side:
browsers didn't support rich interactivity, but the server might interface with
databases,other  servers, etc.
• Because the server was so much more complicated, "web security" focused on
the server-­‐side.  Up to this point, this class has largely  focused on the server-­‐side  
as well  (e.g.,  buffer overflows on  web  servers,  privilege separation  in  the OKWS
server).

The web has changed: now the browser is very complicated.


• JavaScript: Allows a page to execute client-­‐side  code.
• DOM model Provides a JavaScript interface to the page's HTML,  allowing the
page to add/remove tags, change their styling, etc.
• XMLHttpRequests  (AJAX): Asynchronous HTTP  requests.
• Web  sockets: Full-­‐duplex client-­‐server  communication over TCP.
• Web  workers: Multi-­‐threading  support.
• Multimedia support: <video>, web cams, screen-­‐sharing.
• Geolocation: Browser can determine your location by examining GPS units.
Firefox can also locate you by passing your WiFi information to the Google
Location Service.
• <canvas> and WebGL: Bitmap manipulation and interactive 2D/3D graphics.
• Nacl: Allows browsers to run native code!

The web is now a complex platform for distributed computation! But what does this
mean for security?
• The threat surface  is huge!
• A single web application now spans multiple programming languages,  OSes,
hardware platforms. I might be running Firefox on Windows  interacting with  a
Linux server running Apache and interfacing with memcached and MySQL).
• All of this composition makes it difficult  to verify end-­‐to-­‐end  correctness,  or even
understand what the system is doing. Ex: Parsing contexts and content
sanitization.

<script> var x = 'UNTRUSTED'; </script>


//Single quote breaks out of JS string
//context into JS context
//
//"</script>" breaks out of JS context
//into HTML context

1
• The web specs are incredibly long, very complex, occasionally  contradictory,  and
constantly  evolving.
o So, browser vendors  do something that roughly resembles the specs and
then  laugh about  it with their friends.
o If you want to understand the horror,  go to [Link].

In this lecture,  we're  going to focus on the client-side  of a web application.  In  
particular, we're going to focus on how to isolate content from different providers
that  has to reside within the same browser.
• Big  difference between  a web  application  and a traditional  desktop  application:
the bits in a desktop application typically come from a single vendor  (e.g.,
Microsoft or Apple or TurboTax),  but a single  web application  contains content
from a bunch of different principals!

+--------------------------------------------+
| +--------------------------------------+ |
| | [Link] from [Link] | |
| +--------------------------------------+ |
| +-----------------+ +------------------+ |
| | Analytics .js | | [Link] from | |
| | from [Link] | | from [Link] | |
| +-----------------+ +------------------+ |
| |
| HTML (text inputs, buttons) |
| |
| +--------------------------------------+ |
| | Inline .js from [Link] (defines | |
| | event handlers for HTML GUI inputs) | |
| +--------------------------------------+ |
|+------------------------------------------+|
|| frame: [Link]
|| ||
|| +----------------------+ +--------------+||
|| | Inline .js from | | [Link] from https://
|| | [Link] | | [Link] |||
|| +----------------------+ +--------------+||
|| ||
|+------------------------------------------+|
| |

Question: Which pieces of JavaScript code can access which pieces  of state? For
example…

2
• (." (&3.#- ) ,)' !))!&8)' -- -.. #(." $/,3) ,)'
(8 ))8)'< @'- '3  -#( # ,(. *,#(#*&- 1,).." )6/.
."3 , #(&/ #( ." -' ,' 8 8 8A
• (." $/,3 ) ,)' (8 ))8)' -- -.. #(." #(&#( 0,#*.)
 #( 3 ))8)'< @"3D, B&')-.B ,)' ." -' *& 8 8 8A
• ( ."(&3.#-) ), $/,3-- ."  .2.#(*/.-<@D0 !)..)
'% .". )(.(. #(.,.#0 -)'")18A
• ( 0,#*. #( ." ))% ,' .)/" (3 -.. #( ." ))8)' ,'< )-
#. '.., .". ." ))% ,' #- "..*-7==6 /. ." ))8)' ,' #- ,!/&,
"..*7==<

) (-1,."-+/-.#)(-6,)1-,-/-  -/,#.3 ')& && ." -':),#!#(


*)&#38
• !/!)&71)# ,(. 1-#.--")/&().  & .) .'*, 1#." "
).",D-)(.(.8
• -3 .) -..6 /. .,#%3 .) #'*&'(.8
o 0#)/-&37 "0 .1) # ,(. 1-#.- )*(6." #,-.-#. -")/&
().  & .) )0,1,#.." 0#-/& #-*&3 ) ."-)( -#.8
o 0#)/-&3!))7 0&)*,- -")/&  & .) ,. '-":/*-#.- .".
)'#( )(.(. ,)' '/./&&3 ))*,.#0 1 -#.-8
 :27  -#. .". )'#(- ))!& * . 1#.",& -...8
 :27 0,.#-.'(.-8
 :27 )#& '# 1#!.- >8!86." ))% E&#%E /..)(?8
o ,.) -37  *! ,)' 1 -,0,  )1(&)- 0,#*. &#,,3
,)'  # ,(. -,0, 61". *#&#.#- -")/&.". -,#*. "0<
• -# -.,.!3 ) -':),#!#(*)&#37" ,)1-, --#!(- ( ),#!#(.) 0,3
,-)/,#(  *!6 #(&/#(! 0,#*. &#,,#-8 0,#*. ) ( )(&3--
,-)/,-.". &)(! .)#.-),#!#(8
•  #(#.#)( ) ( ),#!#(7 -"' O ")-.(' O *),.
• ), 2'*&7
o "..*7== ))8)'=#(28".'& >"..*6 ))8)'6 MF @#'*&##.A?
o "..*-7== ))8)'=#(28".'& >"..*-6 ))8)'6 JJI @#'*&##.A?
o "..*7==,8)'7MGMG=#(28".'&>"..*6,8)'6MGMG?
• "'- (  "..*6 "..*-6 .*6 #&6 .8
• )/, '#( #-7
G8 " ),#!#(#- --)#. 1#." &#(.:-# ,-)/,->8!86 ))%#-6 
-.),!6  0,#*. ('-*6   .,6 1#()1-6  0#-/&#-*&3
,6(.1),%,---?8
 ( ),#!#( #- ." '),& +/#0&(. )    #(." (#21),&8
H8 " ,' !.- ." ),#!#( ) #.-  8  ,' #- ." '),& +/#0&(. ) 
*,)-- #( (#28
I8 ,#*.- #(&/ 3  ,' 2/. 1#." ." /."),#.3 ) .".  #&D-
),#!#(8 "#- #- .,/ ), )."#(&#( -,#*.-B(B )(- .". ,*/&& ,)'
2.,(& )'#(-; @(#2 (&)!37 /((#(!  #(,3.".D- -.), #(
-)')3 &-D- ")' #,.),38A


4. Passive  content (e.g., images and CSS)  can't execute  code, so this  content
is given zero  authority.
• Returning to our example:
o The Google  analytics  script and  the  jQuery script can  access  all the
resources  belonging to [Link] (e.g., they can read and write cookies,
attach event  handlers to buttons, manipulate the DOM tree, access
JavaScript variables,  etc.).
o JavaScript code in the Facebook frame has  no access  to  resources in the
[Link] frame, because the two frames have different origins. The two
frames can only  talk via postMessage(), a JavaScript API that allows
domains to exchange immutable strings.
§ If the two frames *were* in the same origin, they  could  use
[Link] and [Link][] to directly interact with  each  
other's  JavaScript state!
o JavaScript code in the Facebook frame cannot issue an  XMLHttpRequest
to [Link]'s server [the network  is a resource  with an origin!]  . . .
o However, the Facebook frame *can* import scripts, CSS,  or images from
[Link] (although  that content can  only  update the Facebook frame, since
the content inherits  the  authority  of the  Facebook origin, not [Link]
origin).
o The browser  checks  the  type  of [Link], determines that [Link] is a image,
and concludes that the image should receive no authority  at all.

What  happens if  the browser mistakenly identifies the MIME type of an object?
• Old versions of IE used to do MIME sniffing.
o Goal:  Detect when  a web server has  given an incorrect  file extension  to an
object (e.g., [Link] should actually be [Link]).
o Mechanism: IE looks at the first 256 bytesof the file and looks for magic
values which indicate a file type.  If there's a disagreement between the
magic values and the file extension,  IE trusts the file  extension.
o Problem: Suppose that a page includes some passive content (e.g.,  an
image) from an attacker-­‐controlled domain. The victim page thinks that
it's  safe  to import passive content, but the attacker can intentionally  put
HTML+JavaScript in the image and execute code in the victim page!
• Moral: Browsers are complex-­‐-­‐-­‐adding a well-­‐intentioned  feature may cause
subtle and unexpected security  bugs.

Let's  take  a deeper  look at how the  browser secures  various  resources.

Frame/window objects
• Note: A frame object is a DOM node of type HTMLIFrameElement,  whereas  the
window  object is the alias for the global JavaScript namespace. Both objects have  
references  to  each  other.
• Get the origin of their frame's URLs
-­‐OR-­‐  

4
• Get the origin of the adjusted [Link]
o A frame's [Link] is originally derived from the URL in the
normal  way.
o A frame can set [Link] to be a suffix of the full domain. Ex:
§ [Link] //Original value
§ [Link] //Allowable new value
§ [Link] //Allowable new value
§ [Link] //Disallowed
§ .com //Disallowed
o Browsers distinguish between a [Link] that  has been  written,
and one that  has not, even if both have the same value! Two frames can
access each other if:
o They have both set [Link] to the same
value,  or
o Neither  has  changed  [Link] (and  those
values  are equal in both frames)
o These rules  help protect a site from being attacked by a buggy/malicious
subdomain, e.g., [Link] trying to attack [Link] by shortening  its
[Link].

DOM nodes
• Get the  origin  of their surrounding frame

Cookies
• A cookie has a domain AND a path. Ex: *.[Link]/6.858/
o Domain can only be a (possibly full) suffix of a page's current domain.
o Path  can be  "/" to  indicate  that all paths  in the domain should have access
to the cookie.
• Whoever sets cookie gets to specify the domain and path.
o Can be  set by  the  server using a header, or by JavaScript  code that  writes
to [Link].
o There's also  a "secure" flag  to  indicate HTTPS-­‐only  cookies.
• Browser keeps cookies on  client-­‐side  disk (modulo cookie expiration,  ephemeral
cookies,  etc.).

• When  generating  an HTTP request,  the browser sends all matching cookies in
the request.
o Secure  cookies only sent for HTTPS  requests.
• JavaScript code can access any cookie that match the code's origin,  but note that
the cookie's path and the origin's port  are ignored!
o The protocol matters, because HTTP  JavaScript cannot access HTTPS
cookies  (although  HTTPS JavaScript can access  both  kinds  of cookies).

• Q: Why is it important to protect cookies from arbitrary  overwriting?

5
• A: If an attacker controls a cookie, the attacker can force the  user to  use an
account  that's controlled  by  an attacker!
o Ex: By controlling a Gmail cookie, an attacker can redirect a user to  an
attacker controlled account  and read any  emails that are sent from that
account.
• Q: Is it  valid for [Link]  to set  a cookie's domain to [Link]?
• A: This is valid according to the rules that we've discussed  so far,  but in practice,
we should disallow such a thing,  since  ".[Link]"  is semantically  a single, "atomic"
domain  like  ".com". Mozilla maintains a public  list which  allows browsers to
determine the  appropriate suffix rules for top-level domains.
[[Link]

HTTP responses:  Many  exceptions  and  half-­‐exceptions  to same-­‐origin  policy.


• XMLHttpRequests: By default,  JavaScript  can only send XMLHttpRequests to its
origin server… unless the remote server has enabled Cross-­‐origin Resource  
Sharing (CORS).  The scheme defines some new HTTP  response  headers:
o Access-­‐Control-­‐Allow-­‐Origin  specifies  which origins can  see HTTP
response.
o Access-­‐Control-­‐Allow-­‐Credentials  specifies if browser  should  accept
cookies in HTTP  request from the foreign origin.
• Images: A frame can load an image from any origin… but it  can't  look  at the
image pixels… but it  can determine the image's size.
• CSS:  Similar story to images-­‐-­‐a frame can't directly read  the  content of external
CSS files, but can infer some of its properties.
• JavaScript: A frame can load JavaScript from any origin . . . but it can't directly
examine the source  code in a <script>  tag/XMLHttpRequest response  body  . . .
but all JavaScript  functions have a public toString() method which reveals source  
code… and a page's home server can always fetch the source code directly  and
then pass it to the page!
o To prevent  reverse-­‐engineering,  many sites minify and obfuscate their
JavaScript.
• Plugins: A frame can run a plugin from any origin.
o <embed src=...> // Requires  plugin-­‐specific elaborations.

Remember that, when the browser generates an HTTP  request, it automatically  


includes  the  relevant cookies.
• What happens if the browser creates a frame with a URL like this?
o [Link]
• This attack is called  a cross-­‐site  request forgery (CSRF).
• Solution: Include some random data in URLs that is difficult for the  attacker
to guess.  Ex:

<form action="/[Link]" ...>


<input type="hidden"
name="csrfToken"

6
value="a6dbe323..."/>

• Each time a user requests the page, the server generates  HTML  with  new
random tokens. When the user submits a request, the server validates the
token  before actually processing  the request.
• Drawback: If each URL to the same object is unique, it's difficult  to cache that
object!

Network addresses almost  have an origin.


• A frame can send HTTP  *and* HTTPS  requests to a host+port that match its
origin.
• Note that the security of the same-­‐origin  policy depends  on the  integrity  of the  
DNS infrastructure!
• DNS rebinding attack
o Goal: Attacker wants to run attacker-­‐controlled JavaScript code with  the  
authority  of an origin that he does not control ([Link]).
o Approach:
1) Attacker  registers a domain name (e.g., [Link]) and creates
a DNS  server to respond to the relevant  queries.
2) User  visits the [Link] website, e.g., by  clicking  on an  
advertisement.
3) The  attacker  website  wants  to  downloads a single object,  but first,  
the browser must issue a DNS request for [Link]. The
attacker's DNS  server responds with a DNS  record to the attacker's
IP address. However,  the record has a short time-­‐to-­‐live.
4) The  attacker rebinds [Link] to the IP address of [Link].
5) A  bit later, the attacker website creates an XMLHttpRequest  that  
connects  to [Link]. That request will actually be sent  to the
IP address of [Link]! The browser won't complain because it
will  revalidate the DNS  record and see the new  binding.
6) Attacker  page can now exfiltrate data, e.g., using CORS  
XMLHttpRequest  to the attacker domain.
o Solutions:  
§ Modify DNS  resolvers so that  external hostnames can never
resolve  to  internal IP addreses.
§ Browsers can pin  DNS  bindings,  regardless of their  TTL settings.  
However, this may break web applications that use dynamic DNS
(e.g., for load-­‐balancing).

What  about  the pixels on  a screen?


• They don't have  an origin! A frame can draw anywhere within  its bounding  box.
• Problem: A parent frame can overlay content atop the pixels of its child frames.
o Ex: At attacker creates a page which has an enticing  button  like "Click  
here for a free iPad!" Atop that button,  the  page creates a child frame that
contains  the Facebook "Like" button. The attacker places that button atop

7
the "free iPad" button, but makes it transparent! So, if the  user clicks  on
the "free iPad" button,  he'll actually "Like"  the attackers page on
Facebook.
• Solutions
1) Frame-­‐busting  code: Include JavaScript that prevents your page from
being included as a frame. Ex: if(top  != self)
2) Have  your  web server send  the  X-­‐Frame-­‐Options HTTP response  header.
This will instruct the browser not  to put your content  in a child frame.

What about frame URLs that don't have an origin?


Ex: [Link]
about:blank
javascript:[Link]="x"

• Sometimes the frame is only accessible to other frames with  that protocol (e.g.,
[Link] [This  can  be  irritating  if you're debugging  a site and you want to mix
file:// and  http:// content].
• Sometimes the frame is just inaccessible to all other origins (e.g.,  "about:").
• Sometimes the origin is inherited from whoever created  the  URL (e.g.,
"javascript:").  This prevents attacks in which a [Link] creates a frame
belonging to [Link], and then navigates the victim frame to a javascript:
URL-­‐-­‐we don't want the JavaScript  to execute in  the context of [Link]!

Names can be used as an attack vector!


• IDN: internationalized domain names (non-­‐latin  letters).
• Supporting more languages is good, but now, it can be difficult  for users to
distinguish two domain names from each other.
• *Ex: The Cyrillic  "C"  character looks like the Latin "C" character!  So, an attacker
can buy a domain like "[Link]" (with a Cyrillic  "C")  and trick  users who
thought  that  they were going to "[Link]" (Latin "C").
• Good example of how new features can undermine security assumptions.
• Browser vendors thought  registrars will  prohibit ambiguous names.
• Registrars  thought browser vendors will  change browser to do something

Plugins  often  have subtly-­‐different security  policies


• Java: Sort of uses the same-­‐origin  policy,  but Java code can set HTTP headers
(bad!  see "Content-­‐Length" discussion), and in some cases, different hostnames
with the same IP address are considered to share the same origin.
• Flash: Developers place a file called [Link] on their  web servers. That
file  specifies  which  origins can talk to  the  server via  Flash.

HTML5  introduces  a new screen-­‐sharing  API: Once  the user gives permission, a site
can capture  the entire visible screen area and transmit it back
to the site's origin.

8
• So, if an attacker page can convince the user to grant  screen-­‐sharing  permission,
the attacker page can open an iframe to a sensitive site (e.g., banking,  Facebook,
email), and capture the screen  contents!
• The iframe will send cookies, so the user will automatically be logged in,
allowing  the attacker to see "real" information, not boring login  page stuff.
• Attacker can make the iframe flash only briefly to prevent the user from noticing
the mischief.
• Possible  defenses:
o Allow users to only screen-­‐share  part of the DOM tree? It seems like this
will  be tedious and error-­‐prone.
o Only allow  an origin  to screen-­‐capture content from its own origin?
Seems like a more reasonable approach, although it prevents
Since "The Tangled  Web,"  there  have  been  various  modifications and additions to
the aggregate web stack.
• In general, things have gotten more complicated, which is typically bad for
security.
• For reference, here are some of the new features:
o [Link]
o [Link]
o [Link] origin_resource_sharing
o HTML5 iframe sandbox attribute [[Link]
us/[Link]]

The browser security model is obviously a mess. It's very complex and contains a lot
of subtleties  and inconsistencies.
• Q: Why not rewrite the security model from scratch?
• A1: Backwards compatibility! There's a huge amount of preexisting  web
infrastructure  that  people rely  on.
• A2: How  do we know that a new security model would be expressive
enough? Users typically  do not accept  a reduction  of features in  exchange for
an increase in  security.
• A3: Any security model may be intrinsically doomed-­‐-­‐-­‐perhaps all popular
systems are destined to accumulate a ton of features as time progresses. [Ex:
Word processing programs, smartphones.]
• What might a better design look like?
o Strict isolation Embassies-­‐-­‐-­‐everything is a network message, even
locally
§ [Link]
[Link]
o Don't make policy extraction and enforcement dependent on complex
parsing rules (remember our sanitization example)

9
o Only add  features in small, clearlyn defined quanta with minimal room
for implementation error or interpretation mistakes---remove ambiguity
and the need for guessing.

10
MIT OpenCourseWare
[Link]

6.858 Computer Systems Security


Fall 2014

For information about citing these materials or our Terms of Use, visit: [Link]

You might also like