A Spotify egyik felhasználója fórumbejegyzésben hívta fel a közösség (és a fejlesztők) figyelmét, hogy tetszőleges felhasználói fiók felett át lehet venni az irányítást. A történet a Unicode karakterek kezelésével volt összefüggésben, a Spotify ugyanis úttörő módon megengedi a nem-ASCII karakterek használatát a felhasználónevekben. A támadás valahogy így nézett ki:
- Vegyük az áldozat felhasználónevét - az eredeti példánál maradva legyen ez a példában a bigbird
- Generáljunk egy új, unicode felhasználónevet valahogy így: ᴮᴵᴳᴮᴵᴿᴰ
( u’\u1d2e\u1d35\u1d33\u1d2e\u1d35\u1d3f\u1d30′) - Kérjünk jelszóemlékeztetőt az új fiókra
- A jelszóemlékeztető e-mail megérkezik a címünkre, de az abban szereplő link már bigbird jelszavának megváltoztatására szolgál
És hogy mi okozta ezt a furcsa hibát?
A Spotify a regisztrált felhasználóneveket kanonizálja, vagyis úgy alakítja át, hogy a kanonizált formában eltűnjenek az eredeti forma apró különbségei, melyek az adatok felhasználása során problémát okozhatnak. Például nem regisztrálható olyan felhasználónév, melynek kanonizált alakja már regisztrált, elkerülendő például a bigbird és Bigbird felhasználók összekeverését.
A Spotify különböző alrendszereiben gyakran kanonizálták a felhasználóneveket, abban a tudatban, hogy a művelet idempotens, vagyis egy bemenetet többször kanonizálva mindig ugyanazt az első kanonizált alakot kapjuk - így nem kell odafigyelni, hogy két modul együttműködésekor az interfészeken közlekedő adat milyen formában érkezik.
Esetünkben azonban ez nem volt így, a felhasznált Twisted könyvtár ugyanis a Python egyik API-jának megváltozásának következtében nem idempotens kimenetet adott:
>>> canonical_username(u'\u1d2e\u1d35\u1d33\u1d2e\u1d35\u1d3f\u1d30') u'BIGBIRD' >>> canonical_username(canonical_username(u'\u1d2e\u1d35\u1d33\u1d2e\u1d35\u1d3f\u1d30')) u'bigbird'
A regisztrációkor illetve a jelszóemlékeztető küldésénél a felhasználónevek egyszer kerültek kanonizálásra, míg a jelszó kiütésénél kétszer, így a támadás 4. lépésében más felhasználóval dolgozott a rendszer mint az előző háromban.
A Spotify élvezetes blogposztban foglalta össze a hiba feltárását, valamint a javítás folyamatát, melyben néhány hasznos tanulságot is összegeztek, ezek az én interpretációmban valahogy így szólnak:
- Megfelelő bemenetellenőrzéssel a problmának elejét lehetett volna venni
- A Unicode nehéz, és sokszor még az elterjedt könyvtárak sem kezelik jól
- Nem érdemes nekimenni a hibát feltáró felhasználónak, hiszen hasznos információkkal szolgálhat a probléma megoldásához. A tárgyalt hibát bejelentő felhasználót a Spotify ingyen hónapokkal jutalmazta
- Néha a verziófrissítés is bevezethet új hibákat.