Zeven essentiële principes voor het schrijven van veilige programma’s

21/05/24

Traditioneel werd applicatiebeveiliging voornamelijk beschouwd als een taak voor het beveiligingsteam die meestal aan het einde van het ontwikkelingsproces werd uitgevoerd. Deze aanpak leidt echter tot langdurige en kostelijke procedures wanneer beveiligingsfouten opgespoord en verholpen moeten worden, terwijl die vaak al in een vroeg stadium hadden kunnen worden voorkomen. Daarom is in de moderne softwareontwikkelingscyclus beveiliging een integraal deel van elk stadium geworden. Het moderne ontwikkelingsproces focust dan ook op het schrijven van veilige software.

Veilig programmeren omvat een reeks praktijken en technieken die worden gebruikt door ontwikkelaars om hun software te beschermen tegen beveiligingsrisico’s. Het gaat niet alleen om het toevoegen van veiligheidsfuncties, maar ook om het identificeren en elimineren van kwetsbaarheden in de code die software blootstellen aan potentiële aanvallen. Door gebruik te maken van secure coding, worden de kansen verkleind dat kwaadwillende actoren kwetsbaarheden in de software kunnen exploiteren en zo schade kunnen toebrengen aan systemen of gegevens.

Een van de belangrijkste voordelen van secure coding is het vroegtijdig identificeren van potentiële kwetsbaarheden. Dit omvat onder andere het tegengaan van veelvoorkomende programmeerfouten zoals buffer overflows, SQL-injecties, en andere gemakkelijke doelwitten voor aanvallers. Door deze fouten uit de software te halen in een vroeg ontwikkelingsstadium, kan dit veelal kostefficiënter gebeuren dan wanneer de fouten in een later stadium ontdekt worden.

Welke best practices moet je in je code toepassen?

Er zijn verschillende best practices die je kan toepassen bij het ontwikkelen van applicaties. Hier volgt een kort overzicht van enkele van de belangrijkste principes.

Begin met een threat model

Threat modeling kan een goed startpunt vormen voor het ontwikkelen van veilige applicaties. Deze procesmatige benadering laat ontwikkelaars potentiële bedreigingen identificeren en aanpakken voordat ze in de code terecht komen. Het proces bestaat uit vier stappen: documenteren, lokaliseren, aanpakken en valideren. Een effectief threat model omvat een grondige analyse van het ontwerp van het systeem, de gegevensstromen en de mogelijke bedreigingen. Dit helpt bij het prioriteren van beveiligingsrisico’s en het integreren van geschikte beveiligingsmaatregelen in het ontwikkelingsproces. In het ideale geval wordt threat modeling uitgevoerd tijdens de architectuurfase van de applicatieontwikkeling, maar het kan ook waardevol zijn bij het beveiligen van bestaande applicaties.

Maak gebruik van sterke authenticatie en autorisatie

Authenticatie en autorisatie werken hand in hand om de correcte toegang tot het systeem af te dwingen. Authenticatie is het proces waarbij de identiteit van een gebruiker geverifieerd wordt. Dit gebeurt vaak door het valideren van een gebruikersnaam en wachtwoord, maar kan ook via aanvullende factoren, zoals beveiligingstokens of biometrische gegevens, gecontroleerd worden. Autorisatie, aan de andere kant, bepaalt welke acties een geauthenticeerde gebruiker mag uitvoeren binnen het systeem. Het specificeert de toestemmingen en privileges die zijn gekoppeld aan de identiteit van een gebruiker. Door het principle of least privilege toe te passen, krijgt elke gebruiker alleen de minimaal vereiste privileges toegewezen om bepaalde acties uit te voeren. Op die manier wordt het risico op ongeoorloofde toegang tot gevoelige informatie verminderd.

Valideer potentieel gevaarlijke invoer

Door gebruik te maken van inputvalidatie worden alle invoergegevens gecontroleerd om te verifiëren dat ze voldoen aan gespecificeerde criteria. Het doel is om potentieel schadelijke gegevens eruit te filteren die problemen kunnen veroorzaken binnen de applicatie. Bijvoorbeeld, een probleem dat door inputvalidatie oplost kan worden, is het voorkomen van SQL-injectieaanvallen. Bij een SQL-injectie probeert een aanvaller kwaadaardige SQL-code in te voeren via invoervelden op een webformulier. Als de ingevoerde gegevens niet worden gevalideerd en gefilterd, kan de aanvaller SQL-commando’s invoeren die de database manipuleren, gevoelige gegevens ophalen of zelfs de hele database wissen. In andere gevallen kan door het ontbreken van invoervalidatie de aanvaller geïnjecteerde programmacode uitvoeren in de context van het proces om zo de uitvoering van de applicatie over te nemen.

Encodeer applicatie-uitvoer

Output encoding is een beveiligingspraktijk die helpt bij het voorkomen van injectieaanvallen zoals Cross-Site Scripting (XSS) aanvallen. Bij deze aanvallen injecteert een aanvaller een kwaadaardig script dat dan later uitgevoerd wordt door de browser van een slachtoffer. Zo kan de aanvaller cookies bemachtigen die gebruikt worden als authenticatietokens, of kan hij de uitvoering van de webapplicatie verstoren of zelfs overnemen. Door output encoding toe te passen, worden gegevens omgezet naar veilige formaten voordat ze worden weergegeven in de uitvoer van een webapplicatie. Het vertaalt potentieel gevaarlijke speciale tekens naar een equivalent dat een aanval neutraliseert. Wanneer een aanvaller een script injecteert, zal dit script niet uitgevoerd worden door de browser van het slachtoffer maar gewoon als tekst getoond worden.

Bescherm data met cryptografie

Met encryptietechnieken kunnen gevoelige gegevens worden beschermd tegen ongeautoriseerde toegang, zowel tijdens opslag als verzending. Cryptografie helpt bij het waarborgen van de integriteit en de vertrouwelijkheid van gegevens. Gebruik standaardalgoritmen zoals AES of elliptische cryptografie, en maak gebruik van standaardprotocollen zoals TLS 1.3. Kies bij voorkeur voor implementaties die voldoen aan strenge beveiligingsnormen, zoals FIPS-certificering. Cryptografie kan ook helpen bij het naleven van Europese en internationale regelgeving. Zo moet een organisatie die wil voldoen aan de Algemene Verordening Gegevensbescherming (AVG) de integriteit en vertrouwelijkheid van opgeslagen of verwerkte persoonsgegevens waarborgen.

Logging is onmisbaar

Het vastleggen van alle gebeurtenissen in het programma is niet alleen nuttig om problemen op te lossen en de code te debuggen, maar het ondersteunt ook (in sommige gevallen verplichte) auditprocessen. Bovendien kunnen intrusion detection tools gebruikmaken van de output logs om verdachte activiteiten te detecteren. Hierdoor wordt het mogelijk om proactief te reageren op potentiële bedreigingen. Naast het loggen van events, verdient het veilig afhandelen van fouten speciale aandacht. Foutafhandeling dient om alle onverwachte gedragingen van de applicatie op een correcte manier te behandelen. In veel gevallen wordt er echter informatie over de fout doorgegeven naar de gebruiker van de applicatie. Daarbij moet gelet worden op de vertrouwelijkheid van die informatie, want wanneer gevoelige informatie gelekt wordt kan die misbruikt worden door een aanvaller.

Test de veiligheid van de applicatie

Net zoals het testen van de functionaliteit van de applicatie, kan de veiligheid van de applicatie ook getest worden. De makkelijkste manier is om automatische tools te integreren in de ontwikkelingscyclus. Static Application Security Testing (SAST) tools, bijvoorbeeld, analyseren de broncode en identificeren potentiële beveiligingsproblemen zonder dat de code hoeft uitgevoerd te worden. Ze kunnen ingesteld worden om bij elke commit van nieuwe broncode automatisch een controle te doen. Dynamic Application Security Testing (DAST) tools gebruiken een andere aanpak, waarbij verschillende cyberaanvallen gesimuleerd worden in een draaiende versie van de applicatie. Software Composition Analysis (SCA) tools tenslotte zijn gericht op de externe componenten van de applicatie en controleren die op bekende kwetsbaarheden. Naast deze geautomatiseerde tools zijn penetratietests en bug bounty-platforms ook waardevolle aanvullingen. Penetratietests kunnen worden uitgevoerd door ingehuurde beveiligingsexperts om potentiële beveiligingsfouten in de code te zoeken. Eenmaal de applicatie uitgerold is, stellen bug bounty-platforms de bredere hackergemeenschap in staat om actief op zoek te gaan naar kwetsbaarheden in de software en beloond te worden voor het verantwoordelijk melden ervan.

Meer dan een checklist

De principes die in dit artikel besproken werden, vormen een stevig kader voor het bouwen en onderhouden van veilige applicaties. Toch is het implementeren van software op een veilige manier niet slechts een checklist die afgevinkt moet worden; het moet een integraal onderdeel worden van de identiteit van het softwarebedrijf. Door middel van trainingen rond softwarekwetsbaarheden blijft de focus van het ontwikkelingsteam gericht op veiligheid en kan het team beter potentiële dreigingen identificeren. Enkel door het creëren en onderhouden van dit bewustzijn, kan de veiligheid van de geproduceerde software verzekerd worden.

Auteur: Pieter Philippaerts, DistriNet, KU Leuven

Publicatiedatum: 21 mei 2024

Recente Posts

De SBOM-startersgids

De SBOM-startersgids

Recente cybersecurity-incidenten, zoals de Log4J en SolarWinds hacks, benadrukken de noodzaak voor bedrijven om de samenstelling en kwetsbaarheden van hun gebruikte software grondig te begrijpen. In deze context worden Software Bill of Materials (SBOM's) steeds...

LEZEN

De anatomie van een API-aanval

De anatomie van een API-aanval

Application Programming Interfaces (API's) vormen het kloppende hart van de moderne digitale softwareinfrastructuur. Deze onzichtbare maar cruciale technologie zorgt ervoor dat verschillende toepassingen met elkaar kunnen communiceren en samenwerken. API's zijn...

LEZEN

Houd je geheimen vers

Houd je geheimen vers

Geheimen die je niet opgesloten houdt in een 'diepvriezer', beschouw je best als zeer beperkt houdbaar. Gebruik omgevingscredentials om de onwelriekende geur van wachtwoorden en API-sleutels te elimineren. Het is uiteraard essentieel voor de veiligheid van een...

LEZEN