AWS - Abusing Lambda Extensions
Last updated
Last updated
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)
Rozszerzenia Lambda wzbogacają funkcje, integrując się z różnymi narzędziami do monitorowania, obserwowalności, bezpieczeństwa i zarządzania. Te rozszerzenia, dodawane za pomocą .zip archiwów przy użyciu warstw Lambda lub zawarte w wdrożeniach obrazów kontenerów, działają w dwóch trybach: wewnętrznym i zewnętrznym.
Wewnętrzne rozszerzenia łączą się z procesem uruchomieniowym, manipulując jego uruchomieniem za pomocą zmiennych środowiskowych specyficznych dla języka i skryptów opakowujących. Ta personalizacja dotyczy różnych środowisk uruchomieniowych, w tym Java Correto 8 i 11, Node.js 10 i 12 oraz .NET Core 3.1.
Zewnętrzne rozszerzenia działają jako oddzielne procesy, utrzymując zgodność z cyklem życia funkcji Lambda. Są kompatybilne z różnymi środowiskami uruchomieniowymi, takimi jak Node.js 10 i 12, Python 3.7 i 3.8, Ruby 2.5 i 2.7, Java Corretto 8 i 11, .NET Core 3.1 oraz niestandardowymi środowiskami uruchomieniowymi.
Aby uzyskać więcej informacji na temat jak działają rozszerzenia lambda, sprawdź dokumentację.
To jest podsumowanie techniki zaproponowanej w tym poście: https://www.clearvector.com/blog/lambda-spy/
Stwierdzono, że domyślny kernel Linux w środowisku uruchomieniowym Lambda jest skompilowany z wywołaniami systemowymi “process_vm_readv” i “process_vm_writev”. A wszystkie procesy działają z tym samym identyfikatorem użytkownika, nawet nowy proces utworzony dla zewnętrznego rozszerzenia. Oznacza to, że zewnętrzne rozszerzenie ma pełny dostęp do odczytu i zapisu pamięci sterty Rapid, zgodnie z założeniem.
Ponadto, podczas gdy rozszerzenia Lambda mają możliwość subskrybowania zdarzeń wywołania, AWS nie ujawnia surowych danych tym rozszerzeniom. Zapewnia to, że rozszerzenia nie mogą uzyskać dostępu do wrażliwych informacji przesyłanych za pośrednictwem żądania HTTP.
Proces Init (Rapid) monitoruje wszystkie żądania API pod adresem http://127.0.0.1:9001 podczas gdy rozszerzenia Lambda są inicjowane i uruchamiane przed wykonaniem jakiegokolwiek kodu uruchomieniowego, ale po Rapid.
Zmienna AWS_LAMBDA_RUNTIME_API
wskazuje adres IP i numer portu API Rapid dla procesów uruchomieniowych potomnych i dodatkowych rozszerzeń.
Zmieniając zmienną środowiskową AWS_LAMBDA_RUNTIME_API
na port
, do którego mamy dostęp, możliwe jest przechwycenie wszystkich działań w ramach uruchomienia Lambda (man-in-the-middle). Jest to możliwe, ponieważ rozszerzenie działa z tymi samymi uprawnieniami co Rapid Init, a kernel systemu pozwala na modyfikację pamięci procesów, umożliwiając zmianę numeru portu.
Ponieważ rozszerzenia działają przed jakimkolwiek kodem uruchomieniowym, modyfikacja zmiennej środowiskowej wpłynie na proces uruchomieniowy (np. Python, Java, Node, Ruby) w momencie jego uruchomienia. Ponadto, rozszerzenia załadowane po naszym, które polegają na tej zmiennej, również będą kierowane przez nasze rozszerzenie. Ta konfiguracja może umożliwić złośliwemu oprogramowaniu całkowite ominięcie środków bezpieczeństwa lub rozszerzeń rejestrujących bezpośrednio w środowisku uruchomieniowym.
Narzędzie lambda-spy zostało stworzone, aby wykonać zapis pamięci i ukraść wrażliwe informacje z żądań lambda, innych rozszerzeń żądań i nawet je modyfikować.
Ucz się i ćwicz Hacking AWS:HackTricks Training AWS Red Team Expert (ARTE) Ucz się i ćwicz Hacking GCP: HackTricks Training GCP Red Team Expert (GRTE)