AWS - Lambda Layers Persistence
Lambda Slojevi
Lambda sloj je .zip arhiva koja može sadržati dodatni kod ili drugi sadržaj. Sloj može sadržati biblioteke, prilagođeno izvršno okruženje, podatke ili konfiguracione fajlove.
Moguće je uključiti do pet slojeva po funkciji. Kada uključite sloj u funkciju, sadržaj se izvlači u direktorijum /opt
u okruženju izvršenja.
Po podrazumevanim podešavanjima, slojevi koje kreirate su privatni za vaš AWS nalog. Možete odabrati da podelite sloj sa drugim nalozima ili da ga učinite javnim. Ako vaše funkcije koriste sloj koji je objavio drugi nalog, vaše funkcije mogu nastaviti da koriste verziju sloja nakon što je obrisan, ili nakon što vam je dozvola za pristup sloju opozvana. Međutim, ne možete kreirati novu funkciju ili ažurirati funkcije koristeći obrisnu verziju sloja.
Funkcije implementirane kao kontejnerska slika ne koriste slojeve. Umesto toga, pakujete svoje preferirano izvršno okruženje, biblioteke i druge zavisnosti u kontejnersku sliku prilikom izgradnje slike.
Putanja učitavanja za Python
Putanja učitavanja koju će Python koristiti u lambdi je sledeća:
Proverite kako su drugi i treći položaj zauzeti direktorijumima gde lambda slojevi raspakuju svoje datoteke: /opt/python/lib/python3.9/site-packages
i /opt/python
Ako napadač uspe da ubaci zadnja vrata u korišćeni lambda sloj ili doda jedan koji će izvršavati proizvoljni kod kada se učita zajednička biblioteka, moći će da izvrši zlonamerni kod pri svakom pozivu lambda funkcije.
Stoga su potrebni sledeći uslovi:
Proveriti biblioteke koje se učitavaju u kodu žrtve
Kreirati proxy biblioteku sa lambda slojevima koja će izvršavati prilagođeni kod i učitati originalnu biblioteku.
Prethodno učitane biblioteke
Prilikom zloupotrebe ove tehnike naišao sam na poteškoću: Nekolike biblioteke su već učitane u python okruženju prilikom izvršavanja vašeg koda. Očekivao sam da ću pronaći stvari poput os
ili sys
, ali čak je i biblioteka json
bila učitana.
Da bi se zloupotrebila ova tehnika upornosti, kod mora učitati novu biblioteku koja nije učitana prilikom izvršavanja koda.
Pomoću python koda poput ovog moguće je dobiti listu biblioteka koje su prethodno učitane unutar python okruženja u lambdi:
I ovo je lista (proverite da li su biblioteke poput os
ili json
već tamo)
I ovo je lista biblioteka koje lambda podrazumevano instalira: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Lambda Layer Backdooring
U ovom primeru pretpostavimo da ciljni kod uvozi csv
. Backdoor-ovaćemo uvoz biblioteke csv
.
Da bismo to uradili, kreiraćemo direktorijum csv sa fajlom __init__.py
u njemu na putanji koju učitava lambda: /opt/python/lib/python3.9/site-packages
Zatim, kada se lambda izvrši i pokuša da učita csv, naš __init__.py
fajl će biti učitan i izvršen.
Ovaj fajl mora:
Izvršiti naš payload
Učitati originalnu csv biblioteku
To možemo uraditi sa:
Zatim, napravite zip sa ovim kodom na putanji python/lib/python3.9/site-packages/__init__.py
i dodajte ga kao lambda sloj.
Ovaj kod možete pronaći na https://github.com/carlospolop/LambdaLayerBackdoor
Integrisani payload će poslati IAM kredencijale serveru PRVI PUT kada se pozove ili NAKON resetovanja lambda kontejnera (promena koda ili hladna lambda), ali se mogu integrisati i druge tehnike kao što su sledeće:
AWS - Steal Lambda RequestsSpoljni slojevi
Imajte na umu da je moguće koristiti lambda slojeve iz spoljnih naloga. Štaviše, lambda može koristiti sloj iz spoljnog naloga čak i ako nema dozvole. Takođe imajte na umu da je maksimalan broj slojeva koje lambda može imati 5.
Stoga, kako bi se poboljšala univerzalnost ove tehnike, napadač bi mogao:
Backdoor-ovati postojeći sloj korisnika (ništa nije spoljno)
Napraviti sloj u svom nalogu, dati pristup korisničkom nalogu da koristi sloj, konfigurisati sloj u Lambda korisnika i ukloniti dozvolu.
Lambda će i dalje moći da koristi sloj i žrtva neće imati jednostavan način da preuzme kod slojeva (osim ako dobije rev šel unutar lambe)
Žrtva neće videti spoljne slojeve korišćene sa
aws lambda list-layers
Last updated