https://chrome.coin98.com
The Coin98 Chrome Extension protects users by injecting non-writable wallet provider objects (like window.keplr and window.ethereum) into every webpage. This prevents malicious scripts from replacing the wallet with a fake one to steal funds.
However, the extension's core content script (takePlaces.f90f5315.js) contains a critical logic flaw: before it injects these secure objects, it reads a key called override from the website's own localStorage. If this key is set to enable: false for a specific provider, the extension skips its security protection entirely.
Since localStorage is completely controlled by the website (or any script running on it), a malicious DApp can "poison" this key on a user's first visit. On all subsequent visits, the extension will fail to inject its secure provider, allowing the attacker to inject a fake wallet that intercepts and modifies the user's transaction signing requests.
Prepare the PoC: Host the provided
poc_coin98_keplr_hijack.html(atatched below in poc.md) on a local server (e.g., python3 -m http.server 8080).
Control Group Verification The provided PoC includes a Control Phase. When first loaded (or after a reset), it confirms that window.ethereum.isCoin98 AND window.keplr.isCoin98 are both true. This proves the extension is installed and its security features are normally active.
Bypass Verification After poisoning localStorage and reloading, the PoC check shows: