Browser and Wallet Hardening Guide for Web3 Teams

Securing the highest-traffic Web3 attack surface: the browser and the signer

1. What This Guide Is For

This guide is for anyone in a Web3 team who interacts with on-chain systems through a browser, whether you are a developer, an operator, or in a non-technical role. The contracts may be audited and the protocol may be sound, and the loss still happens at the browser and the signer. That is where the value moves and where the human makes the final decision.

Most real losses do not come from a contract bug. They come from a signature: an unbounded approve, an off-chain Permit2 authorization, a typed-data message handed to a drainer, or a transaction whose recipient was swapped by a malicious extension or a poisoned address. The attacker does not need to break the protocol if they can get you to sign.

Baseline rule: separate browser profiles by risk tier, keep extensions minimal and vetted, verify every transaction on the signing device, and revoke stale approvals.

For the most sensitive work, treasury signing, contract administration, multisig participation, and release approvals, a dedicated signing device with a hardware wallet and a clean profile is still the better option. A browser-extension wallet holding meaningful value is a standing liability.

2. Browser and Profile Strategy

The problem is bleed. Cookies, sessions, extensions, and cached permissions that belong to one activity become available to another when they share a profile. A malicious extension installed for “degen” experimentation can read your work session. A drainer dApp opened in the same profile as your treasury wallet can prompt that wallet to sign. A phishing page that captured a session cookie now has whatever that profile could reach.

Separation by risk tier breaks these chains. Each tier gets its own profile (or, for the highest tier, its own browser or device), its own extension set, and its own wallet. Nothing crosses.

TierPurposeWalletExtensionsNotes
SigningTreasury, multisig, contract admin, high-value transactions.Hardware wallet only. No extension wallet holding value.Minimum needed to sign. Ideally a dedicated browser or device.Never used for general browsing, email, chat, or links from anywhere.
WorkSource control, cloud, docs, dApp interaction with the hot operational wallet.Hot wallet with capped balances and capped approvals.Vetted, work-required only.No personal browsing, no airdrops, no random dApps.
Personal / degenExperimentation, airdrops, new dApps, mints, trading.Burner or low-value wallet. Nothing you cannot lose.Treat anything here as compromisable.Separate profile or separate browser. Never touches work or signing sessions.

Browser profiles are an isolation boundary for sessions and extensions, not a hardened sandbox. Treat them as risk separation, not as a guarantee that a compromised personal profile cannot affect the machine. For the signing tier, prefer a separate browser or a separate device over a profile in the same browser.

3. Quick Setup Checklist

Every browser used for Web3 work should have these controls before it touches a wallet.

Browser Settings

SettingWhat To DoNotes
UpdatesKeep the browser on automatic updates.Renderer and extension-API bugs are patched often. Do not sit on an old build.
ProfilesCreate separate profiles per risk tier.Signing, work, and personal/degen at minimum.
SyncDo not sync the signing or work profile into a personal account.Synced extensions and sessions defeat tier separation.
Default searchAvoid clicking search results or ads for dApps.Fake dApp ads are a standard delivery channel for drainers.
Site permissionsDeny clipboard, camera, and notification access by default.Grant only per-site when there is a reason.

Profiles and Wallets

AreaWhat To Do
Signing profileHardware wallet only. No extension wallet holding value. No general browsing.
Work profileHot operational wallet with capped balances and capped approvals.
Personal / degenBurner wallet, separate profile or browser, nothing of value.
Seed isolationNever import a hardware-wallet seed into an extension wallet.

Extension Review

AreaWhat To Do
InventoryList every extension in every work and signing profile.
RemovalRemove anything not actively needed.
PermissionsScrutinize any extension that can read or change page content or intercept requests.
SourceInstall only from the official store, verified publisher, with a real review history.

Allowance Review

AreaWhat To Do
Stale approvalsReview token and NFT approvals monthly on Revoke.cash or an equivalent.
Unbounded approvalsRevoke or reduce infinite approve and broad Permit2 allowances.
DisconnectDisconnect dApps and WalletConnect sessions you are no longer using.

4. Browser Extensions: The Risk Surface

A browser extension with content-script access can read everything on a page, rewrite the DOM, intercept and modify network requests, and inject scripts. An extension with that access sitting in your wallet’s profile can swap a recipient address before you see it, rewrite a displayed balance, replace a QR code, or relay your session to an attacker. The extension does not need to be the wallet to attack the wallet.

Vet before installing, and re-vet periodically because extensions update silently and ownership changes hands:

  • Publisher. Known developer, verified where the store supports it, consistent identity across the listing and the project’s real site.
  • Permissions. “Read and change all your data on all websites” is the maximum-risk grant. Justify it or do not install.
  • Reviews and history. Real review volume over time, not a burst of five-star reviews on a new listing.
  • Install source. Official store only. Never from a search ad, a social post, a chat link, or a “quick fix” instruction in a support DM.

Wallet extensions carry their own risk. A look-alike wallet in the store, a typosquatted name, or a cloned listing with a slightly different publisher is a common delivery method for seed-phrase theft. Install the wallet from the link on the project’s verified site, confirm the publisher, and check the user count and review history. A wallet extension with a few hundred users and a recent publish date is a red flag.

“Quick fix” extensions are a recurring trap: a page or a support agent tells you to install an extension to resolve an error, claim an airdrop, or connect a wallet. Treat any unsolicited install instruction as hostile.

Permission CategoryWhat It AllowsWhy It Matters
Read and change all data on all sitesFull DOM read/write, script injection on every page.Can rewrite addresses, balances, and transaction details before you sign.
Web request interceptionRead and modify network traffic.Acts as a man-in-the-middle between the dApp and the RPC.
Clipboard accessRead and write the clipboard.Clipboard hijacking: swaps a pasted address for the attacker’s.
Scripting / executeScriptInject arbitrary code into pages.Same effect as full content access, applied on demand.
Native messagingCommunicate with a local host application.Bridges the browser to local processes; expands the blast radius beyond the tab.

5. Wallet Setup and Connection Hygiene

A hot wallet (private key in software, in the browser extension) is always online and always one malicious signature away from drain. A hardware wallet keeps the key in a separate device and forces a physical confirmation. The two are not interchangeable. Hot wallets are for small operational balances you can afford to lose. Hardware wallets are for anything you cannot.

Separate wallets by tier and do not let them merge:

  • Hot operational wallet. In the work profile. Capped balance. Capped approvals. Used for routine, lower-value interactions.
  • Cold treasury wallet. Hardware wallet, ideally behind a multisig. In the signing profile or on a dedicated device. Used only for deliberate, verified transactions.
  • Burner. In the personal/degen profile. Nothing of value. Assume it will eventually be drained.

Connection hygiene matters as much as the wallet itself:

  • WalletConnect and dApp sessions. Each active connection is standing authorization. Review connected dApps regularly and disconnect anything you are not actively using. A forgotten session is an open door.
  • Custom RPC and networks. A malicious or hijacked RPC endpoint can feed your wallet false balances, false simulation results, and false transaction outcomes. Add networks only from the project’s verified source, not from a pop-up that offers to “add network” for you.
  • Spending caps. Keep operational balances low. A hot wallet with a small balance limits the loss when, not if, something goes wrong.

Never import a hardware-wallet seed phrase into a browser-extension wallet. Doing so takes the key out of the secure element and puts it in software, discarding the entire reason for the hardware wallet. If a process asks you to “sync” or “import” a hardware seed into an extension, it is either a misunderstanding or an attack.

6. Transaction Signing Hygiene

The signing step is the last line of defense, and it is where most losses are finalized. Blind signing, approving a transaction or message whose contents your device cannot decode and display, means you are trusting the dApp UI completely. The dApp UI is exactly what an attacker controls. Clear signing, where the hardware device decodes and displays what you are actually authorizing, removes that trust dependency. Use wallets and apps that support it, and verify on the device screen, not in the browser.

Specific signature and approval types carry specific risk:

  • eth_sign. Signs an arbitrary 32-byte hash with no human-readable context. Legacy and dangerous. A modern wallet should warn loudly or block it. Never approve an eth_sign request you did not initiate and understand.
  • personal_sign. Human-readable message signing. Lower risk for plain login messages, but read the message. A drainer can phrase a malicious authorization as innocuous text.
  • EIP-712 typed data. Structured, decodable data. The improvement is that it can be displayed clearly. The risk is that users approve it without reading, and Permit and Permit2 authorizations are EIP-712.
  • ERC-20 approve. Grants a spender the right to move your tokens. An unbounded (type(uint256).max) approval is a permanent open door until revoked.
  • Permit / Permit2 off-chain signatures. A single signature grants spending authorization with no on-chain transaction and no gas, so there is no obvious on-chain footprint at signing time. Drainers favor these because the victim never sends a transaction they would scrutinize.

Two mechanical attacks target the moment of signing:

  • Address poisoning. The attacker sends a dust transaction from an address that shares your counterparty’s first and last characters, polluting your history so you copy the wrong address from a transaction list. Always verify the full address, not the truncated display.
  • Clipboard hijacking. Malware or a malicious extension replaces a copied address with the attacker’s at paste time. Verify the pasted address character by character, or use an address book entry you created and verified.

Build the simulate-and-verify habit. Use transaction simulation (Tenderly, the wallet’s built-in preview, or a security extension) to see the predicted state changes before signing. Then verify the target and the calldata on the hardware screen. The dApp can show you anything. The hardware device shows you what you are signing.

Signature / Approval TypeWhat It AuthorizesRisk
eth_signSigns an arbitrary hash, no context.Highest. Can authorize anything. Block or treat as hostile.
personal_signSigns a readable message.Moderate. Read it. Can be phrased to deceive.
EIP-712 typed dataSigns structured, decodable data.Moderate to high. Includes Permit authorizations. Read fields.
ERC-20 approve (bounded)Spender may move up to N tokens.Limited to N. Prefer exact amounts.
ERC-20 approve (unbounded)Spender may move all tokens, indefinitely.High. Open door until revoked.
Permit / Permit2 off-chainGasless spending authorization via signature.High. No on-chain footprint at signing. Drainer favorite.
setApprovalForAll (NFT)Operator may transfer all NFTs in a collection.High. Drains an entire collection if granted to an attacker.

Step 1: Create Profiles by Risk Tier

Create at least three browser profiles or contexts: signing, work, and personal/degen. For the signing tier, prefer a separate browser or a dedicated device. Do not sync these profiles into a shared personal account, which would re-merge the extensions and sessions you just separated.

Step 2: Clean Up Extensions

Inventory every extension in the work and signing profiles. Remove anything not actively needed. For anything that remains, check the permission grant: any extension that can read or change page content or intercept requests is a candidate for removal. The signing profile should carry the absolute minimum.

Step 3: Set Up Wallet Tiers

Place a low-balance hot wallet with capped approvals in the work profile. Keep the treasury on a hardware wallet, ideally behind a multisig, in the signing context. Put only a burner in the personal/degen profile. Confirm balances match the tier: nothing of value outside the signing tier.

Step 4: Pair the Hardware Wallet

Pair the hardware wallet in the signing profile. Verify the device firmware is current and installed from the vendor’s official channel. Confirm clear signing is enabled for the chains and contracts you use. Test with a small transaction and confirm the device screen shows the decoded details, not a blind hash.

Step 5: Review dApp Connections and Allowances

Open Revoke.cash (or an equivalent) for each active wallet. Revoke stale approvals, reduce unbounded approvals, and revoke any setApprovalForAll and Permit2 grants you do not recognize. Disconnect WalletConnect and dApp sessions you are not actively using.

Step 6: Build the Simulate-and-Verify Habit

For every non-trivial transaction: simulate it, read the predicted state changes, then verify the target and calldata on the hardware screen before approving. Make this automatic. The habit is the control.

Step 7: Establish Anti-Phishing URL Discipline

Bookmark the real URL for every dApp and tool you use, and reach them only through the bookmark. Never navigate to a dApp through a search result, an ad, a DM link, or a chat link. Confirm the domain character by character before connecting a wallet. Most drainer campaigns start with a look-alike domain delivered through one of those channels.

8. Extra Rules for Critical-Access Users

Treasury signers, multisig participants, and contract administrators can turn one bad signature into a company-level loss. If this applies to you, the stricter controls below are not optional.

ControlRequirement
Dedicated signing contextUse a dedicated browser or device for signing. No general browsing, email, chat, or external links in it.
Hardware wallet onlyNo extension wallet holding value. The signing key stays in the secure element.
No seed importNever import the hardware seed into software, an extension, or a backup app.
Clear signingEnable and require clear signing. Refuse to blind-sign treasury or admin transactions.
Simulate every transactionSimulate and read state changes before every signature, without exception.
Verify on deviceConfirm target and calldata on the hardware screen, never on the dApp UI alone.
Extension lockdownNo unapproved extensions in the signing context. Re-vet the minimal set periodically.
Allowance disciplineUse exact-amount approvals. Revoke promptly. No standing unbounded grants.
MultisigHold treasury behind a multisig so a single compromised signer is not sufficient.
Connection hygieneMaintain zero idle dApp or WalletConnect sessions in the signing context.
Suspicious activityStop signing and escalate before resuming if anything looks off.

9. Things To Avoid

These habits are common, and each one has drained wallets.

  • Reaching a dApp through a search ad, a search result, or a link in a DM, chat, or email.
  • Importing a hardware-wallet seed phrase into a browser-extension wallet or any software.
  • Granting infinite or unbounded ERC-20 approvals when an exact amount would do.
  • Signing eth_sign requests, or any message or typed data you have not read and understood.
  • Approving setApprovalForAll or Permit2 grants to a contract you cannot identify.
  • Reusing the signing profile for general browsing, email, chat, or external links.
  • Trusting the dApp UI for transaction details instead of verifying on the hardware screen.
  • Pasting a recipient address without verifying the full string character by character.
  • Copying a counterparty address from transaction history instead of a verified source (address poisoning).
  • Adding a custom RPC or network from a pop-up that offers to configure it for you.
  • Installing a “quick fix,” airdrop-claim, or wallet-connect extension on someone’s instruction.
  • Leaving dApp and WalletConnect sessions connected long after you finished using them.
  • Holding meaningful balances in a hot extension wallet because it is convenient.

10. If Something Suspicious Happens

If you suspect you signed a drainer message, approved a malicious allowance, or connected to a phishing dApp, move fast and in order. Approvals and signatures can be exploited at any time after they are granted, so the window matters.

Immediate Actions

  1. Stop signing. Do not approve anything else, including transactions that claim to “fix” or “secure” the wallet.
  2. From a clean device or profile, check the affected wallet’s approvals on Revoke.cash or an equivalent.
  3. Identify what you authorized: an approve, a Permit2 grant, a setApprovalForAll, or a session.
  4. Notify the security owner or treasury lead from a trusted channel.

Contain

SurfaceAction
Token / NFT approvalsRevoke malicious and unbounded approvals immediately, highest-value tokens first.
Permit / Permit2Revoke or invalidate outstanding off-chain authorizations the wallet granted.
dApp / WalletConnect sessionsDisconnect every active session for the affected wallet.
Assets in the hot walletMove remaining assets to a clean, unaffected wallet. Beat the attacker to it.
Suspicious extensionRemove the extension and review what else it could reach.

If a Permit2 or unbounded approval was granted and assets remain, assume the attacker can move them on their schedule. Revoking the approval is the priority; moving assets out is the backstop if revocation is uncertain or contested by the attacker’s transactions.

Rotate and Escalate

  • Treat the affected hot wallet as burned. Stop using it for value.
  • Generate fresh wallets from a clean device for ongoing operations.
  • If a seed phrase may have been exposed (entered into a phishing page, imported into a malicious app, stored insecurely), the wallet and every account derived from that seed are compromised. Move everything and retire the seed.
  • Review the profile and device the signing happened on. If a malicious extension or page was involved, assume the profile is compromised and rebuild it.
  • For treasury or multisig exposure, escalate immediately and freeze further signing until the security owner agrees it is safe to resume.

11. Monthly Self-Check

Once a month, do this short review. It should take a few minutes.

CheckDone
Browser is up to date.
Profiles are separated by risk tier (signing, work, personal).
The signing context is not used for general browsing or links.
Extensions in work and signing profiles have been reviewed.
No extension has unjustified read/change-all-sites or request-interception access.
Wallet tiers are correct: nothing of value outside the signing tier.
No hardware-wallet seed has been imported into software.
Token and NFT approvals have been reviewed on Revoke.cash or an equivalent.
Unbounded approvals and unknown Permit2 / setApprovalForAll grants have been revoked.
Idle dApp and WalletConnect sessions have been disconnected.
Clear signing is enabled and used for signing-tier transactions.
dApp URLs are reached through verified bookmarks, not search or links.

12. References

Questions about this guide? Ask the OpSec Agent.

Ask the Agent