Code execution sandbox για AI agents: ασφαλής εκτέλεση κώδικα με όρια και απομόνωση
Ένας AI agent που μπορεί να εκτελεί Python ή shell αποκτά μεγάλη χρησιμότητα: αναλύει αρχεία, μετατρέπει δεδομένα, δημιουργεί reports και δοκιμάζει υπολογισμούς. Αποκτά όμως και πρόσβαση σε μια πραγματική επιφάνεια εκτέλεσης. Ο παραγόμενος κώδικας πρέπει να αντιμετωπίζεται ως μη αξιόπιστος, ακόμη κι αν προήλθε από αξιόπιστο model και φαινομενικά αθώο prompt.
Το sandbox δεν είναι ένας προσωρινός φάκελος και ένα timeout. Χρειάζεται ισχυρό isolation boundary, ελάχιστα privileges, περιορισμένο δίκτυο, quotas και ελεγχόμενη μεταφορά αρχείων. Ο agent δεν πρέπει να μπορεί να δει host secrets, άλλους tenants ή το control plane που τον εκτελεί.
Γιατί ο κώδικας θεωρείται untrusted
Ο χρήστης μπορεί να ζητήσει ρητά επικίνδυνη ενέργεια. Ένα uploaded document μπορεί να περιέχει prompt injection. Το model μπορεί να γράψει λάθος εντολή ή dependency να έχει vulnerability. Η ασφάλεια δεν βασίζεται στην πρόθεση του prompt.
Ακόμη και κώδικας που κάνει απλή ανάλυση CSV μπορεί να επιχειρήσει να διαβάσει environment variables, filesystem paths ή cloud metadata endpoint. Αν τρέχει στο ίδιο process με την εφαρμογή, ένα bug μπορεί να εκθέσει credentials και δεδομένα.
Η επίσημη τεκμηρίωση Kubernetes συνιστά sandboxing όταν εκτελείται untrusted code και σημειώνει ότι τα κοινά containers μοιράζονται kernel, άρα προσφέρουν ασθενέστερο isolation boundary από virtual machines ή userspace kernels.
Ephemeral περιβάλλον ανά εργασία
Κάθε execution πρέπει να ξεκινά σε καθαρό, προσωρινό περιβάλλον με σαφές lifetime. Δεν επαναχρησιμοποιείται filesystem ανάμεσα σε άσχετους χρήστες ή tenants. Μετά την ολοκλήρωση, το περιβάλλον καταστρέφεται και τα outputs που επιτρέπεται να διατηρηθούν αντιγράφονται σε ελεγχόμενο storage.
Η επαναχρησιμοποίηση container για διαδοχικά βήματα του ίδιου job μπορεί να είναι χρήσιμη, αλλά χρειάζεται session ownership, expiry και συνολικό quota. Ο agent δεν πρέπει να μπορεί να μαντέψει container ID άλλου χρήστη.
Το OpenAI API, για παράδειγμα, εκθέτει containers και container files για Code Interpreter, με ρητά file IDs και memory limit. Σε self-hosted λύση, αντίστοιχες έννοιες πρέπει να είναι πρώτης τάξης και όχι ad hoc directories.
Container δεν σημαίνει πλήρες sandbox
Ένα standard container απομονώνει processes και filesystem namespaces, αλλά μοιράζεται τον kernel του host. Για υψηλού ρίσκου untrusted workloads μπορεί να χρειάζεται sandboxed runtime όπως gVisor, Kata Containers, microVM ή ξεχωριστός worker host.
Η επιλογή εξαρτάται από threat model, performance και συμβατότητα. Η Kubernetes τεκμηρίωση αναφέρει virtual machines και userspace kernels ως δημοφιλείς προσεγγίσεις για ισχυρότερη απομόνωση. Δεν υπάρχει μία ρύθμιση κατάλληλη για κάθε workload.
Το sandbox infrastructure δεν πρέπει να τρέχει στο ίδιο node με βάσεις δεδομένων ή control-plane components όταν το threat model απαιτεί ισχυρή απομόνωση.
Non-root και ελάχιστα Linux capabilities
Το process τρέχει ως μη προνομιούχος χρήστης, χωρίς privileged mode και χωρίς δυνατότητα privilege escalation. Αφαιρούνται Linux capabilities που δεν χρειάζονται και εφαρμόζεται default seccomp profile ή αυστηρότερο policy όπου είναι δοκιμασμένο.
Η Kubernetes τεκμηρίωση προτείνει runAsNonRoot, allowPrivilegeEscalation: false και αποφυγή privileged containers. Περιγράφει seccomp, AppArmor και SELinux ως επιπλέον μηχανισμούς περιορισμού.
Δεν γίνονται mounts host paths, Docker socket, Kubernetes service account tokens ή άλλα control interfaces. Πρόσβαση στο container runtime socket ισοδυναμεί πρακτικά με δυνατότητα δημιουργίας νέων containers και σοβαρό escalation risk.
Δίκτυο: deny by default
Ο περισσότερος analytical κώδικας δεν χρειάζεται απεριόριστο internet. Το egress πρέπει να είναι κλειστό by default και να ανοίγει μόνο μέσω allowlist ή controlled proxy για συγκεκριμένη εργασία. Αποκλείονται private network ranges, cloud metadata endpoints και εσωτερικές υπηρεσίες.
Αυτό προστατεύει από data exfiltration και SSRF-like πρόσβαση. Αν ο agent πρέπει να κατεβάσει δημόσιο dataset, είναι ασφαλέστερο ένα ξεχωριστό fetch service να ελέγχει URL, μέγεθος, content type και redirects και μετά να εισάγει το αρχείο στο sandbox.
DNS και redirects χρειάζονται έλεγχο κατά τη στιγμή της σύνδεσης, ώστε ένα επιτρεπτό hostname να μη μετατραπεί σε private IP. Το network policy πρέπει να εφαρμόζεται εκτός του ίδιου του untrusted container.
Όρια CPU, μνήμης, χρόνου και αποθήκευσης
Ο κώδικας μπορεί να περιέχει ατέρμονο loop, fork bomb, υπερβολική κατανάλωση μνήμης ή τεράστια outputs. Χρειάζονται hard limits σε CPU, wall-clock time, memory, process count, disk space, file count και μέγεθος stdout/stderr.
Το timeout πρέπει να τερματίζει ολόκληρο process tree και όχι μόνο το parent. Μετά το kill, το environment καταστρέφεται. Τα partial outputs σημειώνονται ως μη ολοκληρωμένα και δεν παρουσιάζονται ως επιτυχές αποτέλεσμα.
Τα quotas εφαρμόζονται και σε επίπεδο χρήστη ή tenant, ώστε πολλά μικρά jobs να μην παρακάμπτουν τα per-job limits. Queue και concurrency controls προστατεύουν το σύστημα από resource exhaustion.
Dependencies και package installation
Η ελεύθερη εγκατάσταση πακέτων από internet αυξάνει supply-chain risk και κάνει τα jobs μη αναπαραγώγιμα. Προτιμάται curated base image με συγκεκριμένες, pinned βιβλιοθήκες.
Αν απαιτείται dynamic package install, γίνεται από allowlisted internal mirror, με version constraints, malware scanning και ξεχωριστό build stage. Το execution environment δεν αποκτά credentials για το package registry.
Οι container images χρησιμοποιούν immutable digests, ελέγχονται για vulnerabilities και ενημερώνονται με ελεγχόμενο rollout. Η Kubernetes Security Checklist προτείνει minimal images, non-root user και references με digest ή επαλήθευση provenance.
Αρχεία εισόδου και εξόδου
Τα uploads ελέγχονται πριν μπουν στο sandbox: μέγεθος, πραγματικός file type, archive depth και πιθανό malware. Τα filenames δεν χρησιμοποιούνται ως trusted paths και αποφεύγεται directory traversal.
Ο agent λαμβάνει μόνο τα file IDs που έχουν εξουσιοδοτηθεί για τη συγκεκριμένη εργασία. Δεν βλέπει ολόκληρο customer bucket. Τα outputs περνούν από αντίστοιχο validation πριν γίνουν downloadable: όριο μεγέθους, ασφαλές content disposition και scanning όπου απαιτείται.
Τα αρχεία έχουν retention policy και διαγράφονται μετά το συμφωνημένο διάστημα. Τα logs δεν περιλαμβάνουν αυτόματα ολόκληρο το περιεχόμενο των αρχείων.
Secrets και πρόσβαση σε επιχειρησιακά APIs
Δεν εισάγονται γενικά production secrets ως environment variables. Αν ο κώδικας χρειάζεται δεδομένα, τα λαμβάνει μέσω narrow tool ή broker που εφαρμόζει authorization, filters και audit log.
Ένα short-lived, scoped credential είναι ασφαλέστερο από μόνιμο API key, αλλά και αυτό δεν πρέπει να είναι αναγνώσιμο αν δεν είναι απολύτως απαραίτητο. Συχνά ο agent μπορεί να καλέσει tool εκτός sandbox και να περάσει μόνο το αποτέλεσμα ως αρχείο.
Η εκτέλεση κώδικα και η εκτέλεση side effects πρέπει να είναι ξεχωριστές δυνατότητες. Ένα sandbox για ανάλυση δεν χρειάζεται δικαίωμα να στείλει email ή να αλλάξει CRM.
Παρακολούθηση χωρίς έκθεση δεδομένων
Καταγράφονται job ID, tenant, image version, resource usage, exit code, timeout reason και επιτρεπόμενες network attempts. Τα stdout και stderr μπορεί να περιέχουν προσωπικά δεδομένα, άρα χρειάζονται truncation, redaction και περιορισμένη πρόσβαση.
Alerts ενεργοποιούνται για repeated sandbox escapes indicators, πρόσβαση σε απαγορευμένο δίκτυο, ασυνήθιστη δημιουργία processes και συνεχή resource-limit failures. Υπάρχει kill switch για να σταματήσει άμεσα η δυνατότητα code execution χωρίς να απενεργοποιηθεί όλη η εφαρμογή.
Πώς το υλοποιεί η Ai Foundry
Στην Ai Foundry σχεδιάζουμε το code execution ως ξεχωριστό, μη αξιόπιστο workload. Επιλέγουμε isolation boundary ανάλογα με το threat model, χρησιμοποιούμε ephemeral environments, non-root execution, κλειστό δίκτυο και αυστηρά resource limits. Τα αρχεία περνούν μέσω ελεγχόμενων IDs και όχι με γενική πρόσβαση σε storage.
Στις agentic AI λύσεις μας, κρατάμε secrets και επιχειρησιακά side effects έξω από το sandbox. Ο agent χρησιμοποιεί περιορισμένα tools με authorization όταν χρειάζεται δεδομένα ή ενέργειες. Προσθέτουμε audit trail, quotas, ασφαλή output handling και kill switch, ενώ δοκιμάζουμε timeout, memory exhaustion και network-deny scenarios πριν το production.
Checklist ασφαλούς εκτέλεσης
- Αντιμετωπίζεται κάθε παραγόμενος κώδικας ως untrusted;
- Δημιουργείται ephemeral environment ανά job ή session;
- Είναι αρκετά ισχυρό το isolation για το threat model;
- Τρέχει non-root χωρίς privilege escalation και host mounts;
- Είναι το δίκτυο κλειστό by default;
- Υπάρχουν hard limits σε χρόνο, CPU, μνήμη, processes και disk;
- Είναι pinned και ελεγμένες οι dependencies;
- Περνούν inputs και outputs από validation;
- Παραμένουν secrets και side effects έξω από το sandbox;
Η δυνατότητα εκτέλεσης κώδικα κάνει έναν AI agent πολύ πιο πρακτικό, αλλά αλλάζει ουσιαστικά το security model. Ένα πραγματικό sandbox περιορίζει όχι μόνο τι σκοπεύει να κάνει ο agent, αλλά κυρίως τι μπορεί να κάνει αν ο κώδικας είναι λάθος ή εχθρικός.