Please first watch my official video response to Coinomi’s “Spell Check” scandal before you continue reading:
Coinomi multi-asset wallet poor implementation leads to sharing your plain-text passphrase with a third-party server. My passphrase was compromised and $60K-$70K worth of crypto-currency were stolen because of Coinomi wallet and how the wallet handled my passphrase. I’m disclosing this issue publicly because Coinomi refused to take the responsibility and all my attempts through private channels have failed.
Please note that this security issue cannot be exploited by anyone except by the people who created it or have control over the backend. To everyone who is using or used Coinomi wallet, make sure to remove your funds from the wallet and change your passphrase by creating a new wallet using another application otherwise your funds might get stolen sooner or later.
To understand how catastrophic the security issue is, they simply take your crypto-currency wallet’s passphrases/seeds and spell check it by sending it remotely to Google servers in clear plain text!
They did not take the responsibility of my loss, I gave them more than 24 hours before full disclosure, they fixed the issue without notifying their users and they kept procrastinating like scumbags to buy more time.
Below is a link to their final response to my request after going back and forth with them for over 3 days to get my stolen funds back, even after they confirmed the security issue and you can clearly see how silly and reckless their responses are (these responses are just examples):
My advice never ever trust Coinomi with your hard earned crypto-currency assets. Read this post entirely to understand why because this is not their first time reflecting this kind behavior.
First of all I admit it was my mistake trusting Coinomi wallet by inserting one of my main wallets (Exodus wallet) passphrase into their application. I trusted them because I downloaded the software from their website, the setup file was digitally signed and was mentioned by several reputable websites such as bitcoinwiki.org. I wanted to shift some of the assets that were not supported by Exodus wallet using the same passphrase/seed.
The incident began on 14th February, 2019. I downloaded and installed Coinomi application (Windows version) and noticed that their setup file was digitally signed but their main application was NOT signed after the installation process was completed.
I contacted them publicly through twitter (@warith2020) and they confirmed the issue then uploaded a new version with the main application signed. At that time I had already entered my Exodus’s wallet passphrase into Coinomi’s application.
On 22nd February 2019, I noticed that more than 90% of my Exodus wallet assets were transferred to multiple wallet addresses and the first transaction began with BTC on 19th February 2019 around 3:30 am UTC. Then followed by ETH (including ERC20 tokens), LTC and finally BCH.
I started going back in time and arranging the events. The only new thing that I did was installing and running Coinomi wallet so my first conclusion was that the unsigned version of the application had a backdoor.
I did further investigation and compared both the unsigned version of the setup file and the signed version. The only difference was they added digital signature to the main executable file and the Java file (the main application).
At that stage I thought that there is probably something suspicious about the application apart from having their main executable unsigned, so I started replicating what I did in a new virtual machine but this time I installed “Fiddler”. A software that allows you to monitor and debug HTTP/HTTPS traffic of all applications running on your machine.
I started monitoring the traffic by running Fiddler in the background and then started Coinomi wallet. The first thing I noticed is that Coinomi application starts downloading dictionary wordlist from the following web address:
Then I clicked on restore wallet and pasted a random passphrase and suddenly the screen screamed SURPRISE MODA****** (boom puzzle solved!)
The WHOLE passphrase in plain-text is sent to googleapis.com a domain name owned by Google! It was sending it as a spelling check function! Here is sample of the screenshot of the HTTP request:
To verify my findings I have uploaded a video for anyone who wants to test and replicate what I did:
You can also simply paste any random sentence with spelling mistake in the textbox in Coinomi‘s “Restore Wallet” form/page and you will see that it gets underlined with red line after being sent in clear text to googleapis.com.
The whole thing is done using JxBrowser to build cross-platform applications and before you say (like Coinomi‘s CTO did) that it’s JxBrowser issue, let me tell you that they mentioned this on their website in 2016 and how to disable the spell checking default behavior:
So essentially the textbox which you enter your passphrase in, is basically an HTML file ran by Chromium browser component and once you type or paste anything in that textbox it will immediately and discreetly send it remotely to googleapis.com for spelling check (how awesome is that!)
As a result, someone from Google’s team or whoever had access to the HTTP requests that are sent to googleapis.com found the passphrase and used it to steal my $60K-$70K worth crypto assets (at current market price). Anyone who is involved in technology and crypto-currency knows that a 12 random English words separated by spaces will probably be a passphrase to a crypto-currency wallet!
The team behind Coinomi are either extremely smart to add such backdoor so that when they get caught they would simply say it was an honest mistake or they are extremely stupid to overlook such security bug.
I will not be surprised if they intentionally created this backdoor behavior function and had an insider at Google especially when you learn from recent news about a founder of crypto-currency exchange claiming weird suspicious death while no one except him has access to the crypto-currency assets!
Coinomi’s team did not reflect any responsible behavior and they kept asking me about the technical issue behind the bug because they were worried about their public image and reputation. They kept ignoring my request of taking the responsibility and ignored my solid facts regarding it. They didn’t give a single **** about my stolen crypto assets. They kept reminding me (kinda threatening me) of the legal implications if I go public with the information I have and they forgot their legal responsibility for my stolen crypto assets as well as the risk that impacts other users of the wallet
In fact, Coinomi’s team discreetly deleted their reply to my tweets to hide the evidence regarding their unsigned main executable in which they confirmed the issue and they didn’t respond to my requests as shown in the following screenshots:
Such behavior was a clear evidence for me that there is something suspicious about their wallet and they didn’t want to expose it. It seems the founders are the developers of the application and they don’t like anyone who criticizes their ugly baby creation “Coinomi” wallet. They think that they are the code gurus fallen from the heavens who write perfect code.
However, before I published my findings I sent them the whole thing giving them more than 12 hours heads-up because they requested a clear technical evidence. Their CTO told me that he will download the report within 3 hours (they downloaded the report after 5-6 hours). Imagine someone tells you that you have a CRITICAL vulnerability in your software which holds users' hard earned crypto assets and yet you act carelessly because somehow you think you are a superior creature (Khan from Star Trek Into Darkness movie).
Below are the screenshots of the private messages between Coinomi’s CTO and me:
This is not their first time behaving this way especially when someone finds an issue with their application. Luke Childs previously published a security vulnerability/misconfiguration and their response was somehow similar:
To recap the events for further investigation:
Please note that I took all the security precaution to keep my passphrase and wallet safe. I have a separate isolated virtual machine for it with Anti-Virus/Anti-Malware and firewall installed. I also had other wallets on the same virtual machine for years. Nothing was stolen except for the wallet which I recently used my passphrase in, which is Coinomi wallet!
I will start taking legal actions against the company behind Coinomi if they don’t act and take the responsibility. The company is registered in UK as “Coinomi LTD” if anyone one has faced or facing similar case were you suddenly lost your crypto assets and you happen to have used Coinomi wallet. The funny thing is that they state on their website:
“Most importantly, no Coinomi wallet has ever been hacked or otherwise compromised to date.” (bull****!)
Be aware that probably all desktop versions are affected (I’m not sure about the mobile versions) and the guy/group who is/are capturing the passphrases, possibly targeting only wallets with decent amount of assets to stay low profile as long as he/they can.
I have also uploaded copy of the latest version of Coinomi application in case they take down the links to hide the facts:
This was an expensive and mentally painful experience to learn from and hopefully after publishing this post no one will experience the same. The lessons learned so far:
At the end I need to make it clear again why I published this:
Finally I hope the readers share this website to spread the awareness. I’m pretty sure hundred thousands of crypto assets will be saved and many users will have the opportunity to save their hard earned crypto assets!
Next time if you need to spell check your passphrase/seed and to make sure that you are following the English dictionary just use Coinomi wallet LMAO!
Coinomi was forced by the community (special thanks) and finally published an official statement regarding the incident and it can be found here (screenshot here):
First of all, I wish they have sense of transparency and publish my responses in their social media channels like I always do so that the reader of both responses can judge and assess the situation.
I was expecting Coinomi’s official statement to be sloppy and incompetent but never thought it would be that bad. But again it’s clearly reflects the mentally behind their “never been hacked” wallet.
I will start responding to their official statement by quoting and screenshotting parts of their official response because as you know by now they have a bad habit of deleting their posts.
Starting with their announcement title:
Calling this horrible security issue as “findings” is quite misleading and running away from responsibility. Coinomi obviously don’t want (or like) to name the issue as a CRITICAL vulnerability. In fact, their vulnerability is something beyond CRITICAL. As a standard, usually vulnerabilities are ranked based on their severity: Low, Medium, High or Critical. I’m suggesting that the information security community should introduce a new rank and call it the “Coinomi Level”, the new highest level ranking.
Going to the next statement:
"The seed phrase wasn’t being transmitted in plain text, instead it was being encapsulated inside a HTTPS request with Google being the sole recipient"
When I said that my passphrase was transmitted in plain text, I meant it reached Google API servers in plain text. Please make sure you know the difference between transmitting something in a secure tunnel (this is how HTTPS works) and between encrypting something before transmitting it.
For the sake of argument, imagine if they encrypted the passphrase first then sent it to Google. In such scenario even if you transmit that data through HTTP (not SSL/TLS) it would reach the destination encrypted. Nonetheless, that made me giggle for a while because it's like saying “we took all the security measures and transmitted your passphrase securely to Google” ouch!
“The seed phrase wasn’t being transmitted at all unless the user chose to explicitly restore their Desktop wallets”
That statement was hilarious and essentially they mean by that is “It’s not a vulnerability because the user chose to restore his wallet otherwise he would have been safe”. So as a Coinomi user you are not supposed to “restore your wallet” and that feature was there just to spell check your passphrase and make sure it matches Google’s dictionary.
"The spell-check requests that were sent over to Google API were not processed, cached or stored and the requests themselves returned an error (code: 400) as they were flagged as “Bad Request”¹ and weren’t processed further by Google"
That’s quite misleading because how can Google API server respond by “Bad Request” without knowing what you sent to it in the beginning! The screenshot that they captured showing Google’s web service response, is actually from the web application side. The web application won’t reply to the request unless it processes the data first and then determine whether it was a valid data or not.
In fact, it’s even much worse than what they think or trying to imply. Google API servers needs a valid API Key in order to use their API web service. But in Coinomi’s case they sent the request using invalid (unauthorized) API Key which made Google API server treat the request as a bad request. This will definitely alert Google’s team to investigate the cause of the bad request and see the 12 English words separated by spaces (is that a passphrase to a crypto-currency wallet?!) and let's hope that server is not managed by a third-party or even compromised.
In other words, if Coinomi used a valid API Key then Google would have been obliged to treat the data better and would make the person who used my passphrase think twice.
Going to the next statement:
"Our engineers immediately tracked down the cause of this issue, which wasn’t a bug in our source code but instead was a bad configuration option in a plug-in used in Desktop wallets only."
Stating that this wasn't part of their "source code" is really misleading and trying to run away from the responsibility. The JxBrowser component/plug-in is bundled with Coinomi’s wallet at the source code level and you can enable/disable any undesired feature of JxBrowser from the source code. So essentially it was a feature not a bug but Coinomi have misused it and it turned into a CRITICAL security bug.
Coinomi’s team is trying to divert the community attention and blame JxBrowser for their mess. In fact, JxBrowser clearly explained the default behavior in their documentation since 2016 and how to disable it:
The original link can be found here:
To make it simple for the readers, Coinomi could have avoided the “spell check” scandal with a single line of code:
Apparently the “Code Gurus” at Coinomi didn’t have the time to read JxBrowser documentation. In fact, I’m not sure why did they use JxBrowser in the first place. Coinomi wallet core functionality is based on Java programming language and it’s already cross-platform enabled by default so you don’t need a third-party component for that. The answer is probably that they were too lazy to do the UI in Java natively and wanted a fast sloppy solution to rollout their Desktop version as soon as possible to compete against their competitors skipping the QA tests (if it exists at all!).
Now let’s talk about Google API and their terms regarding the API usage. You can find these terms in the following links:
Quoting some of their terms:
As you can see, Coinomi have already violated several terms. For example they used Google API without a valid API Key (unauthorized usage) and they didn’t inform their users about it. In other words they deceived Coinomi wallet users with the hidden “spell check” feature which uses Google API servers to check their passphrases/seeds.
Coinomi stated in their official announcement that the data they sent to Google API servers were not “processed, cached or stored”. Don’t take my words for it and let’s see what Google says in their terms:
Apparently they don’t need to change their CTO only, they also need to change their attorney.
First of all, publishing that support ticket publically is a clear violation of my privacy as a client. It contained sensitive information related to my case such as the my personal crypto-currency addresses and the destination crypto-currency addresses. These information should be only available for the authorities and the parties involved in the case.
Secondly, if my claims were false then why a “blackmailer” (based on Coinomi’s official statement) would accept to send his personal wallet “passphrase/seed” to them? If I wanted to double spend my money why would I give them my wallet passphrase/seed? I’m glad that I sent them my passphrase/seed through an encrypted channel otherwise they would have published it!
The final point is that they did not upload the full ticket and deleted the part where they confirmed that my assets were stolen and said they will start blacklisting the addresses so the person who stole my crypto-currency assets can’t utilize the assets in exchanges:
You can download the full support ticket from here (sensitive information blurred):
I will recap the events to understand why I was affirmative with my conclusion that my assets were stolen because of Coinomi wallet and not because any other reason:
With these facts it’s clear that the only wallet which got compromised is the wallet which I pasted my Exodus passphrase in and that wallet was Coinomi which had a vulnerability (a feature) to spell check passphrases/seeds with Google API servers.
The team behind Coinomi was trying very hard to mislead the community with false information. I have listed few screenshots of their tweets to show the community what sort of company they are dealing with:
One of Coinomi’s arguments in their official statement is that they had zero reports of hacked Desktop wallets and they are using it as an excuse. In fact, several reports of stolen assets were reported on Reddit. However, I will list some reasons that probably made me the first victim:
It’s seems the team behind Coinomi (especially the management) are hiding behind the shadows. I’m listing them here so that the community can always identify them if they start any new project or even rename Coinomi to “Spell Checker”. They are affecting the ecosystem of crypto-currencies in a negative way because they lack credibility and professionalism.
By my second statement and the YouTube video, I’m pretty sure that I have provided all the facts and evidences that proves my claims regarding my stolen crypto-currency assets. I also provided clear evidences that shows how Coinomi lack credibility.
I have no choice other than taking this case legally against Coinomi because they keep refusing to take the responsibility of my loss. They wanted it to do it the hard way then let it be.
My final message to the person who stole my crypto-currency assets. The case is escalating by time by time and eventually legal investigations will begin. You still have the choice to correct your mistake and return the assets to the following addresses:
ETH (including ERC20 tokens):
Further updates will be posted through social media channels (@warith2020) and if required will be posted here.