bob started at the narrowest human boundary: a first-party wallet app where a URL can open an announcement over the real product.
open first-party wallet app
→ { "urlData": "announcement", "origin": "trusted", "wallet": "present" }
single-page app · modal path · wallet provider in a real browser
the frontier was not everything bob found. it was the one lead where UI plumbing crossed wallet trust.
surface ledger API map -> supporting context
other real leads -> separate reports
scanner edge -> parked until client proof
wallet app bundle -> live enough to read
announcement modal -> crosses user trust
The workflow keeps adjacent findings separate, then follows the lead whose impact survives verification.
the claim froze when one entry path reached two separate interactive links. one patch would not close both.
entry data -> two renderers entry: URL-carried announcement
sink A: rich-text link accepts unsafe scheme
sink B: action link accepts unsafe scheme
shared entry, separate renderers
fix A does not fix B
That distinction is the claim: not duplicate bugs, and not one vague injection.
verification stayed concrete: live bundle, disposable browser, trusted-origin prompt, no signature needed.
- bundlelive
- modalopens
- prompttrusted
the proof stops at the prompt: trusted origin visible, user can reject, no funds moved.
bob put the grade in the language a triager reads: the class the bug belongs to, and the score that sizes it.
CWE-79improper neutralization of input
untrusted text rendered as live code — cross-site scripting
CWE-116improper output encoding
the escape step that should have neutered it never ran
CVSS 3.1AV:N/AC:L/PR:N/UI:R/S:C/C:H/I:H/A:N
- AV:N over the network
- AC:L no special setup
- PR:N no account
- UI:R victim must act
- S:C escapes the component
- C:H full read
- I:H full tamper
- A:N stays up
8.2high
bob’s own score — a private engagement, no public advisory. Scope is Changed because the injection runs in a wallet-trusted origin: it reaches the wallet, not just the page.
filed as one chain: same entry, two independent fixes, trusted-origin wallet prompt.
SUBMIT
85 / 100
high · client-side injection · wallet-trusted origin · two independent sinks
anonymized: exact brand, origin, entry parameter, and payload withheld.