AWS - Abusing Lambda Extensions
Lambda Extensions
Lambda-Erweiterungen verbessern Funktionen durch die Integration mit verschiedenen Überwachungs-, Beobachtungs-, Sicherheits- und Governance-Tools. Diese Erweiterungen, die über .zip-Archive mit Lambda-Layern hinzugefügt oder in Container-Image-Bereitstellungen enthalten sind, arbeiten in zwei Modi: intern und extern.
Interne Erweiterungen verschmelzen mit dem Laufzeitprozess und manipulieren dessen Start mit sprachspezifischen Umgebungsvariablen und Wrapper-Skripten. Diese Anpassung gilt für eine Reihe von Laufzeiten, einschließlich Java Correto 8 und 11, Node.js 10 und 12 und .NET Core 3.1.
Externe Erweiterungen laufen als separate Prozesse und halten die Betriebsabstimmung mit dem Lebenszyklus der Lambda-Funktion aufrecht. Sie sind mit verschiedenen Laufzeiten wie Node.js 10 und 12, Python 3.7 und 3.8, Ruby 2.5 und 2.7, Java Corretto 8 und 11, .NET Core 3.1 und benutzerdefinierten Laufzeiten kompatibel.
Weitere Informationen darüber, wie Lambda-Erweiterungen funktionieren, finden Sie in den Dokumenten.
Externe Erweiterung für Persistenz, Stehlen von Anfragen & Modifizieren von Anfragen
Dies ist eine Zusammenfassung der in diesem Beitrag vorgeschlagenen Technik: https://www.clearvector.com/blog/lambda-spy/
Es wurde festgestellt, dass der Standard-Linux-Kernel in der Lambda-Laufzeitumgebung mit den Systemaufrufen „process_vm_readv“ und „process_vm_writev“ kompiliert ist. Und alle Prozesse laufen mit derselben Benutzer-ID, auch der neue Prozess, der für die externe Erweiterung erstellt wurde. Das bedeutet, dass eine externe Erweiterung standardmäßig vollen Lese- und Schreibzugriff auf den Heap-Speicher von Rapid hat.
Darüber hinaus haben Lambda-Erweiterungen zwar die Fähigkeit, sich bei Aufrufereignissen anzumelden, AWS gibt jedoch die Rohdaten nicht an diese Erweiterungen weiter. Dies stellt sicher, dass Erweiterungen keinen Zugriff auf sensible Informationen haben, die über die HTTP-Anfrage übertragen werden.
Der Init (Rapid)-Prozess überwacht alle API-Anfragen unter http://127.0.0.1:9001, während Lambda-Erweiterungen initialisiert und vor der Ausführung von Laufzeitcode, aber nach Rapid, ausgeführt werden.
Die Variable AWS_LAMBDA_RUNTIME_API
gibt die IP-Adresse und die Portnummer der Rapid-API an Kind-Laufzeitprozesse und zusätzliche Erweiterungen an.
Durch Ändern der AWS_LAMBDA_RUNTIME_API
-Umgebungsvariable auf einen Port
, auf den wir Zugriff haben, ist es möglich, alle Aktionen innerhalb der Lambda-Laufzeit abzufangen (Man-in-the-Middle). Dies ist möglich, weil die Erweiterung mit denselben Rechten wie Rapid Init ausgeführt wird und der Kernel des Systems die Änderung des Prozessspeichers ermöglicht, wodurch die Portnummer geändert werden kann.
Da Erweiterungen vor jedem Laufzeitcode ausgeführt werden, beeinflusst das Ändern der Umgebungsvariablen den Laufzeitprozess (z. B. Python, Java, Node, Ruby) beim Start. Darüber hinaus werden Erweiterungen, die nach unserer geladen werden und auf diese Variable angewiesen sind, ebenfalls über unsere Erweiterung geleitet. Diese Konfiguration könnte es Malware ermöglichen, Sicherheitsmaßnahmen oder Protokollierungserweiterungen direkt in der Laufzeitumgebung vollständig zu umgehen.
Das Tool lambda-spy wurde entwickelt, um diesen Speicherschreibvorgang durchzuführen und sensible Informationen aus Lambda-Anfragen, anderen Erweiterungsanfragen zu stehlen und sogar zu ändern.
Referenzen
Last updated