Javította a biztonsági hibát a LastPass
A böngészős kiegészítőbe a JavaScript hiányos dokumentációja nyomán került sebezhetőség. A Project Zero is közreműködött a javításban, meglepő gyorsasággal sikerült megoldani a problémát.
A hétvégén elkészült a LastPass-sebezhetőség javítása, azt a cég már ki is adta a felhasználóknak, a böngészős beépülő pedig automatikusan frissült kliensoldalon. Ezzel a cég roppant gyorsan, mindössze néhány nap alatt javította a Google Project Zero által jelzett hibát, bőven a biztonsági kutatók által szabott (meglehetősen önkényes) 90 napos határidő előtt. A javítás kiadásával immár publikus a hiba és az arra adott megoldás is, JavaScript-fejlesztőknek tanulságos lehet annak tanulmányozása.
Korábbi cikkünk a témában itt érhető el.
Lássuk a szaftos részleteket
A sebezhetőség a LastPass kliensoldali részében, a böngészőbe épülő plugin kódjában volt. Ez tette lehetővő (hipotetikus) támadók számára, hogy ha sikerült a felhasználót egy megfelelően preparált weboldalra csábítani (phishing vagy más támadással), akkor hozzáférést nyerjenek a számítógéphez (távoli kódfuttatás) vagy ellopják a felhasználó LastPass szolgáltatásban tárolt jelszavakat. Fontos tehát, hogy nem a LastPass backendje volt sebezhető, és az (elvi) támadás csak felhasználóként működött volna - tömeges adatlopásra, az adatbázis teljes lemásolására nem adott elméleti lehetőséget sem.
A LastPass böngészős beépülője viszonylag egyszerű feladatot lát el: megnézi az épp betöltött weboldalt és bejelentkezési mezőket keres rajta. Amennyiben ilyent talál, azt kis LastPass-logós gombokkal jelöli meg, ezeket megnyomva hívható elő a szolgáltatás. Ez a gyakorlatban azt jelenti, hogy egy weboldal kontextusában egyszerre fut a beépülő megbízhatónak számító JavaScript kódja és a weboldal saját JS-e, utóbbi hagyományosan megbízhatatlanként, ellenségesként jelölve.
Ez biztonságos...
A két világot a böngészők szigorú izolációval választják el egymástól, ez teszi lehetővé, hogy azonos DOM-on dolgozzanak a programok, miközben nem férhetnek hozzá egymás belső változóihoz, függvényeihez, stb. Esetünkben ez az izoláció teszi lehetővé, hogy a LastPass scriptje ki tudja tölteni az űrlapot, az űrlap viszont nem tudja tetszőlegesen kiolvasni a jelszavakat a helyi tárolóból - legalábbis elvben.
...ez pedig nem.
Ahhoz ugyanis, hogy egy változó biztonságossá váljon, deklarálni kell azt - az "undefined" változókra az izoláció ugyanis nem vonatkozik. Ez kevéssé ismert tény, a JavaScript illetve a böngészők izolációs implementációjának dokumentációja sem tér erre ki - a LastPass fejlesztői sem voltak tisztában vele. Az eredmény: a beépülő által használt kód több ezer helyen használ undefined változókat, megannyi belépési pontot teremtve ezzel a támadók számára ahhoz, hogy a telepített LastPass bináris belső API-jához hozzáférjenek, ezáltal akár távoli kódfuttatást, akár a jelszavakhoz való hozzáférést elérve.
A hiba kijavítása ezért első látásra rendkívül időigényes: kézzel vagy valamilyen megbízható eszközzel végigfésülni a kódbázist és megtalálni minden egyes esetet elképesztően nagy feladat, amire alapesetben könnyen ráment volna a Project Zero által adott 90 napos türelmi idő jelentős része. Szerencsére volt ennél elegánsabb megoldás, a zerós csapat egyik tagja, Jann Horn ötlete egy proxyt iktat a kódba, ami segít globálisan megoldani a problémát.
A végső javítás végül ennek és számos más védelmi mechanizmus kombinációjával el is készült, a hétvégén automatikusan frissítette a LastPass az érintett beépülőket, az internetre kapcsolódó böngészők ezt már le is töltötték-telepítették időközben.
Automatikusan frissült.
A Gitlab mint DevSecOps platform (x) Gyere el Radovan Baćović (Gitlab, Data Engineer) előadására a november 7-i DevOps Natives meetupon.
A hiba felismerése óta egyébként Ormandy megvizsgálta a népszerűbb böngészős beépülőket és sok helyen visszaköszön a fenti probléma. Komoly biztonsági problémára azonban nem talált, a beépülő működését sikerült megzavarni, eltörni a betöltött oldalt vagy kivételt dobni - ezek pedig nem jelentenek érdemi kockázatot. Az eredeti dokumentációs probléma ettől még fennáll, így Ormandy jelezte, hogy a böngészőgyártókkal is felveszi a kapcsolatot annak érdekében, hogy ez a speciális eset jobb definíciót kapjon, illetve felmerült az is, hogy a window[id] hozzáférését is érdemes korlátozni, ez ugyanis a lapon futó scriptek munkájához nem szükséges.
További részletek a Project Zero leírásában gyakorló JavaScript-fejlesztőknek itt érhető el, a LastPass sterilebb, de a végfelhasználók számára olvashatóbb szövege itt található.