Scheme flooding vulnerability: how it works and why it is a threat to anonymous browsing

Overview

The source code of the demo for external protocol flooding vulnerability. Allows arbitrary websites to gather information about installed applications on a victim's computer in order to perform reliable tracking across different desktop browsers.

This repository is created for research and educational purposes only. Consider reading the original article about research.

Target Browsers

The demo was successfuly tested on the following browsers and operating systems:

  • Chrome 90 (Windows 10, macOS Big Sur)
  • Firefox 88.0.1 (Ubuntu 20.04, Windows 10, macOS Big Sur)
  • Safari 14.1 (macOS Big Sur)
  • Tor Browser 10.0.16 (Ubuntu 20.04, Windows 10, macOS Big Sur)
  • Brave 1.24.84 (Windows 10, macOS Big Sur)
  • Yandex Browser 21.3.0 (Windows 10, macOS Big Sur)
  • Microsoft Edge 90 (Windows 10, macOS Big Sur)

The vulnerability can already be fixed by the time you find this repository.

Technical overview

The scheme flooding vulnerability allows an attacker to determine which applications you have installed. In order to generate a 32-bit cross-browser device identifier, a website can test a list of 32 popular applications and check if each is installed or not. On average, the identification process takes a few seconds and works across desktop Windows, Mac and Linux operating systems.

To check if an application is installed, browsers can use built-in custom URL scheme handlers. You can see this feature in action by entering skype:// in your browser address bar. If you have Skype installed, your browser will open a confirmation dialog that asks if you want to launch it. This feature is also known as deep linking and is widely used on mobile devices, but is available within desktop browsers as well. Any application that you install can register its own scheme to allow other apps to open it.

To make this vulnerability possible, the following steps are required:

  • Prepare a list of application URL schemes that you want to test. The list may depend on your goals, for example, if you want to check if some industry or interest-specific applications are installed.
  • Add a script on a website that will test each application from your list. The script will return an ordered array of boolean values. Each boolean value is true if the application is installed or false if it is not.
  • Use this array to generate a permanent cross-browser identifier.
  • Optionally, use machine learning algorithms to guess your website visitors’ occupation, interests, and age using installed application data.

The actual implementation of the exploit varies by browser, however the basic concept is the same. It works by asking the browser to show a confirmation dialog in a popup window. Then the JavaScript code can detect if a popup has just been opened and detect the presence of an application based on that.

Authors

Join our team to work on exciting research in online security: [email protected]

This repository is MIT licensed.

Copyright 2021 FingerprintJS, Inc

Comments
  • False Positive: Spotify and Skype found, although they are not (and never were) installed

    False Positive: Spotify and Skype found, although they are not (and never were) installed

    This machine I'm working on has been set up from scratch in January. I know very precisely what is installed right now and that I have never had Spotify or Skype installed.

    When running this on Windows 10, with Firefox 88.0.1, this is my result:

    three apps installed

    opened by ccoenen 7
  • Site not detecting Figma

    Site not detecting Figma

    I used the app and have Figma v 97.7 installed, but the site did not detect it. I opened figma and did a re-login and tested again with the app open, but still without success.

    Tested on Windows 10

    windows 
    opened by Carnageous 7
  • About the

    About the "scheme flooding"?

    I am a developer from China, and when I try to translate the term "scheme flooding", there seems to be no easy-to-understand answer, so I would like to ask how do I understand the term "scheme flooding"?Looking forward to your reply, thanks!

    opened by ghost 3
  • All Applications are incorrect.

    All Applications are incorrect.

    Of all 23 applications it claims I have installed I have 0

    Screenshot from 2021-05-19 14-40-31 . Screenshot from 2021-05-19 14-41-17

    This is your identifier. It was seen 986 times among 42201 tests so far. That means it is 97.66% unique. We have generated your identifier based on 23 applications you have installed.

    opened by B2H990 1
  • Spoofing UserAgent triggers all applications

    Spoofing UserAgent triggers all applications

    Spoofing the user agent triggers all apps (installed and not installed) on Brave , and stops completely on Firefox.

    Brave : UserAgent: Mozilla/5.0 (Windows NT 10.0; rv:78.0) Gecko/20100101 Firefox/78.0

    image

    Firefox : UserAgent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/91.0.4433.0 Safari/537.36

    image

    I suspect it is because of getBrowserFamily(): https://github.com/fingerprintjs/external-protocol-flooding/blob/5a2be48e5b3d2aaa8a0e62d7e997506e6253443e/packages/client/src/detector/browser.ts#L1-L23

    opened by ZOASR 1
  • Not working?

    Not working?

    I get three different Fingerprints for Firefox, Chromium and Tor Browser (all three with supposedly vulnerable versions according to your README file). All three manage to miscalculate the apps that are installed. Firefox reports almost every app as installed (although I don't have all the reported ones) while the other two browsers report fewer apps installed than what's present on my pc. Running Archlinux with a few typical privacy-preserving Add-Ons on Firefox and an Adblocker on Chromium.

    I can send you more exact information about my setup if you're interested, but I don't want to post that publicly.

    I would be interested to see what part of my setup "breaks" the detection.

    duplicate 
    opened by MaxMatti 1
  • Different Visitor Id for different browsers

    Different Visitor Id for different browsers

    I just started recently with fingerprint js and during test run observed that it gives different visitorId for different browsers. Is this the expected result ?

    opened by imukulmunjal 0
  • when popup window in running, if main windows is clicked by user, the detecting will not work

    when popup window in running, if main windows is clicked by user, the detecting will not work

    there is some bug with the code below

        // detection.ts
        const isBrowserActive = document.hasFocus() || handler.document.hasFocus()
        if (!isBrowserActive) {
          throw AlertMessage.FocusWindow
        }
    
        // Make test
        if (document.hasFocus()) {
          document.body.insertBefore(input, document.getElementById('app'))
        } else {
          handler.document.body.appendChild(input)
        }
    
    opened by GalliumWang 0
  • Old versions of itunes not detected.

    Old versions of itunes not detected.

    A windows pc with itunes 12.5 installed does not have it detected properly (sometimes detecting, usually not), it also shows skype and spotify as installed though that is only because they were recently uninstalled. image Testing with a newer version installed (12.10) detects it properly. image

    windows 
    opened by yea-idk 2
  • Configuring Firefox in order to prevent cross-browser tracking

    Configuring Firefox in order to prevent cross-browser tracking

    When using firefox and adjusting the certain settings below in the config. This entire thing just fails to function.

    (1) In a new tab, type or paste about:config in the address bar and press Enter/Return. Click the button promising to be careful or accepting the risk.

    (2) In the search box above the list, type or paste neww and wait for the list to finish filtering.

    (3) Change the preferences as follows:

    (A) browser.link.open_newwindow - for links in Firefox tabs. 3 = divert new window to a new tab (default) 2 = allow link to open a new window 1 = force new window into same tab <= Change to this one

    (B) browser.link.open_newwindow.restriction - for links in Firefox tabs. 0 = apply the setting under (A) to ALL new windows (even script windows) <= Change to this one 2 = apply the setting under (A) to normal windows, but NOT to script windows with features (default) 1 = override the setting under (A) and always use new windows

    (C) browser.link.open_newwindow.override.external - for links in other programs. -1 = apply the setting under (A) to external links (default) 3 = open external links in a new tab in the last active window <= Change to this one 2 = open external links in a new window 1 = open external links in the last active tab replacing the current page

    (4) Then using this website (the one you have for testing this stuff). Try to "Get my Identifier" to see results.

    Note: I don't know how to add a label to this, so what I want it to be is in the title.

    documentation 
    opened by therealOri 3
  • Some applications don't deregister protocol handlers when uninstalled

    Some applications don't deregister protocol handlers when uninstalled

    Summary

    Some applications, e.g. Steam, leave behind their Windows registry records when uninstalled. Therefore user can install an application, then delete it and still have protocol registration which is picked up by the demo. Since the demo produces results which appear as false positives (reporting that an application is installed when it ctually is not), users might dismiss the demo thinking it is inaccurate. It would be nice if you could add a note or a mark (e.g., asterisk) to programs prone to false positives.

    Repro steps

    1. Install Steam so that it registers protocol handler in HKEY_CLASSES_ROOT\steam.
    2. Uninstall Steam and note that the registry record is still present.
    3. Run demo and see Steam among "installed" applications.
    windows 
    opened by bershanskiy 3
Owner
FingerprintJS
Fraud detection API for the Internet
FingerprintJS
The perfect library for adding search, sort, filters and flexibility to tables, lists and various HTML elements. Built to be invisible and work on existing HTML.

List.js Perfect library for adding search, sort, filters and flexibility to tables, lists and various HTML elements. Built to be invisible and work on

Jonny Strömberg 10.9k Jan 1, 2023
Drag and drop library for two-dimensional, resizable and responsive lists

GridList Drag and drop library for a two-dimensional resizable and responsive list of items Demo: http://hootsuite.github.io/grid/ The GridList librar

Hootsuite 3.6k Dec 14, 2022
📝 Algorithms and data structures implemented in JavaScript with explanations and links to further readings

JavaScript Algorithms and Data Structures This repository contains JavaScript based examples of many popular algorithms and data structures. Each algo

Oleksii Trekhleb 158k Dec 31, 2022
Gmail-like client-side drafts and bit more. Plugin developed to save html forms data to LocalStorage to restore them after browser crashes, tabs closings and other disasters.

Sisyphus Plugin developed to save html forms data to LocalStorage to restore them after browser crashes, tabs closings and other disasters. Descriptio

Alexander Kaupanin 2k Dec 8, 2022
A lightweight jQuery plugin for collapsing and expanding long blocks of text with "Read more" and "Close" links.

Readmore.js V3 alpha I am deprecating the 2.x version of Readmore.js. A new version is coming soon! Check it out and help me test it! Readmore.js A sm

Jed Foster 1.5k Nov 30, 2022
FriendAdvisor is a mobile app with a focus on allowing friends and family to coordinate and receive text notifications about upcoming group events.

FriendAdvisor is a mobile app with a focus on allowing friends and family to coordinate and receive text notifications about upcoming group events.

Brad Johnson 4 Sep 29, 2022
Defines the communication layer between mobile native(iOS/Android) and webview using JSON Schema and automatically generates SDK code

Defines the communication layer between mobile native(iOS/Android) and webview using JSON Schema and automatically generates SDK code.

당근마켓 31 Dec 8, 2022
A responsive image polyfill for , srcset, sizes, and more

Picturefill A responsive image polyfill. Authors: See Authors.txt License: MIT Picturefill has three versions: Version 1 mimics the Picture element pa

Scott Jehl 10k Dec 31, 2022
A high-performance, dependency-free library for animated filtering, sorting, insertion, removal and more

MixItUp 3 MixItUp is a high-performance, dependency-free library for animated DOM manipulation, giving you the power to filter, sort, add and remove D

Patrick Kunka 4.5k Dec 24, 2022
JavaScript Survey and Form Library

SurveyJS is a JavaScript Survey and Form Library. SurveyJS is a modern way to add surveys and forms to your website. It has versions for Angular, jQue

SurveyJS 3.5k Jan 1, 2023
Extensive math expression evaluator library for JavaScript and Node.js

?? Homepage Fcaljs is an extensive math expression evaluator library for JavaScript and Node.js. Using fcal, you can perform basic arithmetic, percent

Santhosh Kumar 93 Dec 19, 2022
Components for interactive scientific writing, reactive documents and explorable explanations.

@curvenote/article The goal of @curvenote/article is to provide web-components for interactive scientific writing, reactive documents and explorable e

curvenote 142 Dec 24, 2022
Create explorable explanations and interactive essays.

Tutorials | Examples | Docs | Chatroom | Mailing list | Twitter What is Idyll? For an introduction to Idyll, API reference, examples, and tutorials, p

Idyll 1.9k Dec 27, 2022
Browser fingerprinting library with the highest accuracy and stability.

FingerprintJS is a browser fingerprinting library that queries browser attributes and computes a hashed visitor identifier from them. Unlike cookies a

FingerprintJS 18.1k Dec 31, 2022
autoNumeric is a standalone library that provides live as-you-type formatting for international numbers and currencies.

What is autoNumeric? autoNumeric is a standalone Javascript library that provides live as-you-type formatting for international numbers and currencies

AutoNumeric 1.7k Dec 16, 2022
Bookmarklet to remove sticky elements and restore scrolling to web pages!

Bookmarklet to remove sticky elements and restore scrolling to web pages!

Tim Martin 648 Dec 29, 2022
Free, open-source crypto trading bot, automated bitcoin / cryptocurrency trading software, algorithmic trading bots. Visually design your crypto trading bot, leveraging an integrated charting system, data-mining, backtesting, paper trading, and multi-server crypto bot deployments.

Free, open-source crypto trading bot, automated bitcoin / cryptocurrency trading software, algorithmic trading bots. Visually design your crypto trading bot, leveraging an integrated charting system, data-mining, backtesting, paper trading, and multi-server crypto bot deployments.

Superalgos 3.1k Jan 1, 2023
🔥 Miniflare is a simulator for developing and testing Cloudflare Workers.

?? Miniflare is a simulator for developing and testing Cloudflare Workers.

Cloudflare 3.1k Jan 3, 2023
A user script for the web that allows you to view and edit files in the Godot Web Editor

Godot-Web-File-Manager This is a user script for the web that allows you to view and edit files in the Godot Web Editor. You can even use this to enab

Roujel Williams 4 Jan 31, 2022