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

Few questions about some prefs [also webaudio FP results] #1216

Closed
ghost opened this issue Jul 20, 2021 · 13 comments
Closed

Few questions about some prefs [also webaudio FP results] #1216

ghost opened this issue Jul 20, 2021 · 13 comments

Comments

@ghost
Copy link

ghost commented Jul 20, 2021

In the latest version 90 release dom.webaudio.enabled and media.navigator.enabled are changed. I noticed it when I updated Mull from F-Droid main repo today and visited browserleaks.com to detect changes which I normally do when browser gets updated in desktop and in Android(yes Arkenfox user.js file works in Android and as a regular user I can confirm it works pretty darn good), well in this case Android first. So both prefs were detected in JavaScript and WebRTC browserleaks pages respectively, as before WebRTC page showed all values null and JavaScript showed WebAudio null which is not the case now. I don't use this website to see if I'm unique but to detect changes between updates like dom.security.httpsonlymode stopped working in version 87, before that it was working fine in Android.

When I visited the section 4500, there is some explanation for media.navigator.enabled being removed, but I still don't get it. With that pref being disabled, I was relaxed(maybe false security before) that no website can access camera & microphone. So that has gone now means websites can access them or I'm not seeing things properly?

I'll admit I don't pay much attention to Github discussions as I'm not a developer, just a casual user, and so I missed whole discussion in #1194
By doing the test in Firefox 90 in Ubuntu, the audio context value differs from what reported by other users(2glops) on Linux. The audio context value is 573f84633bd0a02ab6da198fbe4879f28b5d2f77 [20 keys] without RFP
All other values are same(without RFP). I honestly don't even know what that means, but mentioned it coz its different and is potentially a raised entropy. I can provide values for Android too if needed.

I would like to ask one question, can a linux user using user.js file fool the website in believing that he is using windows as that can make things for me clear? Because that's what I believed RFP and other values in user.js does which is reducing the info about hardware and software to a minimum in desktop and Androids.

Plus why these two values in RFP alternatives section as enabling them reports different values from RFP in version 90. I never paid much attention to this section but believed that values in the section would bridge some gap from no RFP to RFP. With these two prefs there is another ground. Of course I might be wrong.

I don't see any harm in webaudio being disabled as audio in all websites worked fine and it differs between OS. Plus in that discussion although it was mentioned - not for Android, but things are different there. Is disabling WebAudio a good idea in Android?
Just don't say things like only few users do it or percentage as I prefer to disable prefs which are in some way connected to hardware, coz percentage of users doesn't apply there, like for any chromium browser. And please don't dismiss this as no discussion for Android. And don't consider me a troll, I just created a new account and have some doubts for something I use daily.

@rusty-snake
Copy link
Contributor

rusty-snake commented Jul 20, 2021

So that has gone now means websites can access them or I'm not seeing things properly?

Without consent? No, you will always get a prompt from Firefox.

By doing the test in Firefox 90 in Ubuntu, the audio context value differs from what reported by other users(2glops) on Linux.

First question: do you have a 32-bit system? edit you already said it "without RFP". I get other results too if I disable RFP.
If you scare, have a look at CanvasBlocker.

@Thorin-Oakenpants
Copy link
Contributor

In the latest version 90 release

I haven't done a v90 release yet, See #1099 for media.navigator.enabled

can a linux user using user.js file fool the website in believing that he is using windows

Not even Firefox, with special built in code, can hide your operating system

The audio context value is ... [20 keys] without RFP

RFP protects two of those 20 keys. RFP is on by default. #1194 contains everything you need.

Is disabling WebAudio a good idea in Android

Unless it's an enforced set of users like Tor Browser, then don't do it .. waste of time. The number of results is tiny (by OS and engine) and likely equivalency (but not all buckets will have equal users) - changing it would make you stand out a hell of a lot more.


Audio tests

I can provide values for Android too if needed.

Yes please. Test with and without RFP, just expand the results and post images in a new issue for me - that would be cool. For your android and linux (can you state the distro as well) - that would be awesome

@Thorin-Oakenpants
Copy link
Contributor

but believed that values in the section would bridge some gap from no RFP to RFP

section 4600 is massively different to RFP itself. 4600 tends to disable APIs, whereas RFP controls them. These two sections are not even in the same ballpark.

@Thorin-Oakenpants
Copy link
Contributor

Thorin-Oakenpants commented Jul 20, 2021

dom.security.httpsonlymode stopped working in version 87

huh? can you elaborate. We added it here for version 84 - it's worked fine for me ever since, and they have made improvements since then as well - see #1047 first post .. v90 for example got an exceptions UI in settings

edit: unless this is just an android issue?

@ghost
Copy link
Author

ghost commented Jul 20, 2021

Whoa I didn't expected the response to be super quick.

With media.navigator.enabled the main thing is I liked how things were before as no prompt needed, no camera or microphone access which is good, as I created new profiles for them.

Dom.security.httpsonly mode is android issue.

Thanks for WebAudio clarrification. Here are the values in Android

With RFP

getChannelData 1 639354199cf12c28fb7f14cabdb77872a040bd93
copyFromChannel 1 639354199cf12c28fb7f14cabdb77872a040bd93
sum 1 35.7499681673944
 
audioContext 2 63848d42fb8da033b1bd6861a5198ed01f4b214b [20 keys]
-- --
OscillatorNode 2 9c39676511544e169d0b40366dd8f7bf167eb437
OscillatorNode/DynamicsCompressor 2 7072df3640caea7df394a560e30aada4b416ca95

Without RFP

getChannelData 1 639354199cf12c28fb7f14cabdb77872a040bd93
copyFromChannel 1 639354199cf12c28fb7f14cabdb77872a040bd93
sum 1 35.7499681673944
audioContext 2 63848d42fb8da033b1bd6861a5198ed01f4b214b [20 keys]
OscillatorNode 2 9c39676511544e169d0b40366dd8f7bf167eb437
OscillatorNode/DynamicsCompressor 2 7072df3640caea7df394a560e30aada4b416ca95

Edit - I'm sorry I messed up the test as with RFP test is on version 90 and without one on version 91(Firefox Beta). I'll give the new test.

@ghost
Copy link
Author

ghost commented Jul 20, 2021

Without RFP on version 90

getChannelData 1 639354199cf12c28fb7f14cabdb77872a040bd93
copyFromChannel 1 639354199cf12c28fb7f14cabdb77872a040bd93
sum 1 35.7499681673944
 
audioContext 2 d908755de877d8ebd96651bc5286bcf85fbd42d3 [20 keys]
OscillatorNode 2 9c39676511544e169d0b40366dd8f7bf167eb437
OscillatorNode/DynamicsCompressor 2 7072df3640caea7df394a560e30aada4b416ca95

Without RFP means all the browser data was cleared and no about:config changes or any extensions.

@ghost ghost closed this as completed Jul 20, 2021
@Thorin-Oakenpants
Copy link
Contributor

@githubuniqu expand the details as well, so I can see the actual key values :) Just tajke your time. Android with and without RFP. Your linux with and without RFP. damn, still typing and you closed :) Thanks for the tests, these will help

@abrahamjuliot ^see above for some FF audio values


Because that's what I believed RFP and other values in user.js does which is reducing the info about hardware and software to a minimum in desktop and Androids

I don't want to repeat everything (I had/have plans to create an arkenfox/blog with entries for common answers about fingerprnitng, but you know, time limitations), so I'll point at this - sereneblue/chameleon#508 (comment) for starters

Everything is about reducing entropy. Raising entropy by randomizing ultimately can be detected and reduced to a static value, e.g. canvas: "randomized". That doesn't mean randomizing is useless - if scripts can't detect that, then they swallow a "poison pill". But ultimately the name of the game is to never reveal the true value (it''s OK if you actually are that value), and to lower entropy. And ideally this should be done with as little web breakage as possible (like canvas breaks images into garbage), or unintended side effects (like the user doesn't expect the timezone to be UTC0 = education needed).

If a metric can't be protected because it;s either too complex, or not yet implemented for various reason, another option is to disable the API. Which is what Tor Browser has done with webGL, webaudio, webRTC and media devices (camera, mike).

  • We know webaudio has equivalency in math, but no really bothered to check how bad webaudio was, and they don't have time - so it was just disable the API, no one uses it (this was 4 years ago)
  • Same with webRTC + media.navigator.enabled. TB can't afford to mess around with webRTC leaks, they need to be handled upstream (and I think they might be now), and obviously a camera/mic at the time posed more issues than today

The things is TB has a different threat model to consider, and RFP is specifically for Tor Browser. Slowly but surely, more is getting added on, even if not specifically for TB. And a lot of things are being done even for non RFP users.

Anyway, back to the OS: some items cannot be hidden if a script really wants to know it (OS, engine, version, etc), but that doesn't mean RFP can't try and make it hard. Read the above link and it explains the UA stuff, which pertains to your question about OSes. RFP doesn't try to hide the OS, and in fact spoofs values differently for some metrics based on the OS - such as those audioContext keys.

godamn it .. wrote far too much .. I really should start the arkenfox/blog

@Thorin-Oakenpants
Copy link
Contributor

PS: the tests between versions don't matter - the diffs are in OS and RFP - if you do any more let me know which results relate to which os, thanks

@Thorin-Oakenpants
Copy link
Contributor

Dom.security.httpsonly mode is android issue.

Ahh, right. I haven't particularly followed it in android. I looked at https://bugzilla.mozilla.org/show_bug.cgi?id=1613063 and didn't immediately spot a reference ticket, but it rings a bell that HTTPS-Only Mode hasn't been enabled for geckoview yet

@ghost ghost reopened this Jul 20, 2021
@ghost
Copy link
Author

ghost commented Jul 20, 2021

ANDROID
With RFP, hopefully this is how it's done and copy paste is working

e8482ba39b760522764695fb0075cb7685787461 [1 metric]

[ i ]   [api] web audio | enabled
getChannelData 1 | 639354199cf12c28fb7f14cabdb77872a040bd93
copyFromChannel 1 | 639354199cf12c28fb7f14cabdb77872a040bd93
sum 1 | 35.7499681673944

[ click here ] hash | hash not coded yet
audioContext 2 | 63848d42fb8da033b1bd6861a5198ed01f4b214b [20 keys]
OscillatorNode 2 | 9c39676511544e169d0b40366dd8f7bf167eb437
OscillatorNode/DynamicsCompressor 2 | 7072df3640caea7df394a560e30aada4b416ca95
▲ hide details
audioContext 2 | ac-baseLatency: 0 ac-outputLatency: 0.02 [RFP] ac-sampleRate: 44100 [RFP] ac-state: suspended ac-maxChannelCount: 2 ac-numberOfInputs: 1 ac-numberOfOutputs: 0 ac-channelCount: 2 ac-channelCountMode: explicit ac-channelInterpretation: speakers an-fftSize: 2048 an-frequencyBinCount: 1024 an-minDecibels: -100 an-maxDecibels: -30 an-smoothingTimeConstant: 0.8 an-numberOfInputs: 1 an-numberOfOutputs: 1 an-channelCount: 2 an-channelCountMode: max an-channelInterpretation: speakers
OscillatorNode 2 | -120.82623291015625, -121.40191650390625, -120.58375549316406, -119.82835388183594, -118.76979064941406, -117.4899673461914, -115.98652648925781, -114.32443237304688, -112.45613861083984, -110.40257263183594, -108.1410140991211, -105.64762878417969, -102.88689422607422, -99.81646728515625, -96.39297485351562, -92.61177062988281, -88.74403381347656, -88.17584991455078, -63.368507385253906, -38.913368225097656, -30.113183975219727, -30.702001571655273, -40.96392059326172, -69.38873291015625, -87.42301177978516, -89.23757934570312, -93.1483383178711, -96.89712524414062, -100.2867431640625, -103.33564758300781
OscillatorNode/DynamicsCompressor 2 | -126.43988800048828, -118.35896301269531, -104.18639373779297, -102.31742095947266, -110.18136596679688, -120.06529235839844, -119.62649536132812, -105.9378433227539, -101.73870849609375, -101.29652404785156, -101.38101196289062, -111.21796417236328, -104.39777374267578, -107.95561981201172, -95.34663391113281, -86.3258056640625, -97.8609848022461, -92.66708374023438, -71.51853942871094, -47.659698486328125, -38.904075622558594, -39.49070739746094, -49.69326400756836, -77.04199981689453, -91.82857513427734, -94.98822021484375, -86.20430755615234, -97.25701

Without RFP

e8482ba39b760522764695fb0075cb7685787461 [1 metric]

[ i ]   [api] web audio | enabled
getChannelData 1 | 639354199cf12c28fb7f14cabdb77872a040bd93
copyFromChannel 1 | 639354199cf12c28fb7f14cabdb77872a040bd93
sum 1 | 35.7499681673944

[ click here ] hash | hash not coded yet
audioContext 2 | d908755de877d8ebd96651bc5286bcf85fbd42d3 [20 keys]
OscillatorNode 2 | 9c39676511544e169d0b40366dd8f7bf167eb437
OscillatorNode/DynamicsCompressor 2 | 7072df3640caea7df394a560e30aada4b416ca95
▲ hide details
audioContext 2 | ac-baseLatency: 0 ac-outputLatency: 0 [failed] ac-sampleRate: 44100 [RFP] ac-state: suspended ac-maxChannelCount: 2 ac-numberOfInputs: 1 ac-numberOfOutputs: 0 ac-channelCount: 2 ac-channelCountMode: explicit ac-channelInterpretation: speakers an-fftSize: 2048 an-frequencyBinCount: 1024 an-minDecibels: -100 an-maxDecibels: -30 an-smoothingTimeConstant: 0.8 an-numberOfInputs: 1 an-numberOfOutputs: 1 an-channelCount: 2 an-channelCountMode: max an-channelInterpretation: speakers
OscillatorNode 2 | -120.82623291015625, -121.40191650390625, -120.58375549316406, -119.82835388183594, -118.76979064941406, -117.4899673461914, -115.98652648925781, -114.32443237304688, -112.45613861083984, -110.40257263183594, -108.1410140991211, -105.64762878417969, -102.88689422607422, -99.81646728515625, -96.39297485351562, -92.61177062988281, -88.74403381347656, -88.17584991455078, -63.368507385253906, -38.913368225097656, -30.113183975219727, -30.702001571655273, -40.96392059326172, -69.38873291015625, -87.42301177978516, -89.23757934570312, -93.1483383178711, -96.89712524414062, -100.2867431640625, -103.33564758300781
OscillatorNode/DynamicsCompressor 2 | -126.43988800048828, -118.35896301269531, -104.18639373779297, -102.31742095947266, -110.18136596679688, -120.06529235839844, -119.62649536132812, -105.9378433227539, -101.73870849609375, -101.29652404785156, -101.38101196289062, -111.21796417236328, -104.39777374267578, -107.95561981201172, -95.34663391113281, -86.3258056640625, -97.8609848022461, -92.66708374023438, -71.51853942871094, -47.659698486328125, -38.904075622558594, -39.49070739746094, -49.69326400756836, -77.04199981689453, -91.82857513427734, -94.98822021484375, -86.20430755615234, -97.25701904296875, -112.48721313476562, -103.72319030761719

@ghost
Copy link
Author

ghost commented Jul 20, 2021

About Ubuntu, well I'm getting different result from the previous one. Here is the one in new created profile without RFP

6e0d66e64d12e600db73a769b918c91ea0f2fa5e [1 metric]
[ i ]
[api] web audio enabled
getChannelData 1 4460bdcbe1cb161b6f9bd804565c8ecbaa2c4da6
copyFromChannel 1 4460bdcbe1cb161b6f9bd804565c8ecbaa2c4da6
sum 1 35.73833402246237

[ click here ] hash hash not coded yet
audioContext 2 506774fdd1f5cf63c96db512f3efe5f335d656b2 [20 keys]
OscillatorNode 2 247e9af1788fd5dca82f2139619cc7bd7e3be6ea
OscillatorNode/DynamicsCompressor 2 d7db6f9e9102bc7989a56dc42ab48cd9a1be60b2
▲ hide details
audioContext 2 ac-baseLatency: 0
ac-outputLatency: 0.113129251 [RFP]
ac-sampleRate: 44100 [RFP]
ac-state: suspended
ac-maxChannelCount: 2
ac-numberOfInputs: 1
ac-numberOfOutputs: 0
ac-channelCount: 2
ac-channelCountMode: explicit
ac-channelInterpretation: speakers
an-fftSize: 2048
an-frequencyBinCount: 1024
an-minDecibels: -100
an-maxDecibels: -30
an-smoothingTimeConstant: 0.8
an-numberOfInputs: 1
an-numberOfOutputs: 1
an-channelCount: 2
an-channelCountMode: max
an-channelInterpretation: speakers
OscillatorNode 2 -120.82844543457031, -121.40194702148438, -120.58355712890625, -119.82896423339844, -118.77040100097656, -117.48970031738281, -115.9870834350586, -114.32347106933594, -112.45613861083984, -110.40259552001953, -108.14111328125, -105.64728546142578, -102.88674926757812, -99.81663513183594, -96.3929672241211, -92.61178588867188, -88.74397277832031, -88.1758804321289, -63.368499755859375, -38.913368225097656, -30.113183975219727, -30.702001571655273, -40.96392059326172, -69.38872528076172, -87.42302703857422, -89.23757934570312, -93.14838409423828, -96.89705657958984, -100.28680419921875, -103.33616638183594
OscillatorNode/DynamicsCompressor 2 -126.45079040527344, -118.34969329833984, -104.18366241455078, -102.317138671875, -110.18647003173828, -120.0528793334961, -119.62663269042969, -105.93672943115234, -101.73855590820312, -101.30055236816406, -101.38484191894531, -111.21754455566406, -104.39872741699219, -107.95581817626953, -95.34893798828125, -86.32833862304688, -97.8610610961914, -92.6681137084961, -71.52093505859375, -47.66236114501953, -38.90677261352539, -39.493404388427734, -49.695926666259766, -77.04419708251953, -91.82952117919922, -94.98836517333984, -86.20660400390625, -97.25951385498047, -112.48420715332031, -103.7234878540039

With RFP in new profile

6e0d66e64d12e600db73a769b918c91ea0f2fa5e [1 metric]
[ i ]
[api] web audio enabled
getChannelData 1 4460bdcbe1cb161b6f9bd804565c8ecbaa2c4da6
copyFromChannel 1 4460bdcbe1cb161b6f9bd804565c8ecbaa2c4da6
sum 1 35.73833402246237

[ click here ] hash hash not coded yet
audioContext 2 fdb6f2cb10e8f42e073ef8b99345d739986ec390 [20 keys]
OscillatorNode 2 247e9af1788fd5dca82f2139619cc7bd7e3be6ea
OscillatorNode/DynamicsCompressor 2 d7db6f9e9102bc7989a56dc42ab48cd9a1be60b2
▲ hide details
audioContext 2 ac-baseLatency: 0
ac-outputLatency: 0.025 [RFP]
ac-sampleRate: 44100 [RFP]
ac-state: suspended
ac-maxChannelCount: 2
ac-numberOfInputs: 1
ac-numberOfOutputs: 0
ac-channelCount: 2
ac-channelCountMode: explicit
ac-channelInterpretation: speakers
an-fftSize: 2048
an-frequencyBinCount: 1024
an-minDecibels: -100
an-maxDecibels: -30
an-smoothingTimeConstant: 0.8
an-numberOfInputs: 1
an-numberOfOutputs: 1
an-channelCount: 2
an-channelCountMode: max
an-channelInterpretation: speakers
OscillatorNode 2 -120.82844543457031, -121.40194702148438, -120.58355712890625, -119.82896423339844, -118.77040100097656, -117.48970031738281, -115.9870834350586, -114.32347106933594, -112.45613861083984, -110.40259552001953, -108.14111328125, -105.64728546142578, -102.88674926757812, -99.81663513183594, -96.3929672241211, -92.61178588867188, -88.74397277832031, -88.1758804321289, -63.368499755859375, -38.913368225097656, -30.113183975219727, -30.702001571655273, -40.96392059326172, -69.38872528076172, -87.42302703857422, -89.23757934570312, -93.14838409423828, -96.89705657958984, -100.28680419921875, -103.33616638183594
OscillatorNode/DynamicsCompressor 2 -126.45079040527344, -118.34969329833984, -104.18366241455078, -102.317138671875, -110.18647003173828, -120.0528793334961, -119.62663269042969, -105.93672943115234, -101.73855590820312, -101.30055236816406, -101.38484191894531, -111.21754455566406, -104.39872741699219, -107.95581817626953, -95.34893798828125, -86.32833862304688, -97.8610610961914, -92.6681137084961, -71.52093505859375, -47.66236114501953, -38.90677261352539, -39.493404388427734, -49.695926666259766, -77.04419708251953, -91.82952117919922, -94.98836517333984, -86.20660400390625, -97.25951385498047, -112.48420715332031, -103.7234878540039

EDIT - different results are in Audio Context category and is changing every single time without RFP. I have created multiple profiles and I find the same thing. With RFP it is stable.

@Thorin-Oakenpants
Copy link
Contributor

thanks for the re-tests 👍

And hide the metrics which are not necessary

hiding a metric is still measurable. let's not get too complicated, but essentially if you do nothing you will be unique. if you do your own thing trying to hide, you will be very likely still be unique (except for poison pills). You cannot beat all fingerprinting - the goal is make enough metrics useless that it becomes impossible to linkify your traffic with certainty. Since all metrics ultimately rely on lowering entropy, it therefore can only properly succeed when large sets of users do the same thing.

arkenfox doesn't claim to defeat FPing. RFP doesn't either. Even Brave doesn't (it only says it fools naive scripts). The only browser that does this successfully, and says it is doing this, is Tor Browser - because it's a large set of users with all the same enforced protections. Tor Browser's antifingerprinting is 90% RFP, 5% some pref flips (webgl, webaudio etc), and 5% their own stuff. They don't guarantee FPing is fully defeated, but it's been proven super robust and only getting better.

I like media.navigator.enabled(also geo.enabled) set to false as I don't like dealing with prompts

No worries. Prompt fatigue is a PITA (I never see it TBH) .. but it's your choice/threat model, do what you like. The user.js is just stating prefs and facts - e.g. the fact that geo is behind a prompt means it's not a risk, and the fact that setting it to default deny is fingerprintable and disabling the API is fingerprintable. You can assess that how you like: e.g

  • most scripts are blocked, most scripts that might get through are probably dumb enough to be sucked in by random canvas, and excluding sites I log into, any remaining smart scripts can probably ID me anyway .. so I'm going to relax a few things for usabillity. If I need to do anything super secret I will use Tor Browser
  • ^ 100% legit threat model

:)

@rusty-snake
Copy link
Contributor

@githubuniqu If you care about prompts, have a look at the permissions.default.* prefs (0=prompt, 1=allow, 2=deny).
Note that some of them are FPable via Permissions API.

@Thorin-Oakenpants Thorin-Oakenpants changed the title Few questions about some prefs Few questions about some prefs [also webaudio FP results] Jul 20, 2021
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Development

No branches or pull requests

2 participants