AWS - Lambda Layers Persistence
Lambda Layers
Ένα Lambda layer είναι ένα αρχείο .zip που μπορεί να περιέχει επιπλέον κώδικα ή άλλο περιεχόμενο. Ένα layer μπορεί να περιέχει βιβλιοθήκες, ένα προσαρμοσμένο runtime, δεδομένα ή αρχεία διαμόρφωσης.
Είναι δυνατόν να περιλαμβάνονται έως πέντε layers ανά συνάρτηση. Όταν περιλαμβάνετε ένα layer σε μια συνάρτηση, το περιεχόμενο εξάγεται στον φάκελο /opt
στο περιβάλλον εκτέλεσης.
Από προεπιλογή, τα layers που δημιουργείτε είναι ιδιωτικά για τον λογαριασμό σας στο AWS. Μπορείτε να επιλέξετε να μοιραστείτε ένα layer με άλλους λογαριασμούς ή να το κάνετε δημόσιο. Εάν οι συναρτήσεις σας χρησιμοποιούν ένα layer που δημοσίευσε ένας διαφορετικός λογαριασμός, οι συναρτήσεις σας μπορούν να συνεχίσουν να χρησιμοποιούν την έκδοση του layer ακόμα και αφού έχει διαγραφεί ή αφού έχει ανακληθεί η άδειά σας για πρόσβαση στο layer. Ωστόσο, δεν μπορείτε να δημιουργήσετε μια νέα συνάρτηση ή να ενημερώσετε συναρτήσεις χρησιμοποιώντας μια διαγραμμένη έκδοση του layer.
Οι συναρτήσεις που έχουν αναπτυχθεί ως εικόνες εμπορευματοκιβωτίου δεν χρησιμοποιούν layers. Αντ' αυτού, συμπεριλαμβάνετε το προτιμώμενο runtime, τις βιβλιοθήκες και άλλες εξαρτήσεις στην εικόνα του εμπορευματοκιβωτίου κατά την κατασκευή της εικόνας.
Φορτωτική διαδρομή Python
Η φορτωτική διαδρομή που θα χρησιμοποιήσει η Python στο Lambda είναι η εξής:
Ελέγξτε πώς οι δεύτερη και τρίτη θέση καταλαμβάνονται από καταλόγους όπου οι λειτουργίες του λάμδα αποσυμπιέζουν τα αρχεία τους: /opt/python/lib/python3.9/site-packages
και /opt/python
Εάν ένας επιτιθέμενος καταφέρει να εισχωρήσει σε ένα χρησιμοποιούμενο λάμδα layer ή να προσθέσει ένα που θα εκτελεί αυθαίρετο κώδικα όταν φορτώνεται μια κοινή βιβλιοθήκη, θα μπορεί να εκτελέσει κακόβουλο κώδικα με κάθε κλήση του λάμδα.
Επομένως, οι προϋποθέσεις είναι:
Ελέγξτε τις βιβλιοθήκες που φορτώνονται από τον κώδικα των θυμάτων
Δημιουργήστε μια βιβλιοθήκη διαμεσολαβητή με λάμδα layers που θα εκτελεί προσαρμοσμένο κώδικα και θα φορτώνει την αρχική βιβλιοθήκη.
Προφορτωμένες βιβλιοθήκες
Όταν καταχρώνται αυτήν την τεχνική, αντιμετώπισα μια δυσκολία: Ορισμένες βιβλιοθήκες έχουν ήδη φορτωθεί στον χρόνο εκτέλεσης της Python όταν εκτελείται ο κώδικάς σας. Περίμενα να βρω πράγματα όπως os
ή sys
, αλλά ακόμα και η βιβλιοθήκη json
είχε φορτωθεί.
Για να καταχραστείτε αυτήν την τεχνική διατήρησης, ο κώδικας πρέπει να φορτώσει μια νέα βιβλιοθήκη που δεν έχει φορτωθεί όταν εκτελείται ο κώδικας.
Με έναν κώδικα Python όπως αυτός, είναι δυνατόν να λάβετε τη λίστα των βιβλιοθηκών που έχουν προφορτωθεί εντός του χρόνου εκτέλεσης της Python στο λάμδα:
Και αυτή είναι η λίστα (ελέγξτε ότι βιβλιοθήκες όπως os
ή json
υπάρχουν ήδη εκεί)
Και αυτή είναι η λίστα των βιβλιοθηκών που περιλαμβάνει η lambda που είναι εγκατεστημένες από προεπιλογή: https://gist.github.com/gene1wood/4a052f39490fae00e0c3
Παραβίαση Λειτουργίας Επιπέδου Lambda
Σε αυτό το παράδειγμα, ας υποθέσουμε ότι ο κατευθυνόμενος κώδικας εισάγει τη csv
βιβλιοθήκη. Θα προχωρήσουμε στην παραβίαση της εισαγωγής της βιβλιοθήκης csv
.
Για να το κάνουμε αυτό, θα δημιουργήσουμε τον φάκελο csv με το αρχείο __init__.py
μέσα σε αυτόν, σε ένα μονοπάτι που φορτώνεται από την lambda: /opt/python/lib/python3.9/site-packages
.
Έπειτα, όταν εκτελείται το lambda και προσπαθεί να φορτώσει το csv, το αρχείο μας __init__.py
θα φορτωθεί και θα εκτελεστεί.
Αυτό το αρχείο πρέπει:
Να εκτελεί το payload μας
Να φορτώνει την αρχική βιβλιοθήκη csv
Μπορούμε να κάνουμε και τα δύο με:
Στη συνέχεια, δημιουργήστε ένα zip με αυτόν τον κώδικα στη διαδρομή python/lib/python3.9/site-packages/__init__.py
και προσθέστε το ως ένα λειτουργικό επίπεδο λάμδα.
Μπορείτε να βρείτε αυτόν τον κώδικα στο https://github.com/carlospolop/LambdaLayerBackdoor
Το ενσωματωμένο φορτίο θα στείλει τα IAM διαπιστευτήρια σε έναν διακομιστή ΤΗΝ ΠΡΩΤΗ ΦΟΡΑ που καλείται ή ΜΕΤΑ από επαναφορά του container της λάμδα (αλλαγή του κώδικα ή κρύα λάμδα), αλλά μπορούν επίσης να ενσωματωθούν και άλλες τεχνικές όπως οι ακόλουθες:
Εξωτερικά Επίπεδα
Να σημειωθεί ότι είναι δυνατή η χρήση επιπέδων λάμδα από εξωτερικούς λογαριασμούς. Επιπλέον, μια λάμδα μπορεί να χρησιμοποιήσει ένα επίπεδο από έναν εξωτερικό λογαριασμό ακόμα κι αν δεν έχει δικαιώματα. Επίσης, να σημειωθεί ότι το μέγιστο πλήθος των επιπέδων που μπορεί να έχει μια λάμδα είναι 5.
Επομένως, για να βελτιώσει την ευελιξία αυτής της τεχνικής, ένας επιτιθέμενος θα μπορούσε:
Να εισχωρήσει σε ένα υπάρχον επίπεδο του χρήστη (τίποτα δεν είναι εξωτερικό)
Να δημιουργήσει ένα επίπεδο στον λογαριασμό του, να δώσει στον λογαριασμό του θύματος πρόσβαση για να χρησιμοποιήσει το επίπεδο, να διαμορφώσει το επίπεδο στη λάμδα του θύματος και να αφαιρέσει την άδεια.
Η Λάμδα θα μπορεί ακόμα να χρησιμοποιήσει το επίπεδο και το θύμα δεν θα έχει εύκολο τρόπο να κατεβάσει τον κώδικα των επιπέδων (εκτός από το να πάρει ένα αντίστροφο κέλυφος μέσα στη λάμδα)
Το θύμα δεν θα δει εξωτερικά επίπεδα που χρησιμοποιούνται με
aws lambda list-layers
Last updated