AWS - Abusing Lambda Extensions

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Rozszerzenia Lambda

Rozszerzenia Lambda ulepszają funkcje poprzez integrację z różnymi narzędziami monitorującymi, obserwującymi, zabezpieczającymi i zarządzającymi. Te rozszerzenia, dodawane za pomocą .zip archiwów przy użyciu warstw Lambda lub dołączane do wdrożeń obrazów kontenerowych, działają w dwóch trybach: wewnętrznym i zewnętrznym.

  • Rozszerzenia wewnętrzne łączą się z procesem uruchomieniowym, manipulując jego uruchomieniem za pomocą zmiennych środowiskowych specyficznych dla języka i skryptów opakowujących. Ta niestandardowa konfiguracja dotyczy różnych środowisk uruchomieniowych, w tym Java Correto 8 i 11, Node.js 10 i 12 oraz .NET Core 3.1.

  • Rozszerzenia zewnętrzne działają jako osobne procesy, zachowując zgodność z cyklem życia funkcji Lambda. Są one 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 niestandardowe środowiska uruchomieniowe.

Aby uzyskać więcej informacji na temat działania rozszerzeń Lambda, sprawdź dokumentację.

Zewnętrzne Rozszerzenie do Trwałości, Kradzieży Żądań i Modyfikowania Żądań

To podsumowanie techniki zaproponowanej w tym poście: https://www.clearvector.com/blog/lambda-spy/

Stwierdzono, że domyślny jądro Linuxa w środowisku uruchomieniowym Lambda jest skompilowane z wywołaniami systemowymi „process_vm_readv” i „process_vm_writev”. I wszystkie procesy działają z tym samym identyfikatorem użytkownika, nawet nowy proces utworzony dla rozszerzenia zewnętrznego. Oznacza to, że rozszerzenie zewnętrzne ma pełny dostęp do odczytu i zapisu pamięci sterty Rapid, zgodnie z projektem.

Ponadto, chociaż rozszerzenia Lambda mają możliwość subskrybowania zdarzeń wywołania, AWS nie ujawnia tych danych surowych rozszerzeniom. Zapewnia to, że rozszerzenia nie mogą uzyskać dostępu do poufnych informacji przesyłanych za pomocą żą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 interfejsu 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 środowisku uruchomieniowym Lambdy (człowiek pośrodku). Jest to możliwe, ponieważ rozszerzenie działa z tymi samymi uprawnieniami co Rapid Init, a jądro systemu pozwala na modyfikację pamięci procesu, umożliwiając zmianę numeru portu.

Ponieważ rozszerzenia uruchamiają się przed jakimkolwiek kodem uruchomieniowym, zmiana zmiennej środowiskowej wpłynie na proces uruchomieniowy (np. Python, Java, Node, Ruby) podczas uruchamiania. Ponadto rozszerzenia załadowane po naszych, które polegają na tej zmiennej, również będą kierowane przez nasze rozszerzenie. Taka konfiguracja może umożliwić złośliwemu oprogramowaniu całkowite obejście środków bezpieczeństwa lub bezpośrednie pomijanie rozszerzeń logowania bezpośrednio w środowisku uruchomieniowym.

Narzędzie lambda-spy zostało stworzone do wykonania zapisu pamięci i kradzieży poufnych informacji z żądań lambdy, innych żądań rozszerzeń i nawet ich modyfikacji.

Odnośniki

Nauka hakowania AWS od zera do bohatera z htARTE (HackTricks AWS Red Team Expert)!

Inne sposoby wsparcia HackTricks:

Last updated