CodeBlanks Logo Icon CodeBlanks

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.

Başlangıç kodu

main.c
#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

main.c
#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

Soru
if (len < 0 || len > ____) return 0;
Cevap
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

Uzman bölümündeki tüm dersler