
D'CENT Wallet
by IoTrust Co., Ltd. · Android 9.2.1 · measured 2026-09-16
Signs any hash after a PINThe App Wallet's screen is a website, and its signer approves whatever hash that website sends it once a PIN is entered. Hardware users with a screen are insulated; a hardware recovery phrase imported into the App Wallet is not. The opt-in social backup sends the recovery phrase to Wepin, the vendor's own service, which holds the key that opens it.
Rating and build
Rating
- Custody15/20
- Vault & key storage15/20
- Seed handling & signing10/15
- Isolation7/15
- Transport & network8/15
- Code integrity5/8
- Privacy2/7
The build that was read
- Version
- Android 9.2.1 (versionCode 1638, com.kr.iotrust.dcent.wallet)
- Current
- Google Play listed 10.0.0 (updated 27 Aug 2026) at the time of writing; that build is not covered by this audit
- Verified
- Google Play build; v3 signature and Play source-stamp verified
- Measured
- 2026-09-16
- Chains
- Multi-chain, including the XRP Ledger and Xahau
- Custody
- Self-custody by default, with a hardware option. The opt-in Wepin social mode uploads the whole recovery phrase to Wepin, a service IoTrust itself operates, encrypted to a key held on that side: the vendor can recover the seed.
- Signing
- The App Wallet screen is a remote web page. Its software signer approves any hash it is sent after a PIN, with no native display of the transaction.
Rating history
3| Date | Rating | Rubric | What it rested on |
|---|---|---|---|
| 2026-09-08 | 74 / 100Good | v1, six dimensions | First static pass. It credited an origin-allowlisted dApp browser, scored a four-digit PIN floor, and read the cleartext endpoints as a mainnet node; all three readings were later corrected. Custody 18/20 · Vault & KDF 19/25 · Seed 15/15 · Transport & hardening 10/20 · Integrity 9/10 · Privacy 3/10 |
| 2026-09-08 | 71 / 100Moderate-3 | v2, Isolation added | Same findings, new rubric: an explicit Isolation dimension (how well the seed and signing are walled off from hostile code), funded by trimming Vault, Transport, Integrity and Privacy. Custody 16/20 · Vault 16/20 · Seed 13/15 · Isolation 11/15 · Transport 6/15 · Integrity 7/8 · Privacy 2/7 |
| 2026-09-16 | 62 / 100Moderate-9 | v2 | Full re-verification from the code path that runs: a remote wallet page bridged to a blind hash signer with no origin check (Seed 13→10, Isolation 11→7); the dApp browser exposes the same signer and the engine is remote and unsigned (Integrity 7→5); no user-secret key derivation on the vault (Vault 16→15); the social mode lets the vendor recover the seed (Custody 16→15). Transport rose 6→8: cleartext confined to a test network, the developer trust path scoped. Custody 15/20 · Vault 15/20 · Seed 10/15 · Isolation 7/15 · Transport 8/15 · Integrity 5/8 · Privacy 2/7 |
An interim estimate near 69 on 16 September was superseded within hours by the full re-verification and was never recorded as the rating.
Findings
143 high, 4 medium, 5 low, plus what holds up.
- HighThe software signer has no display of its ownThe signing command takes an opaque hash. The only prompt is a PIN keypad that is given no destination, amount or token, so a PIN proves a person was present, not what they agreed to.
- HighThe bridge checks no originMessages from the wallet page are parsed and dispatched to five targets, the software signer among them, with no check on where the page came from and no allow-list.
- HighThe in-app dApp browser opens the same signer to any siteA wildcard origin allow-list, mixed content allowed, a URL safety check that returns true for any non-empty string, and the bridge switched on for every page it loads. Talking a person into opening a link there is enough to ask the signer for a signature; nothing has to be broken into.
- MediumSocial backup sends the recovery phrase to the vendor's own Wepin serviceThe whole phrase is encrypted under a fresh key that is itself wrapped to a public key fetched from Wepin, then uploaded; the PIN is hashed and uploaded under the same key, not used to lock the phrase. The app never holds the private half and contains no key-splitting logic, so whoever holds that key can recover the seed. Wepin's terms name its operator as IoTrust Co., Ltd., the company behind D'CENT. Opt-in and disclosed.
- MediumThe provider engine is fetched at run time and never verifiedInjected into every dApp page from assets.dcentwallet.com, downloaded as plain text with no signature or hash check; the list of extra scripts to load comes from the same host.
- MediumThe bridge also reaches device commandsThrough the native target a bridged page can read the clipboard, open the camera QR scanner, start speech recognition through the microphone, and read or change app settings.
- MediumNo certificate pinningThe wallet page and the engine are trusted on the phone’s certificate store alone; anyone who can present a certificate the device accepts can sit in the middle.
- LowCleartext HTTP is enabled for the whole appusesCleartextTraffic is on with no network-security configuration. The shipped plain-HTTP endpoints belong to a test network; a hand-added custom node could be http:// too.
- LowA developer certificate-trust path ships in productionA patched WebView client can accept an untrusted certificate, scoped to developer mode plus a toggle, a developer root fetched from D’CENT, and the dev server or private addresses.
- LowThe inner seed layer is keyed to an install id with a zero IVIts key derives from an id the app generates and stores itself, not a user secret; the PIN only gates the prompt. The real protection is the Keystore wrapping around it.
- LowThe main WebView allows file access and universal access from file URLsSettings a wallet WebView normally disables. Not exercised by this analysis; a hardening gap, not a demonstrated vector.
- LowThree analytics kits and the advertising permissionsAppsFlyer, Firebase Analytics and Amplitude, with Sentry and Pushwoosh; the advertising id and all AdServices permissions; the microphone permission is live.
- NoteDevelopment settings shipped to usersThe production wallet-create call is labelled dcent-wallet-test, and the build carries dev, beta and live provider keys and a localhost wallet address gated behind developer mode.
- Holds upWhat holds upThe default-mode seed is Keystore-wrapped and never leaves the phone; Android backup is off; the PIN is six digits with lockouts; cloud backup uses argon2id then AES-256-GCM; screenshots are blocked; the hardware wallet signs on its own screen.
This rating is re-scored when the vendor fixes what the audit found, and the change is recorded above. Anything wrong here gets corrected: hello@xrpl.to or @xrplto.