AWS - Lambda Layers Persistence
Lambda Lae
'n Lambda-laag is 'n .zip-lêerargief wat addisionele kode of ander inhoud kan bevat. 'n Laag kan biblioteke, 'n aangepaste uitvoering, data, of opsetlêers bevat.
Dit is moontlik om tot vyf lêers per funksie in te sluit. Wanneer jy 'n laag in 'n funksie insluit, word die inhoud onttrek na die /opt
-gids in die uitvoeringsomgewing.
Standaard is die lêers wat jy skep privaat vir jou AWS-rekening. Jy kan kies om 'n laag met ander rekeninge te deel of om die laag publiek te maak. As jou funksies 'n laag verbruik wat deur 'n ander rekening gepubliseer is, kan jou funksies voortgaan om die laagweergawe te gebruik nadat dit uitgevee is, of nadat jou toestemming om die laag te gebruik, herroep is. Jy kan egter nie 'n nuwe funksie skep of funksies bywerk met 'n uitgevee laagweergawe nie.
Funksies wat as 'n houerbeeld ontplooi is, gebruik nie lêers nie. In plaas daarvan pak jy jou verkose uitvoering, biblioteke, en ander afhanklikhede in die houerbeeld in wanneer jy die beeld bou.
Python laaipad
Die laaipad wat Python in lambda sal gebruik, is die volgende:
Kyk hoe die tweede en derde posisies beset word deur gide waar lambda-lae hul lêers uitpak: /opt/python/lib/python3.9/site-packages
en /opt/python
As 'n aanvaller daarin slaag om 'n gebruikte lambda laag te agterdeur of een by te voeg wat willekeurige kode uitvoer wanneer 'n algemene biblioteek gelaai word, sal hy in staat wees om skadelike kode uit te voer met elke lambda-aanroeping.
Daarom is die vereistes:
Kontroleer biblioteke wat deur die slagoffers se kode gelaai word
Skep 'n proksi-biblioteek met lambda-lae wat aangepaste kode uitvoer en die oorspronklike biblioteek laai.
Voorafgelaai biblioteke
Toe ek hierdie tegniek misbruik het, het ek 'n probleem gevind: Sommige biblioteke is reeds gelaai in die python-uitvoertyd wanneer jou kode uitgevoer word. Ek het verwag om dinge soos os
of sys
te vind, maar selfs die json
-biblioteek was gelaai.
Om hierdie volhardingstegniek te misbruik, moet die kode 'n nuwe biblioteek laai wat nie gelaai is wanneer die kode uitgevoer word nie.
Met 'n python-kode soos hierdie is dit moontlik om die lys van biblioteke wat vooraf gelaai is binne die python-uitvoertyd in lambda te verkry:
En hierdie is die lys (kontroleer of biblioteke soos os
of json
reeds daar is)
En hierdie is die lys van biblioteke wat lambda standaard geïnstalleer het: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Lambda Laag Agterdeur
In hierdie voorbeeld gaan ons aanneem dat die geteikende kode die invoer van csv
invoer. Ons gaan die invoer van die csv
-biblioteek agterdeur.
Om dit te doen, gaan ons die csv-gids skep met die lêer __init__.py
daarin op 'n pad wat deur lambda gelaai word: /opt/python/lib/python3.9/site-packages
Dan, wanneer die lambda uitgevoer word en probeer om csv te laai, sal ons __init__.py
-lêer gelaai en uitgevoer word.
Hierdie lêer moet:
Ons lading uitvoer
Die oorspronklike csv-bibliotheek laai
Ons kan beide doen met:
Dan, skep 'n zip met hierdie kode in die pad python/lib/python3.9/site-packages/__init__.py
en voeg dit as 'n lambda-laag by.
Jy kan hierdie kode vind op https://github.com/carlospolop/LambdaLayerBackdoor
Die geïntegreerde payload sal die IAM-kredos na 'n bediener stuur DIE EERSTE KEER wat dit aangeroep word of NÁ 'n herstel van die lambda-houer (verandering van kode of koue lambda), maar ander tegnieke soos die volgende kan ook geïntegreer word:
AWS - Steal Lambda RequestsEksterne Lêers
Let daarop dat dit moontlik is om lambda-lêers van eksterne rekeninge te gebruik. Verder kan 'n lambda 'n laag van 'n eksterne rekening gebruik selfs al het dit nie toestemmings nie. Let ook daarop dat die maksimum aantal lêers wat 'n lambda kan hê 5 is.
Daarom, om die veelsydigheid van hierdie tegniek te verbeter, kan 'n aanvaller:
'n Bestaande laag van die gebruiker agterdeur
Skep 'n laag in sy rekening, gee die slagofferrekening toegang om die laag te gebruik, konfigureer die laag in die slagoffers Lambda en verwyder die toestemming.
Die Lambda sal steeds in staat wees om die laag te gebruik en die slagoffer sal nie 'n maklike manier hê om die kode van die lae af te laai nie (behalwe om 'n omgekeerde dop binne die lambda te kry)
Die slagoffer sal nie eksterne lêers sien wat met
aws lambda list-layers
gebruik word nie
Last updated