Πρακτικές Ασφαλούς Προγραμματισμού και Σημεία Ευπάθειας

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

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

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

Η λίστα ευπαθειών είναι εκτενής (OWASP 2022). Υπάρχουν ευπάθειες γενικές που συνήθως εντοπίζονται σε κάθε γλώσσα προγραμματισμού και άλλες ειδικές για κάθε γλώσσα.

Για παράδειγμα, στο ακόλουθο τμήμα κώδικα γραμμένο σε C μπορούμε να εντοπίσουμε τα εξής σημεία ευπάθειας:

#define BUF_SIZE 64

int main(int argc, char *argv[]) {
	int volume = 0;
	int radius = 0;
	char *name = NULL;
	name = malloc(sizeof(char) * BUF_SIZE);
	printf(" strlen %d\n", strlen(argv[2]));
	...
	return 0;
}

α) έχουμε μια κλήση στη συνάρτηση malloc() χωρίς να ελέγχεται η τιμη επιστροφής της συνάρτησης.
Η πρακτική ασφαλούς προγραμματισμού είναι να ελέγξουμε την τιμή που επιστρέφεται και να δράσουμε ανάλογα:

	name = malloc(sizeof(char) * BUF_SIZE);
	if(name) { // successful - perform the remaining of the code
	
		... 

	}
	else { // failed - print message and return
		perror("a malloc error");
		return 1;
	}

β) βλέπουμε οτι η παράμετρος εισόδου argv[2] χρησιμοποιείται χωρίς να γίνει έλεγχος εγκυρότητάς της (validation).
Στη συγκεκριμένη περίπτωση το πρόγραμμα μετατρέπει πεζά σε κεφαλαία, άρα θα ελέγξουμε αν οι χαρακτήρες που δίνονται στην
παράμετρο εισόδου είναι γράμματα. Επίσης θα ελέγξουμε το μήκος της συμβολοσειράς αυτής να μην υπερβαίνει το όριο που έχουμε θέσει:

	if(strlen(argv[2])>BUF_SIZE) {
		printf(" name too long\n");
		return 1;
	}
	int val=0;
	for(i=0; i<strlen(argv[2]); i++) {
		if(!(argv[2][i]>='a' && argv[2][i]<='z') && !(argv[2][i]>='A' && argv[2][i]<='Z')
			val=1;
	}
	if(val==1) {
		printf(" name should have alphabet letters only\n");
		return 1;
	}

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


OWASP (2022) Vulnerabilities https://owasp.org/www-community/vulnerabilities/ Accessed 13 Σεπτεμβρίου 2022.
This entry was posted in Πληροφορική and tagged , , . Bookmark the permalink.

Αφήστε μια απάντηση

Η ηλ. διεύθυνση σας δεν δημοσιεύεται. Τα υποχρεωτικά πεδία σημειώνονται με *