Component: ghost-lite @ a420393, src/containers/Transactions.tsx:37-38,54; internal trigger in src/containers/AddressBook.tsx:127-130 (openTransfer → navigate('/transactions?address=...')).
Description: The Transactions page initializes the receiver state directly from the URL: const initialReceiver = queryParams.get("address") ?? "". Anyone can craft a link https://<app>/#/transactions?address=<attacker-SS58-address> and lure the victim into pasting an amount and pressing Transfer. This is a by-design feature for the address book’s “Send” button, but it accepts input from arbitrary external links without distinction.
Impact: Social-engineering amplifier. Existing verified mitigations: (1) the full address is shown in the input (not truncated), (2) receiverObject validates the checksum via ss58Decode and the prefix must match the chain’s ss58Format (Transactions.tsx:88-99): calldata is not built for invalid addresses, (3) the wallet signing popup shows the real decode. Exploitation needs a victim who carelessly ignores a clearly displayed address.
Reproduction: Static: open /#/transactions?address=<valid SS58> → the receiver field auto-fills with the URL’s address.
Severity: Low. Reason: behavior verified, but the exploit chain needs heavy social engineering against three layers of visibility/validation.
Recommendation: When address comes from the query param (not internal address-book navigation), show a confirmation banner (“Receiver filled from link, verify the address”), or consume and strip the param from the URL (navigate(..., {replace:true})).
Verification: VERIFIED.