AWS - Lambda Layers Persistence
Lambda Layers
Eine Lambda-Schicht ist ein .zip-Dateiarchiv, das zusätzlichen Code oder anderen Inhalt enthalten kann. Eine Schicht kann Bibliotheken, eine benutzerdefinierte Laufzeit, Daten oder Konfigurationsdateien enthalten.
Es ist möglich, bis zu fünf Schichten pro Funktion einzuschließen. Wenn Sie eine Schicht in eine Funktion einschließen, werden die Inhalte im Verzeichnis /opt
in der Ausführungsumgebung extrahiert.
Standardmäßig sind die Schichten, die Sie erstellen, privat für Ihr AWS-Konto. Sie können wählen, eine Schicht mit anderen Konten zu teilen oder die Schicht öffentlich zu machen. Wenn Ihre Funktionen eine Schicht verbrauchen, die von einem anderen Konto veröffentlicht wurde, können Ihre Funktionen die Schichtversion weiterhin verwenden, nachdem sie gelöscht wurde oder nachdem Ihre Berechtigung zum Zugriff auf die Schicht widerrufen wurde. Sie können jedoch keine neue Funktion erstellen oder Funktionen mit einer gelöschten Schichtversion aktualisieren.
Funktionen, die als Container-Image bereitgestellt werden, verwenden keine Schichten. Stattdessen packen Sie Ihre bevorzugte Laufzeit, Bibliotheken und andere Abhängigkeiten in das Container-Image ein, wenn Sie das Image erstellen.
Python-Ladepfad
Der Ladepfad, den Python in Lambda verwenden wird, ist der folgende:
Überprüfen Sie, wie die zweite und dritte Position von Verzeichnissen belegt sind, in denen Lambda-Layer ihre Dateien entpacken: /opt/python/lib/python3.9/site-packages
und /opt/python
Wenn es einem Angreifer gelingt, einen verwendeten Lambda-Layer zu infiltrieren oder einen hinzuzufügen, der bösartigen Code ausführt, wenn eine gemeinsame Bibliothek geladen wird, kann er bei jedem Lambda-Aufruf bösartigen Code ausführen.
Daher sind die Anforderungen:
Überprüfen Sie Bibliotheken, die vom Code der Opfer geladen werden
Erstellen Sie eine Proxy-Bibliothek mit Lambda-Layern, die benutzerdefinierten Code ausführen und die ursprüngliche Bibliothek laden wird.
Vorab geladene Bibliotheken
Beim Missbrauch dieser Technik stieß ich auf eine Schwierigkeit: Einige Bibliotheken sind im Python-Laufzeitumgebung bereits geladen, wenn Ihr Code ausgeführt wird. Ich erwartete, Dinge wie os
oder sys
zu finden, aber sogar die json
-Bibliothek war geladen.
Um diese Persistenztechnik zu missbrauchen, muss der Code eine neue Bibliothek laden, die nicht geladen ist, wenn der Code ausgeführt wird.
Mit einem Python-Code wie diesem ist es möglich, die Liste der Bibliotheken abzurufen, die in der Python-Laufzeitumgebung in Lambda vorab geladen sind:
Und dies ist die Liste (überprüfen Sie, ob Bibliotheken wie os
oder json
bereits vorhanden sind)
Und dies ist die Liste der Bibliotheken, die standardmäßig in Lambda installiert sind: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Lambda Layer Backdooring
In diesem Beispiel nehmen wir an, dass der Zielcode csv
importiert. Wir werden den Import der csv
-Bibliothek hintertürig gestalten.
Um das zu tun, werden wir das Verzeichnis csv mit der Datei __init__.py
darin in einem Pfad erstellen, der von Lambda geladen wird: /opt/python/lib/python3.9/site-packages
Dann, wenn Lambda ausgeführt wird und versucht, csv zu laden, wird unsere __init__.py
-Datei geladen und ausgeführt.
Diese Datei muss:
Unser Payload ausführen
Die originale csv-Bibliothek laden
Wir können beides mit:
Dann erstellen Sie ein Zip mit diesem Code im Pfad python/lib/python3.9/site-packages/__init__.py
und fügen Sie es als Lambda-Layer hinzu.
Sie können diesen Code unter https://github.com/carlospolop/LambdaLayerBackdoor finden.
Das integrierte Payload wird die IAM-Anmeldeinformationen beim ersten Aufruf oder nach einem Zurücksetzen des Lambda-Containers (Änderung des Codes oder kaltes Lambda) an einen Server senden, aber andere Techniken wie die folgende könnten ebenfalls integriert werden:
AWS - Steal Lambda RequestsExterne Layer
Beachten Sie, dass es möglich ist, Lambda-Layer von externen Konten zu verwenden. Darüber hinaus kann eine Lambda-Schicht aus einem externen Konto verwendet werden, auch wenn keine Berechtigungen vorliegen. Beachten Sie auch, dass die maximale Anzahl von Layern, die eine Lambda haben kann, 5 beträgt.
Daher könnte ein Angreifer zur Verbesserung der Vielseitigkeit dieser Technik:
Eine vorhandene Schicht des Benutzers infiltrieren (nichts ist extern)
Eine Schicht in seinem Konto erstellen, dem Opferkonto Zugriff geben, um die Schicht zu verwenden, die Schicht in den Lambda des Opfers konfigurieren und die Berechtigung entfernen.
Der Lambda wird weiterhin in der Lage sein, die Schicht zu verwenden, und das Opfer wird keine einfache Möglichkeit haben, den Code der Schicht herunterzuladen (außer durch Erhalt einer Reverse-Shell innerhalb des Lambdas)
Das Opfer wird keine externen Layer sehen, die mit
aws lambda list-layers
verwendet werden.
Last updated