<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
  <meta content="text/html;charset=ISO-8859-1" http-equiv="Content-Type">
</head>
<body bgcolor="#ffffff" text="#000000">
Ian Hickson wrote, On 18/02/2009 12.43:
<blockquote type="cite">
  <blockquote type="cite">
    <pre wrap="">3) Add an on-by-default mechanism that prevents UI actions to be taken
   when a document tries to obstruct portions of a non-same-origin frame.
   By carefully designing the mechanism, we can prevent legitimate uses
   (such as dynamic menus that overlap with advertisements, gadgets, etc)
   from being affected, yet achieve a high reliability in stopping
   attacks.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
This seems difficult to get right in practice, and browser vendors seem 
reluctant to go down this road.</pre>
</blockquote>
Incidentally, NoScript's ClearClick is a working implementation of this
"difficult" approach, effective also with same-origin plugin content
(like in the original Clickjacking PoC by RSnake & Grossman).<br>
<a class="moz-txt-link-freetext" href="http://noscript.net/faq#clearclick">http://noscript.net/faq#clearclick</a><br>
-- G<br>
<br>
Ian Hickson wrote, On 18/02/2009 12.43:
<blockquote
 cite="mid:Pine.LNX.4.62.0902180538490.6209@hixie.dreamhostps.com"
 type="cite">
  <pre wrap="">On Thu, 25 Sep 2008, Michal Zalewski wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">Problem definition: a malicious page in domain A may create an IFRAME 
pointing to an application in domain B, to which the user is currently 
authenticated with cookies. The top-level page may then cover portions 
of the IFRAME with other visual elements to seamlessly hide everything 
but a single UI button in domain B, such as "delete all items", "click 
to add Bob as a friend", etc. It may then provide own, misleading UI 
that implies that the button serves a different purpose and is a part of 
site A, inviting the user to click it. Although the examples above are 
naive, this is clearly a problem for a good number of modern, complex 
web applications.

Proposed fixes:

1) Create a HTTP-level (or HTTP-EQUIV) mechanism along the lines of
   "X-I-Do-Not-Want-To-Be-Framed-Across-Domains: yes" that permits a web
   page to inhibit frame rendering in potentially dangerous situations.

   Pros:

   - Super-simple

   Cons:

   - "Opt-in", i.e. currently vulnerable sites remain vulnerable unless
     action is taken

   - Can't be used for cases where IFRAME content mixing has a legitimate
     purpose (for example, cross-domain gadgets, certain types of mashups)
    </pre>
  </blockquote>
  <pre wrap=""><!---->
In particular, this breaks Image Search tools from various vendors as well 
as navigation aids like the Reddit toolbar.

  </pre>
  <blockquote type="cite">
    <pre wrap="">   - Adds yet another security measure (along with cross-domain XHR, MSIE8
     XSS filters, MSIE P3P cookie behavior, Mozilla security policies)
     that needs to be employed correctly everywhere to work - which is
     very unlikely to consistently happen in practice

   - Along with the aforementioned security features, threatens to
     result in HTTP header or HTML HTTP-EQUIV size bloat that some sites
     may care about.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
This solution is what IE8 has apparently chosen to use.

Specifically, IE8 will recognise an HTTP header or <meta> pragma directive 
with the name "X-Frame-Options", and will process it as follows:

   If the value is a case-insensitive match for "deny" and the browsing 
   context being navigated is not a top-level browsing context, replace 
   the document with a UA-defined error message.

   If the value is a case-insensitive match for "sameorigin" and the
   browsing context being navigated is not a top-level browsing context 
   and the origin of the top-level browsing context is not the same as the 
   origin of the document in question, replace the document with a 
   UA-defined error message.

(The "sameorigin" rule seems like it should check all ancestor browsing 
contexts, not just the top-level one, because otherwise a site X, e.g. 
images.google.com, showing a frame with a document on site Y, e.g. 
hostile.example.com -- which might happen e.g. on something like Google 
Image Search -- would be able to embed another page from site X, e.g. your 
image search preferences, and do clickjacking on it.)

This feature could also be extended to apply to other resources, e.g. 
scripts, images, style sheets, fonts, to prevent them from being used 
cross-origin. This would help, e.g., with securing scripts that contain 
private data.


  </pre>
  <blockquote type="cite">
    <pre wrap="">2) Add a document-level mechanism to make "if nested <show this> else
   <show that>" conditionals possible without Javascript. One proposal is
   to do this on the level of CSS (by using either the media-dependency
   features of CSS or special classes); another is to introduce new HTML
   tags. This would make it possible for pages to defend themselves even
   in environments where Javascript is disabled or limited.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
This is an interesting idea, though it would be subsumed by Hallvord's 
suggestion with Origin given below, in conjunction with idea 1 above in 
the absence of Origin information.


  </pre>
  <blockquote type="cite">
    <pre wrap="">3) Add an on-by-default mechanism that prevents UI actions to be taken
   when a document tries to obstruct portions of a non-same-origin frame.
   By carefully designing the mechanism, we can prevent legitimate uses
   (such as dynamic menus that overlap with advertisements, gadgets, etc)
   from being affected, yet achieve a high reliability in stopping
   attacks.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
This seems difficult to get right in practice, and browser vendors seem 
reluctant to go down this road.


  </pre>
  <blockquote type="cite">
    <pre wrap="">4) Enforce a click-to-work mechanism (resembling the Eolas patent
   workaround) for all cross-domain IFRAMEs.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Experience with the Eolas patent workaround suggests this wouldn't be 
popular, to put in mildly.


  </pre>
  <blockquote type="cite">
    <pre wrap="">5) Rework everything we know about HTML / browser security models to
   make it possible for domains and pages to specify very specific opt-in
   / opt-out policies for all types of linking, referencing, such that
   countering UI redress attacks would be just one of the cases controlled
   by this mechanism.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
This seems like it would still basically need one of the other mechanisms 
as well. Without a more concrete proposal here it's hard to tell what 
exactly this would be.


On Thu, 25 Sep 2008, Collin Jackson wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">6) New cookie attribute: The "httpOnly" cookie flag allows sites to put 
restrictions on how a cookie can be accessed. We could allow a new flag 
to be specified in the Set-Cookie header that is designed to prevent 
CSRF and "UI redress" attacks. If a cookie is set with a "sameOrigin" 
flag, we could prevent that cookie from being sent on HTTP requests that 
are initiated by other origins, or were made by frames with ancestors of 
other origins. In a CSRF or "UI redress" attack scenario, it will appear 
as though the user is not logged in, and thus the HTTP request will be 
unable to affect the user's account.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
This is an interesting idea, though it only works for Cookie- 
authenticated content (admittedly that is most content). I recommend 
suggesting this to the group currently speccing httpOnly. It seems out of 
scope for HTML5.


  </pre>
  <blockquote type="cite">
    <pre wrap="">7) New HTTP request header: Browser vendors seem to be moving away
from "same origin restrictions" towards "verifiable origin labels"
that let the site decide whether two security origins trust each
other.  Recent examples of this are MessageEvent's "origin" property
[1], postMessage's "targetOrigin" argument [2], and the HTTP "Origin"
header [3] [4] [5]. We can adjust proposal (1) to conform to this
philosophy: instead of making it an
"X-I-Do-Not-Want-To-Be-Framed-Across-Domains: yes" HTTP response
header, make it an "X-Ancestor-Frame-Origin: <a class="moz-txt-link-freetext" href="http://www.evil.com">http://www.evil.com</a>" HTTP
request header. This header could be a list of all the origins that
are ancestors of the frame that triggered the request. If the site
decides it does not like the ancestor frame origin it could reject the
request. This could be added as a property of MessageEvent as well to
detect client-side-only UI redress attacks.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
This could be considered an extension to suggestion 1.


On Mon, 29 Sep 2008, Hallvord R M Steen wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">Sites may want to use any of several policies in a "somebody framed me" 
situation. For example, these are all policies a site may want to 
deploy:

1. nobody may frame my content
2. selected sites only may frame my content
3. anyone may frame my content but not re-use an existing session
4. anyone may frame my content
    </pre>
  </blockquote>
  <pre wrap=""><!---->
Also noted in other e-mails was:

  5. anyone may frame my content, but I want my UI not to get clobbered


  </pre>
  <blockquote type="cite">
    <pre wrap="">Giving the site an "Origin: <a class="moz-txt-link-freetext" href="http://www.example.com">http://www.example.com</a>" HTTP header in the 
intial request lets the backend implement any of these policies.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
(Except 5.)


  </pre>
  <blockquote type="cite">
    <pre wrap="">Instead of responding with a payload that always includes some variant 
of the proposed "X-I-Do-Not-Want-To-Be-Framed-Across-Domains: yes" 
header, the site can send or redirect to a framebreaking "embedding 
forbidden" page for policy #1. It can do so selectively based on origin 
site and/or requested content for policy #2. It can kill existing 
cookies, void session and set new origin-specific cookies for policy 
#3.)
    </pre>
  </blockquote>
  <pre wrap=""><!---->
This is a good point. Maybe Adam's Origin draft can help with this? Adam?

This wouldn't reduce the need for the other proposals, though, so that we 
had defense in depth (e.g. for the cases where Origin was stripped, or for 
servers that don't want to do dynamic work like this).


On Mon, 29 Sep 2008, Michal Zalewski wrote:
  </pre>
  <blockquote type="cite">
    <pre wrap="">It still completely ignores the question of how we protect gadgets / 
mashups / whatever that are *designed* to be embedded on potentially 
untrusted sites, but depend on having the integrity of their UIs 
preserved, so I think we need - or well, should - tackle this aspect 
separately if this is the consensus for now.
    </pre>
  </blockquote>
  <pre wrap=""><!---->
I have unfortunately not seen any workable solutions suggested for how to 
solve this, and have no ideas myself.


[snip a very long thread -- I did read every e-mail on this thread, and 
these e-mails informed my comments in this e-mail]


It seems like the most obvious course of action is to embrace Microsoft's 
X-Frame-Options header, and consider extensions to make it apply to all 
content and/or to make it support CORS headers also in the future.

I would be interested in feedback from browser vendors about the 
feasibility of such an approach.

Is this something we should add to HTML5?

I am interested also in suggestions on how to handle the <meta http-equiv> 
pragma case, where the header can come megabytes into the file. Is it 
acceptable to replace the document in-place once the pragma is seen and 
found to deny embedding?

  </pre>
</blockquote>
<br>
</body>
</html>