Tweets by @buherablog
profile for buherator at IT Security Stack Exchange, Q&A for IT security professionals

A BitBetyár Blog

Túljártál a nagyokosok eszén? Küldd be a mutatványodat! (e-mail a buherator gmailkomra jöhet)

Full-Disclosure / Névjegy / Coming out


Promó

H.A.C.K.

Címkék

0day (110) adobe (87) adobe reader (21) anonymous (26) apple (60) az olvasó ír (49) blackhat (20) botnet (22) bug (200) buherablog (44) buhera sörözés (39) bukta (49) deface (38) dns (22) dos (29) esemény (82) facebook (26) firefox (64) flash (33) gondolat (31) google (59) google chrome (36) hacktivity (37) hírek (117) incidens (224) internet explorer (88) iphone (35) java (50) jog (22) kína (21) kriptográfia (68) kultúra (21) linux (24) malware (43) microsoft (142) móka (48) mozilla (23) office (26) oracle (40) os x (43) patch (197) php (20) politika (31) privacy (58) programozás (22) safari (34) sql injection (62) windows (85) xss (77) Címkefelhő

Licensz

Creative Commons Licenc

Apache Struts sebezhetőségek

2012.01.06. 18:57 | buherator | 3 komment

Az Apache SF nem rég kiadta a Struts keretrendszer legfrissebb, 2.3.1-es változatát, amely több kritikus, akár kódfuttatásra alkalmas hibát orvosol. Ezekről részletes leírást adott ki a SEC Consult illetve szintén értékes információkhoz juthatunk velük kapcsolatban Johannes Dahse blogjáról. Nézzük hát, mik voltak a problémák, és hogyan lehetett őket kihasználni!

 A Strust keretrendszer az OpenSymphony XWork és OGNL könyvtárait használja. Az XWork-ről őszintén szólva semmi épeszű dokumentációt nem találtam, de nekünk most elég, ha annyit tudunk róla, hogy ez adja a Struts gerincét és néhány biztonsági beállítást ezen keresztül kell eszközölni. Az OGNL egy egyszerű, Java kódra leképződő nyelv, melyet a HTTP paraméterek értelmezéséhez használnak. A "product.id=1" OGNL kifejezés például a getProduct().setId(1) Java utasítássá alakul, de alapjáraton tetszőleges metódus, konstruktor és adattag hozzáférhető segítségével.

Alapjáraton, ugyanis a Struts megtiltja a statikus és nem statikus metódokhoz történő hozzáférést, emellett pedig egy fehérlistát is alkalmaz a paraméternevek szűréséhez:

acceptedParamNames = "[a-zA-Z0-9\\.\\]\\[\\(\\)_'\\s]+";

Az első probléma ott jelentkezik, hogy utóbbi fehérlistát egyszerűen nem alkalmazzák a Struts CookieInterceptor osztályában, ezért a kódfuttatás nagyjából triviálisan elérhető, ha engedélyezett a sütik nevének feldolgozása. Először engedélyeznünk kell a statikus metódusokhoz történő hozzáférést az XWork allowStaticMethodAccess tulajdonságán keresztül, majd meghívhatjuk a szokásos exec()-t:

Cookie: (#_memberAccess["allowStaticMethodAccess"]\u003dtrue)(x)=1; \ x[@java.lang.Runtime@getRuntime().exec('calc')]=1

Ez eddig laza volt, de lássuk, mi a helyzet akkor, ha a süti nevek értelmezése nincs beállítva! Ilyenkor meg kell küzdeni a fehérlistával, hogy URL-ben is tudjunk kung-fuzni. Mint kiderült, ez sem teljesen lehetetlen, mivel megadott karakterkészlettel setter metódusok hívhatók:

name=foo
x[name('foo')]=1

sőt, konstruktorok is, melyeknek egyetlen String paraméterük van:

x[new java.lang.String('foo')]

Innen már csak egy lépés, hogy tetszőleges fájlt létrehozzunk (vagy kiüssük a tartalmát). Az egyetlen baj, hogy a könyvtárstruktúrában nem tudunk mozogni a karakterkészlet megkötései miatt. Ezek a megkötések azonban csak a paraméternevekre és nem az értékekre vonatkoznak :)

x[new java.io.FileWriter(message)]=1&message=C:/test.txt

Ha esetleg valaki nem látná meg a lehetőséget egy egyszerű fájllétrehozásban: ilyen módon remekül gajra lehet vágni a rendelkezésreállást (kinullázod a servleteket vagy a konfigokat), kis szerencsével az integritás is megborítható, például ha fontos üzleti adatok leledzenek az alkalmazásszerver által hozzáférhető fájlokban (meg persze a naplók törlése sem mindig haszontalan), de a csillagok kedvező együttállása esetén akár kódfuttatás is elérhető (2. oldal, 1. hiba - ez itt a reklám helye :).

Johannes szerint a fenti módszerrel elméletileg akár írni is lehet a fájlokba, de megoldást nem közöl, a probléma továbbgondolása tehát ránk marad. Emellett érdemes lehet annak is utánajárni egy kicsit, hogy milyen elterjedt projektek használják még ezt a remek OGNL könyvtárat - az Apache kódjait nem amatőrök fejlesztik, máshol ennél csak gyengébb korlátozásokra számíthatunk!

A SEC Consult jelentése a fentieken túl még két hibára tér ki: Az egyik a Struts régebbi változatait érinti, és abból adódik, hogy a paraméterfeldolgozás közben keletkező kivételek kezelésekor a paraméter értékek is OGNL kifejezésként értelmeződnek, melyekre az itt tárgyalt korlátozások egyálalánnem vonatkoznak. A másik probléma debug módban hagyott alkalmazásokat érint, ilyen esetben a debug paraméteren keresztül elérhető a DebuggingInterceptor, mellyel ugyanazt lehet eljátszani, mint a CookieInterceptorral.

Címkék: java bug apache struts ognl xwork

Kommentek:

A hozzászólások a vonatkozó jogszabályok  értelmében felhasználói tartalomnak minősülnek, értük a szolgáltatás technikai  üzemeltetője semmilyen felelősséget nem vállal, azokat nem ellenőrzi. Kifogás esetén forduljon a blog szerkesztőjéhez. Részletek a  Felhasználási feltételekben és az adatvédelmi tájékoztatóban.

wec 2012.01.06. 22:00:24

"gallyra lehet vágni" >>> "gajra lehet vágni"
index.hu/kultur/korrektor/gaj/

dr poljakov 2012.01.08. 07:40:45

"XWork-ről őszintén szólva semmi épeszű dokumentációt nem találtam, de nekünk most elég, ha annyit tudunk róla, hogy ez adja a Struts gerincét"

Ha kívülről nézném, akkor azt mondanám, ez minősít az egész Struts-ot. És még azt is mondanám, hogy ha ilyen "igényesen" dokumentált a cucc, akkor mi a francot csodálkozunk, hogy kritikus sebezhetőségek vannak benne. Ja, hogy profik fejlesztik? Akkor már értem.

Summa summarum: kit érdekel?! :/

synapse · http://www.synsecblog.com 2012.01.25. 20:54:22

dr poljakov: Szerinted akkor mi is a megfelelo software es a fejlesztoi dokumentacio mivel is konnyiti meg az auditot?