mirror of
https://github.com/bitwarden/android.git
synced 2026-03-18 20:24:33 -05:00
[Android] Forcing user to re-authenticate if the system fingerprint settings are changed #881
Closed
opened 2025-11-26 22:33:09 -06:00 by GiteaMirror
·
7 comments
No Branch/Tag Specified
main
sdlc/sdk-update
premium-upgrade/PM-33513-checkout-deep-link
premium-upgrade/PM-33512-premium-state-manager
premium-upgrade/PM-33510-billing-manager
sdk-folder-repo-interface
PM-29829/duplicate-items-created-scanning-qrcode
PM-25654-preview-attachment
android-collections
cx/android-architect-agent
PM-30130-remove-archive-feature-flag
llm/add-resolving-sdk-updates-skill
QA-1523/sanity-test-saucelabs
release/2026.3-rc48
PM-24380/flight-recorder-redact-hostname
PM-26577-app-links-support
PM-26896-autofill-fix
release/2026.2-rc47
PM-32714/fallback-to-web-vault-host
pr-6572
PM-28834/setting-app-layout-horizonos
release/2026.2-rc46
release/2026.1-rc45
PM-30644/added-logs-for-debug
PM-30644/quicktile-nav-not-showing-migration
minor-gradle-updates
release/2026.1-rc42
release/2026.1-rc44
release/2026.1-rc43
PM-28834/set-landscape-on-horizonos-devices
context-rules
devclarity/update-code-review-command
PM-20026/force-ltr-passwords-and-codes
release/2025.12-rc41
cmcg/testCoverage
PM-29014/talkback-support-for-passwords
release/2025.12-rc40
BRE-1305/publish_test
accept-user-certs
autofill-permissions
release/2025.11-rc39
PM-22479/check-all-certificates-validate-asset-links
release/2025.10-rc38
agalles/android-latest
optimize-test-workflows
tier2-test-sharding
retro-agent
PM-27001/skip-account-selection-only-one-exists-cxp
release/2025.10-rc37
agalles/test-1118
release/2025.10-rc36
PM-20593-token-refresh
QA-1126b/adding-native-sanity-test
release/2025.9-rc35
pm-25933/sdk-update-password
release/2025.9-rc34
release/2025.8-rc33
agalles/20250821-release
debug-release-issues
pm-24249-allow-automated-prs-for-sdk-updates
release/2025.8-rc32
release/WORKFLOW-TEST-2025.8-rc28
agalles/20250807release
release/2025.07-rc25
release/hotfix-v2025.7.0-bwa
pm-23311/export-vault-policy-bypass
release/2025.07-rc24
authenticator-pm-sync-flags-issue
ps/implement-sdk-repository-example
release/hotfix-v2025.6.0-bwpm
release/2025.06-rc21
agalles/automate-android-fastlane-patch
release/2025.05-rc20
release/2025.04-rc19
languages/basque
release/2025.03-rc19
update-readme
qrcode/feature
innovation/archive/pm-19153-archive-items
qrcode/2-ui-fields
qrcode/1-page
hold-on-biometric-prompt-alternative
release-notes-process
release/2025.02-rc16
bwa-monorepo
PM-8223/new-device-verification-ux-improvements
pm-18451/exempt-from-policies
test-bwa
cs-workaround-linked-0-copy
release/2025.01-rc15
release/2025.01-rc14
release/2024.12-rc13
pm-16670/sync-leave-notice
821
PM-16695/backport-lean-more-new-device-verification
km/15084-testing
release/hotfix-v2024.11.7
release/2024.11-rc1
pm-11304/collection-add-item-button
PM-14241/disabling-logs-app-crash
poc/offline-editing
new-version-calc
pm-11649/expired-link-services
pm-6702/add-feature-flag
pm-6702/email-verification-feature
pm-9933/marketing-copy-update
pm-6702/registration-flows
update-templates
pm-6701/email-verification-selfhost-registration
v2026.2.1-bwpm
v2026.2.1-bwa
v2026.2.0-bwpm
v2026.2.0-bwa
v2026.1.1-bwa
v2026.1.1-bwpm
temp-test
v2026.1.0-bwpm
v2026.1.0-bwa
v2025.12.1-bwa
v2025.12.1-bwpm
v2025.12.0-bwa
v2025.12.0-bwpm
v2025.11.1-bwpm
v2025.11.1-bwa
v2025.11.0-bwpm
v2025.11.0-bwa
v2025.10.1-bwa
v2025.10.1-bwpm
v2025.10.0-bwa
v2025.10.0-bwpm
v2025.9.1-bwa
v2025.9.1-bwpm
v2025.9.0-bwa
v2025.9.0-bwpm
v2025.8.1-bwa
v2025.8.1-bwpm
v2025.8.0-bwa
v2025.8.0-bwpm
v2025.7.2-bwa
v2025.7.2-bwpm
v2025.7.1-bwa
v2025.7.1-bwpm
v2025.7.0-bwa
v2025.7.0-bwpm
v2025.6.1-bwpm
v2025.6.0-bwa
v2025.6.0-bwpm
v2025.1.0-bwa
v2025.5.0-bwa
v2025.5.0-bwpm
v2025.5.999
2025.4.0
v2025.4.0
untagged-4731eaadac73f3dfbbb8
v2025.3.0
v2025.2.0
untagged-815a165c5d70ffe75bc7
v2025.1.2
v2025.1.1
v2025.1.0
v2024.12.0
untagged-5a76b6392a4c8998c63a
v2024.11.7
v2024.11.6
v2024.11.5
v2024.11.4
v2024.11.3
v2024.11.2
v2024.11.1
v2024.11.0
v2024.10.2
v2024.10.1
v2024.10.0
v2024.9.0
v2024.8.1
v2024.8.0
v2024.7.3
v2024.7.2
v2024.7.1
v2024.7.0
v2024.6.1
v2024.6.0
v2024.5.1
v2024.4.1
v2024.4.2
v2024.4.0
v2024.3.3
v2024.3.1
v2024.3.0
v2024.2.1
v2024.2.0
v2024.1.1
v2024.1.0
v2023.12.0
v2023.10.0
v2023.9.2
maui-single-project-android
v2023.9.1
v2023.9.0
v2023.8.0
v2023.7.0
v2023.5.0
v2023.4.0
v2023.3.2
v2023.3.1
v2023.3.0
v2023.2.0
v2023.1.0
v2022.11.0
v2022.10.0
v2022.9.1
v2022.9.0
v2022.8.0
v2022.6.2
v2022.6.1
v2022.6.0
v2022.05.0
v2.18.0
v2.17.0
v2.16.4
v2.16.3
v2.16.2
v2.16.1
v2.15.0
v2.14.2
v2.14.1
v2.14.0
v2.13.0
v2.12.0
v2.11.3
v2.11.2
v2.11.1
v2.11.0
v2.10.0
v2.9.1
v2.9.0
v2.8.2
v2.8.1
v2.8.0
v2.7.2
v2.7.0
v2.6.1
v2.6.0
v2.5.6
v.2.5.5
v2.5.5
v2.5.4
v2.5.3
v2.5.2
v2.5.1
v2.5.0
v2.4.3
v2.4.2
v2.4.1
v2.4.0
v2.3.1
v2.3.0
v2.2.8
v2.2.7
v2.2.6
v2.2.2
v2.2.1
v2.2.0
v2.1.2
v2.1.0
v2.0.6
v2.0.5
v2.0.4
v2.0.3
v2.0.2
v2.0.1
v2.0.0
v1.22.1
v1.22.0
v1.21.0
v1.20.0
v1.19.0
v1.18.1
v1.18.0
v1.17.0
v1.16.0
v1.15.2
v1.15.1
v1.15.0
v1.14.4
v1.14.1
v1.14.0
v1.13.0
v1.12.2
v1.12.1
v1.12.0
v1.11.1
v1.11.0
v1.10.0
v1.9.0
v1.8.1
v1.8.0
v1.7.0
v1.6.5
v1.6.1
v1.6.0
v1.5.1
v1.5.0
v1.4.4
v1.4.3
v1.4.0
v1.3.0
v1.2.1
v1.2.0
v1.1.0
v1.0.0
v0.0.6
v0.0.5
v0.0.4
v0.0.3
v0.0.2
v0.0.1
No Label
Milestone
No items
No Milestone
Projects
Clear projects
No project
No Assignees
Notifications
Due Date
No due date set.
Dependencies
No dependencies set.
Reference: github-starred/android#881
Reference in New Issue
Block a user
Blocking a user prevents them from interacting with repositories, such as opening or commenting on pull requests or issues. Learn more about blocking a user.
Delete Branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Originally created by @alxndrv on GitHub (Dec 5, 2019).
This is strictly related to Android. While playing around I noticed that removing a fingerprint from my device and adding a new one does not affect Bitwarden's fingerprint unlock at all.
Simple way to reproduce this would be:
As a counter-example to this, a mobile banking application that I use (with fingerprint unlocking support) forced me to re-authenticate with a password after I followed the steps described above.
While this whole thing is technically only a risk when someone has physical access to the device, I can see a scenario where a user's carelessness can lead to issues.
Question is, should the user be forced to re-authenticate when device fingerprints are changed? It seems that this is technically possible. Any thoughts on this?
@kspearrin commented on GitHub (Dec 6, 2019):
This is expected today. I could possibly change it to disable the fingerprint option Bitwarden if it detects the device's fingerprint settings have changed. The only issue there is I don't know how to detect that event. Do you?
@alxndrv commented on GitHub (Dec 6, 2019):
Some quick googling suggests that Android's KeyStore API can be set up to invalidate fingerprint-associated keys when new fingerprints are added to the device. Alternatively, the FingerprintManager API may be used somehow.
I'm not exactly sure how fingerprint locking is implemented in Bitwarden so I'll try and set up a dev environment and play around with the code a bit. I'll let you know if I find a solution.
@alxndrv commented on GitHub (Dec 6, 2019):
Okay so I looked into this and here's what I found. As of right now the application makes no specific distinction between a fingerprint lock and other locking options (let's say PIN).
When unlocking the vault, the application simply asks the OS to authenticate the user using the native biometrics prompt. Upon successful authentication, Bitwarden simply flags the fingerprint lock as "unlocked" and proceeds to retrieve the vault key (master password or encryption key, I'm not sure which one) from secure storage.
I looked into the source code of Xamarin's secure storage and it seems they are using Android's KeyStore API to generate keys which are then used to encrypt the stored values. The encrypted values are then stored using SharedPreferences.
Note that the KeyStore API has a way to generate keys which require user authentication in order to be used and make those keys become invalid when fingerprints are added/removed. Xamarin's Secure Storage however, does not use this option, meaning that those keys are always retrievable (within the context of the app) despite changes to device's security settings.
A proposed solution to this would be to re-write the biometric authentication implementation for Android. This would mean generating a new key using the KeyStore API whenever a user enables fingerprint locking and using that key to encrypt the vault key (and manually storing the encrypted vault key somewhere). This way, if we try to use the key after adding/removing fingerprints, the KeyStore will throw a KeyPermanentlyInvalidException which we can handle by requesting the user to re-enter their master password and forcing them to manually re-enable fingerprint locking via Settings.
Any thoughts on this? The proposed solution would require a lot of work.
Feel free to correct me if I've made any mistakes with the way fingerprints are currently handled.
@smanelli commented on GitHub (Jan 30, 2020):
Hi,
I'm no expert, but reading this Stackoverflow article , it seems simple enough. From the article:
So to check if any new fingerprints have been enrolled since you created your fingerprint-associated key, just create a cipher with that key and try to init the cipher. If any new fingerprints have been enrolled, the init call should trigger a KeyPermanentlyInvalidatedException
Could this work?
@alxndrv commented on GitHub (Jan 31, 2020):
@smanelli That solution seems roughly the same as the one I described earlier, and it makes sense to use Android's built-in API to invalidate keys when biometric options change.
If I recall correctly, right now the vault key is stored using Xamarin's "secure storage". The problem is that Xamarin is also the module which is responsible for getting the keys which are used to encrypt items in secure storage. While its handy and all, this means that we can't directly use Android's key invalidation API.
@cleveHEX commented on GitHub (Jan 25, 2024):
Hello there, was there any progress since?
@vvolkgang commented on GitHub (Jun 20, 2024):
Issue migrated to https://github.com/bitwarden/mobile/issues/666