Vše začalo v pátek, kdy @homakov vytvořil issue request, ve kterém navrhoval změnit standardní nastavení Active Record v Rails tak, aby vyžadoval od programátorů whitelist na Mass Assignmentu.
Jedná se přesně o to, co se řeší v PHP už velice dlouho – kontrola dat, které dostává skript od uživatelů ve formuláři. V Active Recordu (= „Doctrine pro Ruby“) můžete nastavit všechny parametry jednou metodou. V podstatě jde o to, že v rámci Ruby on Rails většina programátorů dělá v controlleru:
# save user data Users.find(params[:id]).update_attributes(params[:user])
Pokud v rámci modelu Users nemáte nastaveno attr_accesible, pak můžete nastavit jakýkoliv parametr modelu, včetně (například) administrator.
Homakov reportoval issue, pohádal se s vedoucími developery Rails, a ti se nechali slyšet, že výhody standardního nastavení (kdy attr_accessible není použito) vyvažují jakékoli nevýhody plynoucí z vynucení. Homakov byl přesvědčen, že problém má ve skutečnosti obludné rozměry, a začal si hrát s Githubem, který je nad Ruby on Rails postaven.
V rámci přesvědčování Rails dev týmu vytvořil issue I’m bender from future, který byl založen v roce 3012. Udělal to jednoduše – ve firebugu přidal <input type="hidden" name="created" /> a, ke svému vlastnímu překvapení, zjistil, že to funguje. Proof of concept zaslal Githubu v pátek, a GitHub chybu ihned opravil.
Rails tým reagoval slovy „good one.“
Homakov pokračoval v experimentech. Napsal komentář jménem DHH (jeden z hlavních vývojářů Rails.) To byla docela legrace.
Potom mohl vymazat obsah jakéhokoliv příspěvku. To už nebyla sranda, to bylo docela nebezpečné.
Pak zjistil, že může přiřadit svůj SSH klíč k jakémukoliv projektu. Jackpot.
Rails tým stále ignoroval Homakovův požadavek i informace o závažnosti problému. Nakonec se tedy rozhodl, že udělá push do master větve ruby on rails. Nic nerozbil, jenom přidal jeden soubor a problém poté reportoval Githubu.
O github mu nešlo – šlo mu o standardní politiku Rails, která vede k bezpečnostním dírám. Github vydal roztomilé prohlášení, kde se rozplývají nad tím, jak problém proaktivně zjistili, smazali dotyčný SSH klíč a suspendovali účet tomu, kdo na exploit přišel.
Dozvuky
Rails komunita se okamžitě rozdělila na dva tábory – jeden tleskal, druhý Homakova odsuzoval. Faktem je, že i když mohl přistupovat k jakýmkoliv repozitářům, jediné, co udělal, bylo, že commitoval do rails/master. Mohl se přitom dostat k repositories, která jsou private, mohl tímto způsobem dělat s celým githubem, co by se mu zlíbilo. Na druhou stranu problém „prachsprostě využil“ a neoznámil jej nejdříve Githubu. Osobně si myslím, že udělal správnou věc – kdyby ho oznámil, díra v Rails aplikacích leží dodnes.
Hodinu po zmíněném pushi do masteru upravil Rails tým generátory tak, že je standardní politika restriktivní. Veškeré argumenty, které celou dobu stavěli proti, najednou ignorovali.
Dosah celé věci je mnohem závažnější, i když není vidět na první pohled – takto způsobenou díru obsahuje Posterous, Scribd, Speakerdeck a řada dalších služeb. A jedná se i o firmy, které mají velké finanční zázemí a mají dobré vývojáře! Popadaných webů bude v tomto týdnu asi nemálo. Máme se na co těšit, zatím je to docela show.

Nejsmutnější na celé věci je, že o chybě se ví minimálně od května 2007. A o celých pět let později to využije devatenáctiletý mladík k tomu, aby dokázal Rails týmu, že se jedná o skutečný problém.
Oprava bezpečnostní díry
Nejsem Ruby developer, a tak vás odkážu na tento článek. V podstatě by mělo do všech modelů stačit doplnit parametr attr_accessible, jak je vysvětleno v dokumentaci. Pokud jste o něm nikdy neslyšeli, nechtěl bych teď být ve vaší kůži.
Další čtení
- GitHub and Rails: You have let us all down.
- What’s New in Edge: Scoped Mass Assignment in Rails 3.1
- Public Key Security Vulnerability and Mitigation (github)
- Responsible Disclosure Policy (github)
- Github is classy
- How Homakov hacked GitHub and the line of code that could have prevented it


Přehled komentářů