Επίθεση Trojan Source για την εισαγωγή αλλαγών στον κώδικα που είναι αόρατες στον προγραμματιστή

Ερευνητές από το Πανεπιστήμιο του Κέιμπριτζ δημοσίευσαν μια τεχνική για την σιωπηλή εισαγωγή κακόβουλου κώδικα στον πηγαίο κώδικα που έχει αξιολογηθεί από ομοτίμους. Η προετοιμασμένη μέθοδος επίθεσης (CVE-2021-42574) παρουσιάζεται με το όνομα Trojan Source και βασίζεται στον σχηματισμό κειμένου που φαίνεται διαφορετικό για τον μεταγλωττιστή/διερμηνέα και το άτομο που βλέπει τον κώδικα. Παραδείγματα της μεθόδου παρουσιάζονται για διάφορους μεταγλωττιστές και διερμηνείς που παρέχονται για C, C++ (gcc και clang), C#, JavaScript (Node.js), Java (OpenJDK 16), Rust, Go και Python.

Η μέθοδος βασίζεται στη χρήση ειδικών χαρακτήρων Unicode σε σχόλια κώδικα που αλλάζουν τη σειρά εμφάνισης του αμφίδρομου κειμένου. Με τη βοήθεια τέτοιων χαρακτήρων ελέγχου, ορισμένα μέρη του κειμένου μπορούν να εμφανιστούν από αριστερά προς τα δεξιά, ενώ άλλα - από δεξιά προς τα αριστερά. Στην καθημερινή πρακτική, τέτοιοι χαρακτήρες ελέγχου μπορούν να χρησιμοποιηθούν, για παράδειγμα, για την εισαγωγή γραμμών κώδικα στα εβραϊκά ή στα αραβικά σε ένα αρχείο. Αλλά εάν συνδυάσετε γραμμές με διαφορετικές κατευθύνσεις κειμένου σε μία γραμμή, χρησιμοποιώντας τους καθορισμένους χαρακτήρες, τα αποσπάσματα κειμένου που εμφανίζονται από τα δεξιά προς τα αριστερά μπορούν να επικαλύπτουν το υπάρχον κανονικό κείμενο που εμφανίζεται από αριστερά προς τα δεξιά.

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

Επίθεση Trojan Source για την εισαγωγή αλλαγών στον κώδικα που είναι αόρατες στον προγραμματιστή

Κατά την εξέταση κώδικα, ένας προγραμματιστής θα έρθει αντιμέτωπος με την οπτική σειρά των χαρακτήρων και θα δει ένα μη ύποπτο σχόλιο σε ένα σύγχρονο πρόγραμμα επεξεργασίας κειμένου, διεπαφή ιστού ή IDE, αλλά ο μεταγλωττιστής και ο διερμηνέας θα χρησιμοποιήσουν τη λογική σειρά των χαρακτήρων και θα επεξεργαστείτε την κακόβουλη εισαγωγή ως έχει, χωρίς να δίνετε προσοχή στο αμφίδρομο κείμενο στα σχόλια. Το πρόβλημα επηρεάζει διάφορους δημοφιλείς επεξεργαστές κώδικα (VS Code, Emacs, Atom), καθώς και διεπαφές για την προβολή κώδικα σε αποθετήρια (GitHub, Gitlab, BitBucket και όλα τα προϊόντα Atlassian).

Επίθεση Trojan Source για την εισαγωγή αλλαγών στον κώδικα που είναι αόρατες στον προγραμματιστή

Υπάρχουν διάφοροι τρόποι χρήσης της μεθόδου για την υλοποίηση κακόβουλων ενεργειών: προσθήκη μιας κρυφής έκφρασης "επιστροφής", η οποία οδηγεί στην ολοκλήρωση της λειτουργίας εκ των προτέρων. σχολιασμός εκφράσεων που κανονικά θα ήταν ορατές ως έγκυρες κατασκευές (για παράδειγμα, για απενεργοποίηση σημαντικών ελέγχων). εκχώρηση άλλων τιμών συμβολοσειράς που οδηγούν σε αποτυχίες επικύρωσης συμβολοσειράς.

Για παράδειγμα, ένας εισβολέας μπορεί να προτείνει μια αλλαγή που περιλαμβάνει τη γραμμή: if access_level != "user{U+202E} {U+2066}// Check if admin{U+2069} {U+2066}" {

το οποίο θα εμφανίζεται στη διεπαφή κριτικής σαν access_level != "user" { // Ελέγξτε εάν διαχειριστής

Επιπλέον, έχει προταθεί μια άλλη παραλλαγή επίθεσης (CVE-2021-42694), που σχετίζεται με τη χρήση ομογλυφικών, χαρακτήρων που είναι παρόμοιοι στην εμφάνιση, αλλά διαφέρουν στη σημασία και έχουν διαφορετικούς κωδικούς unicode (για παράδειγμα, ο χαρακτήρας "ɑ" μοιάζει με " a", "ɡ" - "g", "ɩ" - "l"). Παρόμοιοι χαρακτήρες μπορούν να χρησιμοποιηθούν σε ορισμένες γλώσσες στα ονόματα συναρτήσεων και μεταβλητών για να παραπλανήσουν τους προγραμματιστές. Για παράδειγμα, μπορούν να οριστούν δύο συναρτήσεις με δυσδιάκριτα ονόματα που εκτελούν διαφορετικές ενέργειες. Χωρίς λεπτομερή ανάλυση, δεν είναι αμέσως σαφές ποια από αυτές τις δύο συναρτήσεις καλείται σε ένα συγκεκριμένο μέρος.

Επίθεση Trojan Source για την εισαγωγή αλλαγών στον κώδικα που είναι αόρατες στον προγραμματιστή

Ως μέτρο ασφαλείας, συνιστάται οι μεταγλωττιστές, οι διερμηνείς και τα εργαλεία συναρμολόγησης που υποστηρίζουν χαρακτήρες Unicode να εμφανίζουν σφάλμα ή προειδοποίηση εάν υπάρχουν μη συζευγμένοι χαρακτήρες ελέγχου σε σχόλια, κυριολεκτικά συμβολοσειρές ή αναγνωριστικά που αλλάζουν την κατεύθυνση εξόδου (U+202A, U+202B, U +202C, U+202D, U+202E, U+2066, U+2067, U+2068, U+2069, U+061C, U+200E και U+200F). Τέτοιοι χαρακτήρες θα πρέπει επίσης να απαγορεύονται ρητά στις προδιαγραφές της γλώσσας προγραμματισμού και θα πρέπει να τηρούνται σε προγράμματα επεξεργασίας κώδικα και διεπαφές αποθετηρίου.

Προσθήκη 1: Έχουν ετοιμαστεί ενημερώσεις κώδικα ευπάθειας για GCC, LLVM/Clang, Rust, Go, Python και binutils. Το GitHub, το Bitbucket και το Jira διόρθωσαν επίσης το πρόβλημα. Μια επιδιόρθωση για το GitLab είναι σε εξέλιξη. Για τον εντοπισμό προβληματικού κώδικα, προτείνεται η χρήση της εντολής: grep -r $'[\u061C\u200E\u200F\u202A\u202B\u202C\u202D\u202E\u2066\u2067\u2068\u2069\uXNUMX\uXNUMX//path/' πηγή

Προσθήκη 2: Ο Russ Cox, ένας από τους προγραμματιστές του Plan 9 OS και της γλώσσας προγραμματισμού Go, επέκρινε την υπερβολική προσοχή στην περιγραφόμενη μέθοδο επίθεσης, η οποία είναι γνωστή εδώ και πολύ καιρό (Go, Rust, C++, Ruby) και δεν λαμβάνεται σοβαρά υπόψη . Σύμφωνα με τον Cox, το πρόβλημα αφορά κυρίως τη σωστή εμφάνιση πληροφοριών σε προγράμματα επεξεργασίας κώδικα και διεπαφές ιστού, η οποία μπορεί να λυθεί χρησιμοποιώντας τα σωστά εργαλεία και αναλυτές κώδικα κατά την αναθεώρηση. Επομένως, αντί να εφιστάται η προσοχή σε κερδοσκοπικές επιθέσεις, θα ήταν πιο σωστό να εστιάσουμε στη βελτίωση των διαδικασιών ελέγχου κώδικα και εξαρτήσεων.

Ο Ras Cox πιστεύει επίσης ότι οι μεταγλωττιστές δεν είναι το σωστό μέρος για να διορθωθεί το πρόβλημα, καθώς με την απαγόρευση επικίνδυνων συμβόλων σε επίπεδο μεταγλωττιστή, παραμένει ένα τεράστιο στρώμα εργαλείων στα οποία η χρήση αυτών των συμβόλων παραμένει αποδεκτή, όπως συστήματα κατασκευής, συναρμολογητές, διαχειριστές πακέτων και διάφοροι αναλυτές ρυθμίσεων και δεδομένα. Ως παράδειγμα, δίνεται το έργο Rust, το οποίο απαγόρευε την επεξεργασία του κώδικα LTR/RTL στον μεταγλωττιστή, αλλά δεν πρόσθεσε μια ενημέρωση κώδικα στον διαχειριστή πακέτων Cargo, η οποία επιτρέπει παρόμοια επίθεση μέσω του αρχείου Cargo.toml. Ομοίως, αρχεία όπως BUILD.bazel, CMakefile, Cargo.toml, Dockerfile, GNUmakefile, Makefile, go.mod, package.json, pom.xml και απαιτήσεις.txt μπορούν να γίνουν πηγές επιθέσεων.

Πηγή: opennet.ru

Προσθέστε ένα σχόλιο