SlideShare a Scribd company logo
1 of 75
Download to read offline
Breaking Vaults
Stealing LastPass protected
secrets
Martin Vigo
@martin_vigo
martinvigo.com
It wasn’t me
Who am I
• Product Security Engineer
• Spaniard / Galician
• Diver
• Gin tonic consumer
• @martin_vigo / martinvigo.com
Most beautiful beach in the world
Amazing seafood
Charlie Sheen’s grandfather was Galician
Wikipedia
“LastPass is a password management service
which seeks to resolve the password fatigue
problem by centralizing user password
management in the cloud”
Password Managers
Why targeting Password
Managers?
• All you want to hack is in one
place
• Social Networks
• Banks
• Email accounts
• Corporate credentials
Why LastPass?
• Enterprise edition
• Large companies use it
• “More than 10,000 corporate customers
ranging in size all the way up to the
Fortune 500”
• Not only credentials
• Credit Cards, Personal documentation,
Private notes, etc.
• Arguably the most popular password
manager
State of the art
• Vulnerabilities
• DNS poisoning
• XSS form injection
All focus on leaking specific secrets
Target: Master Password
All your secrets are belong to us
Architecture
Focus
LastPass browser plugin
• Javascript
• Sandboxed (SOP)
• Injects code into DOM
• Access to filesystem
Security claims
• LastPass has no access to your data
• Local encryption
• Secure storage
Reversing
Meaning making sense of 3MB of obfuscated JS
siesta.py
• Beautifies every JS file
• Injects a payload to every function
• console.log([file] [function] [params])
• Credits to Alberto Garcia (@algillera)
• Identified all accessed files
• Minimized/obfuscated JS
• Storage on Sqlite DBs
• Browser specific implementation
• Business logic
• File location
• Storage
• AES own implementation
• RSA is based on jsbn library
Logic and storage
Local encryption
• 256-bit AES
• CBC and ECB
• Their own implementation
• PBKDF2
• 500 / 5000 rounds (default)
• Unauthenticated query
Encryption key
PBKDF2-SHA256(Username, Master Password, Iterations, 32)
Salt Password key length
LastPass has no access to
your data
PBKDF2-SHA256(Master Password, k, 1, 32)
E/D(k, vault)
Encrypted Vault
Encrypted Vault
PBKDF2(SHA-256, Per user salt, k’, 100000, 32)
What does LastPass see?
The encrypted vault
A 1-round PBKDF2-SHA256 of
the encryption key
Stealing the Master Password
Remember password
• Stores the password locally
• Sqlite DB or prefs.js
• ECB or CBC
• u7W1PsEYsWrtAS1Ca7lOOH==
• !waXcJg8b7wI8XYZnV2l45A==|4d0Hiq+spx50pso2tEMtkQ==
Storage
Chrome Firefox Safari Opera
Windows
#{user_profile['LocalApp
Data']}/Google/Chrome/
User Data/Default/
databases/chrome-
extension_hdokiejnpimak
edhajhdlcegeplioahd_0
#{user_profile[
'AppData']}/
Mozilla/
Firefox/Profiles
#{user_profile['LocalAppData
']}/Apple Computer/Safari/
Databases/safari-
extension_com.lastpass.lpsaf
ariextension-n24rep3bmn_0
#{user_profile['AppData']}/
Opera Software/Opera
Stable/databases/chrome-
extension_hnjalnkldgigidg
gphhmacmimbdlafdo_0
Mac
#{user_profile['LocalApp
Data']}/Google/Chrome/
Default/databases/
chrome-
extension_hdokiejnpimak
edhajhdlcegeplioahd_0
#{user_profile['
LocalAppData']
}/Firefox/
Profiles
#{user_profile['AppData']}/
Safari/Databases/safari-
extension_com.lastpass.lpsaf
ariextension-n24rep3bmn_0
#{user_profile['LocalAppData']
}/com.operasoftware.Opera/
databases/chrome-
extension_hnjalnkldgigidggph
hmacmimbdlafdo_0
Unix
#{user_profile['LocalApp
Data']}/.config/google-
chrome/Default/
databases/chrome-
extension_hdokiejnpimak
edhajhdlcegeplioahd_0
#{user_profile['
LocalAppData']
}/.mozilla/firefox
#{user_profile[‘LocalApp
Data’]}/.opera/widgets/
wuid-*/pstorage
Internet Explorer uses Protected Storage
SQLite DB
• LastPassSavedLogins2 contains the encrypted
credentials
• No root needed
prefs.js (Firefox)
• extensions.lastpass.loginusers contains the usernames
• extensions.lastpass.loginpws contains encrypted passwords
• No root needed
Master password encryption
• AES-256
• IV: Random
• KEY: SHA256(username)
• Data: !L5b/dOyu4EMdmWCYkASQaw==|cHTFJDy1DQi8dPY0AJL/1B=
IV
24 chars (ignoring !)
Separator
26th char
Data
Starting 27th char
MP encryption key Vault encryption key
Profit!
• We located the files
• We know the encryption system
• We have the IV
• We have the key
• We have the data
What about 2 factor auth?
Bypassing 2-factor Auth
2-factor auth
• Supports multiple platforms
• Google Auth, Yubikey, Toopher, etc.
UUID is the “trust token”
What’s going on?
• How is the request forged?
• How is the token generated?
• How is it stored?
• Where is it stored?
How is the request forged?
The token is injected into the DOM
How is the token generated?
• At plugin installation 32 chars
length
• 0-9 A-Z a-z !@#$%^&*()_
length lowercase?
uppercase? digits?
special
chars?
min digits
ambiguous
chars?
make
pronounceable?
How/Where is it stored?
• In plaintext
• Firefox
• In the file “lp.suid”
• Chrome/Safari/Opera
• Local-storage SQLite DB
Design Problems?
• Browsers don’t encrypt local storage
• LocalStorage DB and lp.suid are
accessible and unencrypted
• The token is stored in plaintext
• Token is injected in DOM
• XSS means game over
More problems
• Same token for all browser users
• Fixed token till plugin is reinstalled
• Untrusting the browser has no real effect
• Same token when changing QR Code
• Token fixation
• Attacker can set a token on the client
• Proactive token stealing
• Steal token today, use it tomorrow
Profit!
• We have the file
• We know the encryption
• We have the data
• We have the IV
• We have the key
• We have the 2-factor token
What about if:
“Remember password” was not clicked
There was no way to obtain 2-factor auth token
Abusing Account recovery
Wait… What?
How is account recovery possible if LastPass
does not know my password?
Recovering the account
Provide your email
Recovering the account
Get a unique link
Recovering the account
Press the button
Boom!
• Full, unrestricted access to the vault
• Attacker can set a new password
• But does not have to!
• Bypasses 2 factor-auth
Recover account flow
Email
GET /s/?s=8aa37bb1bb3FAKE03ad4127
302 Location: /recover.php?
&time=1412381291&timehash=340908c353c099c9FAKE6b387002c5a4881ebdf1
&username=test%40test.com&usernamehash=fc7be7e5f6cbec9FAKE2995bd3331c097
POST /otp.php
&changepw=ccb2501724FAKE2b575a214e1052
d0fa27b0726b6HASHdb2e1da3952e
Recover button
Can I directly generate the
recover url?
• time: timestamp when the recovery was
initiated (the link “expires” in 2 hours)
• timehash: salted hash of the timestamp
• username: the email address
• usernamehash: salted hash of the email
302 Location: /recover.php?
&time=1412381291&timehash=340908c353c099c9FAKE6b387002c5a4881ebdf1
&username=test%40test.com&usernamehash=fc7be7e5f6cbec9FAKE2995bd3331c097
Challenges
• I need to generate a valid timestamp
• I need the be able to generate the hashes
• I need the salt
Let’s try…
• Request my own unique url and reuse the hashes in
the victims url
• BINGO!
• Same salt is used for all users
• Link does not truly expire, only the timestamp is
validated against the hash
• There is no need to request account recovery. You
only need a valid url
The salt is the secret
• Still, we need to change the username, and hash it.
• We are only missing the server salt to be able to
generate valid recover urls
• Salts are not designed to be a secret, only random
and unique.
• Oh wait…
“LastPass account email addresses, password reminders,
server per user salts, and authentication hashes were
compromised”
Can I forge the post
request?
• changepw: a derived “disabled OTP”
POST /otp.php
&changepw=ccb25017c4FAKE2b575a21441055d0fa27b0726b6HASHdb2e1da395e
OTPs in LastPass
• 2 types of OTPs
• “True” OTPs for authentication
• “Disabled” OTP
• Let’s call it dOTP
Disabled OTP
• Used to recover the vault
• Which ultimately means for authentication
• It’s set by default
• It’s not the encryption key
How/Where is it stored?
• Unprotected
• Firefox
• In the file {SHA256(username)}_ff.sotp (binary format)
• Needs the extra step: bin2hex
• Chrome/Safari/Opera
• SQLite DB
How is the request forged?
The dOTP is injected into the DOM
From dOTP to vault
Local-storage
getdOTP(username)
dOTP
token=SHA256(SHA256(username+dOTP2)+dOTP2)
/otp.php(username, token)
Set-Cookie: PHPSESSID
pwdeckey
GET /accts3.php
encrypted vault
What is”pwdeckey”?
• It’s not the key to decrypt any password
• It’s the seed to derive the key to decrypt the “vault
key”
• The vault key decrypts all the password, notes, etc.
in the vault
So… What is a Disabled OTP
again?
• A Master Password on steroids
• Bypasses IP restrictions
• Bypasses 2-factor auth
• Bypasses user alerts
pwdeckey == dOTP token
*Took me “only” 3 months to notice…
AES-ECB(SHA256(dOTP_token), encryptedVaultKey )
Vault key decryption
*Remember: dOTP_token = SHA256(SHA256(username+dOTP2)+dOTP2)
How/Where is the vault key
stored?
• Encrypted
• Firefox
• In the file {SHA256(username)}_lpall.slps
• Chrome/Safari/Opera
• SQLite DB
No need to query LastPass!
• dOTP -> Key to decrypt vault key -> Vault key
• Encrypted vault is stored locally by default!
• Iterations;base64 encoded/encrypted vault
• Firefox
• In the file {SHA256(username)}_lps.act.sxml
• Chrome/Safari/Opera
• SQLite DB
Profit!
• We located the token
• We know how to hash it
• We get the vault key
decryption key
• We get the vault
• We decrypt the vault key
• We decrypt the vault
Automating all the stuff
Metasploit module
• Steals and decrypts the master password
• Steals the 2-factor auth token
• Steals the encryption key
• Decrypts the entire vault
• Supports:
• Windows, Mac and Unix
• Chrome, Firefox, Safari and Opera
• IE coming soon
• Meterpreter and shell
• Multiuser
https://github.com/martinvigo/metasploit-framework
Sometime in the next couple weeks
Demo
What about if there is:
No disabled OTP
No access to the machine
No Exploit
No nothing!
Google dorks
“extensions.lastpass.loginpws”
Stop sharing your LastPass
credentials with the entire world!!!!
Hardening LastPass
Hardening LastPass
• Use the binary version of the plugin
• Do not store your master password
• Disable “Account recovery”
• Do not use “Password reminder”
• Activate 2-factor auth
• Prompt for master password to make passwords visible
• Add country restriction
• Update/Randomize PBKDF2 iterations
• Disallow TOR logins
Mahalo!
Questions?
@martin_vigo
martinvigo.com
martinvigo@gmail.com

More Related Content

What's hot

Building Secure User Interfaces With JWTs (JSON Web Tokens)
Building Secure User Interfaces With JWTs (JSON Web Tokens)Building Secure User Interfaces With JWTs (JSON Web Tokens)
Building Secure User Interfaces With JWTs (JSON Web Tokens)Stormpath
 
Web application Security
Web application SecurityWeb application Security
Web application SecurityLee C
 
Application Security around OWASP Top 10
Application Security around OWASP Top 10Application Security around OWASP Top 10
Application Security around OWASP Top 10Sastry Tumuluri
 
Cryptography in PHP: use cases
Cryptography in PHP: use casesCryptography in PHP: use cases
Cryptography in PHP: use casesEnrico Zimuel
 
PHP Experience 2016 - [Palestra] Json Web Token (JWT)
PHP Experience 2016 - [Palestra] Json Web Token (JWT)PHP Experience 2016 - [Palestra] Json Web Token (JWT)
PHP Experience 2016 - [Palestra] Json Web Token (JWT)iMasters
 
Even the LastPass Will be Stolen Deal with It!
Even the LastPass Will be Stolen Deal with It!Even the LastPass Will be Stolen Deal with It!
Even the LastPass Will be Stolen Deal with It!Martin Vigo
 
Token Based Authentication Systems with AngularJS & NodeJS
Token Based Authentication Systems with AngularJS & NodeJSToken Based Authentication Systems with AngularJS & NodeJS
Token Based Authentication Systems with AngularJS & NodeJSHüseyin BABAL
 
JSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your LifeJSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your LifeJohn Anderson
 
A XSSmas carol
A XSSmas carolA XSSmas carol
A XSSmas carolcgvwzq
 
Maximize your Cache for No Cash
Maximize your Cache for No CashMaximize your Cache for No Cash
Maximize your Cache for No CashYorick Phoenix
 

What's hot (11)

Building Secure User Interfaces With JWTs (JSON Web Tokens)
Building Secure User Interfaces With JWTs (JSON Web Tokens)Building Secure User Interfaces With JWTs (JSON Web Tokens)
Building Secure User Interfaces With JWTs (JSON Web Tokens)
 
Web application Security
Web application SecurityWeb application Security
Web application Security
 
Application Security around OWASP Top 10
Application Security around OWASP Top 10Application Security around OWASP Top 10
Application Security around OWASP Top 10
 
Cryptography in PHP: use cases
Cryptography in PHP: use casesCryptography in PHP: use cases
Cryptography in PHP: use cases
 
PHP Experience 2016 - [Palestra] Json Web Token (JWT)
PHP Experience 2016 - [Palestra] Json Web Token (JWT)PHP Experience 2016 - [Palestra] Json Web Token (JWT)
PHP Experience 2016 - [Palestra] Json Web Token (JWT)
 
Even the LastPass Will be Stolen Deal with It!
Even the LastPass Will be Stolen Deal with It!Even the LastPass Will be Stolen Deal with It!
Even the LastPass Will be Stolen Deal with It!
 
Token Based Authentication Systems with AngularJS & NodeJS
Token Based Authentication Systems with AngularJS & NodeJSToken Based Authentication Systems with AngularJS & NodeJS
Token Based Authentication Systems with AngularJS & NodeJS
 
JSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your LifeJSON Web Tokens Will Improve Your Life
JSON Web Tokens Will Improve Your Life
 
A XSSmas carol
A XSSmas carolA XSSmas carol
A XSSmas carol
 
Maximize your Cache for No Cash
Maximize your Cache for No CashMaximize your Cache for No Cash
Maximize your Cache for No Cash
 
Django cryptography
Django cryptographyDjango cryptography
Django cryptography
 

Similar to Breaking vaults: Stealing Lastpass protected secrets

Breaking Vaults - Stealing Lastpass Protected Secrets by Martin Vigo
Breaking Vaults - Stealing Lastpass Protected Secrets by Martin VigoBreaking Vaults - Stealing Lastpass Protected Secrets by Martin Vigo
Breaking Vaults - Stealing Lastpass Protected Secrets by Martin VigoShakacon
 
Nodejsvault austin2019
Nodejsvault austin2019Nodejsvault austin2019
Nodejsvault austin2019Taswar Bhatti
 
Biting into the forbidden fruit. Lessons from trusting Javascript crypto.
Biting into the forbidden fruit. Lessons from trusting Javascript crypto.Biting into the forbidden fruit. Lessons from trusting Javascript crypto.
Biting into the forbidden fruit. Lessons from trusting Javascript crypto.Krzysztof Kotowicz
 
Cache on Delivery
Cache on DeliveryCache on Delivery
Cache on DeliverySensePost
 
[OWASP Poland Day] Saving private token
[OWASP Poland Day] Saving private token[OWASP Poland Day] Saving private token
[OWASP Poland Day] Saving private tokenOWASP
 
Bitcoin Keys, Addresses & Wallets
Bitcoin Keys, Addresses & WalletsBitcoin Keys, Addresses & Wallets
Bitcoin Keys, Addresses & WalletsChristopher Allen
 
Using Vault for your Nodejs Secrets
Using Vault for your Nodejs SecretsUsing Vault for your Nodejs Secrets
Using Vault for your Nodejs SecretsTaswar Bhatti
 
WordPress Security 101 - Meetup Nairobi March 2020
WordPress Security 101 - Meetup Nairobi March 2020 WordPress Security 101 - Meetup Nairobi March 2020
WordPress Security 101 - Meetup Nairobi March 2020 stk_jj
 
Building Secure User Interfaces With JWTs
Building Secure User Interfaces With JWTsBuilding Secure User Interfaces With JWTs
Building Secure User Interfaces With JWTsrobertjd
 
Killing Passwords with JavaScript
Killing Passwords with JavaScriptKilling Passwords with JavaScript
Killing Passwords with JavaScriptFrancois Marier
 
Securing Web Applications with Token Authentication
Securing Web Applications with Token AuthenticationSecuring Web Applications with Token Authentication
Securing Web Applications with Token AuthenticationStormpath
 
Hacking sites for fun and profit
Hacking sites for fun and profitHacking sites for fun and profit
Hacking sites for fun and profitDavid Stockton
 
Maximizing Performance with SPDY and SSL
Maximizing Performance with SPDY and SSLMaximizing Performance with SPDY and SSL
Maximizing Performance with SPDY and SSLZoompf
 
Hacking sites for fun and profit
Hacking sites for fun and profitHacking sites for fun and profit
Hacking sites for fun and profitDavid Stockton
 
Defcon 25 Packet Hacking Village - Finding Your Way to Domain Access
Defcon 25 Packet Hacking Village - Finding Your Way to Domain AccessDefcon 25 Packet Hacking Village - Finding Your Way to Domain Access
Defcon 25 Packet Hacking Village - Finding Your Way to Domain Accesseightbit
 
PENETRATION TESTING FROM A HOT TUB TIME MACHINE
PENETRATION TESTING FROM A HOT TUB TIME MACHINEPENETRATION TESTING FROM A HOT TUB TIME MACHINE
PENETRATION TESTING FROM A HOT TUB TIME MACHINEChris Gates
 
Managing your secrets in a cloud environment
Managing your secrets in a cloud environmentManaging your secrets in a cloud environment
Managing your secrets in a cloud environmentTaswar Bhatti
 
Better encryption & security with MariaDB 10.1 & MySQL 5.7
Better encryption & security with MariaDB 10.1 & MySQL 5.7Better encryption & security with MariaDB 10.1 & MySQL 5.7
Better encryption & security with MariaDB 10.1 & MySQL 5.7Colin Charles
 
下吧开发总结
下吧开发总结下吧开发总结
下吧开发总结Night Sailer
 

Similar to Breaking vaults: Stealing Lastpass protected secrets (20)

Breaking Vaults - Stealing Lastpass Protected Secrets by Martin Vigo
Breaking Vaults - Stealing Lastpass Protected Secrets by Martin VigoBreaking Vaults - Stealing Lastpass Protected Secrets by Martin Vigo
Breaking Vaults - Stealing Lastpass Protected Secrets by Martin Vigo
 
Nodejsvault austin2019
Nodejsvault austin2019Nodejsvault austin2019
Nodejsvault austin2019
 
Biting into the forbidden fruit. Lessons from trusting Javascript crypto.
Biting into the forbidden fruit. Lessons from trusting Javascript crypto.Biting into the forbidden fruit. Lessons from trusting Javascript crypto.
Biting into the forbidden fruit. Lessons from trusting Javascript crypto.
 
Cache on Delivery
Cache on DeliveryCache on Delivery
Cache on Delivery
 
[OWASP Poland Day] Saving private token
[OWASP Poland Day] Saving private token[OWASP Poland Day] Saving private token
[OWASP Poland Day] Saving private token
 
Bitcoin Keys, Addresses & Wallets
Bitcoin Keys, Addresses & WalletsBitcoin Keys, Addresses & Wallets
Bitcoin Keys, Addresses & Wallets
 
Using Vault for your Nodejs Secrets
Using Vault for your Nodejs SecretsUsing Vault for your Nodejs Secrets
Using Vault for your Nodejs Secrets
 
WordPress Security 101 - Meetup Nairobi March 2020
WordPress Security 101 - Meetup Nairobi March 2020 WordPress Security 101 - Meetup Nairobi March 2020
WordPress Security 101 - Meetup Nairobi March 2020
 
Building Secure User Interfaces With JWTs
Building Secure User Interfaces With JWTsBuilding Secure User Interfaces With JWTs
Building Secure User Interfaces With JWTs
 
Killing Passwords with JavaScript
Killing Passwords with JavaScriptKilling Passwords with JavaScript
Killing Passwords with JavaScript
 
Securing Web Applications with Token Authentication
Securing Web Applications with Token AuthenticationSecuring Web Applications with Token Authentication
Securing Web Applications with Token Authentication
 
Hacking sites for fun and profit
Hacking sites for fun and profitHacking sites for fun and profit
Hacking sites for fun and profit
 
Maximizing Performance with SPDY and SSL
Maximizing Performance with SPDY and SSLMaximizing Performance with SPDY and SSL
Maximizing Performance with SPDY and SSL
 
Hacking sites for fun and profit
Hacking sites for fun and profitHacking sites for fun and profit
Hacking sites for fun and profit
 
Defcon 25 Packet Hacking Village - Finding Your Way to Domain Access
Defcon 25 Packet Hacking Village - Finding Your Way to Domain AccessDefcon 25 Packet Hacking Village - Finding Your Way to Domain Access
Defcon 25 Packet Hacking Village - Finding Your Way to Domain Access
 
PENETRATION TESTING FROM A HOT TUB TIME MACHINE
PENETRATION TESTING FROM A HOT TUB TIME MACHINEPENETRATION TESTING FROM A HOT TUB TIME MACHINE
PENETRATION TESTING FROM A HOT TUB TIME MACHINE
 
Managing your secrets in a cloud environment
Managing your secrets in a cloud environmentManaging your secrets in a cloud environment
Managing your secrets in a cloud environment
 
Better encryption & security with MariaDB 10.1 & MySQL 5.7
Better encryption & security with MariaDB 10.1 & MySQL 5.7Better encryption & security with MariaDB 10.1 & MySQL 5.7
Better encryption & security with MariaDB 10.1 & MySQL 5.7
 
下吧开发总结
下吧开发总结下吧开发总结
下吧开发总结
 
presentation
presentationpresentation
presentation
 

More from Martin Vigo

Phonerator, an advanced *valid* phone number generator for your OSINT/SE needs
Phonerator, an advanced *valid* phone number generator for your OSINT/SE needsPhonerator, an advanced *valid* phone number generator for your OSINT/SE needs
Phonerator, an advanced *valid* phone number generator for your OSINT/SE needsMartin Vigo
 
Phonerator, an advanced *valid* phone number generator for your OSINT/SE needs
Phonerator, an advanced *valid* phone number generator for your OSINT/SE needsPhonerator, an advanced *valid* phone number generator for your OSINT/SE needs
Phonerator, an advanced *valid* phone number generator for your OSINT/SE needsMartin Vigo
 
From email address to phone number, a new OSINT approach
From email address to phone number, a new OSINT approachFrom email address to phone number, a new OSINT approach
From email address to phone number, a new OSINT approachMartin Vigo
 
Ransombile: yet another reason to ditch sms
Ransombile: yet another reason to ditch smsRansombile: yet another reason to ditch sms
Ransombile: yet another reason to ditch smsMartin Vigo
 
Compromising online accounts by cracking voicemail systems
Compromising online accounts by cracking voicemail systemsCompromising online accounts by cracking voicemail systems
Compromising online accounts by cracking voicemail systemsMartin Vigo
 
Mobile apps security. Beyond XSS, CSRF and SQLi
Mobile apps security. Beyond XSS, CSRF and SQLiMobile apps security. Beyond XSS, CSRF and SQLi
Mobile apps security. Beyond XSS, CSRF and SQLiMartin Vigo
 
Building secure mobile apps
Building secure mobile appsBuilding secure mobile apps
Building secure mobile appsMartin Vigo
 
Secure Salesforce: Hardened Apps with the Mobile SDK
Secure Salesforce: Hardened Apps with the Mobile SDKSecure Salesforce: Hardened Apps with the Mobile SDK
Secure Salesforce: Hardened Apps with the Mobile SDKMartin Vigo
 
Creating secure apps using the salesforce mobile sdk
Creating secure apps using the salesforce mobile sdkCreating secure apps using the salesforce mobile sdk
Creating secure apps using the salesforce mobile sdkMartin Vigo
 
Security Vulnerabilities: How to Defend Against Them
Security Vulnerabilities: How to Defend Against ThemSecurity Vulnerabilities: How to Defend Against Them
Security Vulnerabilities: How to Defend Against ThemMartin Vigo
 
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay Protocol
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay ProtocolDo-it-Yourself Spy Program: Abusing Apple’s Call Relay Protocol
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay ProtocolMartin Vigo
 
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay Protocol
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay ProtocolDo-it-Yourself Spy Program: Abusing Apple’s Call Relay Protocol
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay ProtocolMartin Vigo
 

More from Martin Vigo (12)

Phonerator, an advanced *valid* phone number generator for your OSINT/SE needs
Phonerator, an advanced *valid* phone number generator for your OSINT/SE needsPhonerator, an advanced *valid* phone number generator for your OSINT/SE needs
Phonerator, an advanced *valid* phone number generator for your OSINT/SE needs
 
Phonerator, an advanced *valid* phone number generator for your OSINT/SE needs
Phonerator, an advanced *valid* phone number generator for your OSINT/SE needsPhonerator, an advanced *valid* phone number generator for your OSINT/SE needs
Phonerator, an advanced *valid* phone number generator for your OSINT/SE needs
 
From email address to phone number, a new OSINT approach
From email address to phone number, a new OSINT approachFrom email address to phone number, a new OSINT approach
From email address to phone number, a new OSINT approach
 
Ransombile: yet another reason to ditch sms
Ransombile: yet another reason to ditch smsRansombile: yet another reason to ditch sms
Ransombile: yet another reason to ditch sms
 
Compromising online accounts by cracking voicemail systems
Compromising online accounts by cracking voicemail systemsCompromising online accounts by cracking voicemail systems
Compromising online accounts by cracking voicemail systems
 
Mobile apps security. Beyond XSS, CSRF and SQLi
Mobile apps security. Beyond XSS, CSRF and SQLiMobile apps security. Beyond XSS, CSRF and SQLi
Mobile apps security. Beyond XSS, CSRF and SQLi
 
Building secure mobile apps
Building secure mobile appsBuilding secure mobile apps
Building secure mobile apps
 
Secure Salesforce: Hardened Apps with the Mobile SDK
Secure Salesforce: Hardened Apps with the Mobile SDKSecure Salesforce: Hardened Apps with the Mobile SDK
Secure Salesforce: Hardened Apps with the Mobile SDK
 
Creating secure apps using the salesforce mobile sdk
Creating secure apps using the salesforce mobile sdkCreating secure apps using the salesforce mobile sdk
Creating secure apps using the salesforce mobile sdk
 
Security Vulnerabilities: How to Defend Against Them
Security Vulnerabilities: How to Defend Against ThemSecurity Vulnerabilities: How to Defend Against Them
Security Vulnerabilities: How to Defend Against Them
 
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay Protocol
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay ProtocolDo-it-Yourself Spy Program: Abusing Apple’s Call Relay Protocol
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay Protocol
 
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay Protocol
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay ProtocolDo-it-Yourself Spy Program: Abusing Apple’s Call Relay Protocol
Do-it-Yourself Spy Program: Abusing Apple’s Call Relay Protocol
 

Recently uploaded

My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024The Digital Insurer
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxhariprasad279825
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machinePadma Pradeep
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxNavinnSomaal
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 3652toLead Limited
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsSergiu Bodiu
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsMemoori
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationSlibray Presentation
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitecturePixlogix Infotech
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek SchlawackFwdays
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...Fwdays
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...shyamraj55
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDGMarianaLemus7
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024BookNet Canada
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfAlex Barbosa Coqueiro
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsMiki Katsuragi
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Mark Simos
 

Recently uploaded (20)

My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024My INSURER PTE LTD - Insurtech Innovation Award 2024
My INSURER PTE LTD - Insurtech Innovation Award 2024
 
Artificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptxArtificial intelligence in cctv survelliance.pptx
Artificial intelligence in cctv survelliance.pptx
 
Install Stable Diffusion in windows machine
Install Stable Diffusion in windows machineInstall Stable Diffusion in windows machine
Install Stable Diffusion in windows machine
 
SAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptxSAP Build Work Zone - Overview L2-L3.pptx
SAP Build Work Zone - Overview L2-L3.pptx
 
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
Tech-Forward - Achieving Business Readiness For Copilot in Microsoft 365
 
DevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platformsDevEX - reference for building teams, processes, and platforms
DevEX - reference for building teams, processes, and platforms
 
Pigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food ManufacturingPigging Solutions in Pet Food Manufacturing
Pigging Solutions in Pet Food Manufacturing
 
AI as an Interface for Commercial Buildings
AI as an Interface for Commercial BuildingsAI as an Interface for Commercial Buildings
AI as an Interface for Commercial Buildings
 
Connect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck PresentationConnect Wave/ connectwave Pitch Deck Presentation
Connect Wave/ connectwave Pitch Deck Presentation
 
DMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special EditionDMCC Future of Trade Web3 - Special Edition
DMCC Future of Trade Web3 - Special Edition
 
Understanding the Laravel MVC Architecture
Understanding the Laravel MVC ArchitectureUnderstanding the Laravel MVC Architecture
Understanding the Laravel MVC Architecture
 
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
"Subclassing and Composition – A Pythonic Tour of Trade-Offs", Hynek Schlawack
 
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks..."LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
"LLMs for Python Engineers: Advanced Data Analysis and Semantic Kernel",Oleks...
 
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
Automating Business Process via MuleSoft Composer | Bangalore MuleSoft Meetup...
 
APIForce Zurich 5 April Automation LPDG
APIForce Zurich 5 April  Automation LPDGAPIForce Zurich 5 April  Automation LPDG
APIForce Zurich 5 April Automation LPDG
 
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort ServiceHot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
Hot Sexy call girls in Panjabi Bagh 🔝 9953056974 🔝 Delhi escort Service
 
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
Transcript: New from BookNet Canada for 2024: BNC CataList - Tech Forum 2024
 
Unraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdfUnraveling Multimodality with Large Language Models.pdf
Unraveling Multimodality with Large Language Models.pdf
 
Vertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering TipsVertex AI Gemini Prompt Engineering Tips
Vertex AI Gemini Prompt Engineering Tips
 
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
Tampa BSides - Chef's Tour of Microsoft Security Adoption Framework (SAF)
 

Breaking vaults: Stealing Lastpass protected secrets

  • 1. Breaking Vaults Stealing LastPass protected secrets Martin Vigo @martin_vigo martinvigo.com
  • 3. Who am I • Product Security Engineer • Spaniard / Galician • Diver • Gin tonic consumer • @martin_vigo / martinvigo.com Most beautiful beach in the world Amazing seafood Charlie Sheen’s grandfather was Galician
  • 4. Wikipedia “LastPass is a password management service which seeks to resolve the password fatigue problem by centralizing user password management in the cloud”
  • 6. Why targeting Password Managers? • All you want to hack is in one place • Social Networks • Banks • Email accounts • Corporate credentials
  • 7. Why LastPass? • Enterprise edition • Large companies use it • “More than 10,000 corporate customers ranging in size all the way up to the Fortune 500” • Not only credentials • Credit Cards, Personal documentation, Private notes, etc. • Arguably the most popular password manager
  • 8. State of the art • Vulnerabilities • DNS poisoning • XSS form injection All focus on leaking specific secrets
  • 9. Target: Master Password All your secrets are belong to us
  • 11. Focus
  • 12. LastPass browser plugin • Javascript • Sandboxed (SOP) • Injects code into DOM • Access to filesystem
  • 13. Security claims • LastPass has no access to your data • Local encryption • Secure storage
  • 14. Reversing Meaning making sense of 3MB of obfuscated JS
  • 15. siesta.py • Beautifies every JS file • Injects a payload to every function • console.log([file] [function] [params]) • Credits to Alberto Garcia (@algillera)
  • 16. • Identified all accessed files • Minimized/obfuscated JS • Storage on Sqlite DBs • Browser specific implementation • Business logic • File location • Storage • AES own implementation • RSA is based on jsbn library Logic and storage
  • 17. Local encryption • 256-bit AES • CBC and ECB • Their own implementation • PBKDF2 • 500 / 5000 rounds (default) • Unauthenticated query
  • 18. Encryption key PBKDF2-SHA256(Username, Master Password, Iterations, 32) Salt Password key length
  • 19. LastPass has no access to your data PBKDF2-SHA256(Master Password, k, 1, 32) E/D(k, vault) Encrypted Vault Encrypted Vault PBKDF2(SHA-256, Per user salt, k’, 100000, 32)
  • 20. What does LastPass see? The encrypted vault A 1-round PBKDF2-SHA256 of the encryption key
  • 22. Remember password • Stores the password locally • Sqlite DB or prefs.js • ECB or CBC • u7W1PsEYsWrtAS1Ca7lOOH== • !waXcJg8b7wI8XYZnV2l45A==|4d0Hiq+spx50pso2tEMtkQ==
  • 23. Storage Chrome Firefox Safari Opera Windows #{user_profile['LocalApp Data']}/Google/Chrome/ User Data/Default/ databases/chrome- extension_hdokiejnpimak edhajhdlcegeplioahd_0 #{user_profile[ 'AppData']}/ Mozilla/ Firefox/Profiles #{user_profile['LocalAppData ']}/Apple Computer/Safari/ Databases/safari- extension_com.lastpass.lpsaf ariextension-n24rep3bmn_0 #{user_profile['AppData']}/ Opera Software/Opera Stable/databases/chrome- extension_hnjalnkldgigidg gphhmacmimbdlafdo_0 Mac #{user_profile['LocalApp Data']}/Google/Chrome/ Default/databases/ chrome- extension_hdokiejnpimak edhajhdlcegeplioahd_0 #{user_profile[' LocalAppData'] }/Firefox/ Profiles #{user_profile['AppData']}/ Safari/Databases/safari- extension_com.lastpass.lpsaf ariextension-n24rep3bmn_0 #{user_profile['LocalAppData'] }/com.operasoftware.Opera/ databases/chrome- extension_hnjalnkldgigidggph hmacmimbdlafdo_0 Unix #{user_profile['LocalApp Data']}/.config/google- chrome/Default/ databases/chrome- extension_hdokiejnpimak edhajhdlcegeplioahd_0 #{user_profile[' LocalAppData'] }/.mozilla/firefox #{user_profile[‘LocalApp Data’]}/.opera/widgets/ wuid-*/pstorage Internet Explorer uses Protected Storage
  • 24. SQLite DB • LastPassSavedLogins2 contains the encrypted credentials • No root needed
  • 25. prefs.js (Firefox) • extensions.lastpass.loginusers contains the usernames • extensions.lastpass.loginpws contains encrypted passwords • No root needed
  • 26. Master password encryption • AES-256 • IV: Random • KEY: SHA256(username) • Data: !L5b/dOyu4EMdmWCYkASQaw==|cHTFJDy1DQi8dPY0AJL/1B= IV 24 chars (ignoring !) Separator 26th char Data Starting 27th char MP encryption key Vault encryption key
  • 27. Profit! • We located the files • We know the encryption system • We have the IV • We have the key • We have the data
  • 28. What about 2 factor auth?
  • 30. 2-factor auth • Supports multiple platforms • Google Auth, Yubikey, Toopher, etc.
  • 31. UUID is the “trust token”
  • 32.
  • 33. What’s going on? • How is the request forged? • How is the token generated? • How is it stored? • Where is it stored?
  • 34. How is the request forged? The token is injected into the DOM
  • 35. How is the token generated? • At plugin installation 32 chars length • 0-9 A-Z a-z !@#$%^&*()_ length lowercase? uppercase? digits? special chars? min digits ambiguous chars? make pronounceable?
  • 36. How/Where is it stored? • In plaintext • Firefox • In the file “lp.suid” • Chrome/Safari/Opera • Local-storage SQLite DB
  • 37. Design Problems? • Browsers don’t encrypt local storage • LocalStorage DB and lp.suid are accessible and unencrypted • The token is stored in plaintext • Token is injected in DOM • XSS means game over
  • 38. More problems • Same token for all browser users • Fixed token till plugin is reinstalled • Untrusting the browser has no real effect • Same token when changing QR Code • Token fixation • Attacker can set a token on the client • Proactive token stealing • Steal token today, use it tomorrow
  • 39. Profit! • We have the file • We know the encryption • We have the data • We have the IV • We have the key • We have the 2-factor token
  • 40. What about if: “Remember password” was not clicked There was no way to obtain 2-factor auth token
  • 42. Wait… What? How is account recovery possible if LastPass does not know my password?
  • 44. Recovering the account Get a unique link
  • 46. Boom! • Full, unrestricted access to the vault • Attacker can set a new password • But does not have to! • Bypasses 2 factor-auth
  • 47. Recover account flow Email GET /s/?s=8aa37bb1bb3FAKE03ad4127 302 Location: /recover.php? &time=1412381291&timehash=340908c353c099c9FAKE6b387002c5a4881ebdf1 &username=test%40test.com&usernamehash=fc7be7e5f6cbec9FAKE2995bd3331c097 POST /otp.php &changepw=ccb2501724FAKE2b575a214e1052 d0fa27b0726b6HASHdb2e1da3952e Recover button
  • 48. Can I directly generate the recover url? • time: timestamp when the recovery was initiated (the link “expires” in 2 hours) • timehash: salted hash of the timestamp • username: the email address • usernamehash: salted hash of the email 302 Location: /recover.php? &time=1412381291&timehash=340908c353c099c9FAKE6b387002c5a4881ebdf1 &username=test%40test.com&usernamehash=fc7be7e5f6cbec9FAKE2995bd3331c097
  • 49. Challenges • I need to generate a valid timestamp • I need the be able to generate the hashes • I need the salt
  • 50. Let’s try… • Request my own unique url and reuse the hashes in the victims url • BINGO! • Same salt is used for all users • Link does not truly expire, only the timestamp is validated against the hash • There is no need to request account recovery. You only need a valid url
  • 51. The salt is the secret • Still, we need to change the username, and hash it. • We are only missing the server salt to be able to generate valid recover urls • Salts are not designed to be a secret, only random and unique. • Oh wait… “LastPass account email addresses, password reminders, server per user salts, and authentication hashes were compromised”
  • 52. Can I forge the post request? • changepw: a derived “disabled OTP” POST /otp.php &changepw=ccb25017c4FAKE2b575a21441055d0fa27b0726b6HASHdb2e1da395e
  • 53. OTPs in LastPass • 2 types of OTPs • “True” OTPs for authentication • “Disabled” OTP • Let’s call it dOTP
  • 54. Disabled OTP • Used to recover the vault • Which ultimately means for authentication • It’s set by default • It’s not the encryption key
  • 55. How/Where is it stored? • Unprotected • Firefox • In the file {SHA256(username)}_ff.sotp (binary format) • Needs the extra step: bin2hex • Chrome/Safari/Opera • SQLite DB
  • 56. How is the request forged? The dOTP is injected into the DOM
  • 57. From dOTP to vault Local-storage getdOTP(username) dOTP token=SHA256(SHA256(username+dOTP2)+dOTP2) /otp.php(username, token) Set-Cookie: PHPSESSID pwdeckey GET /accts3.php encrypted vault
  • 58. What is”pwdeckey”? • It’s not the key to decrypt any password • It’s the seed to derive the key to decrypt the “vault key” • The vault key decrypts all the password, notes, etc. in the vault
  • 59. So… What is a Disabled OTP again? • A Master Password on steroids • Bypasses IP restrictions • Bypasses 2-factor auth • Bypasses user alerts
  • 60. pwdeckey == dOTP token *Took me “only” 3 months to notice…
  • 61. AES-ECB(SHA256(dOTP_token), encryptedVaultKey ) Vault key decryption *Remember: dOTP_token = SHA256(SHA256(username+dOTP2)+dOTP2)
  • 62. How/Where is the vault key stored? • Encrypted • Firefox • In the file {SHA256(username)}_lpall.slps • Chrome/Safari/Opera • SQLite DB
  • 63. No need to query LastPass! • dOTP -> Key to decrypt vault key -> Vault key • Encrypted vault is stored locally by default! • Iterations;base64 encoded/encrypted vault • Firefox • In the file {SHA256(username)}_lps.act.sxml • Chrome/Safari/Opera • SQLite DB
  • 64. Profit! • We located the token • We know how to hash it • We get the vault key decryption key • We get the vault • We decrypt the vault key • We decrypt the vault
  • 66. Metasploit module • Steals and decrypts the master password • Steals the 2-factor auth token • Steals the encryption key • Decrypts the entire vault • Supports: • Windows, Mac and Unix • Chrome, Firefox, Safari and Opera • IE coming soon • Meterpreter and shell • Multiuser https://github.com/martinvigo/metasploit-framework Sometime in the next couple weeks
  • 67. Demo
  • 68.
  • 69. What about if there is: No disabled OTP No access to the machine No Exploit No nothing!
  • 72. Stop sharing your LastPass credentials with the entire world!!!!
  • 74. Hardening LastPass • Use the binary version of the plugin • Do not store your master password • Disable “Account recovery” • Do not use “Password reminder” • Activate 2-factor auth • Prompt for master password to make passwords visible • Add country restriction • Update/Randomize PBKDF2 iterations • Disallow TOR logins