Anti-virus is eenvoudig te omzeilen

Update 25– De Hack – augustus 2015

Dit keer in rubriek De Hack vertelt security consultant Remco Sprooten uitgebreid over het misleiden c.q. ontduiken van virusdetectie.

 

In dit artikel worden een aantal technieken uiteengezet die antivirussoftwaremakers gebruiken om malafide software te detecteren en technieken die door aanvallers gebruikt worden om detectie te voorkomen.

Het doel van anti-virussoftware is het beschermen van computers en hun gebruikers tegen virussen en andere soorten malware. Het is alom bekend dat, in beginsel, elke computer voorzien moet zijn van een anti-virus oplossing. Natuurlijk zijn er meerdere manieren om een computer virusvrij te houden (geen internet, geen usb-sticks, volledig isoleren, etc). De anti-virussoftware is echter de meeste gebruikte oplossing. In de wereld van de penetratietester komt het regelmatig voor dat systemen aangevallen moeten worden waarop anti-virus aanwezig is. Welke middelen en technieken zijn er beschikbaar om hier langs te komen?

Hoe werkt anti-virussoftware?
Er zijn grofweg twee technieken te onderscheiden die gebruikt worden door anti-virusoplossingen voor de detectie van kwaadaardige programma’s:
1. Statische analyse.
2. Analyse op basis van gedrag, die op verschillende manier kan worden geïmplementeerd.

Statische analyse
Statische analyse (of signature analysis) is gebaseerd op het gebruik van blacklists. Dat wil zeggen dat er een lijst is van bekende kwaadaardige software. Wanneer er nieuwe kwaadaardige software wordt ontdekt, maken analisten hier een definitie (of handtekening) voor. Deze definitie kan worden gebaseerd op bepaalde gegevens of data in het betreffende stuk malware. Het is ook mogelijk dat de definitie niet bepaald wordt op basis van de inhoud van een kwaadaardig bestand maar op basis van patronen die vaak voorkomen in malware. We spreken dan van analyse op basis van heuristiek. Wanneer er data naar de harde schijf wordt geschreven (bijvoorbeeld bij het opslaan van een download of bijlage) dan wordt deze, door de anti-virusoplossing, vergeleken met de database van virusdefinities.

Makers van anti-virus oplossingen onderhouden databases van dit soort virusdefinities. Deze definities komen in de vorm van periodieke updates terecht bij de gebruiker. Dit is de eenvoudigste manier om virussen te herkennen, en een manier die weinig foutgevoelig is.

Om statische analyse te kunnen omzeilen is het nodig om steeds nieuwe code te gebruiken of juist kleine stukken uit de code aan te passen zodat de signature niet meer overeenkomt. Hier wordt het direct duidelijk wat de kracht is van een polymorfisch virus. Deze virussen veranderen hun eigen code (vaak door het gebruik van encryptie) automatisch waardoor het onmogelijk is om één definitie vast te stellen dat alle versies van het virus kan herkennen.

Analyse op basis van gedrag
In dit geval zal de anti-virus oplossing code controleren op gedragingen waarvan bekend is dat deze vaak gebruikt worden door malware. De regels waarop detectie plaatsvindt, zijn niet publiek beschreven. Deze analyse kan plaatsvinden wanneer een programma wordt uitgevoerd (runtime analysis) of zonder dat de gebruiker dit door heeft in een virtuele omgeving (sandbox analysis). Het belangrijkste voordeel van analyse op basis van gedrag is dat het kan worden gebruikt om nieuwe vormen van malware te detecteren die nog niet voorkomen in de signature database.

Het grootse nadeel van deze vorm van analyse is het risico op zogenaamde fout-positieven. Je weet tenslotte niets anders over het programma of bestand dan de (combinatie van) gedragingen die het schadelijk doen lijken.

Laten we dat verduidelijken aan de hand van een voorbeeld. Veel malware zal na een infectie van het systeem andere bestanden downloaden. Ditzelfde gedag wordt ook vertoond door een browser. Na de installatie van bijvoorbeeld Firefox of Chrome zal deze primair andere bestanden (web pagina’s, plaatsjes en andere bestanden) downloaden. Wanneer een kwaadaardig programma zich dus kan voordoen alsof het een browser is, zal deze niet gedetecteerd worden. Andersom, wanneer een anti-virusoplossing niet accuraat genoeg is kan het zijn dat een legitieme browser wordt aangezien voor een virus.

Een fout-positief kan vergaande gevolgen hebben.
Een paar voorbeelden:
• In april 2010 detecteerde McAfee VirusScan het bestand svchost. exe, in een bestand van Windows, als een virus op systemen draaiend op Windows XP met Service Pack 3. Dit had tot gevolg dat de computer moest herstarten en geen netwerktoegang meer had.
• In december 2010 zorgde een update van AVG anti-virus ervoor dat 64 bit Windows 7 systemen niet meer konden opstarten.
• In oktober 2011 verwijderde Microsoft Security Essentials (MSE) de browser van Google, Chrome.
• In september 2012 verwijderde Sophos anti-virus verschillende belangrijke systeemonderdelen, waaronder haar eigen programma.
• In februari 2015 zorgde Norton anti-virus ervoor dat Internet Explorer niet meer bruikbaar was op verschillende systemen.
• En meest recent: in mei 2015 beschouwde Avast de browsers Chrome en Firefox alsook Microsoft Office als malware.

 Een fout-positief van de anti-virus kan dus grote gevolgen met zich mee brengen. Er zal dus vaak gekozen worden om technieken te gebruiken die zo min mogelijk fout-positieven opleveren.

De makkelijkste manier om heuristische analyse te omzeilen is om ervoor te zorgen dat alle kwaadaardige code is verborgen. Code encryptie is de meest gebruikte methode hiervoor. Als vóór de ontcijfering van de malware geen functies worden aangeroepen die als gevaarlijk worden gezien, zal de malware niet worden gedetecteerd.

 Combinatie
Tegenwoordig zullen de meeste anti-virus producten een dynamische aanpak prefereren waarbij meerder detectietechnieken worden gecombineerd. Wanneer een uitvoerbaar bestand wordt gedetecteerd, wordt deze – voor een korte tijd – uitgevoerd in een virtuele (sandbox) omgeving. Door dit te combineren met statische en heuristische analyse kan ook malware die gebruik maakt van encryptie om zichzelf te verbergen, opgespoord worden.

Deze vorm van detectie hoeft niet altijd plaats te vinden op de computer van de gebruiker. Wanneer een bestand (of stuk code) initieel wordt aangemerkt als verdacht, kan deze worden opgestuurd naar een anti-virus maker waar vervolgens een uitgebreidere analyse plaatsvindt. Een voorbeeld hiervan is het Kaspersky Security Network (KSN). Het KSN maakt het mogelijk om analyse centraal in de cloud (om even een buzz-woord te gebruiken) te regelen, maar ook om snel van al zijn gebruikers informatie te verzamelen over wereldwijde infecties. De meeste anti-virus producenten beschikken inmiddels over vergelijkbare oplossingen.

Dynamische analyse heeft een aantal beperkingen, waarvan de drie belangrijkste, dat wil zeggen degene die we kunnen uitbuiten, de volgende zijn:
• Scans moeten initieel heel snel gebeuren. De eindgebruiker mag (of wil) niet merken dat een programma eerst in een virtuele omgeving wordt opgestart.
• De virtuele omgeving is “niet echt”. Dat wil zeggen dat bepalende onderdelen (bestanden/mappen/processen) niet nagebootst kunnen worden.
• Er zijn trucs om vast te stellen of een programma wordt uitgevoerd op een normale computer of in een virtuele omgeving.

We leggen in de rest van dit artikel, aan de hand van praktische voorbeelden, uit hoe we deze beperkingen kunnen uitbuiten.

AV-evasion: enkele simpele technieken
Nu we weten hoe anti-virus producten detectie uitvoeren is de volgende vraag hoe we als aanvaller detectie kunnen voorkomen.

We bespreken een aantal technieken. In de onderstaande voorbeelden zijn ook stukjes code opgenomen. Deze code is op zichzelf niet voldoende om een virusscanner te omzeilen maar zijn toegevoegd ter illustratie.

Voorbeeld 1: Gebruik 200 Megabyte aan geheugen
Eerder gaven we aan dat de eindgebruiker niks mag merken van de anti-virus scans. Daarom zijn anti-virus producten gelimiteerd op de hoeveelheid code (en geheugen) die ze kunnen analyseren voordat de gebruiker een vertraging merkt. Zodoende is het mogelijk om detectie te kunnen voorkomen.

In dit eerste voorbeeld maken we een programma dat eerst 200 Megabyte aan geheugen vraagt aan het systeem. Dit wordt vervolgens gevuld met waardes die niks betekenen en weer leeggemaakt.

Het nadeel van deze methode is dat het opeens gebruik maken van zoveel geheugen relatief makkelijk te detecteren valt.

We maken gebruik van Virustotal.com. Hier kan een bestand gescand worden door tientallen verschillende virusscanners.

Tijdens het schijven van dit artikel werd dit voorbeeld herkend door 1 van de 57 virusscanners. (https://www.virustotal.com/en/file/21a10310e70790bf25379d7b0d7db35cdbfda6237da8010 a01075fe559879406/analysis/1431090915/)

Voorbeeld 2: Voer twee miljard acties uit
Vergelijkbaar met het vorige voorbeeld kunnen we ook ervoor zorgen dat de malware eerst erg lang bezig is met het uitvoeren van normale programmacode. De anti-virussoftware zal in de virtuele omgeving alleen maar niet-schadelijke acties kunnen uitvoeren.

In dit voorbeeld voeren we twee miljard keer een zogenaamde XOR-operatie uit. Welke operatie we uitvoeren maakt in wezen niet uit. Waar het hier om gaat is dat de processor gedurende meerdere seconden wordt beziggehouden.

Uit experimenten blijkt dat tien seconden vaak al genoeg kan zijn om ervoor te zorgen dat de anti-virus niet verder kijkt naar het verloop van het programma. Dit voorbeeld werd op Virustotal.com nog herkend door 2 van de 57 virusscanners. Echter werden ze slechts als “verdacht” aangemerkt. In de praktijk zien we dat het uitvoeren van het bestand niet zal worden tegengehouden. We zouden tenslotte te maken kunnen hebben een fout-positief.

Wanneer we hebben we het aantal “nutteloze” acties (de XOR of zelfs steeds opnieuw 1 plus 1) verhogen naar 10 miljard bereikten we detectieratio van 0 van de 57.


(https://www.virustotal.com/en/file/117e852f6ed043a1cdc483d4a8fdf030209815f22b9495ff9 19600a44035d33a/analysis/1432648610/)

Voorbeeld 3: Naam van het proces
Wanneer het programma door de anti-virussoftware wordt opgestart in een virtuele omgeving is dit vaak merkbaar aan een aantal verschillende zaken. Deze maken het mogelijk om te detecteren of het programma op een echte computer draait of in een virtuele omgeving.

Een eenvoudig voorbeeld is dat wanneer een programma wordt uitgevoerd door een normale gebruiker, het programma altijd informatie ontvangt van de gebruiker. Of de gebruiker zich er nu wel of niet van bewust is: het eerste deel van die informatie is altijd de eigen bestandsnaam. In een virtuele omgeving (althans die van de antivirusoplossing) wordt het programma nooit echt opgestart en is deze informatie ook niet aanwezig.

In de bovenstaande code controleren we eerst of het eerste argument, ofwel de naam van het programma, gelijk is aan “isDitDeOrgineleNaam. exe”. Als dit niet het geval is wordt de malware niet ontsleuteld en uitgevoerd. Op Virtustotal.com werd dit voorbeeld door 0 van de 57 scanners opgemerkt.
(https://www.virustotal.com/en/file/ed950a165c08f09301c975872d370b12d068fc7492a- 76454b81e545bd967d602/analysis/1431089828/)

Complexere methoden
Naast de beschreven voorbeelden zijn er nog tal van manieren om anti-virus oplossingen te omzeilen. Bijvoorbeeld:
• Laat de malware een niet-bestaande webpagina opvragen. De virtuele omgeving van een anti-virus oplossing zal altijd een fictieve pagina weergeven. Ziet de code dus een pagina terug komen dan stopt de code met uitvoeren.
• Anti-virus software zal in zijn virtuele omgeving zogenaamde “Sleep” commando’s overslaan om te zorgen dat er zo min mogelijk vertraging ontstaat. In je code kan je controleren of na bijvoorbeeld een “Sleep” van 10 seconden er ook echt 10 seconden voorbij zijn.
• Door gebruik te maken van “code-injectie” kan programma A zijn code toevoegen aan programma B en vervolgens uitvoeren. Aangezien programma A al gestart is zal de anti-virus software deze niet zonder meer in de gaten blijven houden. Als aanvaller kan je dus kwaadaardige code injecteren in een bestaand en valide proces.

De bovenstaande lijst is zeker niet compleet maar schetst hopelijk een beeld van de mogelijkheden die je als aanvaller hebt.

Conclusie
Met dit schrijven hebben we een blik geworpen op het misleiden c.q. ontduiken van virusdetectie. Sommige van de beschreven methoden werken momenteel nog bij veruit de meeste anti-virussoftware, maar professionele malware past ook andere methoden toe. Het is een katen- muisspel waarbij de muis vooralsnog in het voordeel is.

@Secura 2018
Webdesign Studio HB / webdevelopment Medusa