Ευπάθεια στις βιβλιοθήκες δικτύου των γλωσσών Rust και Go που σας επιτρέπει να παρακάμψετε την επαλήθευση διεύθυνσης IP

Τα τρωτά σημεία που σχετίζονται με λανθασμένη επεξεργασία διευθύνσεων IP με οκταδικά ψηφία στις συναρτήσεις ανάλυσης διευθύνσεων έχουν εντοπιστεί στις τυπικές βιβλιοθήκες των γλωσσών Rust και Go. Τα τρωτά σημεία καθιστούν δυνατή την παράκαμψη των ελέγχων για έγκυρες διευθύνσεις σε εφαρμογές, για παράδειγμα, την οργάνωση της πρόσβασης σε διευθύνσεις διεπαφής loopback (127.xxx) ή υποδίκτυα intranet κατά την εκτέλεση επιθέσεων SSRF (Server-side request forgery). Τα τρωτά σημεία συνεχίζουν τον κύκλο προβλημάτων που είχαν εντοπιστεί προηγουμένως στις βιβλιοθήκες node-netmask (JavaScript, CVE-2021-28918, CVE-2021-29418), private-ip (JavaScript, CVE-2020-28360), ipaddress (Python, CVE- 2021-29921 ), Data::Validate::IP (Perl, CVE-2021-29662) και Net::Netmask (Perl, CVE-2021-29424).

Σύμφωνα με την προδιαγραφή, οι τιμές συμβολοσειράς διευθύνσεων IP που ξεκινούν με μηδέν πρέπει να ερμηνεύονται ως οκταδικοί αριθμοί, αλλά πολλές βιβλιοθήκες δεν το λαμβάνουν υπόψη και απλώς απορρίπτουν το μηδέν, αντιμετωπίζοντας την τιμή ως δεκαδικό αριθμό. Για παράδειγμα, ο αριθμός 0177 σε οκταδικό είναι ίσος με 127 σε δεκαδικό. Ένας εισβολέας μπορεί να ζητήσει έναν πόρο καθορίζοντας την τιμή "0177.0.0.1", η οποία σε δεκαδικό συμβολισμό αντιστοιχεί σε "127.0.0.1". Εάν χρησιμοποιηθεί η προβληματική βιβλιοθήκη, η εφαρμογή δεν θα εντοπίσει ότι η διεύθυνση 0177.0.0.1 βρίσκεται στο υποδίκτυο 127.0.0.1/8, αλλά στην πραγματικότητα, κατά την αποστολή ενός αιτήματος, μπορεί να έχει πρόσβαση στη διεύθυνση "0177.0.0.1", την οποία Οι λειτουργίες δικτύου θα επεξεργαστούν ως 127.0.0.1. Με παρόμοιο τρόπο, μπορείτε να εξαπατήσετε τον έλεγχο πρόσβασης σε διευθύνσεις intranet καθορίζοντας τιμές όπως "012.0.0.1" (ισοδύναμο με "10.0.0.1").

Στο Rust, η τυπική βιβλιοθήκη "std::net" επηρεάστηκε από ένα ζήτημα (CVE-2021-29922). Ο αναλυτής διευθύνσεων IP αυτής της βιβλιοθήκης απέρριψε ένα μηδέν πριν από τις τιμές στη διεύθυνση, αλλά μόνο εάν καθορίζονται όχι περισσότερα από τρία ψηφία, για παράδειγμα, το "0177.0.0.1" θα εκλαμβανόταν ως μη έγκυρη τιμή και ως εσφαλμένο αποτέλεσμα θα επιστραφεί ως απάντηση στις 010.8.8.8 και 127.0.026.1. Οι εφαρμογές που χρησιμοποιούν std::net::IpAddr κατά την ανάλυση διευθύνσεων που καθορίζονται από το χρήστη είναι δυνητικά ευαίσθητες σε επιθέσεις SSRF (πλαστογράφηση αιτημάτων από την πλευρά του διακομιστή), RFI (Απομακρυσμένη συμπερίληψη αρχείων) και LFI (Συμπερίληψη τοπικού αρχείου). Το θέμα ευπάθειας επιδιορθώθηκε στον κλάδο Rust 1.53.0.

Ευπάθεια στις βιβλιοθήκες δικτύου των γλωσσών Rust και Go που σας επιτρέπει να παρακάμψετε την επαλήθευση διεύθυνσης IP

Στο Go, επηρεάζεται το τυπικό "net" της βιβλιοθήκης (CVE-2021-29923). Η ενσωματωμένη συνάρτηση net.ParseCIDR παρακάμπτει τα μηδενικά πριν από τους οκταδικούς αριθμούς αντί να τους επεξεργάζεται. Για παράδειγμα, ένας εισβολέας μπορεί να περάσει την τιμή 00000177.0.0.1, η οποία, όταν ελέγχεται στη συνάρτηση net.ParseCIDR(00000177.0.0.1/24), θα αναλυθεί ως 177.0.0.1/24 και όχι ως 127.0.0.1/24. Το πρόβλημα εκδηλώνεται και στην πλατφόρμα Kubernetes. Η ευπάθεια διορθώθηκε στην έκδοση Go 1.16.3 και beta 1.17.

Ευπάθεια στις βιβλιοθήκες δικτύου των γλωσσών Rust και Go που σας επιτρέπει να παρακάμψετε την επαλήθευση διεύθυνσης IP


Πηγή: opennet.ru

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