fredag 30 juli 2010

Säkerhet i GWT

Google Web Toolkit (GWT) låter utvecklare bygga klienttunga webbapplikationer i Java. De kompileras sen till effektiv JavaScript. Frågan är dock om utvecklare känner till vad som händer under huven och hur det påverkar säkerheten? Spider Labs har rotat i den frågan.

Genererad JavaScript
GWT kan generera JavaScript i tre varianter – pretty, detailed och obfuscated. Pretty är helt enkelt trevlig, läsbar kod lämplig under utveckling. Detailed är JavaScript med identifierare som återger exakt vad det var i Java, t ex klassnamn med hela pakettillhörigheten. Inte lätt att läsa men väldigt informativt.

Obfuskering är påslaget default (stäng inte av det för produktionskod) och görs på följande sätt:
  • Variabel-, klass- och metodnamn är förkortade (aa, ab, ac, … zx, zy, zz …)
  • Statiska strängar flyttas till globala variabler
  • Onödig whitespace tas bort
  • Alla funktioner sorteras i storleksordning. Det är oklart varför men enligt Google kan det ge bättre kompression när koden skickas över nätet.
Relativ kodstorlek:
100 % obfuscated
200 % pretty
700 % detailed

Inga privata metoder
En liten detalj värd att notera är att privata metoder inte längre är privata i den genererade JavaScript-koden. Det har inga egentliga säkerhetsimplikationer men pekar på det faktum att Google har prioriterat prestanda och komprimerad kod framför att bibehålla maximalt med egenskaper i konverteringen till JavaScript. Det verkar alltså inte använda Crockfords designmönster Module Pattern som möjliggör privata metoder JavaScript.

Enligt Spider Labs så hittas de flesta säkerhetsfelen i webbappar i rpc-gränssnitt (remote procedure call). Se därför dina rpc-anrop som http-request och säkra dem på samma sätt (autentisering, csrf-skydd …).

Deobfuskering av genererad JavaScript
För en attackerare eller pentestare är det naturligtvis intressant att få klientkoden i ett läsbart skick. Spider Labs har därför byggt en deobfuskator – REGWT – utifrån Mozilla Rhino. Den intressantaste delen i deobfuskeringsprocessen är hur de återskapar metodnamn genom metodsignaturer. De döper alla variabler till numrerade standardnamn (field_3 osv), formatterar koden och beräknar sen en hash på det hela. Den kan jämföras med hashen för kända Java-metoder och på så sätt kan man återskapa en hel del av koden.

Verktyget ska släppas till helgen. Kolla efter REGWT på deras webbsida.

Inga kommentarer: