C
Güvenlik katmanı
Buffer overflow koruması ve güvenlik denetimleri yazarsın.
Güvenlik katmanı
Dördüncü derste güvenlik katmanını eklersin. security_check fonksiyonu, bir tamponun (buffer) taşma riskini denetler: uzunluk sınırdan büyükse veya gösterge NULL ise 0 döndürür.
Tampon taşması (buffer overflow), bir dizinin sınırının asılmasıdır; güvenlik açıklarının en yaygın kaynağıdır. security_check, bir veriyi işlemeden önce boyutunu doğrular. len < 0 || len > 16 ile olumsuz veya çok büyük değerleri yakalar; buf == NULL ile boş göstergeyi yakalar. Her ikisi de geçerse 1 (güvenli) döndürür. Bu, savunmasal programlamanın (defensive programming) temel bir örneğidir.
Defansif programlama
Defansif programlama, olası hataları önceden yakalamaktır. security_check, üç denetim yapar: uzunluk negatif mi, çok büyük mü, gösterge NULL mı. Her denetim başarısız olursa 0 döndürür.
Bu yaklaşım, canary (kanarya) değerine benzer: bir hata oluşmadan önce yakalanır. Gerçek canary, yığın taşmasını (stack smashing) algılamak için fonksiyon dönüş adresinin yanına yerleştirilir; değişirse program durur. security_check ise veri girişinden önce denetim yapar. Her iki yöntem de, hatalı verinin sisteme girmesini önler. Güvenli kod, her giriş denetlenir.
Uygulama security_check fonksiyonunu ekle
Var olan tanımların altına int security_check(const char *buf, int len) yaz. if (len < 0 || len > 16) return 0; ile taşma denetimi yap. if (buf == NULL) return 0; ile NULL denetimi yap. return 1; ile güvenli döndür.
Örnek çözümü göster
#include <stdio.h>
#include <string.h>
void kernel_init(void);
int parse_command(const char *cmd);
int security_check(const char *buf, int len);
void kernel_init(void) {
printf("Çekirdek başladı\n");
}
int syscall(int num) {
return num * 2;
}
int parse_command(const char *cmd) {
if (strcmp(cmd, "help") == 0) return 1;
if (strcmp(cmd, "exit") == 0) return 2;
return 0;
}
int security_check(const char *buf, int len) {
if (len < 0 || len > 16) return 0;
if (buf == NULL) return 0;
return 1;
}
int main(void) {
printf("Proje başladı\n");
kernel_init();
printf("Komut: %d\n", parse_command("help"));
return 0;
}
Kendini test et
-
security_check neyi önler?
- Tip hatası
- Tampon taşması
- Derleme hatası
- Bellek sızıntısı
Cevabı göster
Tampon taşması — security_check tampon taşması riskini denetler.
-
Uzunluk denetimini tamamla
if (len < 0 || len > ____) return 0;
Cevabı göster
if (len < 0 || len > 16) return 0;
-
Güvenlik kavramını eşle
- Taşma denetimi
- len > 16
- NULL denetimi
- buf == NULL
- Canary
- Koruma değeri
- Güvenli
- return 1
Sıradaki ders: Birleştirme