Bösartige Base Images
A lookalike base image on a public registry reaches production and calls home. Trace it back to the FROM line, then fix it with an internal mirror, verified publishers, and signature verification at pull time.
Was ist Bösartige Base Images?
Jeder kann in einer öffentlichen Registry unter einem Namen veröffentlichen, der einem vertrauenswürdigen Namen nahekommt. Ohne Signaturprüfung ist eine FROM-Zeile nur eine Zeichenkette, und ein Build, der diese Zeichenkette auflöst, führt aus, was auch immer er lädt. Diese Übung behandelt ein bösartiges Base Image, das die Produktion erreicht hat: Sehen Sie zu, wie ein Angreifer es platziert und einsammelt, was es nach Hause sendet, und beheben Sie es dann mit verifizierten Publishern, einem internen Mirror und Signaturprüfung beim Pull.
Was Sie lernen in Bösartige Base Images
- Sie löst einen Namen zu dem auf, was auch immer die Registry ausliefert, sodass Sie ohne Verifizierung einer Zeichenkette vertrauen und nicht einem Publisher.
- Es schützt davor, dass sich das Image ändert, nachdem Sie es geprüft haben, aber nicht davor, von vornherein ein bösartiges Image zu pinnen. Sie müssen trotzdem verifizieren, wer es veröffentlicht hat.
- Scanning informiert Sie über bekannte Schwachstellen; eine Signatur sagt Ihnen, dass das Image vom erwarteten Publisher stammt und nicht ausgetauscht wurde.
- Jenes Image war legitim, aber veraltet. Dieses war von Anfang an bösartig, daher ist Patchen bedeutungslos, und bei der Behebung geht es um Herkunft (Provenance).
Bösartige Base Images — Trainingsschritte
-
Ein Name, der ein Zeichen daneben liegt
Bob bricht in nichts ein. Er veröffentlicht. In einem öffentlichen Image-Hub kann jeder ein Repository pushen, und er hat eines unter einem Namespace gepusht, der sich fast genauso liest wie das offizielle Node.js-Base-Image. Dann wartet er darauf, dass irgendwo ein Build es versehentlich zieht.
-
Getarnt, um zu bestehen
Bobs Repository steht in den Suchergebnissen direkt unter dem echten, mit demselben Slogan und einer ordentlichen Pull-Zahl. Der einzige Unterschied ist der Teil, den ein gehetzter Engineer überfliegt.
-
Was er tatsächlich ausgeliefert hat
Bobs Lookalike ist kein neu verpacktes Node-Image mit frischem Etikett. Er hat es aus einem echten gebaut und nur eine einzige Zeile hinzugefügt. Das ist das Dockerfile hinter der Basis, die er veröffentlicht hat.
-
Die Zeile, die die Arbeit macht
Alles über dieser Zeile ist eine gewöhnliche Node.js-Basis. Ein einziges RUN, getarnt mit einem harmlosen Kommentar, macht daraus eine Waffe.
-
Sehen Sie zu, wie die Payload zündet
Die Basis sieht aus und verhält sich wie ein normales Node.js-Image, sodass ein Build damit gelingt und eine App darauf läuft. Aber eine Schicht, die Bob hinzugefügt hat, lädt und startet eine Payload, sobald ein Container startet. Er startet seine eigene Basis einmal, um zu bestätigen, dass die Payload noch zündet.
-
Den Zugang nutzen
Ein Marlspire-Build wurde auf seiner Basis ausgeliefert, und das eingeschleuste Implantat meldete sich nach Hause. Bob muss jetzt nicht mehr einbrechen: Er hat bereits eine Shell in ihrem Produktions-Container. Er weist sie an, alles herauszugeben, was sie erreichen kann.
-
Was das möglich gemacht hat
Ein kurzer Moment beim Mechanismus, bevor die Reaktion beginnt.
-
Der Host meldet einen Miner
Marlspire betreibt Endpoint-Monitoring auf seinen Container-Hosts. Es interessiert sich nicht dafür, was der Container eigentlich tun soll; es meldet, was es gesehen hat.
-
Die Schichten des Image lesen
Ein Image protokolliert, wie es gebaut wurde, ein Befehl pro Schicht. Wenn sich ein Miner selbst installiert, muss irgendeine Schicht den Befehl ausgeführt haben, der ihn geladen hat. Alice liest den Build-Verlauf des ausgelieferten Image.
-
Woher die Basis kam
Das Gift steckt in der Basis, also lautet die Frage: welche Basis. Alice schaut sich die beiden Kandidaten im öffentlichen Hub nebeneinander an.