AWS - Lambda Layers Persistence
Lambda Layers
Una Lambda layer è un archivio .zip che può contenere codice aggiuntivo o altro contenuto. Una layer può contenere librerie, un runtime personalizzato, dati o file di configurazione.
È possibile includere fino a cinque layers per funzione. Quando includi una layer in una funzione, i contenuti vengono estratti nella directory /opt
nell'ambiente di esecuzione.
Per definizione, le layers che crei sono private al tuo account AWS. Puoi scegliere di condividere una layer con altri account o di rendere la layer pubblica. Se le tue funzioni consumano una layer pubblicata da un altro account, le tue funzioni possono continuare a utilizzare la versione della layer dopo che è stata eliminata, o dopo che il tuo permesso di accesso alla layer è stato revocato. Tuttavia, non puoi creare una nuova funzione o aggiornare funzioni utilizzando una versione di layer eliminata.
Le funzioni distribuite come immagine del contenitore non utilizzano le layers. Invece, impacchetti il tuo runtime preferito, librerie e altre dipendenze nell'immagine del contenitore quando costruisci l'immagine.
Percorso di caricamento Python
Il percorso di caricamento che Python utilizzerà in lambda è il seguente:
Controlla come le seconda e terza posizioni sono occupate da directory dove i lambda layers decomprimono i loro file: /opt/python/lib/python3.9/site-packages
e /opt/python
Se un attaccante riesce a backdoor un layer lambda utilizzato o aggiungerne uno che eseguirà codice arbitrario quando una libreria comune viene caricata, sarà in grado di eseguire codice malevolo con ogni invocazione di lambda.
Pertanto, i requisiti sono:
Controllare le librerie che sono caricate dal codice delle vittime
Creare una libreria proxy con lambda layers che eseguirà codice personalizzato e caricherà la libreria originale.
Librerie pre-caricate
Quando si abusa di questa tecnica ho trovato una difficoltà: Alcune librerie sono già caricate nel runtime di python quando il tuo codice viene eseguito. Mi aspettavo di trovare cose come os
o sys
, ma anche la libreria json
era caricata.
Per abusare di questa tecnica di persistenza, il codice deve caricare una nuova libreria che non è caricata quando il codice viene eseguito.
Con un codice python come questo è possibile ottenere la lista delle librerie che sono pre-caricate all'interno del runtime di python in lambda:
E questa è la lista (controlla che librerie come os
o json
siano già presenti)
E questa è la lista delle librerie che lambda include installate per impostazione predefinita: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Backdooring del Lambda Layer
In questo esempio supponiamo che il codice target stia importando csv
. Stiamo per backdooring l'importazione della libreria csv
.
Per fare ciò, andremo a creare la directory csv con il file __init__.py
al suo interno in un percorso che viene caricato da lambda: /opt/python/lib/python3.9/site-packages
Poi, quando il lambda viene eseguito e cerca di caricare csv, il nostro file __init__.py
verrà caricato ed eseguito.
Questo file deve:
Eseguire il nostro payload
Caricare la libreria csv originale
Possiamo fare entrambe le cose con:
Poi, crea uno zip con questo codice nel percorso python/lib/python3.9/site-packages/__init__.py
e aggiungilo come un layer lambda.
Puoi trovare questo codice in https://github.com/carlospolop/LambdaLayerBackdoor
Il payload integrato invierà le credenziali IAM a un server LA PRIMA VOLTA che viene invocato o DOPO un reset del contenitore lambda (cambio di codice o lambda a freddo), ma altre tecniche come le seguenti potrebbero essere integrate:
AWS - Steal Lambda RequestsLayer Esterni
Nota che è possibile utilizzare layer lambda da account esterni. Inoltre, un lambda può utilizzare un layer da un account esterno anche se non ha permessi. Nota anche che il numero massimo di layer che un lambda può avere è 5.
Pertanto, per migliorare la versatilità di questa tecnica, un attaccante potrebbe:
Backdoor un layer esistente dell'utente (niente è esterno)
Creare un layer nel suo account, dare accesso all'account vittima per utilizzare il layer, configurare il layer nel Lambda della vittima e rimuovere il permesso.
Il Lambda sarà ancora in grado di utilizzare il layer e la vittima non avrà alcun modo semplice per scaricare il codice dei layer (a parte ottenere una rev shell all'interno del lambda)
La vittima non vedrà i layer esterni utilizzati con
aws lambda list-layers
Last updated