laserphile: AliExpress webpage keeping multipoint Bluetooth headphones active with WebAudio fingerprinting
Thursday, 20 August 2026
AliExpress webpage keeping multipoint Bluetooth headphones active with WebAudio fingerprinting
Recently I ran into a strange problem with my Bluetooth headphones. They support multipoint Bluetooth audio, so they can be connected to my PC and phone at the same time. Normally the PC takes priority playing audio, with my phone being able to play audio when nothing is playing on the PC.<br>Usually I listen to music on my phone but with notifications or youtrube playing through the PC, this works reliably until I open an AliExpress page in Firefox or Chrome (other browsers untested).<br>Shortly after loading the AliExpress homepage, audio from my phone would stop playing. Closing the AliExpress tab fixes it immediately. Muting the tab does not help, and there is no visible video, music, or other media playing on the page.<br>This seemed suspicious enough to investigate.<br>Looking for hidden media<br>My first thought was an autoplaying product video or advertisement, so I checked for the usual suspects:
and elements<br>calls to HTMLMediaElement.play()<br>active Media Session metadata<br>media requests<br>embedded frames containing media
None of these showed anything useful. There were no audio or video elements, no media playback calls, and navigator.mediaSession.playbackState remained none.<br>A clue was that the problem did not begin immediately. It appeared after the page had been sitting idle for several seconds. I instrumented the page before loading it and watched the Web Audio API instead of only looking for conventional media elements.<br>The basic idea was to wrap the AudioContext constructor and record whenever a page created an audio-processing context:<br>const OriginalAudioContext = window.AudioContext;
window.AudioContext = class extends OriginalAudioContext {<br>constructor(...args) {<br>super(...args);
console.log("AudioContext created", {<br>state: this.state,<br>stack: new Error().stack<br>});<br>};
I also wrapped AudioNode.prototype.connect() so I could see whether anything was connected to the context's audio destination.<br>That finally found it, two hidden audio contexts!<br>During an idle capture of the AliExpress homepage, the page created two AudioContext objects. Both entered the running state and both connected nodes to AudioContext.destination.<br>At the same time there were still:
zero or elements<br>zero media play() calls<br>no active Media Session<br>no audible sound
The constructor stack traces pointed to two scripts:
https://assets.aliexpress-media.com/g/AWSC/uab/1.140.0/collina.js<br>https://assets.aliexpress-media.com/g/AWSC/fireyejs/1.231.67/fireyejs.js
The first context was created by collina.js, while the second came from fireyejs.js. Both sit under an AWSC directory and appear to be part of Alibaba's browser security and anti-abuse tooling.<br>The scripts are extremely obfuscated, but enough names and operations survive for AI to work out what the audio code is doing.<br>What the audio code does<br>Both scripts build a WebAudio graph resembling this:<br>Sawtooth oscillator<br>-> AnalyserNode<br>-> ScriptProcessorNode<br>-> GainNode set to zero<br>-> AudioContext.destination
The oscillator generates a known waveform. The analyser measures the result after it has passed through the browser's audio implementation, and the script reads frequency data from it.<br>The gain is set to zero, so the user should not hear anything. However, the graph is still connected to the system audio destination. Connecting it to the destination causes the browser to actively process the graph, even though the final volume is zero.<br>This is very different from an autoplaying video. There is no media element for the browser's normal tab mute control to stop. As far as the page is concerned, it is performing live audio processing.<br>In my case, that appears to have been enough for Firefox or Windows to keep the Bluetooth audio path active, preventing my multipoint headphones from switching cleanly back to the phone.<br>This looks like fingerprinting<br>The WebAudio test is not the only measurement in these scripts. Inspection of the bundles found code that queries or measures:
canvas rendering and toDataURL()<br>WebGL renderer information, extensions, and shader precision<br>audio oscillator and analyser output<br>screen and viewport dimensions<br>device pixel ratio<br>hardware concurrency and device memory<br>installed browser plugins<br>supported audio and video formats<br>WebRTC behaviour<br>browser performance timing<br>mouse, touch, focus, and scroll events<br>device motion and orientation<br>properties commonly associated with browser automation<br>There is also code for serialising and encrypting results, making requests to Alibaba telemetry services, and sending data with fetch() or sendBeacon().
This is a fairly comprehensive browser and device fingerprint.<br>Audio fingerprinting works because small differences in browser versions, operating systems, audio libraries, and hardware can produce...