pondělí 23. prosince 2019

Život na vedlejších efektech

Znáte tu situaci, když nějaký produkt používáte způsobem, jak nebyl zamýšlen? Někdy se jeho nedostatky dokonce stanou žádoucí vlastností? Asi jako v komisku XKCD workflow:

XKCD workflow

Já to tak mám často, uvedu pár příkladů.

Kdysi dávno jsme v počítači měli disk, který nejen vydával hluk, když se točil, ale ještě k tomu vydával specifický výrazný hluk, když disk zrovna něco četl nebo zapisoval. Nový disk pak sice měl větší kapacitu, ale bohužel postrádal tuto užitečnou zvukovou signalizaci, na kterou jsem si zvykl.

Na telefonu Nokia 3120 snad nebylo možné bez odemčení kláves rozsvítit displej. Teda bylo. Stačilo napsat některé z vybraných nouzových čísel, jako například 112 nebo 911. Asi není moudré pro tyto účely používat místní nouzové číslo 112 (kdybych to omylem vytočil), ale naštěstí telefon takto z nějakého důvodu reagoval i na číslo 08. Stiskem další číslice jsem pak zrušil psaní nouzového čísla. Takže jsem používal sekcenci 080, abych zkontroloval stav telefonu. Bylo to praktické, protože 0 a 8 jsou poblíž.

Na touchpadu jsem si kdysi aktivoval emulaci multitouch. Potom systém například plochu palce bral jako dva prsty, což mi přišlo velice praktické. Bohužel jsem byl v tomto vnímání asi osamocen a novým notebookem jsem o tuto praktickou vlastnost přišel.

V autoškole jsem se naučil řídit starou Fabii 1.9 SDI skoro bez dívání na budíky. Rychlost odhadnu podle převodu a otáček. A na otáčky je tu „zvukový otáčkoměr“. Jenže, pokud budu mít relativně moderní auto, bude mít nejspíš příliš tichý motor…

Naštěstí tento problém až tak řešit nemusím. Asi vás nepřekvapí, že cílem autoškoly nebylo stát se řidičem…

pátek 4. října 2019

A non-technical aspect of security – how could I have prevented the 2014 Jabbim password leak?

The 2014 Jabbim breach has happened almost five years ago, but there is still one interesting information to reveal. It is something I am not much proud of, but we can learn from both my mistake and Jabbim's mistake.

My experience with a past vulnerability report

Some time before the breach (2013-11-21), I had reported some seemingly unrelated vulnerability. Well, it was also an SQL injection, but on a different place. Moreover, just a script crash there had some unexpected consequences:

  1. Some part of the DB remained locked.
  2. This has caused many script waiting for releasing the lock.
  3. As many web scripts were waiting, the server has reached the fork limit. As far as I remember, it was unable to serve even static files.

Maybe you can imagine what happened. Without having an idea that the status icon script is backed by a SQL database and without any bad intentions, just putting an apostrophe in the url accidentally caused an SQL injection and subsequent webserver crash.

I had good intentions, so I promptly reported the issue to admins. The reaction was like “Thank you for crashing our server. I could have been at home right now.”. Well, they fixed the issue, but my feeling from the communication was not much good.

My report of the vulnerability abused in the breach

The same day, I had also discovered another SQL injection vulnerability – in user search. That is, the same vulnerability that was abused in the 2014 breach. I also reported it, but I decided to contact another (hopefully more friendly) admin. However, I was just told about not having enough time for handling it.

So, I was about to report it to the unpleasant admin. He was offline that time, so I had to wait. When waiting, I started thinking about giving a report that demonstrates the danger but stands in limits of white-hat hacking.

However, this takes some time. As I was doing this in my free time for my fun and someone's else profit, I did not have enough time for making the report perfect. I needed to do some other duties, maybe something school-related. So, I postponed it for indefinite amount of time and you know the result… I am really sorry for that.

What could have been done better from the reporter side?

Although I would not describe me as a perfectionist, I admit I sometimes have some perfectionistic traits in a limited way. That said, I am not perfect at avoiding perfectionism. But “perfect” is an enemy of “done”. I could have opted for a trade-off – to try to make the report perfect until some deadline. Once the deadline passes, I would report it in however imperfect form.

What could have been done better from the admin side?

This is much related to the first vulnerability report.

  • Do not discourage white hats: While I understand that a vulnerability report might be something unpleasant to handle in general, they could have responded in a more kind way. I believe it was obvious I had no bad intentions and tried to behave as responsibly as possible.
  • Encourage white hats: There are some companies that even reward vulnerability reports and/or put your name to a hall of fame. If vulnerability rewards are expensive, you still can have a hall of fame, like some companies (even Google) have.
  • Have a contact for reporting of security issues. It is also a good idea to have security.txt file, but it should not be the only way to contact responsible persons. (I know, security.txt has started in 2017, so they could not have it. But today, it is a good idea to have one.)
  • When you receive a vulnerability report but you are not the right person to handle it, forward it to someone responsible as soon as possible.

středa 8. srpna 2018

Cache-friendly secure connection for websites

While commenting Eric Meyer's article about issues that HTTPS bring to Africans, I found that this should be probably also posted as an article. I am discussing how to allow better caching while keeping a reasonable level of security brought by HTTPS.

We still need secure connection, even for public static sites

I still believe we should have a secure communication everywhere; I am not 100% sure if this should be the current HTTPS.

We need secure connection even for public static sites. The reason #1 is not encryption, it is authentication. We do not want infected routers / people with Wi-Fi Pineapple / malicious to ISPs / etc. to modify webpages we see. Without some kind of secure connection, they could for example inject some cryptominers or advertisments or malware. They could also modify the content of static pages to instruct people to do something dangerous, e.g., modify recommended amount of some chemicals.

Do we always want TLS?

The way we secure our communication does not have to be today's HTTPS, though. Encryption is needed just sometimes. On public static sites, it can kind of obscure what are you looking at (e.g., attacker sees you are looking at Wikipedia, but it is not clear what page), but traffic volume analysis can often distinguish between specific pages.

How to make it better?

Let's look at some options to make it better. There will be some tradeoffs to privacy, but we will not let attackers to affect traffic in an arbitrary way, as plain HTTP would allow. Thus, we would not make the user more prone to downgrade attacks than with today's HTTPS. Our main point is allowing the caches doing their jobs, maybe a better one than with the current state of the art HTTP caches can do.

Mixed content secured by SRI

First, we could sometimes achieve a reasonable level of security even with a plain HTTP. We could have loaded some images, stylesheets and even scripts over a plain HTTP, provided they are protected by subresource integrity (SRI). I have wondered why browsers consider even SRI-protected resources as a mixed content. They are protected against modification and they do not necessarily contain anything sensitive. I don't much need to hide the fact I am downloading jQuery 1.8.1… (Today, such change in browsers can be a bit more complex if it has to be compatible with older browsers with a more strict mixed content policy. It would ideally bring something like allowplain atributte, allowing usage of plain HTTP instead of HTTPS.)

Shared cache based on hashes

With SRI, we could go a bit further. Where explicitly approved by some extra header, the browser could just match the hash for caching purposes, even if it has not ever downloaded the specific URL. As a result, we would not needlessly download dozens of exactly same copies of jQuery or Bootstrap. We could download it just once and then use the cache. While this could serve as some minor side channel that reveals information what files are already in your cache, explicit approval through some header can make it a non-issue.

Serving signed responses from caching proxy

We could also have some caches of some signed (but probably unencrypted) data. This however goes with some privacy tradeoff and new protocol to implement, but it does not give up data authentication. A cache server could return some data with expiration time and signature, even without contacting the upstream server. This is quite more complex, but still technically feasible. We cannot use TLS at this point, because TLS serves for transport layer, which we would like to intercept. The handshake could however start as a standard TLS handshake and continue with a different protocol:

Client: ClientHello, I am trying to connect through TLS to host example.com, there are my capabilities (ciphersuites). I am able to use caching proxy instead of standard TLS.
Caching proxy: Hey, I have some content for this server cached. See my non-expired approval from the server, signed by the private key of certificate holder. I am allowed to serve you some of the requests. Plus there is the OCSP response, so you know the server's certificate is not revoked. You see, the private key holder indicates there is nothing sensitive in the URL, you can send it to me.
Client: OK, there is the full URL: htttps://example.com/contact
Caching proxy: OK, there are the data authenticated by the server.

If client or server does not support such a feature, either just because it is not implemented or because they don't want this for a reason, no other party can force the communication to go this way instead of standard TLS.

  • Website owner agreement is needed: If the proxy does not have a signed and non-expired approval, it cannot force the client to reveal the full URL.
  • If the browser chooses not to use this way (e.g., because of user's decision), it can insist on a standard TLS handshake.
  • Standard TLS handshake can ne required for some blacklisted URLs (e.g., /api/*), POST requests or if some specific cookie is present. Those exceptions could be described in the initial approval.

Cache-friendly version?

I am, however, generally against making special cache-friendly sites, similar to past “wap” or “mobile” versions. If they have a different URL, it gets tricky to handle links. When I click a link from elsewhere, it does not necessarily point to the version I want. Also, force website owner not to use HSTS, which is probably not what we want.


  • UX issues: Maybe just some users will want such tradeoff, while some others will not. How to allow both of them making an informed decision?
  • None of those suggestions is enough reviewed by others. Furthermore, description of signed caches is quite vague to properly review, because I have prefered to be concise. While I have some security and crypto background, I don't think this should be implemented without any review.
  • This would require multiple parties to implement it. All the ideas require some change in browser and the website. The last one also requires important modification of the webserver and proxy. But incentives to implement this can be quite low for most people with fast Internet connection. On the other hand, the SRI enhancements are not so hard (i.e., they are much easier than extending HTTPS to some TLS alternative) and can be useful even in Europe / America on mobile connections, despite there is no proxy that can speed up loading.
  • Any change in browsers is likely irelevant for people with Windows XP or something similar. On the other hand, they could be welcome anyway if their usage don't break anything.

pondělí 19. prosince 2016

Pebble patří FitBitu. Co to přinese?

Je už oficiálně potvrzeno, že FitBit koupil Pebble, údajně za 40 milionů dolarů. Co to bude znamenat pro fanoušky hodinek Pebble?

Článek vyšel na MyPebble.cz.

neděle 11. října 2015

Můj první Spartan Race – Kouty Super 2015

Rád běhám. Mám za sebou už pár půlmaratonů (pod 1:45) a překážky taky znějí zajímavě. Přihlásil jsem se tedy na Spartan Race v Koutech nad Desnou, konkrétně na variantu Super (tj. min. 13 km a min. 20 překážek). A opravdu – Spartan Race bylo něco, co jsem do té doby nezažil. Byl to snad první závod, kde jsem předem neměl moc tušení, jestli ho úspěšně dokončím.

Před závodem jsme si zvědavě prohlíželi předpověď počasí. Ano, když jsem se hlásil, tak jsem byl určitě rád, že v říjnu asi nebude horko. Předpověď ukazovala cca 3°C – 5°C. No, horko to není. Zimy bych se nebál, kdyby nebylo zvykem mít na trase nějakou vodu – cestu potokem, podplavání překážky apod. Ale na druhou stranu, o den později, kdy na stejném místě měl být další závod (tzv. Beast, tedy delší varianta závodu), mělo být podle předpovědi dokonce pod nulou. To jsem musel okomentovat: A po nás námraza!

Nikoho z nás ale počasí naštěstí neodradilo a v sobotu jsme dopoledne šli závodit. Před závodem jsem do sebe dostal ještě nějaký teplý čaj (měl jsem trochu rýmu), což byla ten den hned první chyba – nevlezlo se do mě tolik jídla, kolik bych si představoval. Ale co se dá dělat. Před startem se nás z pódia snažili rozproudit a navodit tu správnou atmosféru. Řekl bych, že se to celkem povedlo. Před startem jsme si tam trošku zaskákali. A pak – startujeme! Vybíháme…

Prvních pár překážek bylo tak na rozehřátí. Nic těžkého, musel to dát snad každý. Hned za začátku nás poslali do sjezdovky nahoru. To byl celkem typický terén na celém tomto závodě, ale občas to samozřejmě šlo i dolů. Snažil jsem se mít tempo tak akorát a nepřepálit to, což asi byla druhá chyba, ale k tomu se ještě dostanu. Sepíšu tu pár vzpomínek z překážek. Pokusím se to psát zhruba podle pořadí.

První trošku vážná překážka byla přeručkování jakýchsi tyček. Moje ruce snesou o poznání méně než nohy, ale překážku jsem zvládl celkem bez problémů. Jen jsem se mírně zadýchal, a když mi dohlížející slečna řekla nějaké povzbudivé slovo ihned po dokončení překážky, musel jsem asi vypadat jako profesionální hráč pokeru.

Hod oštěpem. Nic zvláštního, jen mých prvních třicet angličáků. To bývá za nezdařenou disciplínu, v tomto případě jsem se oštěpem netrefil na první (jediný) pokus. Ale žádný problém, jsem svěží a běžím dál.

Pytel s pískem. Každý jsme vyfasovali velký pytel s mokrým pískem a šli s ním po sjezdovce – nejdřív nahoru a pak zpátky dolů. Na začátku jsem řekl, že nechci slyšet, kolik ten pytel váží (sám jsem hádal aspoň 10kg), vzal ho na záda a šel. Nevím, jak to bylo vysoko, řekl bych, že nekonečně. Několikrát jsem do kopce zastavoval a odpočíval. Zastavil jsem i asi tři metry před vrchem. Sice to byly jenom tři metry, ale zároveň to byly ještě tři metry. Pak následovala malá rovinka – nejjednodušší část. Člověk by řekl, že dolů to půjde snadno, ale ne tak docela. Nahoru a po rovince jsem se aspoň s pytlem mohl předklonit a být tak nějak stabilní. Dolů mi ten pytel dost bral stabilitu. Vidím to jako asi pro mě nejtěžší překážku, co tam byla. Na konci překážky jsem se zeptal, kolik ty pytle váží. Pro muže prý 20kg-25kg. Takže s pytlem jsem byl tak o třetinu těžší, možná i o víc.

Zajímavý byl memory test. Člověk si podle svého startovního čísla našel v tabulce kód a musel si ho zapamatovat. O hodně později si na to musel vzpomenout – jinak ho to stálo třicet angličáků. Já jsem s tím neměl problém. Jméno Belinda jsem si zapamatoval. V číslicích jsem našel nějaké údaje jako třeba můj ročník narození (tj. „91“). Ještě teď si vybavím „64Belinda9117“.

Brzy přišel šplh po laně. Nic až tak zvláštního, jen druhých třicet angličáků pro mě, ale stále celkem pohoda. Moment, vlastně něco ano: Na lano se začíná lézt z vody. Když pak člověk dělá angličáky, pěkně se na něj nalepí všechno to bláto. Zhruba od tohoto místa jsem taky měl občas nějaké křeče v nohách, možná kvůli té studené vodě. Zima ale nebyla, na Spartanu se člověk zahřeje.

Asi dvakrát nebo třikrát jsme měli cestu (plazení nebo válení sudů) pod ostnatým drátem. Jednou jsem dokonce pod ostnatým drátem vleže někoho „předbíhal“ (jestli se tomu tak dá říct).

Pár překážek bylo na rovnováhu. Měli jsme přechod po lávce a přechod po kůlech. S ani jedním nebyl problém. Akorát tu lávku někdo přeběhl rychle a rozechvěl celou konstrukci, tak jsem uprostřed lávky chvilku stál a čekal, než se to uklidní.

Horostěna – moje třetí sada angličáků. Trošku zbytečně, ale stále jsem měl sílu a nebyl to problém. A jen tak mimochodem, přišel jsem tady na to, že mokrý papírový kapesník si moc snadno nerozložím.

Na desátém kilometru to přišlo. Překážka nebyla nic extra náročného, měli jsme přeručkovat po madlech. Něco podobného jsem už zvládl dříve, jen tam byly železné tyče, které byly příjemnější. Ale hlavně to tehdy bylo v místě, kde jsem měl dost síly. Tady jsem to zkusil, ale cítil jsem, že mě to dost výrazně vysiluje. Angličáky se začaly zdát jako přívětivá alternativa. Kdybych se hodně snažil, možná bych tu překážku dal až do půlky, ale angličákům bych se stejně nevyhnul.

Tak začala moje čtvrtá sada angličáků. Udělal jsem jeden angličák a zjistil jsem, že té síly už moc není ani na ty angličáky. Nohy mě asi nebolely, ani nic dalšího, jen jsem prostě měl dost hlad a neměl jsem energii. Asi po dalších šesti angličácích vážně zvažuju, jestli pokračovat. Hlad byl výrazný a bylo naprosto jasné, že do cíle to lepší nebude. S sebou jsem si žádné jídlo nebral. (Hmm, příště…) Přede mnou kromě angličáků a překážek bylo ještě asi sedm kilometrů nejistým terénem. Celkem otevřeně se tu ptám: Kdybych teď skončil, za jak dlouho se dostanu k jídlu? Místo odpovědi na svůj dotaz jsem byl ale ujištěn, že už to půjde jen z kopce a překážky už „budou neangličákové“. (Přeloženo do češtiny, překážky nebudou tak náročné, aby se na nich ve velkém dělaly angličáky.) Váhám, ale nakonec se nechávám přesvědčit. Dodělám angličáky a pokračuju dál. Kamarádovi, se kterým jsem do té doby zhruba držel tempo, jsem řekl, že nemá smysl, aby na mě čekal. Bylo mi jasné, že dřív než v cíli se asi nepotkáme, a nechtěl jsem ho brzdit.

Skutečně to už jde jen z kopce. (Všímáte si té ironické dvojznačnosti?) No dobře, zas tak zlé to nebylo, z kopce se dalo i celkem ještě běžet. K čemuž při vidině jídla byla i celkem motivace. Skoro každá překážka tu byla těžká. Ani přelezení dřevěné stěny (cca něco přes 2 metry) už nebylo zdaleka tak samozřejmé jako na začátku závodu, i když to bylo pořád z těch lehčích překážek.

Jedna z posledních překážek bylo podplavání desky. Žádný hluboký ponor, ale člověk se musel celý ponořit do vody. Po vynoření jsem ze sebe okamžitě sundal funkční mikinu, která poněkud nasákla vodou a pekelně studila. Ale pak dobrý, pohybem jsem se zahřál.

Prakticky poslední překážka byla pavučina z lan, kterou měl člověk přelézt. Nahoru to šlo snadno a dolů… Dolů by to mohlo jít ještě mnohem rychleji. Na pavučině bylo mnoho lidí současně, dost se to hýbalo. Sil moc nezbývalo a riskovat, že to dolů půjde ještě mnohem rychleji se mi opravdu nechtělo, i kdybych náhodou spadl na tu správnou stranu. Asi sto metrů před cílem tedy dělám pátou sadu angličáků. Sice jsem v tom nebyl úplně sám, ale šlo o jedinou vyloženě neangličákovou disciplínu, kde jsem dělal angličáky. Šlo to pomalu, ale nějak to šlo. Uff, a hurá do cíle! Už jen kousek potokem, přeskočit malý oheň a jsem v cíli. Čas nic moc, ale cokoli lepšího než DNF beru.

V cíli teprve začala zima. A tedy taky menší dilema – mám se prvně převléct, nebo najíst?

Můj první Spartan Race byla určitě zajímavá zkušenost a i nejedno ponaučení. Dost jsem podcenil dobu trvání, takže jsem neřešil jídlo na cestě. Taky kdybych to na začátku trošku víc „osolil“ (nohy by to patrně zvládly), mohl mě hlad dostihnout až o něco později. Což by se mi vyplatilo hned dvojnásobně – hlad zde vytváří jakousi pozitivní zpětnou vazbu: hladovému všechno trvá déle, ale o to je pak člověk hladovější. Určitě by pomohlo taky pití (hádám, že by to stálo za tu trochu zátěže), ale nepřišlo mi to jako až tak krizové. Na Super jsem byl vlastně vybaven spíš jako na Sprint (kratší varianta závodu). Hodilo by se taky posílit ruce, ale to vím už delší dobu. Příště můžu dopadnout lépe. Určitě toto nebyl můj poslední Spartan Race. Chtěl bych jít na Super nebo Sprint. Varianta Beast má zatím ještě čas.

Za dva týdny jdu na něco vyloženě odpočinkového – na půlmaraton.

úterý 2. června 2015

Review of Crypto library in Play! framework

I'd like to discuss the crypto library security and purposes, namely encryptAES and decryptAES methods. I find it easy to misuse the library. Moreover, recent 2.4 update changed some security properties. That is, some previously insecure usages are secure now, but also some previously secure usages are insecure since 2.4. This means users of Crypto library should consider the security impact before migrating to 2.4.

What has been changed?

The ECB mode has been replaced by CTR mode. I'll quote a misleading claim from the official documentation: The CTR mode is much more secure than the ECB mode.

The ECB mode is non-recommended in general, so this might look like a good decision at first sight. While the CTR mode can be more secure if properly used, it has some different pitfalls. Because some of these CTR mode pitfalls are not present in ECB, some previously secure code might become insecure.

There are some more changes, e.g. better entropy of key (higher effective key size). The old Crypto library uses first 16 characters of a string key (i.e. application.secret by default) as a key, which is wrong, especially when the string (application.secret) is hexadecimal (⟹ 64b effective key size) or so.

The new Crypto uses a hash function for deriving the key, which is much better. A PKDF would be even better for some purposes, but even now I don't see any significant issue with the new key derivation approach. (But it depends on usage! I'll discuss it later.)

What might be wrong for some usages?

Unlike ECB, the CTR mode is a stream cipher mode. Stream ciphers have usually two issues that are not present in ECB mode:

  1. Malleability. This one is not specific for stream ciphers, but stream ciphers are ultimately malleable. An adversary without the secret key can modify the cryptotext to mean something different. For more details on malleability, see the related Wikipedia article.
  2. Insecure when a key+IV is reused. If you, use one key with the same IV twice, some details about both plaintexts are leaked, potentially revealing both of them. See Reused key attack for more details.

The malleability can be mitigated by authenticated encryption, but Play! does not it implicitly. This would be correct for a completely new API if this was mentioned in the documentation. In Play!, the Crypto API is not completely new (so one might consider it as a BC break with some bad security implications) and the documentation even don't mention it.

The key+IV resuse attack (“keystream reuse attack”) can be mitigated by using random unpredictable IVs. The documentation is unclear about usage of IVs. It just states that both using an IV and not using an IV is supported, but it is not clear what is the default.

What else is wrong with the documentation?

I've found also some relict in documentation, ECB doc relicts. It is a minor issue: The documentation just states that some usage is insecure, although the issue is not true for CTR mode. See my comment on the related GitHub issue

What/who is the Play! Crypto library intended for?

A proper mode of operation must be selected for ensuring desired level of security for desired type of usage. There are various properties that can be considered neither good nor bad without defining the correct usage. I am also not sure if the library is intended for crypto-newbies (it is easy to use it wrong for them) or crypto-experts (they would want to choose the mode of operation themselves).

In addition to two CTR-related issues mentioned above, it is questionable if PKDF should be used. It is unneeded in some cases (e.g. if the key is application.secret), but it is welcome if you are using a potentially weak password (e.g. user password), because they slow bruteforce attacks down by some factor.

Well, I admit one can configure the mode. But I don't think that global config (i.e. play.crypto.aes.transformation config option) is a good idea. It is generally unclear what code is affected by changing this property. Is some library code affected? I don't know until I analyze all the libraries I use.

I'd like to hear answer to the question from the developers. It should be also noted in the documentation. Without it, one might assume that almost any behavior is OK.

Why do I disclose it publicly?

I respect responsible disclosure objective, but I don't think that keeping this issue private makes any sense now, especially when 2.4 is fresh. I feel it is better to warn programmers that they should think twice between 2.3 ⟶ 2.4 migration if they are suing Play! Crypto library.


If you wish to discuss it, you should do so in the discussion thread on play-framework user group. Comments under this article are closed in order to prevent two separate discussions.

pondělí 23. února 2015

Password protection for purchases in Google Play can be bypassed. (And some other issues.) How to defend yourself?

Google Play allows you to buy apps, books and music. Once you enter a payment method, (e.g. payment card or carrier invoice), it is saved, so you can use the same payment method in the next purchase. Google offers password protection for that. It sounds great, but it can be bypassed. We actually don't have an additional security, but an unkept promise, which may have the opposite effect – the user might rely on the security enhancement, which does not work correctly.

There is an extra issue for users with multiple Android devices. The thief of one device can install apps on the other devices of that user. I'll also mention another related issue, but the last one is fixed.

This is just a warning about security issues, not a manual for the abuse.

This article is a translation (with minor modifications) of my recent article. I am sorry for the delay, I hoped to release this article sooner.

Google will not fix it.

Well, there were also some related issues in two-factor authentication, but Google fixed them quickly after they were reported. Google however refused to fix two Google Play related issues I will talk about.

By the way, Google has paid a bug bounty and listed me in the Hall of Fame, but they said they were happy with the current situation.

Where is the merit of the issue?

Google Play allow us to purchase some content using the Google Play application for Android, which is usually password protected. I haven't looked in the details of password verification, but I hope this is designed correctly. However, this is not the only way I can buy an item in Google Play. I can also use the web interface on https://play.google.com/. The web interface does not require the password for buying an item.

Moreover, the attacker does not need the victim to be logged in a Google account in a browser on the stolen device. Once the Google account is present in the device (which very likely due to the connections to the Android ecosystem), we can use the account also in a web browser. We just need a tool, which is often pre-installed in Android devices. I am talking about Google Chrome for Android, which suggest the attack when you are on the Google login page:

Well, it is unclear from the screenshot if there is a real attack possible. For example, Google might consider this login method to be something inferior, so Google would ask for password when buying an application. This is, however, not the case. Google allows you to use this passwordless login for buying apps without knowing the password.

There is one more issue. The attacker can install any application (paid or free) on other devices of the victim. For example, If you have your tablet stolen, the thief might abuse this feature for spying your phone.

How could Google fix it?

I've suggested some countermeasures:

  • Remove the passwordless login feature. This would surely mitigate these attacks, but it costs too much of user convenience and there are some more convenient ways.
  • If user uses the passwordless login, the Google Play webapp would require the user's password for any application installation request. If user logs in with the password, Google would allow installing apps without entering the password again.
  • The password would be required always when the user purchases some item in Google Play.
  • Some combination of the above. My preferred approach is asking for password when user buys an item (regardless the authentication method) and asking for password when installing any application (either paid or free) on a remote device using the passwordless login feature. However, when user uses, say, Firefox for Android, so he can log in only with the password-based authentication, he would allow the attacker to install any free application on other devices of the victim.

How can I defend myself?

First, when you lose an Android device, you should change your Google account password as soon as possible. (I also recommend changing all the passwords of other affected accounts, not just the Google account.) This performs a remote logout on the Android devices.

Screen lock might help, but it can be bypassed in general. In some cases, it might be very easy, e.g. on phone with enough access to recovery. In some cases, it might be hard, but one can disassemble the phone and directly access the flash memory. (Well, this extreme case is hard and might not be worth the cost.) Nevertheless, screen lock is likely to discourage some people.

Remote wipe tools can also help, but they should not be a primary countermeasure for this issue. First, I advise you to change the password regardless of remote wipe tools, because you can never be sure if you have it done in time. Moreover, I am not aware of any secure delete functionality in Android remote wipe tools. Of course, when you change the password, there might be still some other reasons for doing a remote wipe, so I don't suggest remote wipe tools to be useless. They are useful, but you should not rely on them too much…

And of course, the best countermeasure is not having your device lost :)

Issues outside the Google Play

Of course, there are some other parts Google ecosystem affected by passwordless login.

Two-factor authentication

There are some apps (e.g. Android) not supporting the two-factor authentication, so Google allows you to generate an application-specific password for these purposes. In order to generate an application-specific password, you have to re-enter your password, which is good. However, it used to be enough to use the password-less authentication in Android for generating new application-specific password. This could be abused by a thief of an Android device for having an access to the account even after the user changes the password.

Well, Google sends an e-mail when user generates a new application-specific password, but the attacker is very likely to have access to his GMail account, so he can easily delete it.

It is worth noting that this used to be also an issue for Android non-users. An adversary was able to abuse this feature for cloning an application-specific password and use the cloned one even after the old one is revoked. Some social engineering (like choosing a good name for it) might be needed for successful attack.

Fortunately, this issue was fixed quickly after I reported it.

Access to history and some other more protected data

Google tries to protect some data more than others. For example, when you go to https://history.google.com/, Google is likely to require your password even if you are logged in. The passwordless login seems to weaken this extra protection. Google sees this to be just a feature, not a bug. You can see the history data by using Google Search app. So, mobile devices (including tablets) seem to have a different security policy from desktops. It might be confusing, but we should be aware of it.