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

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

Παράδειγμα
----------

Στο Unix, ο ακόλουθος κώδικας C εμπεριέχει μία συνθήκη ανταγωνισμού όταν εκτελείται από ένα `setuid` πρόγραμμα:

```
if (access("file", W\_OK) != 0) {
 exit(1);
}

fd = open("file", O\_WRONLY);
write(fd, buffer, sizeof(buffer));

```
Η συνάρτηση `access` ελέγχει εάν ο χρήστης που εκτέλεσε το εν λόγω πρόγραμμα έχει δικαιώματα γραφής στο αρχείο ονόματι file.

|  |  |
| --- | --- |
| 
```
if (access("file", W\_OK) != 0) {
 exit(1);
}

fd = open("file", O\_WRONLY);
// Στην πραγματικότητα γράφουμε στο αρχείο /etc/passwd
write(fd, buffer, sizeof(buffer));

```
 | 
```
// 
//
// Μετά τον έλεγχο πρόσβασης
//symlink("/etc/passwd", "file");
// Πρίν το άνοιγμα του αρχείου, το "file" 
// δείχνει στο αρχείο "etc/passwd"
//

```
 |

Εδώ, ο επιτιθέμενος δύναται να εκμεταλλευτεί την συνθήκη ανταγωνισμού που εμφανίζεται ανάμεσα στον χρόνο ελέγχου (συνάρτηση `access`) και τον χρόνο εκτέλεσης (συνάρτηση `open`), ούτως ώστε να εξαπατήσει το θύμα και εκείνος να αντικαταστήσει μία εγγραφή στο αρχείο κωδικών του συστήματος. Οι συνθήκες ανταγωνισμού μπορούν να χρησιμοποιηθούν για την απόκτηση δικαιωμάτων διαχειριστή στο σύστημα.

Αξιόπιστος συγχρονισμός επιθέσεων συνθηκών ανταγωνισμού
-------------------------------------------------------

Η εκμετάλλευση μίας συνθήκης ανταγωνισμού απαιτεί χρονική ακρίβεια, ούτως ώστε οι ενέργειες του επιτιθέμενου να παρεμβληθούν ανάμεσα σε εκείνες του θύματος. Στο παραπάνω παράδειγμα, ο επιτιθέμενος οφείλει να εκτελέσει την κλήση συστήματος `symlink` ανάμεσα στην κλήση των συναρτήσεων `access` και `open`. Το πλαίσιο της γενικότερης επίθεσης επιβάλλει εκτέλεση των ενεργειών του επιτιθέμενου μετά το πέρας εκτέλεσης κάθε ενέργειας του θύματος.

Αυτό επιτυγχάνεται μέσω συγκεκριμένων τεχνικών όπως ο λαβύρινθος συστήματος αρχείων (file system maze) και οι επιθέσεις αλγοριθμικής πολυπλοκότητας.

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

Πρόληψη
-------

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

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

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

Μία εναλλακτική λύση που προτάθηκε από την ερευνητική κοινότητα αφορά την υιοθέτηση συναλλαγών στο σύστημα αρχείων ή στον πυρήνα του λειτουργικού συστήματος και προορίζεται για συστήματα Unix. Οι συναλλαγές παρέχουν μία αφαίρεση ελέγχου ταυτοχρονισμού για το λειτουργικό σύστημα και μπορούν να χρησιμοποιηθούν για την πρόληψη των συνθηκών ανταγωνισμού. Μάλιστα, έχουν αναπτυχθεί ερευνητικά πρωτότυπα για το Linux ως απόδειξη της παραπάνω έννοιας και περιλαμβάνουν το σύστημα αρχείων Valor και τον TxOS πυρήνα. Ακόμη, τα Windows έχουν προσθέσει τις συναλλαγές ως μέρος του συστήματος αρχείων NTFS, αν και η χρήση τους δεν συνίσταται από την Microsoft.

Παραπομπές
----------

1. ↑  Wei, Jinpeng & Pu, Calton. (2005). TOCTTOU Vulnerabilities in UNIX-Style File Systems: An Anatomical Study.
2. ↑  «Docker Bug Allows Root Access to Host File System». *Decipher* (στα Αγγλικά). Ανακτήθηκε στις 5 Οκτωβρίου 2020.
3. ↑  Borisov, Nikita & Johnson, Rob & Sastry, Naveen & Wagner, David. (2005). Fixing races for fun and profit: how to abuse atime.
4. ↑  Cai, Xiang & Gui, Yuwei & Johnson, Rob. (2009). Exploiting Unix File-System Races via Algorithmic Complexity Attacks. Proceedings - IEEE Symposium on Security and Privacy. 27-41. 10.1109/SP.2009.10.
5. ↑  Dean, Drew & Hu, Alan. (2004). Fixing Races for Fun and Profit: How to Use access(2). 195-206.
6. ↑  Tsafrir, Dan; Hertz, Tomer; Wagner, David; Silva, Dilma (2008). «Portably Preventing File Race Attacks with User-Mode Path Resolution». *Storage Developer Conference*.. Ανακτήθηκε στις 2020-10-05.
7. ↑  Spillane, Richard & Gaikwad, Sachin & Chinni, Manjunath & Zadok, Erez & Wright, Charles. (2009). Enabling Transactional File Access via Lightweight Kernel Extensions.. 29-42. Seventh USENIX Conference on File and Storage Technologies (FAST 2009), San Francisco (CA), February 24–27, 2009
8. ↑  Porter, Donald & Hofmann, Owen & Rossbach, Christopher & Benn, Alexander & Witchel, Emmett. (2009). Operating systems transactions. SOSP'09 - Proceedings of the 22nd ACM SIGOPS Symposium on Operating Systems Principles. 161-176. 10.1145/1629575.1629591.
9. ↑  «About Transactional NTFS - Win32 apps». *docs.microsoft.com* (στα Αγγλικά). Ανακτήθηκε στις 5 Οκτωβρίου 2020.