eth_sign and eth_signTypedData bypass AllowInsecureUnlock JSON-RPC gate
Nobody has claimed this yet.
Assessment
- Difficulty
- 2/5
- Estimated time
- 1-3 hours
- Newbie friendliness
- 72/100
- Issue type
- Bug
- Clarity
- Clearly specified
- Activity status
- Quiet
- Tech stack
- go
- Domain
- backend-api-design, security
Research direction
Read rpc/backend/sign_tx.go around Backend.Sign() and Backend.SignTypedData(), then inspect the AllowInsecureUnlock checks in the other account RPC methods. Add equivalent guards to both signing methods and unit tests for the false flag; done means both return the forbidden error when insecure unlock is disabled. The issue also points to an existing fix on origin/worktree-fix-eth-sign-insecure-unlock.
Written by the indexing model from the issue text.
Description
Summary
eth_sign and eth_signTypedData in the JSON-RPC backend skip the AllowInsecureUnlock check that the other four account-related RPCs enforce. When an operator runs with --json-rpc.allow-insecure-unlock=false expecting account-related signing over HTTP to be blocked, these two endpoints still produce signatures from the loaded keyring.
Vulnerable code (on main HEAD 9a516a34d)
rpc/backend/sign_tx.go:124-142—Backend.Sign()accessesb.ClientCtx.Keyring.SignByAddresswith noAllowInsecureUnlockguard.rpc/backend/sign_tx.go:147-168—Backend.SignTypedData()same pattern, no guard.
For comparison, the correctly guarded endpoints all open with if !b.Cfg.JSONRPC.AllowInsecureUnlock { return ..., fmt.Errorf("account unlock with HTTP access is forbidden") }:
rpc/backend/sign_tx.go:22-27—SendTransaction()rpc/backend/node_info.go:34—Accounts()rpc/backend/node_info.go:84—SetEtherbase()rpc/backend/node_info.go:225—ListAccounts()
Fix
A fix already exists on the remote branch origin/worktree-fix-eth-sign-insecure-unlock (commit d8ea64168, dated 2026-03-24) that adds the four-line guard to both functions. Merge that branch (or land an equivalent two-function patch) plus unit tests asserting the error response when the flag is false. Also worth adding a sweep test or linter check that asserts every Backend method touching b.ClientCtx.Keyring.Sign* either has the AllowInsecureUnlock guard or an explicit comment justifying why it does not, so the next account-related RPC we add does not repeat the omission.
Severity / impact
Classified as Low on HackenProof. eth_sign returns a \x19Ethereum Signed Message-prefixed signature only useful for off-chain auth flows; eth_signTypedData can produce EIP-712 signatures usable for ERC-2612 permit-drain or off-chain marketplace orders, but the realistic fund-extraction path requires four operator-side preconditions to converge (flag set to false against the default true, funded EVM key loaded into validator keyring against standard operator practice, EIP-712-eligible assets controlled by that key, and a publicly reachable RPC port). The realistic population on ZetaChain mainnet satisfying all four is plausibly zero. The fix ships as code hygiene rather than incident response.
Source
HackenProof report: https://dashboard.hackenproof.com/manager/companies/zetachain/zetachain-blockchain-software/reports/ZCNode-284
- Dominant language
- Go
- Stars
- 202
- Forks
- 181
- Avg merge
- 17h 6m
- Merged PRs (30d)
- 2
Getting set up
- No Dockerfile or Docker Compose file
- Has a pull request template
- No contributing guide
First steps
- Read the whole issue, then the project's contributing guide.
- Comment on the issue to say you are picking it up — it saves two people doing the same work.
- Fork the repository and make your change on a branch.
- Open a pull request that references the issue number.
More from zeta-chain/node
-
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
zeta-chain/node#4622 ·
-
Difficulty 1/5 Under an hour Newbie friendliness 85/100
zeta-chain/node#4610 ·
-
bug_bounty zetaclient
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
zeta-chain/node#4603 ·
-
MsgUpdateOperationalChainParams missing range validation can panic zetaclient outbound schedulerOpenbug_bounty zetacore
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
zeta-chain/node#4602 ·
-
bug_bounty zetacore
Difficulty 2/5 1-3 hours Newbie friendliness 85/100
zeta-chain/node#4601 ·
Similar issues
-
needs-triage
Difficulty 2/5 1-3 hours Newbie friendliness 72/100
stacklok/toolhive-catalog#1890 ·
Maintainers usually reply within 1 day
-
Difficulty 2/5 1-3 hours Newbie friendliness 76/100
integrations/terraform-provider-github#3719 · 1 comment ·
Maintainers usually reply within 1 day
-
Wayfinder sample agents don't reach the Data Plane on the quickstart packPossibly taken A pull request linked to this issue is open or already merged. OpenType/Bug
Difficulty 2/5 1-3 hours Newbie friendliness 82/100
thunder-id/thunderid#6402 ·
Maintainers usually reply within 1 day
-
GoStratumEngineOpenaddition
Difficulty 1/5 Under an hour Newbie friendliness 72/100
awesome-selfhosted/awesome-selfhosted-data#3290 ·
Maintainers usually reply within 1 day
-
log4j2.xml from orchestration.extraConfiguration is rendered twice, and the install fails when orchestration.log4j2 is also setPossibly taken @irisfield claimed this today. Openplatform/local
Difficulty 2/5 1-3 hours Newbie friendliness 78/100
camunda/camunda-platform-helm#7854 ·
Maintainers usually reply within 1 day