Ο Λευκός Οίκος θέλει προγραμματισμό ασφαλή για τη μνήμη, αλλά τι είναι αυτό;


Παραγγελίες από την κορυφή: συνδέστε τις διαρροές μνήμης σας.

Βασικά Takeaways

  • Ο Λευκός Οίκος προτρέπει τη χρήση γλωσσών που είναι ασφαλείς για τη μνήμη, όπως η Rust, για τη μείωση των τρωτών σημείων ασφαλείας στον κώδικα.
  • Παλαιότερες γλώσσες χαμηλότερου επιπέδου, όπως η C, ενέχουν κινδύνους σφαλμάτων κώδικα που οδηγεί σε συμβάντα ασφαλείας.
  • Γλώσσες που είναι ασφαλείς για τη μνήμη, όπως η Rust, προσφέρουν λειτουργίες αυτόματης διαχείρισης μνήμης και πρόληψης σφαλμάτων.

Μια αμερικανική κυβερνητική υπηρεσία έχει αποφασίσει ότι οι προγραμματιστές θα πρέπει να προτιμούν γλώσσες που είναι ασφαλείς για τη μνήμη, όπως η Rust και η Java. Αλλά γιατί είναι καλύτερα και έχει πραγματικά σημασία αυτό;

Τι λέει ο Λευκός Οίκος;

Σε μια δήλωση στις 26 Φεβρουαρίου, το Γραφείο του Εθνικού Διευθυντή στον Κυβερνοχώρο (ONCD) του Λευκού Οίκου προέτρεψε τους προγραμματιστές λογισμικού να υιοθετήσουν γλώσσες προγραμματισμού που είναι ασφαλείς για τη μνήμη, όπως η Rust.

Το ONCD είπε:

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

Γιατί είναι σημαντικό?

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

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

Ανεξάρτητα από αυτό, η χρήση γλωσσών που είναι ασφαλείς για μνήμη —όπως η Rust, η Python και η JavaScript— έχει από καιρό αυξηθεί. Το ONCD είναι πιθανό να κάνει αυτή την ανακοίνωση επειδή λιγότερο ασφαλείς γλώσσες όπως η C υπάρχουν τόσο πολύ καιρό που ο κώδικάς τους παλαιού τύπου είναι πλέον ριζωμένος στην υποδομή και σε μεγάλο μέρος του λογισμικού που χρησιμοποιούμε καθημερινά.

Πώς μοιάζει μια μη ασφαλής γλώσσα;

Ο μη ασφαλής κώδικας δεν φαίνεται πάντα τρομακτικός ή ακόμη και περίπλοκος. Πάρτε αυτό το παράδειγμα ενός απλού προγράμματος C:

#include <stdio.h>
int main (void) {
    int arr[3] = { 0, 0, 0 };
    printf("%d\n", arr[3]);
    return 0;
}

Αυτό είναι ένα κλασικό παράδειγμα σφάλματος που μπορεί να οδηγήσει σε επίθεση υπερχείλισης buffer. Ο προγραμματιστής έχει ξεχάσει ότι οι πίνακες στη C (και στις περισσότερες άλλες γλώσσες) έχουν μηδενικό ευρετήριο, που σημαίνει ότι το πρώτο στοιχείο βρίσκεται στο arr[0], κ.λπ. Προσπάθεια πρόσβασης στο arr[3]< Το είναι επομένως ένα λάθος, αλλά αυτό που το C θα επιτρέψει:

Η τιμή στο arr[3] είναι μια έγκυρη διεύθυνση μνήμης, όπως κάθε άλλη, απλώς δεν ανήκει στον πίνακα. Οποιαδήποτε τιμή θα μπορούσε να αποθηκευτεί εκεί και οι συνέπειες της πρόσβασης σε αυτήν ή της εγγραφής σε αυτήν μπορεί να κυμαίνονται από ένα σφάλμα προγράμματος έως ένα καταστροφικό συμβάν ασφαλείας. Πολλοί χάκερ σε όλη την ιστορία έχουν εκμεταλλευτεί τέτοια σφάλματα.

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

Πώς είναι ο κωδικός με ασφάλεια στη μνήμη;

Σε μια γλώσσα ασφαλή για μνήμη όπως η Rust, το ίδιο πρόβλημα απλά δεν υπάρχει. Εδώ είναι το ίδιο πρόγραμμα, στο Rust:

fn main() {
    let arr: [u32; 5] = [0;3];
    println!("{}", arr[3]);
}

Ενώ αυτός ο κώδικας είναι συντακτικά έγκυρος, ο Rust θα αποτύχει να τον μεταγλωττίσει:

Ο μεταγλωττιστής εξηγεί το πρόβλημα και αρνείται να δημιουργήσει ένα εκτελέσιμο αρχείο. Το Rust απλά δεν θα σας αφήσει να εκτελέσετε αυτόν τον κώδικα.

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

Πρέπει να αλλάξω γλώσσα;

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

Η ασφάλεια της μνήμης είναι χαρακτηριστικό τόσων πολλών σύγχρονων γλωσσών, που ίσως να είστε εξοικειωμένοι με τουλάχιστον μία. Το C έχει τις χρήσεις του, αλλά υπάρχουν πιο ασφαλείς επιλογές που θα προκαλέσουν λιγότερες ατυχίες. Ειδικότερα, αν ψάχνετε για μια αποτελεσματική γλώσσα που έχει μερικά καλά δίχτυα ασφαλείας, το Rust είναι απαραίτητο.