AWS - Lambda Privesc
lambda
Więcej informacji na temat lambdy znajdziesz w:
pageAWS - Lambda Enumiam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)
iam:PassRole
, lambda:CreateFunction
, (lambda:InvokeFunction
| lambda:InvokeFunctionUrl
)Użytkownicy posiadający uprawnienia iam:PassRole
, lambda:CreateFunction
oraz lambda:InvokeFunction
mogą eskalować swoje uprawnienia.
Mogą utworzyć nową funkcję Lambdy i przypisać jej istniejącą rolę IAM, nadając funkcji uprawnienia z nią związane. Następnie użytkownik może napisać i przesłać kod do tej funkcji Lambdy (na przykład z odwróconym powłokiem).
Gdy funkcja jest skonfigurowana, użytkownik może wywołać jej wykonanie i zamierzone działania, wywołując funkcję Lambdy za pośrednictwem interfejsu API AWS. Ten sposób efektywnie pozwala użytkownikowi wykonywać zadania pośrednio za pośrednictwem funkcji Lambdy, działając na poziomie dostępu przyznanego roli IAM z nią związanego.\
Atakujący mógłby wykorzystać to do uzyskania odwróconej powłoki i kradzieży tokena:
Możesz również wykorzystać uprawnienia roli lambdy bezpośrednio z funkcji lambdy. Jeśli rola lambdy miała wystarczające uprawnienia, możesz ich użyć do przyznania sobie uprawnień administratora:
Możliwe jest również ujawnienie poświadczeń roli lambdy bez konieczności zewnętrznego połączenia. Byłoby to przydatne dla Lambd izolowanych sieciowo używanych do zadań wewnętrznych. Jeśli nieznane grupy zabezpieczeń filtrowałyby odwrócone powłoki, ten fragment kodu pozwoli Ci bezpośrednio ujawnić poświadczenia jako wynik lambdy.
Potencjalny wpływ: Bezpośrednie podniesienie uprawnień do określonej roli usługi lambda.
Należy zauważyć, że nawet jeśli może to wydawać się interesujące lambda:InvokeAsync
, to nie pozwala samodzielnie wykonać aws lambda invoke-async
, potrzebujesz również lambda:InvokeFunction
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
iam:PassRole
, lambda:CreateFunction
, lambda:AddPermission
Podobnie jak w poprzednim scenariuszu, możesz przyznać sobie uprawnienie lambda:InvokeFunction
, jeśli masz uprawnienie lambda:AddPermission
Potencjalny wpływ: Bezpośrednie podniesienie uprawnień do określonej roli usługi lambda.
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
iam:PassRole
, lambda:CreateFunction
, lambda:CreateEventSourceMapping
Użytkownicy posiadający uprawnienia iam:PassRole
, lambda:CreateFunction
oraz lambda:CreateEventSourceMapping
(i potencjalnie dynamodb:PutItem
oraz dynamodb:CreateTable
) mogą pośrednio podnieść uprawnienia nawet bez lambda:InvokeFunction
.
Mogą utworzyć funkcję Lambda z złośliwym kodem i przypisać jej istniejącą rolę IAM.
Zamiast bezpośredniego wywoływania funkcji Lambda, użytkownik konfiguruje lub wykorzystuje istniejącą tabelę DynamoDB, łącząc ją z Lambdą poprzez mapowanie źródła zdarzeń. Ta konfiguracja zapewnia, że funkcja Lambda zostanie automatycznie uruchomiona po dodaniu nowego elementu do tabeli, zarówno w wyniku działania użytkownika, jak i innego procesu, co pośrednio wywołuje funkcję Lambda i wykonuje kod z uprawnieniami przekazanej roli IAM.
Jeśli DynamoDB jest już aktywny w środowisku AWS, użytkownik musi jedynie ustanowić mapowanie źródła zdarzeń dla funkcji Lambda. Jednak jeśli DynamoDB nie jest używany, użytkownik musi utworzyć nową tabelę z włączonym strumieniowaniem:
Teraz jest możliwe połączenie funkcji Lambda z tabelą DynamoDB poprzez utworzenie mapowania źródła zdarzeń:
Z funkcją Lambda połączoną ze strumieniem DynamoDB, atakujący może pośrednio uruchomić funkcję Lambda aktywując strumień DynamoDB. Można to osiągnąć poprzez wstawienie elementu do tabeli DynamoDB:
Potencjalne skutki: Bezpośrednie podniesienie uprawnień do roli usługi lambda określonej.
lambda:AddPermission
lambda:AddPermission
Atakujący posiadający te uprawnienia może przyznać sobie (lub innym) dowolne uprawnienia (co generuje polityki oparte na zasobach w celu przyznania dostępu do zasobu):
Potencjalne skutki: Bezpośrednie podniesienie uprawnień do roli usługi lambda poprzez udzielenie uprawnień do modyfikacji kodu i jego uruchamiania.
lambda:AddLayerVersionPermission
lambda:AddLayerVersionPermission
Atakujący posiadający te uprawnienia może udzielić sobie (lub innym) uprawnienia lambda:GetLayerVersion
. Może uzyskać dostęp do warstwy i wyszukiwać podatności lub poufne informacje.
Potencjalne skutki: Potencjalny dostęp do poufnych informacji.
lambda:UpdateFunctionCode
lambda:UpdateFunctionCode
Użytkownicy posiadający uprawnienie lambda:UpdateFunctionCode
mają potencjał do modyfikowania kodu istniejącej funkcji Lambda powiązanej z rolą IAM.
Atakujący może zmodyfikować kod lambdy w celu wycieku poświadczeń IAM.
Mimo że atakujący może nie mieć bezpośredniej możliwości wywołania funkcji, jeśli funkcja Lambda istnieje i jest operacyjna, jest prawdopodobne, że zostanie uruchomiona poprzez istniejące przepływy pracy lub zdarzenia, ułatwiając tym samym pośrednio wykonanie zmodyfikowanego kodu.
Potencjalne skutki: Bezpośrednie podniesienie uprawnień do roli usługi lambda używanej.
lambda:UpdateFunctionConfiguration
lambda:UpdateFunctionConfiguration
Wprowadzenie
Warstwy Lambda pozwalają na dołączenie kodu do funkcji lambda, ale przechowywanie go osobno, dzięki czemu kod funkcji może pozostać niewielki, a kilka funkcji może współdzielić kod.
Wewnątrz lambdy można sprawdzić ścieżki, z których jest ładowany kod Python za pomocą funkcji takiej jak poniższa:
Oto miejsca:
/var/task
/opt/python/lib/python3.7/site-packages
/opt/python
/var/runtime
/var/lang/lib/python37.zip
/var/lang/lib/python3.7
/var/lang/lib/python3.7/lib-dynload
/var/lang/lib/python3.7/site-packages
/opt/python/lib/python3.7/site-packages
/opt/python
Na przykład, biblioteka boto3 jest ładowana z /var/runtime/boto3
(4. pozycja).
Wykorzystanie
Możliwe jest nadużycie uprawnienia lambda:UpdateFunctionConfiguration
do dodania nowej warstwy do funkcji lambdy. Aby wykonać dowolny kod, ta warstwa musi zawierać bibliotekę, którą lambda ma zaimportować. Jeśli możesz odczytać kod lambdy, możesz to łatwo znaleźć, zauważ także, że możliwe jest, że lambda już używa warstwy i możesz pobrać warstwę i dodać swój kod tam.
Na przykład, załóżmy, że lambda używa biblioteki boto3, to spowoduje utworzenie lokalnej warstwy z najnowszą wersją biblioteki:
Możesz otworzyć ./lambda_layer/boto3/__init__.py
i dodać backdoor w kodzie globalnym (na przykład funkcję do eksfiltracji poświadczeń lub uzyskania odwrotnego powłoki).
Następnie spakuj ten katalog ./lambda_layer
i załaduj nową warstwę lambdy do swojego konta (lub do ofiary, ale możesz nie mieć uprawnień do tego).
Zauważ, że musisz utworzyć folder python i umieścić w nim biblioteki, aby zastąpić /opt/python/boto3. Ponadto warstwa musi być kompatybilna z wersją pythona używaną przez lambdę, a jeśli ją przesłasz do swojego konta, musi być w tym samym regionie:
Teraz spraw, aby przesłana warstwa lambda była dostępna dla dowolnego konta:
I dołącz warstwę lambda do funkcji lambda ofiary:
Następnym krokiem będzie albo wywołanie funkcji samodzielnie, jeśli jest to możliwe, albo oczekiwanie, aż zostanie wywołana w normalny sposób - co jest bezpieczniejszą metodą.
Bardziej skrytym sposobem wykorzystania tej podatności można znaleźć w:
pageAWS - Lambda Layers PersistencePotencjalne skutki: Bezpośrednie podniesienie uprawnień do roli usługi lambda używanej.
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
?iam:PassRole
, lambda:CreateFunction
, lambda:CreateFunctionUrlConfig
, lambda:InvokeFunctionUrl
Może być możliwe utworzenie funkcji i jej wykonanie, wywołując URL... ale nie mogłem znaleźć sposobu, aby to przetestować, więc daj mi znać, jeśli uda Ci się to zrobić!
Lambda MitM
Niektóre lambdy będą otrzymywać wrażliwe informacje od użytkowników w parametrach. Jeśli uzyskasz RCE w jednej z nich, możesz wyciekać informacje, które inni użytkownicy wysyłają do niej, sprawdź to w:
pageAWS - Steal Lambda RequestsReferencje
Last updated