Güvenlik katmanı
- C kursu
- Uzman
- Ders 46/47
- 6 dk
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.
Başlangıç kodu
#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 main(void) {
printf("Proje başladı\n");
kernel_init();
printf("Komut: %d\n", parse_command("help"));
return 0;
}
// security_check fonksiyonunu yaz:
// len 0-16 arası ve buf NULL değilse 1, yoksa 0Örnek çözüm
#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;
}Beklenen çıktı
Proje başladı Çekirdek başladı Komut: 1
Soru ve cevaplar
Dersin sorularını cevaplarıyla birlikte inceleyebilirsin. Kendini denemek istersen dersi interaktif olarak çöz.
1 security_check neyi önler?
- Tip hatası
- Tampon taşması Doğru cevap
- Derleme hatası
- Bellek sızıntısı
Açıklama: security_check tampon taşması riskini denetler.
2 Uzunluk denetimini tamamla
if (len < 0 || len > ____) return 0;
if (len < 0 || len > 16) return 0;
Açıklama: len > 16 taşma riskini yakalar; 16 bayt sınırı.
3 Güvenlik kavramını eşle
| Kavram | Anlamı |
|---|---|
Taşma denetimi |
len > 16 |
NULL denetimi |
buf == NULL |
Canary |
Koruma değeri |
Güvenli |
return 1 |