Een blended learning-traject: live training onder begeleiding van een instructeur met laboefeningen in een eersteklas e-learningsysteem. Je behoudt 3 maanden na de training toegang tot het e-learningsysteem om de laboefeningen en het materiaal opnieuw te bekijken.
Platform: Linux, Windows.
Labs: Hands-on.
Uw applicatie geschreven in C of C++ werkt zoals bedoeld, dus u bent klaar, toch? Maar heb je overwogen om onjuiste waarden in te voeren? 16Gbs aan gegevens? Een null? Een apostrof? Negatieve getallen, of specifiek -2^32? Want dat is wat de slechteriken zullen doen - en de lijst is nog lang niet compleet.
Het omgaan met beveiliging vereist een gezonde mate van paranoia, en dat is wat deze cursus biedt: een sterke emotionele betrokkenheid door veel hand-on labs en verhalen uit het echte leven, allemaal om de codehygiëne aanzienlijk te verbeteren. Fouten, gevolgen en best practices zijn ons bloed, zweet en tranen.
Dit alles wordt in de context van C en C++ geplaatst en uitgebreid met kernproblemen bij het programmeren, waarbij valkuilen in de beveiliging van code die in deze talen is geschreven worden besproken.
Zodat je voorbereid bent op de krachten van de duistere kant.
Zodat er niets onverwachts gebeurt.
Niets.
PRAKTISCHE INFORMATIE
Doe mee met onze gratis webinar voor meer informatie.
- De training 'Veilig coderen in C en C++' kan ook als in-company training worden georganiseerd.
- Als training op locatie niet haalbaar is, kunnen we een live, interactieve online (virtuele) of hybride training bespreken. Het standaardprogramma met een inhoud van 3 dagen kan ook in 5 halve dagen worden gegeven (van maandag tot vrijdag).
- Benieuwd hoe je het rendement op investering (ROI) van secure coding-trainingen kunt kwantificeren? Bekijk dan dit artikel.
Doelstelling
- Benaderingen uitleggen voor het omgaan met beveiligingsproblemen in code;
- Kwetsbaarheden in de beveiliging en de gevolgen ervan identificeren;
- Leer de beste manieren om deze fouten te vermijden.
Doelgroep
Deze cursus is bedoeld voor ontwikkelaars van C en C++.
Programma
Day 1
Basisprincipes van beveiliging
Wat is veiligheid?
Bedreiging en risico
Soorten bedreigingen voor computersystemen
Gevolgen van onveilige software
Beperkingen en de markt
Bugs, kwetsbaarheden en exploits
Categorisering van bugs
- Zeven verderfelijke koninkrijken
- Algemene opsomming van zwakke punten (CWE)
- CWE/SANS Top 25 van gevaarlijkste softwarefouten
- SEI Cert richtlijnen voor veilig coderen
- Kwetsbaarheden in de omgeving en de afhankelijkheden
Buffer overloop
x86 assemblage en aanroepconventies
- Essentiële X86-assemblage
- Registers en adressering
- Instructies
- Conventies voor aanroepen op x86
- Conventie bellen - waar het allemaal om draait
- Het stackframe
- Proloog en epiloog
- Gestapelde functie-aanroepen
- Recursie
Bufferoverloop op de stack
- Bufferoverloop - basis
- Buffer overlezen en overschrijven
- Stapelen
- Exploitatie - De besturingsstroom stelen
- Lab - Buffer overflow 101, hergebruik van code
- Exploitatie - Een shellscript injecteren
- Lab - Code injectie, BoF uitbuiting met een shellcode
- Bufferoverloop op de heap
- Buffer overflow op de heap - een voorbeeld van exploitatie
- Lab - Heap overflow
- Best practices voor heap overflow
- Casestudie - Heartbleed
- Lab - Heartbleed
- Pointer uitvlucht
- Wijzermanipulatie
- Schrijf-wat-waar
- Wijziging van springtabellen
- GOT en RELRO bescherming kapen
- Functie-aanwijzers overschrijven
- Lab - Virtuele functietabel overschrijven
- Enkele typische fouten die leiden tot BoF
- Uit-bij-één
- Niets toewijzen
- Fouten bij het berekenen van de lengte van strings
- Lab - UTF-8 codering analyseren
- String beëindiging verwarring
- Lab - Verwarring door snaarbeëindiging
- Andere typische BoF zwakke punten
Beste praktijken voor bescherming van de RvB
- Veilige en onveilige functie
- base_string en std::string
- Minder bekende gevaarlijke functie
- Lab - Bufferoverloop oplossen
- Compileropties en instrumentatie
- FORTIFY_SOURCE gebruiken
- Lab - Effecten van FORTIFY
- Compileerbare instrumentatie
- Stapelbeveiliging
- BoF detecteren met de kanarie
- Argumenten klonen
- Stapelbeveiliging op verschillende platforms
- De gewijzigde proloog en epiloog
- Lab - Effecten van stapelbreukbeveiliging
- Bescherming tijdens runtime
- Runtime-instrumentatie
- Address Space Layout Randomization (ASLR)
- ASLR op verschillende platforms
- Lab - Effecten van ASLR
- ASLR omzeilen - NOP-sjoemelen
- Spuiten op hopen
- Niet-uitvoerbare geheugengebieden
- De NX bit
- Schrijven-xof-uitvoeren (W^X)
- NX op verschillende platforms
- Lab - Effecten van NX
- NX-omzeiling - Aanvallen voor hergebruik van code
- Booginjectie - Return-to-libc
- Lab - Return-to-libc uitbuiten
- Cascadering van terugkeer naar libc
- Rendementsgeoriënteerd programmeren (ROP)
- Lab - ROP-demonstratie
- Wat ook georiënteerd programmeren is
- Bescherming tegen ROP
Day 2
Veelvoorkomende zwakke plekken in de beveiliging van software
Invoervalidatie
- Principes voor ingangsvalidatie
- Zwarte lijsten en witte lijsten
- Validatie met regex
- Wat valideren - het aanvalsoppervlak
- Wanneer valideren - validatie vs transformaties
- Waar valideren - verdediging in de diepte
- Injectie
- Injectieprincipes
- Injectieaanvallen
- Code injectie
- Opdrachtinjectie
- Lab - Opdrachtinjectie
- Best practices voor opdrachtinjectie
- Casestudie - Shellshock
- Lab - Shellshock
- Procesbesturing - bibliotheekinjectie
- DLL-kaping
- Lab - DLL-kaping
- Beste praktijken voor injectie
- Invoervalidatie
- Uitvoer zuiveren
- De uitvoer coderen en escapen
- Uitdagingen bij het coderen
- Behandeling van gehele getallen
- Getekende getallen weergeven
- Integer visualiseren
- Problemen met gehele getallen
- Overloop integer
- Lab - Integer overflow
- Casestudie - Android Stagefright
- Getekende / niet-getekende verwarring
- Lab - Getekende / niet-getekende verwarring
- Gehele truncatie
- Casestudie - Wannacry
- Beste praktijken
- Upcasting
- Testen op randvoorwaarden
- Testen na de voorwaarde
- Grote integer bibliotheken gebruiken
- Lab - Best practices voor integerverwerking
- Het AIR integer model
- Andere numerieke problemen
- Delen door nul
- Werken met drijvende-kommagetallen
- Problemen met opmaaktekenreeksen
- Het probleem met printf()
- Formaatspecificaties van printf()
- De zwakte van de printf format string uitbuiten
- Lab - format string misbruiken
- Enkele andere problemen met invoervalidatie
- Onjuiste adresvalidatie in IOCTL
Beveiligingsfuncties
- Authenticatie
- Basisprincipes van authenticatie
- Zwakke punten in authenticatie
- Casestudie - PayPal tweefactorauthenticatie omzeilen
- Beste praktijken voor gebruikersinterfaces
- Wachtwoordbeheer
- Inkomend wachtwoordbeheer
- Accountwachtwoorden opslaan
- Plaintext wachtwoorden bij Facebook
- Lab - Waarom is het hashen van wachtwoorden alleen niet genoeg?
- Woordenboekaanvallen en brute forcing
- Zouten
- Adaptieve hashfuncties voor wachtwoordopslag
- Wachtwoord onderweg
- Wachtwoordbeleid
- Zwakke en sterke wachtwoorden
- Wachtzinnen gebruiken
- Lab - Een wachtwoordbeleid toepassen
- Het datalek bij Ashley Madison
- De woordenboekaanval
- De ultieme aanval
- Gebruik van de resultaten en de geleerde lessen
- Beheer van uitgaande wachtwoorden
- Harde wachtwoorden
- Lab - Hard gecodeerd wachtwoord
- Wachtwoord in configuratiebestand
- Gevoelige informatie in het geheugen beschermen
- Uitdagingen bij het beschermen van het geheugen
- Stapelinspectie
- Compiler verwijdert code voor het wissen van geheugen
- Gevoelige informatie in niet-vergrendeld geheugen
- Autorisatie
- Basisprincipes toegangscontrole
- Ontbrekende of onjuiste autorisatie
- Toegangsbeheer bestandssysteem
- Onjuiste toegangscontrole tot het bestandssysteem
- Eigendom
- chroot gevangenis
- umask() gebruiken
- Linux bestandssysteem
- LDAP
- Toegangscontrole in databases
- Lab - Databasetoegangsbeheer
- Privileges en machtigingen
- Manipulatie van toestemming
- Onjuist gebruik van geprivilegieerde API's
- Blootliggende IOCTL met onvoldoende toegangscontrole
- Best practices voor toestemming
- Principe van de minste privileges
- Principe van scheiding van privileges
- Toestemming verlenen
- Voorrecht laten vallen
- Afhandeling van onvoldoende privileges
- Blootstelling aan informatie
- Blootstelling door geëxtraheerde gegevens en aggregatie
- Lekken van systeeminformatie
- Informatie over lekkend systeem
- Vertrouwen op toegankelijkheidsmodificatoren
- Lab - Ongepaste bescherming door toegankelijkheidsmodificator
- Best practices voor blootstelling aan informatie
- UI-beveiliging
- UI-beveiligingsprincipes
- Gevoelige informatie in de gebruikersinterface
- Verkeerde interpretatie van UI-functies of acties
- Onvoldoende UI-feedback
- Vertrouwen op verborgen of uitgeschakeld UI-element
- Lab - Verborgen of uitgeschakeld UI-element
- Onvoldoende anti-automatisering
Dag 3
Veelvoorkomende zwakke plekken in de beveiliging van software
Tijd en staat
- Best practices voor draadbeheer
- Thread-beheer in C/C++
- Race-omstandigheden
- Race-conditie in objectdataleden
- Lab - Rasconditie
- Bestandsraceconditie
- Tijd van controle tot tijd van gebruik (TOCTTOU)
- Lab - TOCTTOU
- Onveilig tijdelijk bestand
- Potentiële raceconditie in C/C++
- Race condition in signaalverwerking
- Forking
- Bitveld toegang
- Wederzijdse uitsluiting en vergrendeling
- Deadlocks
- Laboratorium - Vergrendeling
- Synchronisatie en thread-veiligheid
- Synchronisatie en thread-veiligheid in C/C++
Fouten
- Principes voor afhandeling van fouten en uitzonderingen
- Foutafhandeling
- Een misleidende statuscode retourneren
- Foutafhandeling in C
- Foutafhandeling in C++
- Blootstelling aan informatie door foutenrapportage
- Uitzonderingsverwerking
- In het vangblok. En wat nu?
- Leeg vangblok
- Beste praktijken voor vangblokken
- Te brede worpen
- NULL pointer uitzonderingen vangen
- Uitzonderingsbehandeling in C++
- Lab - Uitzonderingsverwerkingszooi
Code kwaliteit
- Gegevens
- Type komt niet overeen
- Lab - Type komt niet overeen
- Functie-retourwaarden
- Niet gecontroleerd Returnwaarde
- Casestudie - MacOS X wachtwoord hash wijzigen
- Weggelaten retourwaarde
- Onwijzigbare pointer teruggeven
- Initialisatie en opschonen
- Niet-geïnitialiseerde variabele
- Constructeurs en destructeurs
- Cycli voor klasse-initialisatie
- Aangifte- en toewijzingsproblemen in C
- Toewijzing en deallocatie in C++
- Niet-vrijgegeven bron
- Array verwijdering
- Lab - Mengen van verwijderen en verwijderen[]
- Objectgeoriënteerd programmeren valkuilen
- Toegankelijkheidsaanpassingen
- Erven en oversturen
- De kopieeroperator implementeren
- Mutabiliteit
- Klonen
- Gevoelige klassen klonen - object hijacking
- Object hijacking - beste praktijken
- Serialisatie
Inpakken
Principes voor veilig coderen
- Principes van robuust programmeren door Matt Bishop;
- Veilige ontwerpprincipes van Saltzer en Schröder;
- Nog een paar principes.
En wat nu?
- Verdere bronnen en lezingen;
- .NET en C# bronnen;
- Nog meer labs en uitdagingen te doen.
Methoden
Certificering
Na het volgen van deze training ontvangen deelnemers een certificaat van het High Tech Institute.
Meer informatie
Cursusbeoordelingen
