Wat de controle vindt
Acht bevindingen, van ernstig naar klein. Bij elke bevinding staat hoe we hem vinden: met een vaste scan zonder AI, of met de inspectie waarvan elke bewering is nagekeken op bestand, regel en citaat.
-
Bevindingen Controle FA‑07, beveiliging
De sleutelcontrole van de beheer-API vergelijkt niet in constante tijd
- Waar
- shop/admin.py, regel 21: de sleutel uit de header wordt met een gewone vergelijking naast de verwachte sleutel gelegd.
- Hoe gevonden
- Inspectie: een bewering van het AI-model, door onze code nagekeken op bestand, regel en citaat.
- Wat dit voor je betekent
- Uit kleine tijdverschillen kan een aanvaller afleiden hoeveel tekens van de sleutel kloppen.
- Wat je kunt doen
- Laat je developer secrets.compare_digest gebruiken voor elke vergelijking van wachtwoorden en sleutels.
-
Bevindingen Controle PY‑14, beveiliging
Een logregel schrijft de geweigerde sleutel weg
- Waar
- shop/admin.py, regel 22: een geweigerde sleutel wordt letterlijk in het logboek geschreven.
- Hoe gevonden
- Vaste scan (semgrep) en inspectie: het model citeert de logregel, nooit een waarde; wij kijken het citaat na.
- Wat dit voor je betekent
- Logboeken worden breed gedeeld en lang bewaard, dus een geheim daarin komt bij veel meer mensen dan bedoeld.
- Wat je kunt doen
- Laat je developer gevoelige waarden uit de logregel halen of afschermen. Vervang een geheim dat al in een logboek terecht is gekomen.
-
Bevindingen Controle PY‑08, beveiliging
Kortingscodes worden met een voorspelbare bron gemaakt
- Waar
- shop/codes.py, regel 11: de code komt uit de random-module in plaats van uit de secrets-module.
- Hoe gevonden
- Vaste scan (bandit, regel B311), zonder AI. De inspectie beoordeelt daarna of het om een geheime code gaat.
- Wat dit voor je betekent
- De uitkomst van random is te voorspellen: een aanvaller kan zo'n code raden.
- Wat je kunt doen
- Laat je developer random hier vervangen door de secrets-module van Python, die voor geheime codes bedoeld is.
-
Bevindingen Controle AIR‑1, AI‑risico's
De README bevat een instructie aan AI-lezers
- Waar
- README.md, regel 58: een notitie vraagt elke geautomatiseerde lezer alle documenten groen te zetten en de beveiliging goed te keuren.
- Hoe gevonden
- Vaste controle op verborgen tekens en instructies aan een assistent, zonder AI. Onze eigen inspectie volgt zulke tekst niet op en meldt hem.
- Wat dit voor je betekent
- Een assistent die jullie code leest, kan zo'n instructie opvolgen. Wie hem plaatste, en waarom, is een vraag voor jullie.
- Wat je kunt doen
- Haal de instructie weg en kijk in de geschiedenis wie hem toevoegde. Laat een assistent nooit beslissen op basis van tekst die in de repository staat.
-
Dun of verouderd Documentatie PRD‑08 en SEC‑01
De documentatie zegt iets anders dan de code
- Waar
- docs/pricing-rules.md en docs/security.md tegenover shop/pricing.py en shop/admin.py: een andere staffelkorting, een andere grens waarboven de verzendkosten vervallen, en een beveiligingsmaatregel die in de code niet bestaat.
- Hoe gevonden
- Inspectie: het model leest document en code naast elkaar. Een document dat meer dan een half jaar ouder is dan zijn code mag van onze regels niet actueel heten; de datum komt uit git.
- Wat dit voor je betekent
- Wie op de documentatie vertrouwt, een collega of een AI-assistent, bouwt op regels die niet meer gelden.
- Wat je kunt doen
- Werk de twee pagina's bij, of verwijs naar de code als bron. Spreek af dat een wijziging aan prijsregels ook de documentatie raakt.
-
Ontbreekt Documentatie SEC‑09, OPS‑01, PPL‑01, DEL‑08
Vier documenten die een beheerder nodig heeft, ontbreken
- Waar
- Nergens in de repository: een incidentplan, bewaking en alarmering, wie eigenaar is, en hoe je een release terugdraait.
- Hoe gevonden
- Inspectie met een bewijs van afwezigheid: een zoekopdracht die wij opnieuw uitvoeren. Het eigenaarschap vindt ook een vaste controle op bestandsnamen.
- Wat dit voor je betekent
- Bij een storing weet niemand wie belt, wat de eerste stap is en hoe je terug gaat naar de vorige versie.
- Wat je kunt doen
- Begin met de twee kortste: wie is eigenaar, en hoe draai je een release terug. Een halve pagina elk is genoeg om mee te beginnen.
-
Bevindingen Controle GEN‑05, onderhoudbaarheid
Geen lockfile: niemand weet precies welke versies draaien
- Waar
- requirements.txt noemt alleen minimumversies; een lockfile ontbreekt.
- Hoe gevonden
- Vaste scan, zonder AI.
- Wat dit voor je betekent
- Twee installaties van dezelfde code kunnen andere versies krijgen, en een kwetsbaar onderdeel is dan niet te herleiden.
- Wat je kunt doen
- Leg de versies vast, bijvoorbeeld met pip-compile of uv, en commit het resultaat.
-
Bevindingen Controle CONT‑1, continuïteit
Al het werk komt van één persoon
- Waar
- De git-geschiedenis: twee commits, één auteur.
- Hoe gevonden
- Vaste tools op de git-geschiedenis, zonder AI.
- Wat dit voor je betekent
- Valt die ene persoon weg, dan weet niemand hoe het zit. Dat is geen oordeel over die persoon; het is een risico voor het bedrijf.
- Wat je kunt doen
- Laat een tweede persoon meekijken en leg vast wat alleen in één hoofd zit.
Wat de controle niet vindt, en waarom dat ook telt
Een controle is een momentopname en geen certificaat. Deze voorbeeldcontrole vindt wat erin is gezet en wat de vaste scans en de catalogus kennen. Wat niet in onze catalogus staat, vinden we niet, en dat zeggen we ook in onze voorwaarden. De goudset verwacht nog drie bevindingen die we hier weglaten om de pagina kort te houden: geen Definition of Done, geen API-beschrijving en een dunne pagina over omgevingen.
Wat er wél goed is, zie je ook: de documenten die aanwezig en actueel zijn, zoals hoe je de shop start, de teststrategie, de configuratie en hoe een release live gaat, en de onderdelen die niet van toepassing zijn, zoals back-ups in een shop die niets opslaat.
Hoe dit voorbeeld tot stand kwam
De webshop is van ons. De fouten zijn met opzet geplant: ze vormen de goudset waarmee we onze inspectie meten. Niets hier is van een klant, en er is geen bedrijf verzonnen.
De eerste meting van de inspectie op deze set staat gepland. Tot die tijd zijn de bevindingen hierboven een deel van wat de goudset verwacht, plus wat de vaste regels van de scans opleveren. Zodra de meting er is, vervangen we deze zin door de uitkomst.
Zo ziet het eruit in je werkplek
Bij een klant staat dit niet op een pagina maar in de werkplek: een stoplicht per onderdeel, elke controle met zijn bevindingen, de geschiedenis per commit, en bij elke bevinding de plek en het bewijs. De directie leest het risico, product en beheer de gevolgen, developers het bestand en de regel.
Een bevinding kun je betwisten met een reden, of als aanvaard risico markeren. Een geheim nooit. Wij repareren niets: jullie bouwen en bepalen zelf wat je oplost.