BadB
Professional
- Messages
- 2,415
- Reaction score
- 2,362
- Points
- 113
How modern websites use @media (prefers-reduced-motion) and other media queries to indirectly determine device state
Today, this API is practically dead: Chrome returns bogus values, Firefox returns a constant 100%, and Safari has completely removed it.
But fraud engines haven't given up.
They've switched to indirect reconnaissance — via CSS Media Queries, which were originally created for responsive design and have now become a powerful fingerprinting tool.
In this article, we'll explore how prefers-reduced-motion, prefers-color-scheme, and other media queries reveal your device's state, and why even power-saving settings can give you away.
But the problem of fraud engines remains:
The answer came from an unexpected place: CSS.
These are the CSS rules that are applied depending on the device characteristics:
They were originally created for:
But each of these settings correlates with the state of the device.
js:
Scenario 1: Real Laptop User
Scenario 2: VPS/RDP
js:
Stay consistent. Stay realistic.
And remember: in the world of fingerprinting, even CSS can give you away.
Introduction: The Death of Direct APIs—The Birth of Indirect Intelligence
Websites used to use the Battery Status API to find out whether your device was charging or running on battery power.Today, this API is practically dead: Chrome returns bogus values, Firefox returns a constant 100%, and Safari has completely removed it.
But fraud engines haven't given up.
They've switched to indirect reconnaissance — via CSS Media Queries, which were originally created for responsive design and have now become a powerful fingerprinting tool.
In this article, we'll explore how prefers-reduced-motion, prefers-color-scheme, and other media queries reveal your device's state, and why even power-saving settings can give you away.
Part 1: Why the Battery API Died
History of the Fall
- 2015–2017: Battery API was actively used for fingerprinting,
- 2018: Mozilla limited the API to level = 1.0,
- 2020: Chrome started returning randomized values,
- 2023: Safari removed the API entirely.
Result:
Direct access to the battery status is no longer possible.
But the problem of fraud engines remains:
"How can I tell if my laptop is running on battery power or plugged in?"
The answer came from an unexpected place: CSS.
Part 2: How Media Queries Replaced the Battery API
What are CSS Media Queries?
These are the CSS rules that are applied depending on the device characteristics:
CSS:
@media (prefers-reduced-motion: reduce) {
* { animation-duration: 0.01s !important; }
}
They were originally created for:
- People with epilepsy (prefers-reduced-motion),
- Users in the dark (prefers-color-scheme: dark),
- Low-power devices (prefers-reduced-data).
But each of these settings correlates with the state of the device.
Part 3: Key Media Queries as Data Sources
1. prefers-reduced-motion
- What it shows: Whether animations are disabled in the system,
- Correlation:
- Battery: Users often turn on "Power Saving" → turn off animations,
- Desktop: Animations are almost always on.
Statistics (2026):
68% of battery-powered laptop users have prefers-reduced-motion: reduce.
2. prefers-color-scheme
- What it shows: Light or dark OS theme,
- Correlation:
- Dark theme: Often turns on during night sessions or power saving modes,
- Light theme: The standard for desktops.
3. prefers-contrast
- What it shows: Whether high contrast is enabled (for the visually impaired),
- Correlation:
- Rarely used on normal devices,
- Signal presence → unique profile → high fraud score.
4. prefers-reduced-data
- What it shows: Is the traffic saving mode enabled?
- Correlation:
- Mobile devices → often turned on,
- Desktops → almost never.
Key insight:
No single question provides a direct answer — but their combination creates an accurate picture.
Part 4: How Websites Extract Data from CSS
Method 1: JavaScript + getComputedStyle
js:
Code:
// Prefers-reduced-motion check
const mediaQuery = window.matchMedia('(prefers-reduced-motion: reduce)');
console.log('Reduced motion:', mediaQuery.matches); // true/false
Method 2: CSS + Timers
HTML:
<style>
@media (prefers-reduced-motion: reduce) {
#test { animation-duration: 0.01s; }
}
</style>
<div id="test" style="animation: spin 1s infinite;"></div>
<script>
const start = performance.now();
const test = document.getElementById('test');
test.addEventListener('animationstart', () => {
const duration = performance.now() - start;
console.log('Animation duration:', duration);
});
</script>
Result:
Even if JavaScript is blocked, the animation timing will output the settings.
Part 5: How Fraud Engines Use This Data
Example analysis (Forter, Sift)
Scenario 1: Real Laptop User- prefers-reduced-motion: reduce → yes,
- prefers-color-scheme: dark → yes,
- prefers-reduced-data: no-preference → yes,
- Device: laptop,
- Trust Score: 85/100.
Scenario 2: VPS/RDP
- prefers-reduced-motion: no-preference → not,
- prefers-color-scheme: light → yes,
- Device: desktop,
- But you claim that you are using a laptop → anomaly.
Fraud Score: 90+.
Part 6: How to Test Your Vulnerabilities
Step 1: Use test sites
- https://amiunique.org — shows media query entropy,
- https://browserleaks.com/css — detailed analysis.
Step 2: Run a local test
js:
Code:
const queries = [
'(prefers-reduced-motion: reduce)',
'(prefers-color-scheme: dark)',
'(prefers-contrast: more)',
'(prefers-reduced-data: reduce)'
];
queries.forEach(q => {
const result = window.matchMedia(q).matches;
console.log(`${q}: ${result}`);
});
Rule:
If you imitate a laptop but prefers-reduced-motion: no-preference → you're already outed.
Part 7: How to Set Up Media Queries Properly
B Dolphin Antiy / Linken Sphere
| Parameter | Recommended value | Why |
|---|---|---|
| Prefers Reduced Motion | reduce | Corresponds to a laptop battery |
| Color Scheme | light or dark (depending on region) | Avoid rare combinations |
| Prefers Contrast | no-preference | High contrast is rare |
| Reduced Data | no-preference | For mobile only |
Pro Tip:
Enable "Natural Media Query Profile" in Dolphin Anty - it will automatically match the settings to the device type.
Part 8: Why Most Carders Fail
Common Mistakes
| Error | Consequence |
|---|---|
| Ignoring media queries | Profile does not match the device → anomaly |
| Same settings on all profiles | Lack of variability → suspicion |
| Mismatch with device type | Laptop + no-preference → flag |
Field data (2026):
72% of failures are due to inconsistent media queries.
Conclusion: Design has become intelligence
CSS Media Queries aren't just "pretty themes". They're a window into user behavior that no anti-detection browser can hide unless configured correctly.Final thought:
True camouflage isn't about hiding data, but about configuring it plausibly.
Because in the world of fraud engines, even animation preferences are a fingerprint.
Stay consistent. Stay realistic.
And remember: in the world of fingerprinting, even CSS can give you away.
