Dekking

Wat yof dekt, en wat niet

Klasse voor klasse: waar yof in je code naar zoekt, wat de ‘Geautomatiseerde testronde’ op een draaiende app test, en wat geen van beide doet.

Zo lees je de tabel

  • In code: patronen waarnaar de regels zoeken in de bestanden van een gekoppelde repository. Een regel vindt een patroon en voert de code niet uit, dus de meeste van deze bevindingen moeten worden bevestigd.
  • Live: tests op een draaiende app. De ‘Geautomatiseerde testronde’ is in ontwikkeling en niet te koop, dus niets met die markering is al beschikbaar voor klanten.
  • Niet gedekt: wat geen van beide doet. Een rapport leest nooit alsof dit is gecontroleerd.
KlasseIn codeLiveNiet gedekt
SQL-injectie
  • SQL-tekst wordt opgebouwd uit gegevens van het verzoek
  • Tekst die naar je app wordt gestuurd, draait als deel van een databasequery In ontwikkeling
Invoer die door een andere functie of een ander bestand gaat, opgeslagen injectie (tweede orde) en fouten binnen een ORM.
NoSQL-injectie
  • Een databasefilter neemt een waarde rechtstreeks uit het verzoek
  • Tekst die naar je app wordt gestuurd, draait als deel van een databasequery In ontwikkeling
Querytalen van andere documentdatabases, en andere talen dan JavaScript en TypeScript.
Command-injectie
  • Een shell-opdracht wordt opgebouwd uit gegevens van het verzoek
  • Tekst die naar je app wordt gestuurd, draait als een systeemopdracht In ontwikkeling
Argumenten die worden geïnjecteerd in een programma dat zonder shell wordt aangeroepen, en andere talen.
Template-injectie
  • Gegevens van het verzoek worden als template gebruikt
  • Tekst die naar je app wordt gestuurd, wordt door de sjabloonengine uitgevoerd In ontwikkeling
Templates die uit een database worden gelezen, en template-engines die in de browser draaien.
Code-evaluatie
  • Gegevens van het verzoek worden als code uitgevoerd
Geen live testEvaluatie via een sandbox-object, en andere talen.
Cross-site scripting
  • Gegevens van het verzoek worden als HTML in de pagina geschreven
  • Tekst die naar je app wordt gestuurd, komt terug als levende paginaopmaak In ontwikkeling
Trust-bypasses van Angular en Vue, autoescape-instellingen van servertemplates, opgeslagen scripts en een bewijs in een echte browser.
Open redirect
  • Een doorverwijzing gaat waarheen het verzoek zegt
  • Je site stuurt bezoekers door naar elk adres in de link Vandaag beschikbaar in yof attack
Lijsten met toegestane adressen die bestaan en te omzeilen zijn.
Server-side request forgery
  • De server haalt een adres op dat uit het verzoek komt
  • Je server haalt elk adres op dat een verzoek noemt In ontwikkeling
DNS-rebinding, redirects die naar binnen leiden, en of cloud-metadata bereikbaar is.
Cross-site request forgery
  • Inloggen met een cookie zonder CSRF-controle in de code
  • Een inlogcookie wordt gezet zonder httpOnly of sameSite
  • De inlogcookie mist een beschermingsvlag Vandaag beschikbaar in yof attack
  • Een andere website kan een ingelogde gebruiker zijn gegevens laten wijzigen In ontwikkeling
Andere frameworks dan apps in Express-stijl, een controle door een proxy, en of de standaardinstellingen van de browser de route beschermen.
Riskant laden van objecten
  • Gegevens van het verzoek worden als object geladen
  • Je app geeft een verzoekinhoud aan een onveilige lezer van objecten In ontwikkeling
Java ObjectInputStream, .NET BinaryFormatter en externe XML-entiteiten.
Zwakke cryptografie
  • Een wachtwoord of token wordt gehasht met een snelle of gebroken hash
  • Een token of code wordt gemaakt met een voorspelbare willekeurfunctie
  • Er staat een cryptografische sleutel in de code
  • De versleuteling gebruikt ECB-modus
  • De controle van certificaten staat uit
  • Een inlogtoken wordt geaccepteerd zonder de handtekening te controleren
  • Je app accepteert een inlogtoken dat het nooit controleerde In ontwikkeling
  • Ids of inlogtokens zijn makkelijk te raden In ontwikkeling
Sleutellengtes, protocolversies en certificaten van de draaiende dienst, eigen cryptografie en zijkanalen.
Wachtwoorden in code en configuratie
  • Er staat een wachtwoord in je code of configuratie
  • Er staan een standaard gebruikersnaam en wachtwoord in de code
  • Een adres in je code bevat het wachtwoord
Geen live testDe git-geschiedenis van bestanden die weg zijn, of een gevonden wachtwoord nog werkt, en één gewoon woord zonder cijfer of symbool.
Bestandsuploads
  • Een upload houdt de bestandsnaam of het type dat de bezoeker stuurde
  • De uploadmap wordt als webpagina's aangeboden
  • Een geüpload bestand wordt teruggegeven als een pagina die een browser draait In ontwikkeling
Wat de opslagdienst of het CDN met het bestand doet, malware in de upload en groottelimieten.
Dockerfile
  • Er staat een geheim in je Dockerfile
  • Je Dockerfile voert een download uit zonder hem te controleren
  • Je basis-image is voorbij het einde van de ondersteuning
  • Je container draait de app als root
  • Het basisimage van je container heeft geen vaste versie
  • Je container-image bevat een SSH-server
  • Je basis-image ligt vast op een tag, niet op een digest
  • Je Dockerfile installeert pakketten zonder vaste versie
Geen live testGebouwde images en de besturingssysteempakketten erin worden niet gescand. Het einde van de ondersteuning is alleen bekend voor zes officiële basisimages.
docker-compose
  • Een compose-service draait met de rechten van de host
  • Een compose-service kan Docker zelf besturen
  • Er staat een geheim in je compose-bestand
Geen live testDe draaiende containers, en env-bestanden die niet in de repository staan.
Kubernetes-manifesten
  • Een Kubernetes-container draait privileged
  • Een Kubernetes-workload grijpt in zijn node
  • Er staat een geheim in een Kubernetes-manifest
  • Een Kubernetes-container mag als root draaien
  • Een Kubernetes-container mag meer rechten krijgen
  • Een Kubernetes-container heeft geen resourcelimieten
  • Een Kubernetes-image heeft geen vaste versie
Geen live testHet draaiende cluster, niet-gerenderde Helm-templates, RBAC, netwerk- en admission-policy's en bestanden met YAML-ankers.
Terraform
  • Een firewallregel zet een beheerpoort open voor het hele internet
  • Een opslagbucket wordt in Terraform openbaar gemaakt
  • Opslag of een database wordt zonder versleuteling aangemaakt
  • Een database is in Terraform bereikbaar vanaf internet
  • Er staat een wachtwoord of sleutel in je Terraform-bestanden
Geen live testHet cloudaccount zelf: wat is uitgerold kan afwijken van de bestanden. Waarden uit variabelen, modules of functies, andere providers en andere resourcetypen.

Buiten elke rij

  • Gebouwde container-images en de besturingssysteempakketten erin worden niet gescand.
  • Deze regels lezen bestanden. Ze kijken niet naar het draaiende systeem: het cluster, het cloudaccount of het gedrag van de live app.
  • Gegevens van het verzoek worden alleen binnen één functie of handler gevolgd. Een waarde die eerst door een andere functie of een ander bestand gaat, wordt niet gevolgd.
  • Talen: de syntaxisregels lezen JavaScript en TypeScript. Python heeft de eenvoudige, exacte vormen. PHP, Ruby, Go, Java, Kotlin en C# hebben een paar vormen van één regel. Andere talen worden door deze regels niet gelezen.

Nooit gedekt door automatische controles

  • Fouten in de bedrijfslogica, zoals een prijs of een stap die iemand kan overslaan.
  • Zwakke plekken die nog niemand kent (zero-days).
  • Mensen en processen: phishing, met de hand gedeelde wachtwoorden, wie toegang heeft.
  • Alles buiten de reikwijdte die dit rapport noemt, en elke wijziging na de datum ervan.

Dit is geen penetratietest.

Hoe yof controleert

Wat yof dekt en wat niet, klasse voor klasse