decision: eth_sign is signed as a personal message while its warning and the README describe raw-hash signing #409

Open
opened 2026-09-21 20:37:57 +02:00 by clawbot · 0 comments
Collaborator

Severity: hardening. Owner decision.

Where. src/popup/views/approval.js:808-811 (both eth_sign and
personal_sign call signer.signMessage(getBytes(message)));
src/shared/approvalVerify.js:570-575 (verified with verifyMessage);
src/background/index.js:864-868 (the eth_sign danger warning); README
SignApproval.

The behaviour. eth_sign is implemented identically to personal_sign — an
EIP-191 prefixed message signature — not the raw 32-byte hash signature that
eth_sign denotes. So the danger warning ("this site is requesting to sign a raw
hash … can be used to sign transactions that drain your funds") and the README
describe something the code does not do, and a dApp that asks for eth_sign
expecting raw-hash semantics receives an incompatible signature. There is no key
risk today, because the safe behaviour is what runs.

The question. Keep eth_sign as a personal_sign alias, or drop it?

Options.

  • Drop eth_sign: answer EIP-1193 4200 (unsupported) and remove the warning
    and the README claim.
  • Keep the alias: correct the warning and the README to say the request is signed
    as a personal message.

Recommendation. Drop eth_sign — it is legacy, unsafe by design, and this
implementation does not provide its semantics anyway; answering 4200 is honest
and removes an untrue warning.

Definition of done.

  • The owner rules drop vs keep-and-relabel.
  • The warning text and the README are made true to what the code does, or
    eth_sign is removed and answered 4200.
  • A test pins the chosen behaviour.

Model: fable-5-1 (review); opus-4-8 (filing)

Severity: hardening. Owner decision. **Where.** `src/popup/views/approval.js:808-811` (both `eth_sign` and `personal_sign` call `signer.signMessage(getBytes(message))`); `src/shared/approvalVerify.js:570-575` (verified with `verifyMessage`); `src/background/index.js:864-868` (the `eth_sign` danger warning); README SignApproval. **The behaviour.** `eth_sign` is implemented identically to `personal_sign` — an EIP-191 prefixed message signature — not the raw 32-byte hash signature that `eth_sign` denotes. So the danger warning ("this site is requesting to sign a raw hash … can be used to sign transactions that drain your funds") and the README describe something the code does not do, and a dApp that asks for `eth_sign` expecting raw-hash semantics receives an incompatible signature. There is no key risk today, because the safe behaviour is what runs. **The question.** Keep `eth_sign` as a `personal_sign` alias, or drop it? **Options.** - Drop `eth_sign`: answer EIP-1193 `4200` (unsupported) and remove the warning and the README claim. - Keep the alias: correct the warning and the README to say the request is signed as a personal message. **Recommendation.** Drop `eth_sign` — it is legacy, unsafe by design, and this implementation does not provide its semantics anyway; answering `4200` is honest and removes an untrue warning. **Definition of done.** - [ ] The owner rules drop vs keep-and-relabel. - [ ] The warning text and the README are made true to what the code does, or `eth_sign` is removed and answered `4200`. - [ ] A test pins the chosen behaviour. Model: fable-5-1 (review); opus-4-8 (filing)
sneak was assigned by clawbot 2026-09-21 20:37:57 +02:00
Sign in to join this conversation.
1 Participants
Notifications
Due Date
No due date set.
Dependencies

No dependencies set.

Reference: sneak/AutistMask#409