Minimale container-images
A production image ships a compiler, a package manager, and a shell, turning a small application flaw into a working toolkit. Perform the pivot, then cut the runtime down to a minimal stage with none of it.
Wat is Minimale container-images?
Elke tool die je meelevert in een productie-image is een tool die een aanvaller erft. Een runtime-image met een packagemanager, een compiler, een shell en netwerktools maakt van een beperkte applicatiefout een werkende toolkit, omdat de aanvaller niets meer zelf hoeft mee te brengen. Deze oefening behandelt die escalatie: bekijk hoe een aanvaller pivotteert met behulp van de eigen inhoud van de image, en breng de runtime daarna terug tot een minimale stage zonder shell en zonder buildtooling.
Wat je leert in Minimale container-images
- Het stelt een aanvaller met beperkte code-executie in staat om op te halen en te installeren wat nodig is, waardoor een kleine kwetsbaarheid een volledige foothold wordt zonder dat de aanvaller zelf tooling hoeft mee te brengen.
- De buildtooling blijft in de buildstage, en alleen het gecompileerde artefact en de runtime-dependencies worden gekopieerd naar de uiteindelijke image.
- Veel gangbare exploitatie- en persistentietechnieken gaan uit van een shell om commando's uit te voeren, dus het verwijderen ervan breekt het makkelijkste pad van code-executie naar controle.
- De ene gaat over wat de lagen nog vastleggen van de build, en deze gaat over wat de uiteindelijke image een aanvaller in handen geeft tijdens runtime. Zelfde tool, ander falen.
Minimale container-images — Trainingsstappen
-
Een foothold in checkout
Bob begint niet met een shell. De checkout-service bouwt PDF-verzendlabels en gebruikt daarvoor een shell-aanroep, en één veld in dat verzoek wordt niet gesaneerd. Hij injecteert een probe om te bevestigen dat hij een commando kan uitvoeren, en om te zien wie en waar hij is.
-
Alles wat de image meelevert
Bob heeft één-commando-tegelijk-executie als de app, maar nog geen shell. Dat is meestal waar een aanvaller vastloopt, tenzij de container hem een toolkit in handen geeft. Voordat hij iets opvallends doet, controleert hij wat er al geïnstalleerd is.
-
Curl de cloud-credentials
De container draait in de cloud, en elke cloudinstantie stelt een metadata-service beschikbaar op een vast intern adres dat de tijdelijke rolcredentials van de machine uitgeeft. Om deze te bereiken is een HTTP-client nodig. De image leverde er één mee.
-
Hoe één commando een breach werd
Bobs toegang tot de app was streng beperkt.
-
Een shell in een runtime-container
Skelwyn draait endpoint detection op zijn containerhosts. Het weet niet waar elke container voor dient; het rapporteert gedrag dat niet bij een runtime past.
-
Bevestig wat er is meegeleverd
Alice reproduceert wat de aanvaller heeft ontdekt: ze vraagt de draaiende container welke van die tools daadwerkelijk aanwezig zijn.
-
Een runtime van 412MB
De toolkit is niet gratis. Het is gewicht, en het is aanvalsoppervlak. Alice controleert de grootte van de image die de service daadwerkelijk draait.
-
Waar de toolkit naar binnen komt
De image wordt gebouwd vanuit één Dockerfile. Alice opent deze om te zien waarom een runtime-container uiteindelijk een compiler bevat.
-
Eén stage, alles wordt meegeleverd
De image wordt in één enkele stage gebouwd en uitgevoerd, dus alles wat de build nodig heeft, bevat de runtime ook.
-
Splits build van runtime
De fix is een multi-stage build: houd de volledige image en de bijbehorende toolchain als een buildstage die de app compileert, en kopieer vervolgens alleen de afgeronde app en de dependencies naar een distroless runtime-image zonder shell, zonder packagemanager en zonder compiler.