Egy régi téma aktualizált változata jelent meg nem olyan régen a heise-online-on, most pedig végre van egy kis időm, hogy összefoglaljam nektek a cikk tartalmát. A probléma az Internet Explorer 7-es (legfrisseb stabi)l változatát, valamint néhány korábbi verziót érint, és lehetővé teszi, hogy speciális tartalmú képeken (valójában elméletileg minden HTML oldalba beágyazódó objektumra működhet a megoldás) keresztül pl. JavaScript kódot futtassunk az áldozatok böngészőjében. Ilyen módon valószínűleg sok olyan tartalommegosztó szolgáltatáson keresztül propagálhatók kártékony kódok, melyek elvileg minden elvárható szűrést elvégeznek a rájuk feltöltött tartalmakon.
Mielőtt a konkrét problémára rátérnénk, célszerű tisztába kerülni azzal a ténnyel, hogy nincs szükségszerű összefüggés egy fájl kiterjesztése és formátuma között. Amikor egy böngésző letölt valamilyen webes tartalmat, alapesetben a következő információk alapján döntheti el, hogy az érkező bitsorozatot hogyan dolgozza fel:
- A webszerver által HTTP fejlécben visszaadott Content-type mező értéke alapján - ez a MIME típus.
- A szintén HTTP fejlécben kapott fájlnév kiterjesztése alapján
- A fájl (pontosabban boundary) tartalma alapján
Az utolsó lehetőség nyilván egy igen erőforrásigényes feladat lenne, ha a fájl egészét akarnánk vizsgálni, ami rosszat tenne a felhasználói élménynek, ezért a böngészők általában csak a fájlok első néhány bájtját (az ún. aláírást) vizsgálják, ahol a szabványok amúgy is előírják bizonyos azonosítók használatát (pl. 0x89504e47... a PNG formátum esetén). Emellett az Internet Explorer 4-es verziójától kezdődően a böngésző mind az első 256 bájtot csekkolja biztos ami biztos alapon, ez a MIME sniffing.
A MIME sniffing segítségével egyrészt felül lehet kerekedni a rosszul konfigurált webszerverek hülyeségein (rossz MIME típus jön vissza stb...), másrészt ez a módszer védelmet nyújt a böngésző automatikus futtatási mániáit kihasználó támadásokkal szemben is. Ugyanakkor ez az a tulajdonság ami a mi kis bajunkat is okozza.
Hatékonygái okokból mind a 256 bájt akkor kerül ellenőrzésre, ha a Content-Type, a kiterjesztés és az első néhány bájt különböző fájltípusra utal (valamint a fájlt közvetlenül érjük el, de ez most nagyjábl mindegy). A fájltípusok közül pedig - végtére is egy webböngészőről van szó! - a HTML van előnyben részesítve. Így ha sikerül zavart okoznunk az Erőben, azaz a fenti három adat közül valamelyik kettő különbözik, és az első 256 bájt valamilyen HTML-szerű karaktersorozatot is tartalmaz, a böngésző az objektum renderelése helyett le fogja futtatni a benne rejtőző kódot.
Íme egy példa a heise-től, melyben egyszerűen lecserélték a PNG formátumú fájl kiterjesztését .jpg-re, az aláírás maradt változatlan, így viszont az állomány elején - méghozzá a szabályos PNG fejléc részeként - található rövid HTML kódot annak rendje és módja szerint lefuttatja az arra nyitott böngésző.
Az IE 8 meg fogja oldani a problémát a MIME sniffing kikapcsolásával, valamint néhány zárt header bevezetésével. Azok a fejlesztők, akik nem szeretnék hagyni, hogy ilyen úton kerüljön káros tartalom az általuk készített rendszerekbe, jó ha beraknak néhány plusz ellenőrzést a feltöltött fájlok tartalmára vonatkozóan: például a már említett aláírás és a kiterjesztés összehasonlításával, vagy az első 256 bájt HTML tartalomra való ellenőrzésével* vehetjük elejét a problémának.
Remélem tartamlasan szórakoztatok, ha midnen jól megy, lesz még hasonló nem sokára!
*Jó ötlet lehet még a fájlok automatikus konvertálása (ahogy azt az Indafotón is csinálják ;), de ez természetesen nem alkalmazható minden esetben.