Antivirussoftware is een klasse van computerprogramma's die gebruikt worden om malware1 te voorkomen, op te sporen en te verwijderen. Dergelijke software werd oorspronkelijk ontwikkeld om computervirussen2 te detecteren en te verwijderen, vandaar de naam. Met de toename van andere soorten malware begon antivirussoftware echter ook bescherming te bieden tegen andere computerbedreigingen. In het bijzonder kan moderne antivirussoftware gebruikers beschermen tegen kwaadwillende Browser Helper Objecten3 (BHO's), browserkapers4, ransomware5, keyloggers6, achterdeurtjes7, rootkits8, Trojaanse paarden9, computerwormen10, kwaadaardige Layered Service Providers11 (LSP's), dialers12, valse beveiligingssoftware13, adware14 en spyware15. Sommige producten bieden ook bescherming tegen andere computerbedreigingen, zoals geïnfecteerde en kwaadaardige URL16's, spam17, scam18- en phishing19-aanvallen, online identiteit20 (privacy), online bankaanvallen21, social engineering22-technieken, Advanced Persistent Threats23 (APT) en botnet24-DDoS25-aanvallen.

antivirus
Antivirussoftware.

Traditionele antivirussoftware is sterk afhankelijk van digitale handtekeningen (digital signatures) om malware te identificeren. Een techniek die signature-based detection genoemd wordt. Wanneer malware in handen komt van een antivirusbedrijf, wordt ze geanalyseerd door malware-onderzoekers of door dynamische analysesystemen. Zodra wordt vastgesteld dat het effectief om malware gaat, wordt een unieke digitale handtekening voor het bestand gezocht en toegevoegd aan de handtekeningendatabank van de antivirussoftware.

Een eenvoudige vorm van digitale handtekening is een SHA-256 checksum26. Dit is een cryptografische27 hashfunctie28 die op basis van de bestandsinhoud een waarde berekent (de checksum) die uniek is voor het bestand. Als de bestandsinhoud verandert — bijvoorbeeld doordat er zich een virus in nestelt — dan verandert ook de SHA-256 checksum. Op die manier kan de handtekeningendatabank van de antivirussoftware bijvoorbeeld de SHA-256 checksums bevatten van een reeks bestanden die essentieel zijn voor de goede werking van een besturingssysteem (bijvoorbeeld omdat ze gebruikt worden bij het opstarten van het computersysteem). Omdat een checksum een vaste lengte heeft (de SHA-256 checksum bestaat uit 256 bits) wordt op die manier vermeden dat antivirussoftware de volledige bestandsinhoud moet opslaan in haar databank, en dat volledige bestanden moet vergeleken worden tijdens het scannen van een bestandssysteem.

Hoewel signature-based detection effectief malware-uitbraken kan tegengaan, proberen malwareschrijvers ook om dergelijke software een stap voor te blijven door oligomorfe29, polymorfe30 en meer recentelijk ook metamorfe31 virussen te ontwikkelen, die delen van zichzelf versleutelen of zichzelf aanpassen als vermomming om te voorkomen dat ze overeenkomen met virushandtekeningen in de databank.

Opgave

Het Unix commando sha256sum kan gebruikt worden om de SHA-256 checksum van een gegeven bestand te berekenen:

$ echo "VIRUS" | sha256sum
7947ed98953354d7fe074b80adf8082a37808b7367d4c52a69178601ad1e23e0  -

Geef een Unix commando dat voor een gegeven bestandsnaam en een gegeven SHA-256 checksum, een overzicht uitschrijft naar stdout van alle verdachte bestanden onder de huidige directory (dus in de huidige directory en alle onderliggende directories). Een bestand is verdacht als het aan volgende voorwaarden voldoet:

Elke regel van het overzicht moet bestaan uit de SHA-256 checksum van een verdacht bestand, gevolgd door twee spaties en de relatieve padnaam van het verdacht bestand. De verdachte bestanden moet alfabetisch gerangschikt worden op hun padnaam.

Shell variabelen

Een shell variabele is een naam die verwijst naar een string (tekst). Als je in een Unix commando de naam van de variabele laat voorafgaan door een dollarteken ($), dan zal de variabele (het dollarteken en de naam) door de shell vervangen worden door de geassocieerde string voordat het commando wordt uitgevoerd.

$ filename="systemd"
$ checksum="f6f0a536b93887810d9476227f6b098667e6e7f6c9b1568df1e3ffca5a53e83e"
$ echo "VIRUS: $filename ($checksum)"
VIRUS: systemd (f6f0a536b93887810d9476227f6b098667e6e7f6c9b1568df1e3ffca5a53e83e)

Zoals je hierboven kan zien, gebeurt de toekenning aan een variabele met behulp van een gelijkteken (=). Voor en na het gelijkteken mogen er geen spaties staan. Het toekennen van de variabelen filename en checksum gebeurt door Dodona voordat het commando dat je hebt ingediend wordt uitgevoerd (je hoeft dit dus niet zelf te doen). Daardoor kan je in jouw commando $filename en $checksum gebruiken als verwijzing naar de gegeven bestandsnaam en de gegeven SHA-256 checksum.

Uitvoer

Dit ZIP-bestand32 bevat de directorystructuur die we ook gebruiken bij het testen van ingediende oplossingen (let wel dat de timestamps van de bestanden kunnen verschillen als je die lokaal uitpakt). Als het bestand systemd de volgende SHA-256 checksum moet hebben

f6f0a536b93887810d9476227f6b098667e6e7f6c9b1568df1e3ffca5a53e83e

dan is dit voor deze directorystructuur het overzicht met de verdachte versies van het bestand systemd dat je commando op stdout moet uitschrijven:

b818da060882fc292d0f56aa20b2e51736de997c3a8e4db8cb4a6b455d31b7d0  ./wheaties/systemd/systemd
6de6acb7a13d5c8f42383647b7af3bc29e17d276927ec8c6fe332ea74e9e22fd  ./systemd
12e6ff4feb1b552a431b41d3935d33f08f9d75ddb8a88f645f4cf231bc05e820  ./zxcvbn/systemd
b818da060882fc292d0f56aa20b2e51736de997c3a8e4db8cb4a6b455d31b7d0  ./zxcvbn/zxcvbn/systemd