wintig jaar lang won werkende software van veilige software
Twintig jaar lang was de vraag of iets werkte belangrijker dan de vraag hoe het werkte. Het web moest kunnen chatten, veilig kwam later, en later kwam nooit. Daarom vind ik nog steeds overal dezelfde gaten. Niet omdat ze moeilijk zijn, maar omdat niemand betaalt voor de inbraak die niet gebeurde.
De verschuiving¶
Ergens in de afgelopen twintig jaar is de vraag of iets werkt belangrijker geworden dan de vraag hoe het werkt. Het web moest kunnen chatten. Of dat veilig kon, was een vraag voor later. Er moest een betaalknop in, of die knop te misbruiken was zou nog wel blijken. Het moest in de cloud, wie er precies bij kon was iets voor de volgende sprint.
Later kwam nooit. Dat is de hele these in een zin.
Het is geen verhaal over domme mensen. De bouwers wisten het meestal wel. Het werd alleen nooit de vraag waarop ze werden afgerekend. Wie in een oplevering laat zien dat de functie draait, heeft geleverd. Wie in dezelfde oplevering laat zien dat hij drie dagen bezig is geweest met de vraag wat er gebeurt als iemand het formulier misbruikt, heeft vertraging veroorzaakt.
De verschuiving heeft in mijn eigen vak zelfs een naam gekregen voordat ze goed en wel was ingezet. Richard Gabriel schreef in 1989 het stuk dat bekend werd als The Rise of Worse Is Better: het simpele systeem dat vandaag draait verslaat het doordachte systeem dat morgen af is, omdat het eerder in handen van gebruikers ligt en zich daarna vastzet. Dat was toen een observatie over softwareontwerp. Het is intussen de grondwet van de hele sector. Nicholas Carr beschreef in The Shallows (2010) een verwante beweging bij lezers: van begrijpen naar gebruiken. Hetzelfde is met bouwen gebeurd.
Daarom zitten de gaten er nog¶
Als je je afvraagt waarom ik na al die jaren nog steeds dezelfde soort bevindingen doe, is dit het antwoord. De fouten die ik vind zijn zelden ingewikkeld. Een tracker die vuurt voor de toestemming. Een instelling die op de verkeerde stand staat. Een gegeven dat naar een land gaat waar het niet heen hoort. Briljante aanvallen zijn het zelden. Het zijn open deuren.
Kijk er wat langer naar en het zijn steeds dezelfde drie soorten. De eerste is een volgorde die verkeerd staat: er gebeurt iets voordat er toestemming is. De tweede is een standaardwaarde die nooit is aangeraakt: de leverancier levert een dashboard met alles aan, en niemand heeft het uitgezet. De derde is een schakel verderop in de keten die niemand heeft nagelopen, waar het gegeven een grens over gaat die de eigenaar van de site nooit heeft bedoeld. Voor alle drie geldt dat er geen zwakke plek in de cryptografie voor nodig is. Je hebt alleen het verkeer nodig, en dat mag je gewoon meelezen in je eigen browser. Zie Netwerkverkeer lezen via HAR-files.
Ze staan open omdat het bouwen ervan werd beloond en het dichtzetten niet. De pagina laadde, de knop werkte, de demo deed het. Klaar. Dat er tegelijk een zijdeur openstond, kwam pas ter sprake toen iemand er doorheen liep, en meestal was dat niemand, en dus bleef hij open.
Onder alle losse bevindingen in dit manuscript zit dus een gedeelde oorzaak. Die oorzaak is economisch van aard. De kennis om het beter te doen lag er al, de standaarden lagen er al, en in veel gevallen lag zelfs de instelling er al, op de verkeerde stand.
Waarom niemand voor het hoe betaalt¶
Hier zit de kern, en het is dezelfde logica als bij de deurgreep die knerpt. Zie Twee knoppen met dezelfde functie verschillen in kwaliteit.
Een werkende functie is zichtbaar. Je kunt hem demonstreren, verkopen, in een release zetten. Een inbraak die niet plaatsvond is onzichtbaar. Je kunt niet aantonen wat je hebt voorkomen, want het bewijs is het uitblijven van iets.
Dus wie goed werk levert aan de hoe-kant, kan zijn bijdrage nooit hard maken. Wie de functie oplevert, kan dat wel. In elke organisatie waar budget wordt verdeeld op zichtbare uitkomst, verliest de eerste stelselmatig van de tweede. Er is zelden iemand die dat besluit. De meetlat meet maar een kant op, en de rest volgt vanzelf.
Let op wat dat met mensen doet. De ingenieur die de zijdeur dichtzet levert per definitie een negatief resultaat op: er gebeurde niets. Zijn collega levert een scherm op dat je kunt laten zien aan een klant. Als dat elk kwartaal opnieuw gebeurt, hoef je niemand van kwade wil te verdenken om te voorspellen wie er over drie jaar leiding geeft en wie er is vertrokken. Zie Op IT-afdelingen beslist wie het vak nooit beoefende.
Dat is precies dezelfde vorm als bij de gebruikswaarde die uit producten verdween en bij de boete die goedkoper is dan naleving. Zie We worden bekwamer en de spullen worden slechter en Een boete is voor een groot bedrijf geen straf, maar een rekening. Steeds hetzelfde: wat niet te tonen is op het moment dat er wordt afgerekend, sneuvelt.
De regel zelf ontbreekt overigens niet. AVG artikel 25 eist gegevensbescherming door ontwerp en door standaardinstellingen, artikel 32 eist passende beveiliging, en artikel 11.7a van de Telecommunicatiewet eist toestemming voordat er iets op je toestel wordt gelezen of geplaatst. Het hoe is dus al twintig jaar een verplichting en niet alleen een deugd. Wat ontbreekt is iemand die het op het moment van opleveren natelt. Zie Nederland heeft een wettelijke bekwaamheidseis en toetst hem niet.
Waarom het nu snel misgaat¶
Twintig jaar lang was dit houdbaar, en dat had een simpele reden. De gaten waren er wel, maar iemand moest ze vinden. Dat kostte tijd, kennis en aandacht, en de meeste sites en apps waren te oninteressant om die aandacht te krijgen. De verdediging kon achterlopen omdat de aanval niet schaalde.
Dat is nu aan het kantelen. Wat mij een middag kost, kost een geautomatiseerd systeem seconden, en het kan het tegen duizenden doelen tegelijk doen. De open deuren zijn dezelfde gebleven, alleen loopt er nu iemand langs alle deuren in plaats van langs een paar.
Ik weet dat uit mijn eigen werk, en dat is het deel waar ik hard voor sta. Dezelfde analyse die ik eerst per site met de hand deed, draait bij mij nu geautomatiseerd over lijsten sites, in een nacht, op één machine, met middelen die iedereen kan kopen. Bewijsniveau voor mijn eigen keten: gemeten. De stap naar wat kwaadwillenden ermee doen: afgeleid, want de rekensom is dezelfde en de gereedschappen zijn openbaar.
Wat daarmee verdwijnt is een subsidie. Onbekendheid was jarenlang een gratis beveiligingslaag, betaald door de schaarste aan aandacht van aanvallers. Die schaarste is bezig te verdwijnen. De rekening van twintig jaar uitstel wordt daarmee in een keer opgeeist, en niet bij de partij die het uitstel koos.
De bouwers doen het zelf ook¶
Het scherpste voorbeeld is de sector die dit alles aanjaagt.
Op 22 juli 2026 maakte OpenAI bekend dat een van zijn systemen tijdens een test uit de afgeschermde omgeving was gebroken, het internet had bereikt en had ingebroken bij Hugging Face, een ander bedrijf in dezelfde sector. Volgens het bedrijf ging het om een combinatie van een net uitgebracht model en een nog krachtiger model dat intern werd getest. Het bedrijf noemde het een ongekend incident en zei zijn waarborgen te versterken. Alles wat ik hierover weet komt uit die eigen mededeling. Bewijsniveau: gerapporteerd door de betrokken partij, door mij niet nagemeten.
Lees dat nog eens. Een organisatie met de beste mensen, ongelimiteerde middelen en het uitdrukkelijke doel om te onderzoeken wat haar systemen kunnen, werd verrast door wat haar eigen systeem deed. De capaciteit was af. De beheersing kwam daarna.
Dat is dezelfde fout als zeep op een gaspedaal, alleen op een schaal waar de gevolgen niet bij een terugroepactie ophouden. Zie De Cybertruck is wel echte onbekwaamheid. En de hele investeringsgolf eromheen, miljarden, hele economieen, is gebouwd op het dat. Dat het werkt is bewezen. Hoe het werkt weet niemand precies, ook de makers niet, en dat wordt gepresenteerd als een tijdelijk ongemak in plaats van als de kern van het probleem.
Er is een gezonde tegenhanger, en die laat zien dat het wel kan. Met Paramant bouw ik versleuteling tegen een computer die nog niet bestaat. Dat is de omgekeerde volgorde: eerst het hoe, en dan pas de vraag of iemand er vandaag om vraagt. Zie Bouwen tegen een aanval die nog niet bestaat. Het is ook meteen duidelijk waarom die volgorde zeldzaam is. Er staat op de dag van oplevering niets tegenover.
Het hoe telbaar maken¶
Als de diagnose een meetprobleem is, dan is het antwoord een meting. Niet als reparatie, wel als tegenwicht: zodra het hoe een getal heeft dat naast de functie op tafel ligt, kan het meewegen in dezelfde vergadering.
Het simpelste getal dat ik ken is dit: hoeveel derde partijen worden er aangesproken voordat de bezoeker iets heeft aangeklikt. Je hebt er één opname van je eigen site voor nodig waarin je niets aanraakt.
import json
from urllib.parse import urlparse
def derden_voor_toestemming(har_pad, eigen_domein):
har = json.load(open(har_pad, encoding="utf-8"))
hosts = set()
for e in har["log"]["entries"]:
host = urlparse(e["request"]["url"]).hostname or ""
if host and not host.endswith(eigen_domein):
hosts.add(host)
return sorted(hosts)
derden = derden_voor_toestemming("niets-aanraken.har", "voorbeeld.nl")
print(f"derde partijen voor toestemming: {len(derden)}")
for h in derden:
print(" ", h)Dat is alles. Eén getal, en de namen erachter. Zet die regel in dezelfde pijplijn die je tests draait, laat hem falen boven een afgesproken drempel, en het onzichtbare heeft een plek gekregen op het bord waar ook de functies staan.
Twee waarschuwingen horen erbij, anders meet je jezelf rijk. De eerste: meet zoals een bezoeker binnenkomt, met een echte browser en een echt scherm, want een kale scanner krijgt een andere pagina te zien. Zie Meet zoals een bezoeker, niet zoals een scanner. De tweede: nul is ook de uitkomst van een mislukte meting. Een opname die stukliep en een site die niets doet zien er in de uitvoer identiek uit, dus je moet apart vaststellen dat de meting is gelukt voordat je de nul gelooft. Zie Een mislukte meting is geen schone app.
Wat ik ermee wil¶
Ik ben niet tegen techniek en ik ben niet tegen AI. Ik gebruik het zelf, elke dag, en het is buitengewoon. Mijn kritiek gaat over de volgorde waarin we het inzetten, en daar heb ik een eigen positie over opgeschreven. Zie AI hoort een versterker te zijn, geen vervanging.
Mijn bezwaar is smaller en harder. Zolang alleen het dat wordt beloond, blijft het hoe een kostenpost, en blijft iedereen die het hoe serieus neemt de partij die geld kost en niets oplevert. Ik schrijf dat niet toe aan een karakterfout van bedrijven. Het is een meetprobleem. En meetproblemen zijn op te lossen, alleen niet door de partij die er voordeel van heeft.
Daarom meet ik. Een meting repareert niets. Ze maakt het onzichtbare zichtbaar, en pas dan kan het meewegen tegen het zichtbare. Dat is ook waarom ik het bij publiceren niet laat: een bevinding zonder een betere bouwwijze ernaast blijft een klacht. Zie Apple, Google en Meta verdienen aan tracking binnen de wet.
En het is de reden dat ik hier weinig hoop vestig op de partijen die het probleem hebben veroorzaakt. Wie bouwt, bepaalt wat er gebouwd wordt, en wie afrekent, bepaalt wat er wordt gebouwd door wie er bouwt. Zie De maker en de aandeelhouder willen niet hetzelfde. Zolang die meetlat maar een kant op meet, blijft het werk aan de andere kant liggen bij mensen die het doen zonder dat iemand ervoor betaalt.
Zie ook We worden bekwamer en de spullen worden slechter, De Cybertruck is wel echte onbekwaamheid en Randall Munroe verliet NASA en geeft xkcd gratis weg.
- Nicholas Carr, "The Shallows: What the Internet Is Doing to Our Brains", 2010de verschuiving van begrijpen naar gebruiken