image

Onofficiële patch voor ernstig Adobe Reader-lek

donderdag 16 september 2010, 10:13 door Redactie, 5 reacties

Een Turks beveiligingsbedrijf heeft een onofficiële patch voor een ernstig lek in Adobe Reader ontwikkeld. Naar eigen zeggen had Ramz Afzar twee uur nodig om de update te ontwikkelen. Aangezien het bedrijf niet over de broncode van Adobe Reader beschikte, was het gedwongen om tot "binair patchen" over te gaan. "In eerste instantie wilden we het patchen door een nieuw gedeelte toe te voegen en daar onze code te schrijven, maar besloten uiteindelijk toch voor inline patching te kiezen."

Volgens het beveiligingsbedrijf gaat het om een zeer gevaarlijk lek in de Adobe Reader en zijn voorbeelden en exploits op tal van beveiligingssites te vinden. "Aanvallers kunnen deze exploit voor hun eigen doeleinden gebruiken", aldus de beveiliger. Aangezien Adobe pas volgende maand met een update komt, koos men voor een eigen oplossing. "We ontdekten dat het op 4 oktober gepatcht wordt. Dat is een erg lange periode voor klanten om kwetsbaar te zijn en op het internet te navigeren."

Acrobat
Ramz Afzar laat weten dat het ook op de hoogte van een lek in Acrobat is, maar dat het hier nog geen voorbeeld exploit van heeft ontvangen. Mocht het die ontvangen, dan zal het ook hiervoor een patch ontwikkelen. Deze exploit zou nog niet veel misbruikt worden en is ook nog niet publiek beschikbaar. Het gebruik van onofficiële patches wordt in de meeste gevallen door de leverancier afgeraden. Gebruik van deze patch is dan ook geheel op eigen risico.

Reacties (5)
16-09-2010, 11:21 door [Account Verwijderd]
[Verwijderd]
16-09-2010, 11:49 door Didier Stevens
Heb de patch zelf eens nagekeken. Doet precies wat gezegd wordt.

De bewuste strcat call wordt vervangen door een strncat call, met n = 160.
16-09-2010, 13:12 door [Account Verwijderd]
[Verwijderd]
16-09-2010, 13:57 door Didier Stevens
Ik ben ervan overtuigd Peter dat dit niet uitgebreid getest is. Waarschijnlijk hebben ze de exploit getest en daarna hooguit enkele onschuldige PDF documenten geopend.

Het is theoretisch mogelijk dat de stabiliteit van het OS ondergraven wordt door deze patch, maar hier acht ik dit zeer onwaarschijnlijk.

Vergeet niet dat jouw Adobe Reader voor het ogenblik reeds onstabiel is. Als je een PDF document opent waar de bewuste SING parameter te groot is (we spreken nog niet van een exploit), dan zullen variabelen op de stack overschreven worden en zal Adobe Reader uiteindelijk crashen.
Met de patch worden deze variabelen niet overschreven, en behoud de stack tenminste zijn integriteit. Of er verder in het uitvoeren van de code problemen zullen onstaan door deze patch, weten we niet.

Laat ons de verschillende scenarios bekijken:

- je opent een PDF zonder SING parameter -> de bewuste code wordt niet uitgevoerd. Dus geen verschil tussen origineel en patch.

- je opent een PDF met SING parameter die niet te groot is -> de bewuste code wordt uitgevoerd. Resultaat van strcat en strncat is identiek. Dus geen verschil tussen origineel en patch.

- je opent een PDF met SING parameter die te groot is -> de bewuste code wordt uitgevoerd.
Resultaat van strcat: stack variabelen overschreven -> Adobe Reader instabiel
Resultaat van strncat: stack variabelen niet overschreven -> Adobe Reader stabiel, maar wordt later mogelijks instabiel door ongekende gevolgen patch.

Dus in dit geval ben je er qua stabiliteit niet slechter af.

Persoonlijk acht ik het risico dus laag. Maar dit betekent nog niet dat het een goed idee is om deze patch in je organisatie toe te passen. Hangt ervan af hoe kostelijk dit is.
Maar voor thuis gebruik kan je dit gerust doen.

Opmerking: iemand van Adobe heeft mij ooit gezegd dat updaten een bijkomend risico van dergelijke patchen. Hij beweerde dat zulke patch het Adobe update process kan doen falen.
16-09-2010, 23:45 door Anoniem
Ik heb niet naar de code gekeken, maar zo maar een strcat() vervangen met strncat() hoeft niet te betekenen dat het probleem opgelost is.

strncat() is een vreemde API die heel vaak verkeerd gebruikt word; het size argument is NIET de buffer size, maar het aantal bytes dat toegevoegd moet worden. strncat() schrijft ook nog een '\0' buiten deze size. Correct gebruik is dus:

strncat(dst, src, sizeof(dst) - strlen(dst) - 1);

Zonder de - 1 heb je een off-by-one. De size moet dus altijd berekent worden op basis van de al aanwezige data in dst.

strncat(dst, src, 0xa0); kan dus nog even goed een overflow veroorzaken tenzij 'dst' leeg is. Als er toevallig al een string in dst zit die heel sizeof(dst) - 1 in beslag neemt schrijf je dus bytes buiten de boundaries van dst.
Reageren

Deze posting is gelocked. Reageren is niet meer mogelijk.