Περιορισμός του τι μπορεί να κάνει μια εφαρμογή, χωρίς κώδικα

Στον σύντομο αυτό οδηγό θα δούμε τι είναι το seccomp και πως λειτουργεί. Θα το χρησιμοποιήσουμε για να προστατεύσουμε μια εφαρμογή, χωρίς να γράψουμε ούτε μια γραμμή κώδικα.

Οι κλήσεις συστήματος

Μια κλήση συστήματος είναι μια αίτηση της εφαρμογής στον πυρήνα να κάνει κάτι. Για παράδειγμα να διαβάσει ή να γράψει σε ένα αρχείο. Έστω για παράδειγμα ένα πρόγραμμα που μετατρέπει εικόνες από png σε jpeg. Χρειάζεται από τις υπηρεσίες που παρέχει ο πυρήνας μόνο αυτές τις 2. Με το seccomp ενημερώνει από τα πριν τον πυρήνα ότι θα κάνει χρήση μόνον αυτών των δυο. Είναι σαν να υπογράφει ένα συμβόλαιο ότι δεν θα χρησιμοποιήσει τίποτε άλλο.

Αν το πρόγραμμα παραβιάσει το συμβόλαιο θα υποστεί τις κυρώσεις. Οι κυρώσεις μπορεί να είναι από το να τερματιστεί το πρόγραμμα, να γίνει μια καταγραφή στο journald ή το syslog ή να επιστρέψει λάθος η κλήση και να μην πραγματοποιηθεί.

Μιας και το συμβόλαιο αυτό είναι προαιρετικό, γιατί να το υπογράψει; Μπορεί κάποιος να φτιάξει ένα προβληματικό αρχείο png που εκμεταλλευόμενο κάποιο bug να κάνει τον υπολογιστή να τρέξει κάποιο προσεχτικά φτιαγμένο κώδικα. Το σενάριο αυτό δεν είναι καθόλου υποθετικό και έχουν υπάρξει στο παρελθόν αντίστοιχα exploids με εικόνες στα Windows. Θα ήθελα να προσθέσω πως στο Linux δεν έχουμε τέτοια προβλήματα, αλλά δυστυχώς μου είναι αδύνατον.

Το seccomp θα μας προστατεύσει από αυτό το σενάριο, αλλά η χρήση του απαιτεί αλλαγές στον πηγαίο κώδικα του. Κάτι που λίγα προγράμματα το κάνουν. Και η χρήση του είναι περιορισμένη σε προγράμματα που έχουν γραφτεί στην γλώσσα C/C++.

Χρήση του seccomp με το systemd

Μας σώζει το γεγονός πως το συμβόλαιο θα εξακολουθεί να ισχύει και για τα παιδιά καθώς και για τα εγγόνια και λοιπός συγγενείς του προγράμματος. Οπότε μπορεί να επέμβει το systemd και να υπογράψει αυτό το συμβόλαιο. Σε αυτό μας βοηθάνε δυο ντιρεκτίβες, ή SystemCallFilter [1] και η SystemCallErrorNumber [2].
Υπάρχει όμως ένα μικρό πρόβλημα. Για τεχνικούς λόγους κάποιες κλήσεις θα επιτραπούν. Και μιλάμε για κλήσεις συστήματος την execve! Τι κάνει αυτή; Τρέχει ένα άλλο πρόγραμμα! (Γιατί αν την απαγορεύσει το systemd δεν θα έχει και αυτό το ίδιο τρόπο να τρέξει το πρόγραμμα χωρίς να παραβιάσει το συμβόλαιο.

Το εργαλείο sandbox της Cloudflare.

Αυτό είναι ένα νέο εργαλείο που βγήκε πριν λίγες μόνο μέρες. Χρησιμοποιεί τον μηχανισμό του LD_PRELOAD και αναγκάζει το οποιοδήποτε πρόγραμμα να υπογράψει ένα συμβόλαιο πριν ξεκινήσει. Περισσότερα για το seccomp, πως το χρησιμοποιείς μέσα στον κώδικά σου, καθώς και παραδείγματα χρήσης του εργαλείου θα βρείτε στο άρθρο

Το εργαλείο μπορεί να χρησιμοποιηθεί ακόμα και με προγράμματα που έχουν στατική σύνδεση με ένα μηχανισμό παρόμοιο με αυτό του systemd, αλλά καταφέρνει να μπλοκάρει την κλήση της execve με ένα έξυπνο τρόπο. Ίσως μια μέρα αυτές οι τεχνολογίες να φτάσουν και στις διανομές μας.

3 Likes