De cursus wordt in het Engels verzorgd onder de titel "Secure Coding in C and C++".

Je applicatie in C of C++ werkt, dus je bent klaar, toch? Maar heb je overwogen om onjuiste waarden in te voeren? 16 GB aan data? Een null? Een apostrof? Negatieve getallen, of specifiek -2^32? Want dat is wat de slechteriken zullen doen - en deze 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 programmeerhygië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 geschreven in deze talen 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 kan ook in-company worden georganiseerd.
  • Als training op locatie niet haalbaar is, kunnen we een live, interactieve online (virtuele) of hybride training aanbieden. Het standaardprogramma met een inhoud van 3 dagen kan ook in 5 halve dagen worden gegeven (van maandag tot vrijdag).
  • Benieuwd hoe je de return-on-investment (ROI) van secure coding-trainingen kunt kwantificeren? Bekijk dan dit artikel.

Leerdoelen

  • Benaderingen uitleggen voor het omgaan met beveiligingsproblemen in code
  • Kwetsbaarheden in de beveiliging en de gevolgen ervan identificeren
  • De best practices leren om deze fouten te vermijden

Doelgroep

Deze cursus is bedoeld voor ontwikkelaars van C en C++.

Locatie
Startdatum
Info volgende editie
Duur 5 consecutive half days
Frequentie Eenmaal per jaar
Betrokken
Score
9.4
Prijs per deelnemer € 2,250 excl. btw
Brochure downloaden

Programma

Dag 1

Basisprincipes van beveiliging

Wat is beveiliging?

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
  • Common Weakness Enumeration (CWE)
  • CWE/SANS-top 25 van gevaarlijkste softwarefouten
  • SEI Cert-richtlijnen voor veilig programmeren
  • Kwetsbaarheden in de omgeving en de afhankelijkheden

Bufferoverflow

X86-assembly en aanroepconventies

  • De basis van X86-assembly
  • Registers en adressering
  • Instructies
  • Conventies voor aanroepen op X86
  • Aanroepconventie - waar het allemaal om draait
  • Het stackframe
  • Proloog en epiloog
  • Gestapelde functieaanroepen
  • Recursie

Bufferoverflow op de stack

  • Bufferoverflow - de basis
  • Buffer overread en overwrite
  • Stapelen
  • Misbruik - De controlflow kapen
  • Lab - Bufferoverflow 101, hergebruik van code
  • Misbruik - Een shellscript injecteren
  • Lab - Code-injectie, BoF-uitbuiting met een shellcode
  • Bufferoverlflow op de heap
  • Bufferoverflow op de heap - een voorbeeld van misbruik
  • Lab - Heap overflow
  • Best practices bij heap overflow
  • Casestudy - Heartbleed
  • Lab - Heartbleed
  • Pointer uitvlucht
  • Pointermanipulatie
  • Schrijf-wat-waar
  • Modificatie van jumptabellen
  • GOT- en RELRO-bescherming kapen
  • Functiepointers 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
  • Verwarring bij stringterminatie
  • Lab - Verwarring bij stringterminatie
  • Andere typische BoF-zwakheden

Best practices voor BoF-bescherming

  • Veilige en onveilige functie
  • base_string en std::string
  • Een minder bekende gevaarlijke functie
  • Lab - Bufferoverflow oplossen
  • Compileropties en instrumentatie
  • FORTIFY_SOURCE gebruiken
  • Lab - Effecten van FORTIFY
  • Compile-time instrumentatie
  • Beveiliging tegen stack smashing
  • BoF detecteren met de kanarie
  • Argumenten klonen
  • Beveiliging tegen stack smashing op verschillende platforms
  • De gewijzigde proloog en epiloog
  • Lab - Effecten van beveiliging tegen stack smashing
  • Runtimebescherming
  • Runtime-instrumentatie
  • Address Space Layout Randomization (ASLR)
  • ASLR op verschillende platforms
  • Lab - Effecten van ASLR
  • ASLR omzeilen - NOP sledging
  • 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 misbruiken
  • Cascadering van return-to-libc
  • Rendementsgeoriënteerd programmeren (ROP)
  • Lab - ROP-demonstratie
  • Wat ook georiënteerd programmeren is
  • Bescherming tegen ROP

Dag 2

Veelvoorkomende zwakke plekken in de beveiliging van software

Inputvalidatie

  • Principes voor inputvalidatie
  • 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
  • Commando-injectie
  • Lab - Commando-injectie
  • Best practices voor commando-injectie
  • Casestudy - Shellshock
  • Lab - Shellshock
  • Procesbesturing - bibliotheekinjectie
  • DLL-kaping
  • Lab - DLL-kaping
  • Best practices voor injectie
  • Inputvalidatie
  • Outputopschoning
  • De output coderen en escapen
  • Uitdagingen bij het coderen
  • Behandeling van integers
  • Signed getallen weergeven
  • Integervisualisatie
  • Problemen met integers
  • Integeroverflow
  • Lab - Integeroverflow
  • Casestudy - Android Stagefright
  • Signed/unsigned-verwarring
  • Lab - Signed/unsigned-verwarring
  • Integertruncatie
  • Casestudy - Wannacry
  • Best practices
  • Upcasting
  • Testen van precondities
  • Testen van postcondities
  • Grote integerbibliotheken gebruiken
  • Lab - Best practices voor integerverwerking
  • Het AIR-integermodel
  • Andere numerieke problemen
  • Delen door nul
  • Werken met drijvendekommagetallen
  • Problemen met stringformattering
  • Het probleem met printf()
  • Formaatspecificaties van printf()
  • De zwakte van de printf-formatstring uitbuiten
  • Lab - Stringformattering misbruiken
  • Enkele andere problemen met inputvalidatie
  • Onjuiste adresvalidatie in IOCTL

Beveiligingsfuncties

  • Authenticatie
  • Basisprincipes van authenticatie
  • Zwakke punten in authenticatie
  • Casestudy - PayPal-tweefactorauthenticatie omzeilen
  • Best practices 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
  • Salting
  • 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
  • Hardgecodeerde wachtwoorden
  • Lab - Hardgecodeerd wachtwoord
  • Wachtwoord in configuratiebestand
  • Gevoelige informatie in het geheugen beschermen
  • Uitdagingen bij geheugenbescherming
  • Heap-inspectie
  • Compiler verwijdert code voor het wissen van geheugen
  • Gevoelige informatie in niet-gelockt geheugen

  • Autorisatie
  • Basisprincipes van toegangscontrole
  • Ontbrekende of onjuiste autorisatie
  • Toegangscontrole voor het bestandssysteem
  • Onjuiste toegangscontrole voor het bestandssysteem
  • Eigendom
  • Chroot jail
  • Umask() gebruiken
  • Linux-bestandssysteem
  • LDAP
  • Toegangscontrole in databases
  • Lab - Databasetoegangsbeheer
  • Privileges en rechten
  • Manipulatie van rechten
  • Onjuist gebruik van geprivilegieerde API's
  • Blootliggende IOCTL met onvoldoende toegangscontrole
  • Best practices voor rechten
  • Principe van de minste privileges
  • Principe van scheiding van privileges
  • Toestemming verlenen
  • Privileges laten vallen
  • Afhandeling van onvoldoende privileges
  • Blootstelling van informatie
  • Blootstelling door geëxtraheerde data en aggregatie
  • Gelekte systeeminformatie
  • Lekken van systeeminformatie
  • Vertrouwen op toegankelijkheidsmodificatoren
  • Lab - ongepaste bescherming door toegankelijkheidsmodificator
  • Best practices bij 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 toestand

  • Best practices voor threadbeheer
  • Threadbeheer in C/C++
  • Racecondities
  • Raceconditie in objectdataleden
  • Lab - Raceconditie
  • Bestandsraceconditie
  • Tijd van controle tot tijd van gebruik (TOCTTOU)
  • Lab - TOCTTOU
  • Onveilig tijdelijk bestand
  • Potentiële raceconditie in C/C++
  • Raceconditie in signaalverwerking
  • Forking
  • Bitveldtoegang
  • Wederzijdse uitsluiting en locking
  • Deadlocks
  • Laboratorium - Locking
  • Synchronisatie en threadveiligheid
  • Synchronisatie en threadveiligheid in C/C++

Fouten

  • Principes voor afhandeling van fouten en excepties
  • Foutafhandeling
  • Een misleidende statuscode teruggeven
  • Foutafhandeling in C
  • Foutafhandeling in C++
  • Blootstelling aan informatie door foutrapportage
  • Afhandeling van excepties
  • In het catch-blok. En wat nu?
  • Leeg catch-blok
  • Best practices voor catch-blokken
  • Te brede throws
  • Null-pointerexcepties afvangen
  • Afhandeling van excepties in C++
  • Lab - Gedoe bij de afhandeling van excepties

Codekwaliteit

  • Data
  • Type komt niet overeen
  • Lab - Type komt niet overeen
  • Functiereturnwaarden
  • Niet gecontroleerde returnwaarde
  • Casestudy - MacOS X-wachtwoordhash wijzigen
  • Weggelaten returnwaarde
  • Onwijzigbare pointer teruggeven
  • Initialisatie en opschoning
  • Niet-geïnitialiseerde variabele
  • Constructors en destructors
  • Cycli voor klasseninitialisatie
  • Declaratie- en allocatieproblemen in C
  • Allocatie en deallocatie in C++
  • Niet-vrijgegeven resource
  • Arrayverwijdering
  • Lab - Delete en delete[] door elkaar gebruiken
  • Valkuilen van objectgeoriënteerd programmeren
  • Toegankelijkheidsmodificatoren
  • Overerven en overschrijven
  • De kopieeroperator implementeren
  • Mutabiliteit
  • Klonen
  • Gevoelige klassen klonen - object hijacking
  • Object hijacking - best practices
  • Serialisatie

Samenvatting

Principes voor veilig programmeren

  • Principes van robuust programmeren door Matt Bishop
  • Veilige ontwerpprincipes van Saltzer en Schröder
  • Nog een paar principes

En wat nu?

  • Verdere bronnen en naslagwerken
  • Bronnen voor .NET en C#
  • Meer labs en uitdagingen

Methodiek

Een blended learning-traject: live training onder begeleiding van een instructeur met laboefeningen in een eersteklas e-learningsysteem. Je houdt tot 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

Certificering

Na het volgen van deze opleiding ontvangen de deelnemers een certificaat van het High Tech Institute. Bovendien maakt deze opleiding deel uit van het programma voor beroepsonderwijs van de Nederlandse Vereniging voor Precisietechniek (DSPE), die hiervoor microcredentials verstrekt.

Cursusbeoordelingen

"Grote inzichten in hoe de beveiliging kan worden doorbroken en hoe dit kan worden opgelost."

Ference Schopbarteld - Thales Group

"Balans tussen oude en nieuwe technieken. Goede hands-on training."

Hani S. - Sioux Technologies

"Interessant, uitdagend en technisch zwaar. Het beste deel is de hands-on."

Gabriele Ricciardi - Thales Group