Blootstelling van het containerregister
A registry that allows anonymous pull leaks your source, and one that allows anonymous push lets an attacker replace the tag you deploy. Do both, then fix it with authentication, scoped push, and immutable tags.
Wat is Blootstelling van het containerregister?
Een containerregister bevat je broncode, je configuratie en het artefact dat je deployt. Een register dat anonieme pull toestaat, geeft dit allemaal aan iedereen die de naam van een repository raadt, en een register dat anonieme push toestaat, laat een aanvaller een tag vervangen die je op het punt staat uit te leveren. Deze oefening behandelt beide helften: bekijk hoe een aanvaller een private image leest en vervolgens een tag vergiftigt, en los het daarna op met authenticatie, scoped push-rechten en onveranderlijke tags.
Wat je leert in Blootstelling van het containerregister
- De image bevat de broncode van de applicatie, de configuratie en de build-lagen, dus een pull is in feite een kopie van de codebase en de omgeving ervan.
- Een bestaande tag die opnieuw naar andere inhoud wordt gewezen, zodat het artefact dat je hebt getest het artefact is dat je deployt.
- Push alleen naar de specifieke repositories die het bouwt, en verder niets. Een registerbrede push-credential maakt van één gecompromitteerde runner de controle over elke image.
- Vergelijk de gedeployde image-digest met de digest die de pipeline heeft geregistreerd, aangezien de tag kan verplaatsen maar de digest niet.
Blootstelling van het containerregister — Trainingsstappen
-
Scan naar een publieke repo
Bob richt zich niet specifiek op Quenmoor. Hij scant self-hosted registries op registries die antwoorden zonder login, en somt vervolgens hun repositories op om er een te vinden die leesbaar is achtergelaten. Quenmoor's registry antwoordt, en één repository valt op.
-
Een privé-repo die openstond
Bob scant self-hosted registries op repositories die hij niet zou moeten kunnen bereiken. Quenmoor's registry antwoordde hem zonder te vragen wie hij was, en één repository valt op: een interne dispatchservice.
-
Publiek, en beschrijfbaar
Dit is een interne service, maar het toegangsbeleid staat wagenwijd open. Bob leest de twee instellingen die voor hem van belang zijn.
-
Haal het anoniem binnen
Geen credentials, geen lidmaatschap, geen toegangsverzoek. Bob richt Docker op de registry en haalt het productie-image direct binnen.
-
Lees hun productieconfiguratie
Het image is niet alleen code. Het draagt de configuratie waarmee het draait, ingebakken in een laag. Bob start er een container vanuit en leest dat bestand er direct uit.
-
Herbouw het met een backdoor
Het image lezen was diefstal; het overschrijven is controle. Omdat hij hun echte productie-image heeft binnengehaald, herbouwt Bob er direct vanuit en voegt hij één enkele laag toe. Dit is de Dockerfile.
-
De laag die hij toevoegde
Al het andere is hun ongewijzigde image. Eén RUN maakt er een houvast van dat bij elke deploy wordt meegeleverd.
-
Tag het als hun release
Bob bouwt het vergiftigde image en tagt het met exact de naam waarvandaan Quenmoor uitrolt, zodat de registry het als de productierelease behandelt.
-
Push een vergiftigde tag
Het image lezen is diefstal. Het overschrijven is controle. Bob herbouwt het image met een backdoor in het entrypoint en pusht het terug naar exact de tag waarvandaan Quenmoor uitrolt. De registry accepteert het zonder te vragen wie hij is.
-
Wat de push hem opleverde
De volgende deploy rolde Bob's tag uit naar productie, en de laag die hij toevoegde belde naar huis vanuit de draaiende service. Hij hoeft Quenmoor niet meer van buitenaf te bereiken: zijn code is de service.