Το «τρέξ' το σε sandbox» ακούγεται σαν μία οδηγία. Στην πράξη υπάρχουν τέσσερα συνηθισμένα όρια που εννοούν οι άνθρωποι με αυτό, και σταματούν πολύ διαφορετικά πράγματα. Αν διαλέξετε το λάθος, είτε μένετε εκτεθειμένοι είτε κάθε εκτέλεση γίνεται πιο αργή και ακριβή απ' όσο χρειάζεται.
Η σύγκριση υποθέτει ότι ο κώδικας είναι πραγματικά μη έμπιστος: γραμμένος από γλωσσικό μοντέλο, υποβεβλημένος από χρήστη ή φτασμένος σε pull request από κάποιον που δεν γνωρίζετε. Ο κώδικας που γράψατε εσείς έχει άλλες ανάγκες.
Τι μπορεί να πάει στραβά
Πριν συγκρίνουμε τα όρια, βοηθά να πούμε σε τι χρησιμεύουν. Ο μη έμπιστος κώδικας μπορεί να:
- Διαβάσει ό,τι δεν πρέπει: μεταβλητές περιβάλλοντος, κλειδιά SSH, αρχεία στον προσωπικό σας κατάλογο, endpoints μεταδεδομένων του cloud.
- Εξαντλήσει πόρους: να κάνει ατέρμονο βρόχο, να κάνει fork μέχρι να κολλήσει το μηχάνημα, να γεμίσει τον δίσκο.
- Καταχραστεί το δίκτυο: να σαρώσει άλλους hosts, να στείλει spam, να κάνει mining κρυπτονομισμάτων, να καλέσει τις εσωτερικές σας υπηρεσίες.
- Μείνει μόνιμα: να εγκαταστήσει ένα cron job ή μια υπηρεσία που επιζεί της εργασίας.
- Ξεφύγει: να χρησιμοποιήσει ένα σφάλμα στο από κάτω επίπεδο για να τρέξει κώδικα στον ίδιο τον host.
Κάθε επίπεδο παρακάτω χειρίζεται κάποια από αυτά και όχι άλλα.
Επίπεδο 1: μια διεργασία
Το απλούστερο sandbox είναι μια θυγατρική διεργασία: subprocess.run με χρονικό όριο, ίσως υπό ξεχωριστό χρήστη, με όρια πόρων και φίλτρο seccomp αν είστε σχολαστικοί.
Σταματά: τον ανεξέλεγκτο χρόνο (το χρονικό όριο), μέρος της εξάντλησης πόρων (τα όρια), μερικές επικίνδυνες κλήσεις συστήματος (seccomp). Δεν σταματά: την ανάγνωση οτιδήποτε μπορεί να διαβάσει αυτός ο χρήστης, την πρόσβαση στο δίκτυο, τη μονιμότητα μέσω οτιδήποτε μπορεί να γράψει ο χρήστης, και οποιοδήποτε σφάλμα του πυρήνα. Τυπική αποτυχία: ο κώδικας διαβάζει ένα αρχείο που ξεχάσατε ότι ήταν αναγνώσιμο, ή ένας «περιορισμένος» διερμηνέας γλώσσας αποδεικνύεται ότι έχει παραθυράκι. Η ιστορία είναι γεμάτη sandboxes μέσα στη γλώσσα που δεν άντεξαν.
Ο χρόνος εκκίνησης είναι ουσιαστικά μηδέν. Μια χαρά για κώδικα που γράψατε εσείς· δεν είναι όριο για κώδικα που δεν γράψατε.
Επίπεδο 2: ένα container
Τα namespaces δίνουν στον κώδικα δική του εικόνα αρχείων, διεργασιών και δικτύου· τα cgroups περιορίζουν CPU και μνήμη· οι αφαιρεμένες capabilities και το seccomp στενεύουν ό,τι μπορεί να ζητήσει από τον πυρήνα.
Σταματά: την ανάγνωση των αρχείων του host (εκτός αν είναι προσαρτημένα), την ορατότητα άλλων διεργασιών, την απεριόριστη χρήση πόρων, μεγάλο μέρος του προβλήματος μονιμότητας αν το container πετιέται μετά. Δεν σταματά: ένα σφάλμα στον κοινό πυρήνα του host. Όλα τα containers του μηχανήματος μιλούν με τον ίδιο πυρήνα, οπότε μια προσβάσιμη ευπάθεια του πυρήνα είναι έξοδος. Τυπική αποτυχία: η διαμόρφωση, όχι εξωτικά exploits. Ένα privileged container, το socket του container runtime προσαρτημένο μέσα, η δικτύωση του host ενεργοποιημένη «μόνο για debugging». Το καθένα αφαιρεί αθόρυβα το όριο.
Ο χρόνος εκκίνησης είναι χιλιοστά του δευτερολέπτου. Υπάρχουν ενισχυμένες παραλλαγές, μεταξύ αυτών πυρήνες σε user space που αναχαιτίζουν τις κλήσεις συστήματος πριν φτάσουν στον host, με κάποιο κόστος σε ταχύτητα και συμβατότητα. Για κώδικα από ανθρώπους που εμπιστεύεστε, ένα καλά διαμορφωμένο container είναι λογική προεπιλογή.
Επίπεδο 3: μια microVM
Μια microVM τρέχει τον δικό της πυρήνα πάνω σε hypervisor, όπως μια πλήρης VM, αλλά με σχεδόν όλο το εξομοιωμένο υλικό αφαιρεμένο. Το Firecracker είναι το πιο γνωστό παράδειγμα.
Σταματά: ό,τι σταματά ένα container, συν το πρόβλημα του κοινού πυρήνα. Για να φτάσει τον host, ο κώδικας πρέπει να σπάσει τον hypervisor ή μία από μια χούφτα εικονικών συσκευών, πολύ μικρότερη επιφάνεια από τη διεπαφή κλήσεων συστήματος ενός πυρήνα. Δεν σταματά: την κατάχρηση ό,τι της δίνετε. Η ανοιχτή εξερχόμενη κίνηση μπορεί ακόμη να καταχραστεί· τα μυστικά που βάζετε μέσα μπορούν ακόμη να διαρρεύσουν. Τυπική αποτυχία: η πολιτική, όχι η απομόνωση. Κάποιος περνά ένα token παραγωγής «για να δουλέψουν τα tests», ή αφήνει ανεξέλεγκτη την εξερχόμενη κίνηση σε ένα φορτίο που δεν τη χρειάζεται.
Ο χρόνος εκκίνησης είναι από κλάσμα του δευτερολέπτου ως περίπου ένα δευτερόλεπτο, με επιβάρυνση λίγων megabyte. Αρκετά γρήγορα για να δημιουργείτε μία ανά εργασία και να τη διαγράφετε μετά, κάτι που λύνει και τη μονιμότητα: δεν μένει τίποτα για να επιστρέψει κανείς.
Επίπεδο 4: μια πλήρης εικονική μηχανή
Μια κανονική VM, ή ένα VPS, έχει το ίδιο είδος ορίου με μια microVM: εικονικοποίηση υλικού και hypervisor. Η διαφορά είναι όλα όσα υπάρχουν γύρω του: πλήρες μοντέλο συσκευών, ολόκληρο λειτουργικό σύστημα, δημόσια IP αν θέλετε, και κύκλος ζωής που μετριέται σε μέρες ή μήνες.
Σταματά: τις ίδιες κατηγορίες προβλημάτων με μια microVM, με κάπως μεγαλύτερη επιφάνεια επίθεσης επειδή εξομοιώνεται περισσότερο υλικό. Δεν σταματά: την κατάχρηση της δικής της δικτυακής ταυτότητας. Μια VM με δημόσια IP που τρέχει καταχρηστικό κώδικα βάζει στη μαύρη λίστα τη δική της IP, κάτι που μετράει αν η ίδια IP στέλνει και το email σας. (Αν αυτό έχει ήδη συμβεί, δείτε τι να κάνετε όταν η IP σας είναι σε blocklist.) Τυπική αποτυχία: ζει υπερβολικά πολύ. Μια VM που φτιάχτηκε για ένα πείραμα μαζεύει διαπιστευτήρια και κατάσταση, και σιγά σιγά γίνεται το έμπιστο μηχάνημα που υποτίθεται ότι θα προστάτευε.
Ο χρόνος εκκίνησης είναι από δεκάδες δευτερόλεπτα ως λεπτά, και η χρέωση συνήθως μηνιαία. Αυτό είναι το σωστό σχήμα για μια υπηρεσία μακράς διάρκειας που χρειάζεται εισερχόμενες θύρες, και το λάθος σχήμα για μια εκτέλεση κώδικα 20 δευτερολέπτων.
Η σύγκριση
| Διεργασία | Container | MicroVM | Πλήρης VM | |
|---|---|---|---|---|
| Δικός της πυρήνας | όχι | όχι | ναι | ναι |
| Κύριο όριο | δικαιώματα χρήστη | namespaces + κοινός πυρήνας | hypervisor, μικροσκοπικό μοντέλο συσκευών | hypervisor, πλήρες μοντέλο συσκευών |
| Χρόνος εκκίνησης | ~0 | ms | ~0.1–1 δ. | 10 δ. – λεπτά |
| Επιβάρυνση | καμία | μικρή | μερικά MiB | δεκάδες–εκατοντάδες MiB |
| Πέταμα ανά εργασία | εύκολο | εύκολο | εύκολο | αργό, ακριβό |
| Εισερχόμενες θύρες / δημόσια IP | του host | του host | συνήθως καμία | ναι |
Η επιλογή
- Κώδικας που γράψατε εσείς ή η ομάδα σας: μια διεργασία ή ένα container αρκεί.
- CI για τα δικά σας branches: ένα container στον runner σας.
- Κώδικας από πράκτορα, υποβολές χρηστών, εξωτερικά pull requests: μια microVM ανά εργασία, που διαγράφεται μετά.
- Μια μη έμπιστη υπηρεσία που πρέπει να δέχεται συνδέσεις ή να τρέχει εβδομάδες: ξεχωριστή VM με δική της IP, μακριά από οτιδήποτε κρατά τα διαπιστευτήριά σας ή στέλνει το email σας.
Ό,τι κι αν διαλέξετε, ισχύουν δύο κανόνες από πάνω: μη βάζετε μέσα τίποτα που δεν θα δίνατε στον συντάκτη του κώδικα, και αποφασίστε συνειδητά τι επιτρέπεται να κάνει το δίκτυο.
Πού βρίσκονται τα προϊόντα μας
Για το επίπεδο 3 τρέχουμε sandboxes κώδικα: microVM Firecracker που ξεκινούν σε περίπου ένα δευτερόλεπτο, με εξερχόμενο internet, χωρίς εισερχόμενες θύρες και με χρέωση ανά δευτερόλεπτο. Στοχεύουν ακριβώς στην τρίτη κουκκίδα παραπάνω· η σελίδα ασφάλειας του MCP εξηγεί πώς να περιορίσετε τι μπορεί να κάνει ένας πράκτορας με αυτά. Για το επίπεδο 4, ένα VPS όπως το τιμολόγιο AI agent σας δίνει ολόκληρο μηχάνημα με τον μήνα. Τα λυμένα παραδείγματα στο sandbox για πράκτορες AI δείχνουν το μοτίβο της microVM από άκρη σε άκρη, και το τι χρειάζονται οι πράκτορες AI από την υποδομή εξετάζει την απομόνωση ως μία από πολλές απαιτήσεις.
Σχόλια
Δεν υπάρχουν ακόμη σχόλια. Γίνετε ο πρώτος.