• Akademia
  • Blog
  • O Serverless
  • O stronie

(Nie)bezpieczeństwo w Serverless


alt text

(Nie)bezpieczeństwo w Serverless

M├│wi─ůc o serverless, pr─Ödzej czy p├│┼║niej musi pa┼Ť─ç pytanie - a czy to jest bezpieczne? Na tak postawione pytanie, klasyczna odpowied┼║ brzmi ÔÇťto zale┼╝yÔÇŁ ­čśŐ

Model FaaS (Function as a Service) pozwala na budow─Ö aplikacji oraz us┼éug bez konieczno┼Ťci zarz─ůdzania fizycznymi b─ůd┼║ wirtualnymi serwerami. Dzi─Öki temu, odpowiedzialno┼Ť─ç za bezpiecze┼ästwo sieci, serwer├│w, system├│w operacyjnych, ich konfiguracji oraz aktualizacji spoczywa na dostawcy. Z drugiej jednak strony, w gestii dewelopera pozostaje bezpiecze┼ästwo kodu, logiki oraz konfiguracji aplikacji. Podzia┼é odpowiedzialno┼Ťci jest zdefiniowany tym modelem.

Czym jest Lambda?

Aby zrozumie─ç wektory atak├│w na aplikacj─Ö zbudowan─ů w architekturze serverless, musimy sobie najpierw u┼Ťwiadomi─ç, ┼╝e Lambda to w rzeczywisto┼Ťci ┼Ťrodowisko uruchomieniowe dla naszego kodu, dzia┼éaj─ůce w kontenerze na obrazie Amazon Linux. W teorii ┼Ťrodowisko to jest uruchomione oddzielnie dla ka┼╝dego wywo┼éania, tylko na czas obs┼éugi naszego kodu, a nast─Öpnie usuwane. W┼éa┼Ťnie, w teoriiÔÇŽ uruchomienie nowej instancji Lambdy zajmuje stosunkowo du┼╝o czasu (tzw. cold start). Aby przyspieszy─ç wydajno┼Ť─ç obs┼éugi kolejnych wywo┼éa┼ä Lambdy, ÔÇťstareÔÇŁ instancje nie s─ů od razu zamykane i s─ů wykorzystywane do obs┼éugi nadchodz─ůcych wywo┼éa┼ä, podczas gdy nowe instancje s─ů jeszcze uruchamiane. Bior─ůc pod uwag─Ö, i┼╝ wywo┼éania nie s─ů ca┼ékowicie od siebie odseparowane, a system plik├│w instancji Lambdy wcale nie jest ca┼ékowicie w trybie read-only (folder /tmp umo┼╝liwia zapis) to przy odpowiednich warunkach istnieje mo┼╝liwo┼Ť─ç ÔÇťprzej─ÖciaÔÇŁ przez atakuj─ůcego instancji Lambdy i wykonania z┼éo┼Ťliwego kodu w kontek┼Ťcie nowego wywo┼éania ­čś« Wi─Öcej o tym mo┼╝esz przeczyta─ç tu.

Je┼╝eli chcia┼éby┼Ť zobaczy─ç jak wygl─ůda Lambda ÔÇťod ┼ŤrodkaÔÇŁ bez grzebania w kodzie to zach─Öcam do odwiedzenia projektu: lambdashell.com. Autor zach─Öca to dowolnego atakowania jego ┼Ťrodowiska (i do tego p┼éaci 1000$ za ka┼╝d─ů istotn─ů podatno┼Ť─ç), cho─ç jak si─Ö ju┼╝ pewnie domy┼Ťlasz wprowadzi┼é tam kilka ogranicze┼ä.

OWASP Serverless Top 10

B┼é─Ödy w kodzie zdarzaj─ů si─Ö zawsze, niezale┼╝nie czy piszesz aplikacj─Ö webow─ů czy serverless. 10 najcz─Ö┼Ťciej powtarzanych rodzaj├│w b┼é─Öd├│w zosta┼éo opublikowane w ramach OWASP Serverless Top 10. Najcz─Östszymi b┼é─Ödami jest brak odpowiedniej walidacji danych wej┼Ťciowych. Opr├│cz dobrze znanych b┼é─Öd├│w typu cross-site scripting (XSS), XML External Entity (XXE) czy b┼é─Öd├│w deserializacji w serverless pojawia si─Ö jeszcze nowy wektor ataku, zwany: ÔÇťEvent InjectionÔÇŁ.

AWS Lambda mo┼╝e obs┼éugiwa─ç zdarzenia (ang. event sources) pochodz─ůce z innych us┼éug AWS takich jak np. S3, DynamoDB, SNS itd. Przypu┼Ť─çmy, ┼╝e nasza testowa aplikacja umo┼╝liwia u┼╝ytkownikom upload plik├│w do bucketu S3. Upload nowego pliku wywo┼éuje za┼Ť Lambd─Ö, kt├│ra z kolei dodaje now─ů nazw─Ö pliku do tabeli w MySQL.

W rzeczywisto┼Ťci wys┼éanie przez u┼╝ytkownika pliku tworzy nast─Öpujace zdarzenie:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
{
"Records": [
{
"eventSource": "aws:s3",
"eventName": "ObjectCreated:Put",
"s3": {
"bucket": {
...
},
"object": {
"key": "Plik+testowy",
"size": 5
}
}
}
]
}

Deweloper Lambdy potrzebuje wyci─ůgn─ů─ç nazw─Ö obiektu ÔÇťPlik testowyÔÇŁ i umie┼Ťci─ç j─ů w tabeli MySQL. Tworzy wi─Öc nast─Öpuj─ůcy kod:

1
2
3
4
5
let filename = decodeURIComponent(s3.object.key.replace(/\+/g,'%20'));
connection.query(
'INSERT INTO tabela_plikow (`file`) VALUES ("' + filename + '")',
(error, results) => {}
);

Wyobra┼║my sobie, ┼╝e jeden z u┼╝ytkownik├│w wy┼Ťle plik o nazwie: 1");(delete * from tabela_plikow. W takim wypadku do bazy danych zostanie wys┼éane poni┼╝sze zapytanie, kt├│re oczywi┼Ťcie usunie zawarto┼Ť─ç wszystkich plik├│w w tabeli:

1
INSERT INTO uploads (`file`) VALUES ("1");(delete * from tabela_plikow)

Zasada, aby nigdy nie ufa─ç danym wej┼Ťciowym (lub innymi s┼éowy zawsze walidowa─ç dane wej┼Ťciowe) jest jak najbardziej na miejscu nawet w przypadku obs┼éugi zdarze┼ä.

Przeanalizujmy inny przypadek. Aplikacja https://www.serverless-hack.me/ przyjmuje jako parametr ┼Ťcie┼╝k─Ö URL do dokumentu .doc, kt├│ry nast─Öpnie odpowiednio konwertuje za pomoc─ů Lambdy. Okazuje si─Ö jednak, ┼╝e przekazuj─ůc odpowiednio zmodyfikowane ┼╝─ůdanie mo┼╝emy wykona─ç zdalny kod w ┼Ťrodowisku na kt├│rym uruchomiona jest Lambda (podatno┼Ť─ç typu Remote Code Execution). Co atakuj─ůcy mo┼╝e w tej sytuacji zrobi─ç? Przyk┼éadowo mo┼╝e przej─ů─ç rol─Ö Lambdy, kt├│rej uprawnienia s─ů zdefiniowane w function policy. Lambda przechowuje klucze dost─Öpowe oraz token sesyjny podpi─Ötej roli w zmiennych ┼Ťrodowiskowych. Je┼Ťli wi─Öc atakuj─ůcy mo┼╝e wykona─ç zdalny kod, to nic nie stoi na przeszkodzie aby si─Ö do nich dosta─ç:

Naduzyżycia uprawnień

Zdobywaj─ůc AWS_ACCESS_KEY_ID, AWS_SECRET_ACCESS_KEY oraz AWS_SESSION_TOKEN atakuj─ůcy mo┼╝e tak du┼╝o na ile pozwala mu podpi─Öta polityka. Praktyka pokazuje, ┼╝e deweloperzy nadaj─ů zazwyczaj wy┼╝sze uprawnienia ni┼╝ jest to wymagane do prawid┼éowego dzia┼éania ich aplikacji. Przyk┼éadowo we wspomnianym ju┼╝ projekcie lambdashell.com pocz─ůtkowo nadane by┼éy uprawnienia do zapisu w us┼éudze S3, co zosta┼éo wykorzystane do przej─Öcia strony projektu. W niekt├│rych przypadkach mo┼╝liwe jest tak┼╝e podniesienie uprawnie┼ä skompromitowanej roli i dalsza eksploitacja ┼Ťrodowiska AWS. Zainteresowanym tym tematem Czytelnikom, szczeg├│lnie polecam projekt CloudGoat.

Warto tu nadmieni─ç, ┼╝e nadmiarowe uprawnienia nie s─ů tylko wynikiem ÔÇťlenistwaÔÇŁ dewelopera (w ko┼äcu poliltyka z "Action": "*" gwarantuje brak jakichkolwiek problem├│w z brakiem wymaganych uprawnie┼ä, prawda?). Przyk┼éadowo w frameworkÔÇÖu Serverless domy┼Ťlnie wykorzystywana jest jedna rola dla wszystkich funkcji ­čś« W takim podej┼Ťciu uprawnienia roli musz─ů by─ç na tyle szerokie aby zaspokoja┼éy potrzeby wszystkich funkcji. Pami─Ötaj drogi Czytelniku aby zawsze stosowa─ç jedn─ů polityk─Ö per funkcj─Ö!!! A je┼Ťli korzystasz z frameworkÔÇÖu Serverless mo┼╝e pom├│c Ci w tym dedykowana wtyczka Serverless IAM Roles Per Function.

Opr├│cz zasady najni┼╝szych uprawnie┼ä, dobr─ů praktyk─ů jest tak┼╝e separacja na poziomie kont, czyli stosowanie (minimum) oddzielnego konta do test├│w i oddzielnego konta produkcyjnego. Dodatkowo warto te┼╝ skorzysta─ç z us┼éugi AWS Organizations oraz Service Control Policies do ograniczenia uprawnie┼ä na poziomie organizacyjnym. Wi─Öcej o najlepszych praktykach w kontek┼Ťcie bezpiecze┼ästwa AWS mo┼╝esz znale┼║─ç w moim darmowym poradniku.

Błędy w zewnętrznych bibliotekach

Fakt, ┼╝e Tw├│j kod jest wolny od b┼é─Öd├│w wcale nie oznacza, ┼╝e jeste┼Ť bezpieczny. Podatno┼Ťci bowiem mog─ů pojawi─ç si─Ö tak┼╝e w wykorzystywanych zewn─Ötrznych bibliotekach. Warto tu nadmieni─ç pewne badanie, w kt├│rym to uda┼éo si─Ö przej─ů─ç kontrol─Ö nad kodem 14% wszystkich paczek NPM ­čś« Definiowanie wersji paczki w konwencji:

1
"nazwa paczki NPM": "^1.0.0."

oznacza stosowanie najnowszej kompatybilnej wersji, czyli np. 1.1.0. Wyobra┼║ sobie teraz sytuacj─Ö, gdy w┼éa┼Ťciciel repozytorium zmodyfikuje kod NPM tak by ten wys┼éa┼é na jego serwer przy ka┼╝dym wywo┼éaniu zmienne ┼Ťrodowiskowe Lambdy, w kt├│rej korzystasz z jego paczkiÔÇŽ A ┼╝eby nie pozosta─ç go┼éos┼éownym to pewien badacz zrealizowa┼é ten scenariusz - zwr├│─ç uwag─Ö na liczb─Ö pobra┼ä pomimo do┼Ť─ç wymownej nazwy paczki ÔÇťdo-not-download-this-packageÔÇŁ ­čśé

Oczywi┼Ťcie w zewn─Ötrznych bibliotekach mo┼╝na znale┼║─ç ca┼é─ů gam─Ö podatno┼Ťci. Wyobra┼║my sobie, ┼╝e nasza aplikacja serverless korzysta z paczki humanize-ms do przeliczania czasu na milisekundy. W starej wersji tej paczki mo┼╝na by┼éo znale┼║─ç podatno┼Ť─ç typu ReDoS, czyli b┼é─Ödu w wyra┼╝eniu regularnym. Podatno┼Ť─ç ta, polega na tym, ┼╝e atakuj─ůcy mo┼╝e wys┼éa─ç tak─ů warto┼Ť─ç, kt├│rej czas przetwarzania przekroczy dozwolony timeout Lambdy (maksymalnie mo┼╝e on wynosi─ç 15 minut). Bior─ůc pod uwag─Ö, ┼╝e p┼éacimy za czas wykonania Lambdy, to wys┼éanie tysi─Öcy lub milion├│w takich ┼╝─ůda┼ä mo┼╝e znacz─ůco podnie┼Ť─ç koszty, powoduj─ůc tym samym realne straty. Mo┼╝na wi─Öc powiedzie─ç, ┼╝e znana podatno┼Ť─ç Denial of Service w serverless ewoluowa┼éa do Denial of Wallet ­čśë

Monitorowanie podatno┼Ťci w zewn─Ötrznych bibliotekach jest zadaniem do┼Ť─ç trudnym, szczeg├│lnie w du┼╝ych systemach. Warto jednak wspomnie─ç, ┼╝e mo┼╝emy sprawdzi─ç u┼╝ywane paczki npm pod k─ůtem znanych podatno┼Ťci u┼╝ywaj─ůc narz─Ödzia npm audit. Narz─Ödzie to odpytuje o znane podatno┼Ťci za ka┼╝dym razem kiedy uruchomimy npm install (cho─ç mo┼╝e te┼╝ by─ç u┼╝yte r─Öcznie do skanowania lokalnych paczek). Po wykryciu podatno┼Ťci, komend─ů npm audit fix mo┼╝emy zainstalowa─ç sugerowane aktualizacje.

Alternatywnie, jeden z dostawc├│w, kt├│ry zajmuje si─Ö monitorowaniem podatno┼Ťci w zewn─Ötrznych bibliotekach, oferuje ca┼ékiem wygodn─ů integracj─Ö z Lambd─ů.

Podsumowanie

Bez dw├│ch zda┼ä serverless otwiera przed nami szereg korzy┼Ťci, ale nie mo┼╝emy zapomnie─ç o zagro┼╝eniach. Nawet je┼Ťli ÔÇťwierzyszÔÇŁ w bezpiecze┼ästwo swojego kodu to musisz pami─Öta─ç, ┼╝e zewn─Ötrzne biblioteki mog─ů niepostrze┼╝enie narazi─ç na kompromitacj─Ö Twojego ┼Ťrodowiska AWS, w┼é─ůcznie ze wszystkimi zasobami w nim si─Ö znajduj─ůcymi. Stosowany w serverless model ÔÇťpay as you goÔÇŁ, cho─ç pe┼éen niew─ůtpliwych zalet, mo┼╝e okaza─ç si─Ö gwo┼║dziem do trumny Twojego biznesu, je┼Ťli tylko pozwolisz na zbyt du┼╝o Twojemu u┼╝ytkownikowi. Dlatego niezale┼╝nie czy korzystasz z klasycznej architektury, czy serverless pami─Ötaj o wielowarstwowym podej┼Ťciu do bezpiecze┼ästwa. Zach─Öcam do dyskusji i kontaktu. Znajdziesz mnie na Twitterze i LinkedIn.

Autor: Pawe┼é Rzepa Pawe┼é pracuje jako starszy konsultant ds. bezpiecze┼ästwa w firmie SecuRing. Na co dzie┼ä przeprowadza testy bezpiecze┼ästwa aplikacji, sieci, jak r├│wnie┼╝ ┼Ťrodowisk chmurowych. Posiada szerokie do┼Ťwiadczenie w obszarze bezpiecze┼ästwa zdobyte m.in. jako pentester w EY GSS, deweloper fuzzera dla firmy Spirent, audytor bezpiecze┼ästwa w Credit Agricole czy analityk zagro┼╝e┼ä w IBM SOC. Jego umiej─Ötno┼Ťci potwierdzaj─ů zdobyte certyfikaty OSCP, eMAPT, AWS SAA czy AWS CSS. Pawe┼é aktywnie wspiera spo┼éeczno┼Ť─ç OWASP poprzez wsp├│┼étworzenie projektu OWASP MSTG oraz pomagaj─ůc przy organizacji lokalnych spotka┼ä OWASP we Wroc┼éawiu.



Cze┼Ť─ç

Nazywam si─Ö Pawe┼é Zubkiewicz i ciesz─Ö si─Ö, ┼╝e tu jeste┼Ť!
Od ponad 14 lat profesjonalnie tworz─Ö oprogramowanie, a od 2016 roku pasjonuje si─Ö Serverless.
T─ů stron─Ö stworzy┼éem z my┼Ťl─ů o Tobie i o nas wszystkich, kt├│rzy uwa┼╝aj─ů, ┼╝e trend serverless trwale zmieni spos├│b tworzenia oprogramowania.
Wi─Öcej o tej stronie...

Kategorie

Pobierz bezpłatny PDF

Poradnik 12 Rzeczy o Serverless

Wybrane artykuły