<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0" xmlns:media="http://search.yahoo.com/mrss/"><channel><title><![CDATA[AmIUnique Blog]]></title><description><![CDATA[Privacy-oriented articles from the Amiunique team]]></description><link>https://blog.amiunique.org/</link><image><url>https://blog.amiunique.org/favicon.png</url><title>AmIUnique Blog</title><link>https://blog.amiunique.org/</link></image><generator>Ghost 4.48</generator><lastBuildDate>Wed, 18 Mar 2026 13:06:51 GMT</lastBuildDate><atom:link href="https://blog.amiunique.org/rss/" rel="self" type="application/rss+xml"/><ttl>60</ttl><item><title><![CDATA[Port Contention Goes Portable: Port Contention Side Channels in Web Browsers]]></title><description><![CDATA[CPU Port Contention, a recently discovered micro-architectural side-channel, can be implemented in web-browsers, substantially increasing the attack surface.]]></description><link>https://blog.amiunique.org/port-contention-goes-portable-port-contention-side-channels-in-web-browsers/</link><guid isPermaLink="false">620b9cac6c6dc10001a6a179</guid><dc:creator><![CDATA[Thomas Rokicki]]></dc:creator><pubDate>Wed, 20 Jul 2022 11:11:07 GMT</pubDate><media:content url="https://blog.amiunique.org/content/images/2022/07/port_contention_header.png" medium="image"/><content:encoded><![CDATA[<!--kg-card-begin: markdown--><img src="https://blog.amiunique.org/content/images/2022/07/port_contention_header.png" alt="Port Contention Goes Portable: Port Contention Side Channels in Web Browsers"><p>Microarchitectural attacks have been greatly explored over the last years. They can have a great impact on security by allowing attackers to circumvent system isolation. However, to mount such an attack, the attacker must run code on the victim&apos;s machine, which is a strong condition in today&apos;s systems, where users grew distrustful of unknown code.</p>
<p>In this post, we show how we developed port-contention side channels by running them entirely in JavaScript, dramatically widening its threat surface. We explain how we solved the challenges brought by the browser sandbox, and show concrete examples of port contention attacks. In particular, our attack shows the fastest covert channel in the browser, thus breaking the isolation model at the core of modern browsers&apos; security model. With this covert channel, an attacker can exchange cookies with other tabs or leak secret information.</p>
<!--kg-card-end: markdown--><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4F0;</div><div class="kg-callout-text">Port Contention Goes Portable: Port Contention Side Channels in Web Browsers<br>Thomas Rokicki, Cl&#xE9;mentine Maurice, Marina Botvinnik, Yossi Oren<br>AsiaCCS 2022</div></div><div class="kg-card kg-toggle-card" data-kg-toggle-state="close"><div class="kg-toggle-heading"><h4 class="kg-toggle-heading-text">Citation</h4><button class="kg-toggle-card-icon"><svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/></svg></button></div><div class="kg-toggle-content"><p>@inproceedings{RokickiMBO22, author = {Thomas Rokicki and Cl{\&apos;{e}}mentine Maurice and Marina Botvinnik and Yossi Oren}, title = {Port Contention Goes Portable: Port Contention Side Channels in Web Browsers}, booktitle = {AsiaCCS}, pages = {1182--1194}, publisher = {{ACM}}, year = {2022} }</p></div></div><div class="kg-card kg-button-card kg-align-center"><a href="https://hal.inria.fr/hal-03708833/document" class="kg-btn kg-btn-accent">Full Paper</a></div><!--kg-card-begin: markdown--><h2 id="microarchitectural-side-channels">Microarchitectural Side Channels</h2>
<p>Modern processors are highly optimized pieces of hardware. With the evolution of computing, they have remarkably shrunk while offering exponentially greater computation power. To allow greater performances without changing the frequency of the CPU, hardware vendors have developed a wide range of specific optimizations, in order to reduce the execution time of certain operations.</p>
<p>However, these optimizations can leak sensitive information. As they are situated below the software security brought by the OS, these optimizations are shared between the users. A malicious user can exploit	differences in computation time to retrieve secret information. These microarchitectural side channels can target many different hardware components, but most of them share two major prerequisites:</p>
<ul>
<li>A high-resolution timer to detect the subtle timing differences caused by optimizations. Generally speaking, these attacks require a resolution of a few nanoseconds.</li>
<li>Running malicious code on the victim&apos;s machine, in order to use its hardware.</li>
</ul>
<p>The most well-known example of microarchitectural side channels is based on the CPU Cache. The cache is a very small (around 64 MB), high-speed memory. It is used to dynamically store the values of often-used values, as loading data from the cache is faster than from the DRAM. The cache is shared by all processes on the machine. A malicious user can measure the loading time of certain addresses to monitor other processes: if an access is quicker than usual, it means that the address is in the cache, i.e., another process used it recently. These attacks can allow a process to monitor other processes, or retrieve cryptographic secrets. Recently, transient-execution attacks, such as Spectre, often use microarchitectural side channels to extract sensitive information.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="port-contention">Port Contention</h2>
<p>Port contention is a microarchitectural side channel first described by Aldaya et al. in 2019. It exploits HyperThreading, a technology allowing, at an abstract level, to create two or more logical execution threads on a single physical core. This means that, at the OS level, each physical core offers several threads, but logical threads on the same core share all hardware components in the execution pipeline.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.amiunique.org/content/images/2022/07/CPU-microarchitecture-1.svg" class="kg-image" alt="Port Contention Goes Portable: Port Contention Side Channels in Web Browsers" loading="lazy" width="462" height="341"><figcaption>Figure 1: Simplification of the execution pipeline on a single physical core.</figcaption></figure><!--kg-card-begin: markdown--><p>Port contention exploits the CPU ports. Figure 1 presents an abstracted view of the execution pipeline for a single physical core. Thread 1 and thread 2 are both HyperThreading logical threads. The decoder fetches the instruction to execute and decompose them in micro-operations (or uops), a smaller, more atomic form of operation. Then, the uops are sent to the execution engine to be executed. The execution engine is composed of a various number of execution units. Each execution unit is specialized for a certain type of operations, e.g., arithmetical operations or memory loads. The uops are transmitted to their associated execution units through <strong>CPU Ports</strong>. These ports act as a bottleneck, as a single uop can go through a port per cycle.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.amiunique.org/content/images/2022/07/WPC1-1.svg" class="kg-image" alt="Port Contention Goes Portable: Port Contention Side Channels in Web Browsers" loading="lazy" width="492" height="227"><figcaption>Figure 2.a: All the attacker uops are executed in a row.</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.amiunique.org/content/images/2022/07/WPC2-1.svg" class="kg-image" alt="Port Contention Goes Portable: Port Contention Side Channels in Web Browsers" loading="lazy" width="492" height="227"><figcaption>Figure 2.b: The attacker&apos;s uops are delayed by the victim&apos;s computations.</figcaption></figure><!--kg-card-begin: markdown--><p>By repeatedly calling and timing instructions with a specific port usage, an attacker can monitor the port usage of other processes on the same core. Figure 2 illustrates the process. When no other processes emit uop on port 1, as in <em>Figure 2.a</em>, all the attacker uops are executed in a row, resulting in fast execution. However, when the victim emits an uop on port 1, as in <em>Figure 2.b</em>, the second attacker uop is delayed in the queue, resulting in slower execution. In this simplified scenario, the attacker can know whether or not the victim used instructions with port 1 usage. Using this principle, Aldaya et al. mounted an attack against OpenSSL&apos;s TLS implementation to recover private keys. Port contention was also leveraged to mount a speculative execution attack in SMoTherSpectre.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="port-contention-in-browsers">Port Contention in Browsers</h2>
<h3 id="challenges">Challenges</h3>
<p>As all microarchitectural attacks, port contention requires running code on the victim&apos;s hardware. This is a strong assumption for native attacks, as users rarely download and run malicious code voluntarily.</p>
<p>The main contribution of our paper is to implement port contention in a web setting. Client-side languages, such as JavaScript or Web-Assembly, are by design meant to be downloaded automatically from a web server and run on the client&apos;s hardware. This allows to fulfill one of the prerequisites for microarchitectural attacks, thus substantially increasing their threat surface. However, in the case of port contention, this also introduces new challenges:</p>
<ul>
<li><strong>[C1]:</strong> Port contention attacks, like most timing attacks, require access to high-resolution timers, which are not available by default in the browser.</li>
<li><strong>[C2]:</strong> The high level of abstraction of the browser means that the attacker can neither know nor control on which core the code is run.</li>
<li><strong>[C3]:</strong> Client-side languages are run inside of a secured sandbox, restricting access to native instructions and memory addresses or port usage.</li>
</ul>
<h4 id="high-resolution-timersc1">High-resolution timers - C1</h4>
<p><a href="https://cmaurice.fr/pdf/fc17_schwarz.pdf">Schwarz et al.</a> show how an attacker can reconstruct high-resolution timers in the JavaScript language by using SharedArrayBuffers. They are array shared between the main JavaScript thread and Web Workers, Javascript multithreading implementation. A Web Worker is created and increments a value in the array in a continuous loop. As the duration of the increment is relatively small and steady, we can use it as a time measurement. When the main thread needs a timestamp, it just has to read the shared value.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.amiunique.org/content/images/2022/07/sab_clock-1.svg" class="kg-image" alt="Port Contention Goes Portable: Port Contention Side Channels in Web Browsers" loading="lazy" width="567" height="244"><figcaption>Fig 3: SharedArrayBuffer-based clock</figcaption></figure><!--kg-card-begin: markdown--><p>This clock has a resolution of 10 nanoseconds, which is sufficient to mount our attack, thus resolving <strong>C1</strong>. However, it is less precise than native clocks and the continual increments reintroduce noise that can deteriorate the results.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h4 id="core-managementc2">Core management - C2</h4>
<p>As port contention exploits shared components inside a physical core, we need both the attacker and the victim on the same core. Due to its sandbox design, JavaScript or WebAssembly do not allow the user to know or control on which core the code is running.</p>
<p>We can, however, exploit the OS&apos;s scheduler to try and have both parties on the same core. The scheduler dynamically dispatches software tasks between cores. The scheduler heuristics are complicated, but its goal is to balance the workload between all cores to enhance performance. By creating several WebWorkers running port contention computations, they have a high probability of being set on different cores, as they require heavy computations. This ensures that at least one of them shares a physical core with the victim.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h4 id="pc-detectorc3">PC Detector - C3</h4>
<p>JavaScript and WebAssembly are high-level languages. They offer a strong abstraction from memory management, data structure, or hardware. This is highly practical on  the web to build simple and portable scripts running in the browser. However, in our attack scenario, it prevents us to know what really happens at the microarchitecture level. In particular, we don&apos;t know the translation of our WebAssembly instructions in native x86 instructions, nor the micro-operations or port usage of our script.</p>
<p>To create and exploit contention, we must find instructions that are decomposed in uops dispatched in a specific port. To do so, we built PC-Detector, a framework automatically testing all available instructions for a system, and testing if the instruction creates contention on a specific port.</p>
<p>To detect contention on the web, we use known native instructions paired with unknown WebAssembly instructions. For instance, native <code>vpermd</code> emits one micro-operation on port 5. If we detect contention when repeatedly calling both <code>vpermd</code> and our WebAssembly instruction, this means our WebAssembly instruction emits at least one micro-operation on port 5.</p>
<p>By repeating this operation for all instructions on different ports, we were able to identify instructions creating contention on port 0, port 1, port 23, port 5, and port 6 on an Intel Skylake CPU.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h3 id="proof-of-concepts">Proof of concepts</h3>
<p>We now know that port contention can be achieved in the browser.<br>
We can even target several ports to try to leak more data.<br>
However, this is still a basic building block, an attack vector.<br>
To illustrate the capacity of port contention in the browser, we created two proofs of concept: a covert channel and an artificial side-channel example.</p>
<h4 id="artificial-side-channel-gadget">Artificial Side Channel Gadget</h4>
<p>Programs often change behavior based on user input or environment values. For instance, vulnerable cryptographical implementations will not execute the same computations based on the secret key. This difference in behavior can be detected indirectly through leaks of information in side-channel attacks.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.amiunique.org/content/images/2022/07/toy-example.png" class="kg-image" alt="Port Contention Goes Portable: Port Contention Side Channels in Web Browsers" loading="lazy" width="382" height="272"><figcaption>Fig. 4: Illustration of the workflow of the victim. If the secret is 0, it will run POPCNT in a loop, otherwise it will run VPERMD.</figcaption></figure><!--kg-card-begin: markdown--><p>We built a synthetic and generic example (Fig. 4) showing how a program, which execution depends on secret information, is vulnerable to WebAssembly port contention. The victim is a native unprivileged program, running different code sections based on the bits of secret information. As port usage differs between branches, an attacker monitoring port contention can infer the secret. One branch will execute the POPCNT instruction in a loop, creating contention on port 1. The other branch executes VPERMD, creating contention on port 5. By measuring port contention on either port 1 or 5 in the browser, we can detect which branch was executed, and infer the associated secret.</p>
<p>The victim and the attacker are two different processes. This means that the attacker does not know on which core the victim runs, and must measure contention on all cores and analyze all the traces.</p>
<p>The smallest number of instructions detectable in a branch is critical, as it represents our <strong>spatial resolution</strong>. A high resolution means that more pieces of code are vulnerable, hence widening the attack scope. At best, in a single trace setting, we achieved a spatial resolution of 1024 native instructions, i.e., 3072 bytes. This number is on par with other microarchitectural side channels in the browser, such as the Prime+Probe cache attack.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h4 id="covert-channel">Covert Channel</h4>
<p>A covert channel exploits data leakage in the microarchitecture to create a communication channel between two parties that should not be able to communicate. In our case, a script running inside of the sandbox could communicate with a native program through port contention. This can be particularly threatful as it could be used to monitor users, steal cookies or extract sensitive data.</p>
<p>The physical layer of our channel, i.e., sending 0s and 1s, is fairly simple. A sender creates contention on a specific port for a specific time to send a 1 and idles for the same time to send a 0. The receiver just has to measure contention on this port to receive the flow of information.</p>
<!--kg-card-end: markdown--><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.amiunique.org/content/images/2022/07/cc_stack-1.svg" class="kg-image" alt="Port Contention Goes Portable: Port Contention Side Channels in Web Browsers" loading="lazy" width="417" height="304"><figcaption>Fig 4: Illustration of our covert channel</figcaption></figure><!--kg-card-begin: markdown--><p>We&apos;ve built a two-way covert channel from the browser to the native program. It handles errors and desynchronization with a request to send protocol and offers a bandwidth of 200 bits per second, which is higher than other microarchitectural (or even software!) covert channels in the browser.</p>
<p>Our covert channel also works when one of the two parties is situated inside a VM or a container, and we can even communicate between two different browsers or two tabs in the same browser.</p>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h2 id="countermeasures">Countermeasures</h2>
<p>Countermeasures for this vulnerability could potentially be implemented at three different levels:</p>
<ul>
<li>
<p><strong>Hardware level:</strong> At its very core, port contention exploits the sharing of CPU ports between a victim and an attacker, relying heavily on HyperThreading. Some parties have chosen to disable it totally, but it comes at a high-performance cost, bringing a performance degradation of 15%. Research have proposed alternative solutions, mainly based on still implementing HyperThreading but partitioning the resource so they are not shared.</p>
</li>
<li>
<p><strong>OS Level:</strong> At the OS/Software level, some have suggested port-independent code, i.e., that the port usage does not differ based on a secret. However, this means rewriting all pre-existing code and training all software developers. The scheduler could also be aware of SMT attacks and, for instance, allow highly sensitive operations to run on different physical cores than other computations.</p>
</li>
<li>
<p><strong>Browser Level:</strong> After the publication of previous microarchitectural attacks in the JavaScript sandbox, several countermeasures have been implemented. A popular solution is to remove access to high-resolution timers. However, we&apos;ve seen that it is no easy task as auxiliary timers can always be built. Browser vendors also tried to add more isolation, mainly at the process level, but it has little to no impact on port contention attacks. Browser vendors claim that granted the high level of abstraction of browsers, browser-level mitigations are not viable and result in too much cost for low results.</p>
</li>
</ul>
<!--kg-card-end: markdown--><!--kg-card-begin: markdown--><h1 id="useful-links">Useful Links</h1>
<ul>
<li><a href="https://hal.inria.fr/hal-03708833/document">Full Paper</a></li>
<li>Videos: <a href="https://dl.acm.org/doi/10.1145/3488932.3517411">AsiaCCS Video (17 minutes)</a> or <a href="https://videos-rennes.inria.fr/video/UksGngEVE">Sosysec Seminar (30 Minutes)</a></li>
<li><a href="https://github.com/MIAOUS-group/web-port-contention">Code</a></li>
</ul>
<!--kg-card-end: markdown--><p></p><p></p>]]></content:encoded></item><item><title><![CDATA[Explaining DrawnApart, a remote GPU fingerprinting technique]]></title><description><![CDATA[DrawnApart is a new technique to fingerprint GPUs using the WebGL API. It can distinguish identical GPUs.]]></description><link>https://blog.amiunique.org/an-explicative-article-on-drawnapart-a-gpu-fingerprinting-technique/</link><guid isPermaLink="false">61f858983287aa0001123595</guid><dc:creator><![CDATA[Naif Mehanna]]></dc:creator><pubDate>Mon, 31 Jan 2022 21:51:38 GMT</pubDate><media:content url="https://blog.amiunique.org/content/images/2022/02/Scan-Fingerprint-on-laptop.png" medium="image"/><content:encoded><![CDATA[<img src="https://blog.amiunique.org/content/images/2022/02/Scan-Fingerprint-on-laptop.png" alt="Explaining DrawnApart, a remote GPU fingerprinting technique"><p>Browsing the web exposes us to constant tracking. In recent years, and due in large part to the general public&apos;s interest in their privacy on the web, tracking methods have been scrutinized, new techniques being regularly revealed. Along with colleagues from the Ben-Gurion University of the Negev and the University of Adelaide, we uncovered a new threat to privacy that can efficiently fingerprint your GPU, making you more identifiable on the Internet. </p><div class="kg-card kg-callout-card kg-callout-card-grey"><div class="kg-callout-emoji">&#x1F4F0;</div><div class="kg-callout-text">DRAWNAPART: A Device Identification Technique based on Remote GPU Fingerprinting<br>Tomer Laor, Naif Mehanna, Antonin Durey, Vitaly Dyadyuk, Pierre Laperdrix, Cl&#xE9;mentine Maurice, Yossi Oren, Romain Rouvoy, Walter Rudametkin and Yuval Yarom<br>NDSS&apos;2022</div></div><div class="kg-card kg-toggle-card" data-kg-toggle-state="close"><div class="kg-toggle-heading"><h4 class="kg-toggle-heading-text">Citation</h4><button class="kg-toggle-card-icon"><svg id="Regular" xmlns="http://www.w3.org/2000/svg" viewbox="0 0 24 24"><path class="cls-1" d="M23.25,7.311,12.53,18.03a.749.749,0,0,1-1.06,0L.75,7.311"/></svg></button></div><div class="kg-toggle-content"><p>@inproceedings{laor:hal-03526240, TITLE = {{DRAWNAPART: A Device Identification Technique based on Remote GPU Fingerprinting}}, AUTHOR = {Laor, Tomer and Mehanna, Naif and Durey, Antonin and Dyadyuk, Vitaly and Laperdrix, Pierre and Maurice, Cl{\&apos;e}mentine and Oren, Yossi and Rouvoy, Romain and Rudametkin, Walter and Yarom, Yuval}, URL = {https://hal.inria.fr/hal-03526240}, BOOKTITLE = {{Network and Distributed System Security Symposium}}, ADDRESS = {San Diego, United States}, YEAR = {2022}, MONTH = Feb, DOI = {10.14722/ndss.2022.24093}, PDF = {https://hal.inria.fr/hal-03526240/file/ndss22_laor.pdf}, HAL_ID = {hal-03526240}, HAL_VERSION = {v1}, }</p></div></div><div class="kg-card kg-button-card kg-align-center"><a href="https://hal.inria.fr/hal-03526240/document" class="kg-btn kg-btn-accent">Download paper</a></div><p>In a nutshell, our newly discovered technique that we named <strong>DrawnApart</strong> measures the time it takes for the GPU to draw specific points in a 3D environment. What we found is that even devices with the exact same GPU present noticeable variations that can be used to track users on the web. Notably, in our paper, DrawnApart can <strong>extend by up to 67%</strong> the tracking time of a device compared to known methods.</p><h2 id="tracking-on-the-web">Tracking on the web</h2><p>Tracking on the web is nothing recent. As far back as 2001, <a href="https://www.nytimes.com/2001/09/04/business/giving-web-a-memory-cost-its-users-privacy.html">the New York Time shared concerns</a> about the growing use of cookies on the web. The rapid adoption of the Internet has only made things worse and tracking keeps evolving towards more advanced techniques. <br>Cookie-based tracking has been the most widespread: from a simple technique, when introduced, it has changed over time to become a complex pipeline of first-and third-party cookies that allows for very precise tracking across the web. Fouad <em>et al</em>. <a href="https://arxiv.org/pdf/1812.01514.pdf">explain in great detail</a> most of the advanced cookie-based tracking techniques that are available on the modern web. Advertisers and trackers exploit these possibilities, making cookie-tracking still the most widespread and effective tracking method.<br>However, as users start to realize that their privacy is at risk from constant targeting and tracking, browsers are starting to take a stand against these practices. For instance, private browsing modes have been introduced in all major browsers and allow users to wipe data persisted by websites during the browsing session. Other actors in the market have taken a harsher stand: the <a href="https://brave.com/">Brave</a> browser embeds an ad-blocker to restrict most of the tracking and the unwanted advertising. The <a href="https://www.torproject.org/">Tor</a> browser includes much stricter options to limit tracking, at the cost of speed and breakages. <a href="	 23:17    https://techcrunch.com/2021/04/26/apples-app-tracking-transparency-feature-has-arrived-heres-what-you-need-to-know/">Safari</a> and <a href="https://blog.mozilla.org/en/products/firefox/firefox-now-available-with-enhanced-tracking-protection-by-default/">Firefox</a> have also included many features to reduce tracking, like limiting third-party cookies.<br><br>This newly shed light on cookie-tracking and the self-awareness of users has pushed advertisers to look towards other techniques to track users. A potential candidate that has been studied is <strong>browser fingerprinting</strong>. Its stateless nature makes it more difficult to block than cookies, nothing is stored on the client device, while proving to be able to discriminate devices. The <a href="https://amiunique.org/">Am I Unique</a> platform provides a testing tool that outlines the uniqueness of your setup.<br>One of the difficulties of browser fingerprint tracking is its <a href="https://hal.archives-ouvertes.fr/hal-01652021">limited stability</a>. As attributes evolve over time, it becomes harder to keep track of a device, because the fingerprint changes frequently. This can be countered by choosing a specific set of stable attributes or by taking advantage of hardware-based attributes, which are significantly more stable and arguably <a href="https://hal.archives-ouvertes.fr/hal-01820197">more difficult to consistently forge</a>.<br><br>We found one such hardware based method we call <strong><a href="https://hal.inria.fr/hal-03526240">DrawnApart</a></strong>. Our work outlines how the WebGL API can be exploited to generate a GPU fingerprint through JavaScript. This, combined with other attributes, provides a significant boost of over 66% to the average tracking time over the state-of-the-art algorithm for browser fingerprint tracking (our previous work, called <a href="https://hal.inria.fr/hal-01652021">FP-Stalker</a>).</p><h2 id="what-is-drawnapart">What is DrawnApart ?</h2><p>DrawnApart is a <em>Graphic Processing Unit (GPU) fingerprinting technique </em>which attempts to uniquely identify your graphics card. It can be run using unprivileged JavaScript in the browser and takes advantage of the WebGL API, which is enabled by default on all the browsers. In our <a href="https://arxiv.org/abs/2201.09956">research paper</a>, which is to be presented at the <a href="https://www.ndss-symposium.org/ndss2022">Network And Distributed System Security Symposium 2022</a>, we show that DrawnApart is able to extend by almost 67% the average tracking time of the state-of-the-art. More importantly, we can find differences in what would be otherwise identical hardware (e.g., the same model and version of GPUs from the same vendor, in the purchase order). DrawnApart is able to function for both dedicated or integrated GPUs.<br><br>To better understand how DrawnApart works, it is important to understand that GPUs consists of highly parallelized architectures, composed of various <em>Execution Units</em> (EU). Those can all perform independent operations simultaneously. On the software side, WebGL is a cross-platform API for 3D rendering that is implemented in most major browsers. WebGL abstracts the process of rendering into a multi-step pipeline. Two of those steps are exploited by DrawnApart: the <em>vertex shader </em>and the <em>fragment shader</em>. The first takes care of positioning a point in an area, while the second mainly determines the color.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.amiunique.org/content/images/2022/02/drawnapart_working.png" class="kg-image" alt="Explaining DrawnApart, a remote GPU fingerprinting technique" loading="lazy" width="571" height="535"><figcaption>Overview of our GPU fingerprinting technique: (1) points are rendered in parallel using several EUs; (2) the EU drawing point i executes a stall function (dark), while other EUs return a hard-coded value (light); (3) the execution time of each iteration is bounded by the slowest EU.</figcaption></figure><p>The first step in the DrawnApart fingerprinting process is to instruct the WebGL API to draw a number of points in parallel. For most points, the vertex shader returns as expected, however, for a specific set of points, we execute a <em>stall function </em>which significantly pauses the rendering process. Since a non-stalled point instantly returns, a timing measurement for the set of points is dominated by the time taken by the stalled points to execute. DrawnApart then builds <em>a trace</em> by repeating this drawing process multiple times. The <a href="https://drawnapart.github.io/drawnapart/standalone_demos/onscreen.html">official demo</a> shows the result of this process. This trace can then be used as a GPU fingerprint.</p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.amiunique.org/content/images/2022/02/gen3_raw_traces_gen36-1-2.png" class="kg-image" alt="Explaining DrawnApart, a remote GPU fingerprinting technique" loading="lazy" width="1000" height="114" srcset="https://blog.amiunique.org/content/images/size/w600/2022/02/gen3_raw_traces_gen36-1-2.png 600w, https://blog.amiunique.org/content/images/2022/02/gen3_raw_traces_gen36-1-2.png 1000w" sizes="(min-width: 720px) 720px"><figcaption>Visual representation of raw traces collected by DrawnApart, from a single device</figcaption></figure><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.amiunique.org/content/images/2022/02/gen3_raw_traces_gen31-1.png" class="kg-image" alt="Explaining DrawnApart, a remote GPU fingerprinting technique" loading="lazy" width="1000" height="112" srcset="https://blog.amiunique.org/content/images/size/w600/2022/02/gen3_raw_traces_gen31-1.png 600w, https://blog.amiunique.org/content/images/2022/02/gen3_raw_traces_gen31-1.png 1000w" sizes="(min-width: 720px) 720px"><figcaption>The measurements are divided into 16 groups of 11, where in each group we stall a different point. The color of a point indicates the rendering time, ranging from virtually 0 (white) to 90 ms (blue). Red vertical bars indicate group boundaries</figcaption></figure><h2 id="exploiting-the-trace">Exploiting the trace</h2><p>DrawnApart is evaluated in two scenarios, as described in the paper. First, in a controlled environment to better control different variables. The controlled environment is composed of different groups of devices, all equipped with identical GPUs (within a same group) that DrawnApart intends to distinguish.<br>For this purpose, the evaluation consists in correctly classifying devices by using a &#xA0;Random Forest classifier. The following table present the resulting accuracy gain over the base rate and shows how DrawnApart provides a significant boost in &#xA0;identifying capabilities in the controlled environment.<br>Note we mention three type of timers: onscreen, offscreen, and GPU. Each of these timing methods comes with its advantages: the onscreen method makes use of <em>Window.requestAnimationFrame, </em>which is called after the rendering is done. Measurements are recorded once an iteration of the method has been completed. The onscreen method is compatible with all the major browsers, but present the limitation of a capped refresh rate (to the browser&apos;s maximum frame rate). Consequently, one element of the trace must take at least 16ms to be correctly measured.<br>The <a href="https://caniuse.com/offscreencanvas">offscreen method</a> is more limited in term of compatibility at the time of writing, as it works mostly with Chromium browsers and is subject to manual activation on Firefox.<br>The GPU timing technique is a variation of the offscreen method that measures the duration of a set of graphics commands directly on the GPU side (as opposed as a measure on the CPU side for both previous methods). However, this method presents serious disadvantages as it strongly varies between different GPU architectures and is not supported anymore by the Google SwiftShader renderer.<br></p><figure class="kg-card kg-image-card"><img src="https://blog.amiunique.org/content/images/2022/02/image-1.png" class="kg-image" alt="Explaining DrawnApart, a remote GPU fingerprinting technique" loading="lazy" width="1289" height="594" srcset="https://blog.amiunique.org/content/images/size/w600/2022/02/image-1.png 600w, https://blog.amiunique.org/content/images/size/w1000/2022/02/image-1.png 1000w, https://blog.amiunique.org/content/images/2022/02/image-1.png 1289w" sizes="(min-width: 720px) 720px"></figure><p><br><br>The second scenario, which is much more representative of the real world, uses traces collected in the wild through the <a href="https://chrome.google.com/webstore/detail/amiunique/pigjfndpomdldkmoaiiigpbncemhjeca?hl=fr"><em>Am I Unique</em> extension</a>. The extension performs &#xA0;a scheduled data collection in the background comprised of attributes shown on the <a href="https://amiunique.org/fp"><em>Am I Unique</em> fingerprinting page</a> and 7 DrawnApart traces at each collection. As such, the collected dataset is representative of a real world setting with various users from different parts of the globe, with different hardware and software configurations and a realistic computing load. We collected data from over 2,500 devices, with more than 1,605 distincts GPUs, the main task is to be able to distinguish and consistently track the users over time. This scenario provides additional challenges compared to the controlled environment as an attacker (in this case, we are acting as the attacker) cannot use long training phases as the user must be <strong>identified in real-time</strong>. The attacker should also handle new devices as they arrive, without having to retrain his classifier each time. <br>In order to respond to those challenges, we proposed a pipeline consisting of an embedding neural network that takes the raw traces as input, and outputs an <em>embedding</em> of the trace in euclidean space. Consequently, the attacker simply has to compute the Euclidean distance between an incoming trace and the traces he previously collected and stored. He basically compares the similarity of the GPU fingerprint. If the Euclidean distance is below a threshold, two traces are very similar and are classified as originating from the same device.<br>We chose to evaluate DrawnApart in the wild in two steps. First, we evaluate our system without any additional information other than the processed trace (through the previous pipeline) on a k-Nearest Neighbor classifier and we compare the resulting accuracy to a base rate. We find that DrawnApart significantly improves on the base rate. <br>Second, we evaluate our method when integrated into a browser fingerprint tracking algorithm, namely <a href="https://hal.inria.fr/hal-01652021">FP-Stalker</a>, which is the state-of-the-art algorithm for linking browser fingerprints over time. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.amiunique.org/content/images/2022/02/drawnapart_algorithm.png" class="kg-image" alt="Explaining DrawnApart, a remote GPU fingerprinting technique" loading="lazy" width="511" height="728"><figcaption>DrawnApart integration in FP-Stalker</figcaption></figure><p>Compared to the original version of FP-Stalker, our DrawnApart algorithm offers a boost of <strong>almost 67%</strong> on the average tracking time. </p><figure class="kg-card kg-image-card kg-card-hascaption"><img src="https://blog.amiunique.org/content/images/2022/02/drawnapart_tracking_time.png" class="kg-image" alt="Explaining DrawnApart, a remote GPU fingerprinting technique" loading="lazy" width="678" height="499" srcset="https://blog.amiunique.org/content/images/size/w600/2022/02/drawnapart_tracking_time.png 600w, https://blog.amiunique.org/content/images/2022/02/drawnapart_tracking_time.png 678w"><figcaption>Tracking time boost with DrawnApart compared to the original version of FP-Stalker</figcaption></figure><h2 id="countermeasures">Countermeasures</h2><p>While the effectiveness of DrawnApart introduces serious privacy risks for users, a number of countermeasures could address these issues:</p><ul><li><strong>Blocking JavaScript</strong> is an effective countermeasure, and most browsers and extensions allow blocking JavaScript. This is a rather radical solution that comes with the downside breaking a lot of sides since most websites heavily rely on JavaScript for displaying their content or maintaining a good user experience. You can also look to browser extensions to enable/disable JavaScript at a more granular level (choose which scripts to allow). NoScript is a big favorite, and uMatrix is nice too!</li><li><strong>Disabling the WebGL API</strong> could be a good tradeoff compared to blocking all JavaScript. However, it is to be noted that even if only 1% of the Alexa Top 10k showed any usage of the WebGL API, disabling it completely could introduce unexpected breakage. Firefox and a few other browsers already allow users to deactivate the WebGL API.</li><li><strong>Introducing random variation of the clock speed</strong> would also be an efficient countermeasure. DrawnApart&apos;s traces already contain some noise, and thus, introducing random variations in clock speed would make the data even noisier and thus less exploitable.</li><li><strong>Preventing parallel execution</strong> would directly impact the inner working of our technique. However, this countermeasure comes with the heavy cost of severely limiting the performance of the WebGL API.</li></ul><p>It should be noted that current mitigations against Canvas Fingerprinting that introduce noise in renderings (see <a href="https://brave.com/privacy-updates/3-fingerprint-randomization/">Brave&apos;s farble output</a>) cannot be applied against DrawnApart as it is based on measuring execution time and not on comparing rendered images.</p><h2 id="conclusion">Conclusion</h2><p>Throughout our paper, DrawnApart is shown to efficiently identify devices both in a controlled environment and in real-world scenarios. We show the technique works against what are otherwise identical devices. Through our data collection performed on the <a href="https://amiunique.org">Am I Unique</a> platform we showed it is feasible in practice. DrawnApart offers a boost of almost 67% to the average tracking time of the state-of-the-art browser fingerprinting algorithm, outlining the importance of hardware fingerprinting in web tracking. </p><h3 id="drawnapart-demo">DrawnApart Demo</h3><p>In the following <a href="https://drive.google.com/file/d/1dq_Bj4tG2fuWROLR9Uj9PPj9kBijEuWk/">video</a>, Vitaly Dyadyuk, co-author of the paper, swaps the CPUs (with integrated graphics) of two identical computers showing that DrawnApart is able to detect a full CPU swap.</p><!--kg-card-begin: html--><center><iframe src="https://drive.google.com/file/d/1dq_Bj4tG2fuWROLR9Uj9PPj9kBijEuWk/preview" width="640" height="480" allow="autoplay"></iframe></center><!--kg-card-end: html--><h3 id="useful-links-media-coverage">Useful links &amp; media coverage</h3><ul><li>Full paper: <a href="https://hal.inria.fr/hal-03526240">HAL</a>, <a href="https://arxiv.org/abs/2201.09956">Arxiv</a></li><li><a href="https://orenlab.sise.bgu.ac.il/p/DrawnApart">Paper&apos;s official webpage</a> (orenlab.sise.bgu.ac.il)</li><li><a href="https://github.com/drawnapart/drawnapart">Official artifacts</a> (github.com)</li></ul><p>DrawnApart has received media coverage, most notably: </p><ul><li><a href="https://thehackernews.com/2022/01/your-graphics-card-fingerprint-can-be.html">TheHackerNews (by Ravie Lakshmanan)</a></li><li><a href="https://www.bleepingcomputer.com/news/security/researchers-use-gpu-fingerprinting-to-track-users-online/">BleepingComputer (by Bill Toulas)</a></li><li><a href="https://www.pcgamer.com/drawn-apart-gpu-web-tracking/">PCGamer (by Jacob Ridley)</a></li><li><a href="https://gizmodo.com/your-graphics-card-can-be-used-as-a-web-tracker-1848452619">Gizmodo (by Lucas Ropek)</a></li><li><a href="https://www.securitylab.ru/news/529327.php">SecurityLab.ru (in Russian)</a></li><li><a href="https://gigazine.net/news/20220201-gpu-fingerprinting-drawnapart/">Gigazine.net (in Japanese)</a></li><li><a href="https://www.sohu.com/a/520269770_114760">Sohu.com (in Chinese)</a></li><li><a href="https://www.heise.de/news/Browser-Fingerprinting-PCs-Smartphones-Co-lassen-sich-ueber-die-GPU-tracken-6345233.html">Heise Online (in German)</a></li><li><a href="https://www.01net.com/actualites/ces-chercheurs-ont-trouve-comment-nous-identifier-sur-le-web-grace-aux-cartes-graphiques-de-nos-pc-2054214.html">01net (French)</a></li><li><a href="https://www.clubic.com/carte-graphique/actualite-407007-drawnapart-comment-votre-carte-graphique-peut-etre-utilise-pour-vous-suivre-en-ligne.html">Clubic (French)</a></li><li>Reddit <a href="https://www.reddit.com/r/privacy/comments/shqrw2/your_graphics_card_could_be_used_to_track_you/">1</a> <a href="https://www.reddit.com/r/nvidia/comments/sgqc2l/bleeping_computer_researchers_use_gpu/">2</a> <a href="https://www.reddit.com/r/technology/comments/sgd6ep/researchers_use_gpu_fingerprinting_to_track_users/">3</a> <a href="https://www.reddit.com/r/PrivacyGuides/comments/sgh4e0/researchers_use_gpu_fingerprinting_to_track_users/">4</a></li></ul>]]></content:encoded></item></channel></rss>