Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Hidden download detection #162

Merged
merged 12 commits into from
Jul 6, 2024
14 changes: 11 additions & 3 deletions content/docs/attacks/navigations.md
Original file line number Diff line number Diff line change
Expand Up @@ -35,7 +35,7 @@ To detect if any kind of navigation occurred, an attacker can:

When an endpoint sets the [`Content-Disposition: attachment`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) header, it instructs the browser to download the response as an attachment instead of navigating to it. Detecting if this behavior occurred might allow attackers to leak private information if the outcome depends on the state of the victim's account.

### Download Navigation (with iframes)
### Download Navigation (without Lax cookies)
Copy link
Member

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

I wouldn't change the headings since if they're linked somewhere then the links will stop working after the changes. Instead, it's probably worth adding hintboxes about the cookie types. Also, I think that it would be worth incorporating into the text how the sandboxed iframe helps in detecting the download.

Copy link
Contributor Author

@NDevTK NDevTK May 1, 2024

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.


Another way to test for the [`Content-Disposition: attachment`](https://developer.mozilla.org/en-US/docs/Web/HTTP/Headers/Content-Disposition) header is to check if a navigation occurred. If a page load causes a download, it does not trigger a navigation and the window stays within the same origin. [Run demo](https://xsinator.com/testing.html#Download%20Detection)

Expand All @@ -46,6 +46,8 @@ The following snippet can be used to detect whether such a navigation has occurr
var url = 'https://example.org/';
// Create an outer iframe to measure onload event
var iframe = document.createElement('iframe');
// Don't actually download the file to be stealthy
iframe.sandbox = 'allow-scripts allow-same-origin allow-popups';
document.body.appendChild(iframe);
// Create an inner iframe to test for the download attempt
iframe.srcdoc = `<iframe src="${url}" ></iframe>`;
Expand All @@ -69,15 +71,21 @@ When there is no navigation inside an `iframe` caused by a download attempt, the
This attack works regardless of any [Framing Protections]({{< ref "xfo" >}}), because the `X-Frame-Options` and `Content-Security-Policy` headers are ignored if `Content-Disposition: attachment` is specified.
{{< /hint >}}

### Download Navigation (without iframes)
### Download Navigation (with Lax cookies)

A variation of the technique presented in the previous section can also be effectively tested using `window` objects:

```javascript
// Set the destination URL
var url = 'https://example.org';

// Don't actually download the file to be stealthy
var iframe = document.createElement('iframe');
iframe.sandbox = 'allow-scripts allow-same-origin allow-popups';
document.body.appendChild(iframe);

// Get a window reference
var win = window.open(url);
var win = iframe.contentWindow.open(url);

// Wait for the window to load.
setTimeout(() => {
Expand Down
Loading