Buffer Overflows, C programlamada en kalıcı ve tehlikeli güvenlik güvenlik güvenlik güvenlik güvenlik güvenlik güvenlik güvenlik güvenlik güvenliklerinden biri olarak kalır. on yıllardır iyi niyetli olmasına rağmen, veri yolsuzluk, sistem çökmüş ve uzaktan kod yürütmesi gibi ciddi sorunlara neden olmaya devam ederler.Yazdır güvenli C kodu, akışların nasıl meydana geldiğini ve onları önlemeye yönelik bir disiplin yaklaşımı gerektirir.

Buffer Overflows'ı Anlamak

Bir program daha fazla veri yazarken bir hafıza (a buffer) hafızanın (a buffer) bir uyarı işareti koymak için tahsis edildi.Buffers yığınta veya heap hafızalarında olduğundan, sınırları aşmış bellek yerlerine kadar.Bu yolsuzluk program durumunu değiştirebilir, öngörülemeyen davranışları tanıtabilir veya keyfi kodu uygulamak için bir saldırgan tarafından sömürülebilir.

Sonuçlar, geri dönüş adresinin yazılması, saldırgan kontrol edilen koda müdahale etmeyi yönlendirebilir. Overgraph pointers can lead to icon memory write. even simple accidents can be capturedd for false-service Attack. Understanding the components is the first step to prevent.

Stack-Based Overflows

Yerel değişkenler, iç işlevleri ilan eden tamponlar dahil, yığın üzerinde depolanır ve ayrıca iade adresini tutar, ekran işaretlerini ve diğer kontrol verilerini tutar.Eğer a line buffer likefenFLT:0) aşırı yüklenir, veri geri dönüş adresine dökülüyor ve ötesindeki Classic sömürüleri.

Heap-Based Overflows

Dinamik olarak, tamponlar (END 1: 1), [[Üyetim:2) Oap'ta yaşamak, tümocator tarafından kullanılan metadata, sert veya kullanımı olmayan saldırılar yoluyla sömürülebilir.Heap aşırı akışlar daha da tehlikeli.

Ortak Vulnerable Fonksiyonlları ve Güvenli Alternatifleri

C standart kütüphane, sınır kontrolü yapmadığı birkaç işlev sunar. Onları kullanarak, buffer aşırı akışların en yaygın nedenidir. Onları daha güvenli meslektaşları ile yeniden kurmak temel bir uygulamadır.

String Kopya ve Concatenation

  • [FONT:0][Dönemli: · 1|güvenli olmayan kopyalar, kaynağın n'den daha uzun bir sınır olmadan silinemez.]) Güvenli alternatif:|D|D|D|D|D|Dönetici|Dönetici|saire|saire|saire|saire|seçmişler; notlar, eğer kaynaktan daha uzun süre sonra hiçbir zaman nümert-terminateden daha uzun süre ilerleyemez.
  • Daha iyi: henüz: BSD ve birçok Linux sisteminde mevcut; her zaman devre dışı bırak ve kaynak dizesinin transistör algılamasını döndürür.
  • [FONT:0] – Güvensiz: Sınırsızlar.][Dönetici:2][Dönemli alternatif:[DÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜDÜye Olmayanlar)[Üye Olmayanlar İçindekiler:[DÜye Olmayanlar İçin Tıklayınız.

Formated Çıktı ve Giriş

  • [FONT:0] – Güvensiz: boyut kontrol olmadan bir tampona formatlanmış çıktı.]) Güvenli alternatif:
  • [FONT:0] – Benzer risk; bunun yerine İLDİKKT:11 kullanın.
  • [FONT:0] – Aşırı tehlikeli; yerine C11 standarttan kaldırıldı.
  • [FONT:0] - No bounds check. UseETHFLT:15) veya ) alan genişliği spektral spektralleri ile.

Memory Kopyalama ve Move

  • [FONT:0] – Güvenli sadece hedef tampon boyutunu aşmamak için doğrulanmışsa.]
    ) Güvenli alternatif:[FLT:|Dövme) ve her zaman n ≤ dest büyüklüğü garanti etmez.
  • Bazı platformlar, Ek K'dan (C11) gelen modüller sağlar, ancak kabul sınırlıdır.

Geçerlilik ve Boyut Yönetimi

Güvenli fonksiyonlarla bile, giriş uzunluklarını doğrulamanız gerekir, uygun tampon boyutları sağlamak ve potansiyel transkriptle başa çıkmak zorundasınız.

Check Access Lengths

Dış girişi kopyalamadan veya işlemeden önce (kullanıcı giriş, ağ verileri, dosya içeriği), en kabul edilebilir uzunluklarını belirleme ve onu aşan verileri reddetme veya devre dışı bırakmadan önce. Örneğin:

#define MAX_INPUT 255
char buffer[MAX_INPUT + 1]; // +1 for null
if (strlen(user_input) > MAX_INPUT) {
 // Handle error: reject or truncate
 fputs("Input too long", stderr);
 return -1;
}
strncpy(buffer, user_input, sizeof(buffer) - 1);
buffer[sizeof(buffer) - 1] = '\0';

Bilinen Limitlerle Sabit-Size Buffers kullanın

Mümkün olduğunda, sabit bir boyutla tamponları tanımlayın ve kodun boyunca uygulayın. Değişken uzunlukta dizilerden kaçının (VLAs) büyük boyutlarda depoya konulansa aşırı akışlara neden olabilir. yerine, tümocate dynamically with openscale checks.

Truncation Explicitly

Translamento gibi fonksiyonlar ve [[Dint|s.) ve [[Dint|s.))) ve [[Gayt: s.))) · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · · ·

Güvenlik Bayrakları ve Runtime Protections

Modern derleyiciler, kod değişiklikleri olmadan geçiş tespitini ve mitigation ekler. Onları inşa sisteminizde enable şekilde sunar.

  • [FONT:0] / ) - geri dönüş adreslerini değiştirmeden önce toplanabilir.Eğer geri dönüş adresini değiştirmeden önce bir kanaldan çıkarsanız, kullanım tamamlanmadan önce program bir sürün.
  • [FONT:0] - Değiştirilebilirlik fonksiyonlarını [FONT:0] ve [[DÜŞÜNCÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞ
  • [FONT:0] - Depolama veya bilgi sızıntılarına yol açan format açıkları hakkında savaşlar.
  • [FONT:0] - AdresSanitizer (ASan) Depolama, kullanımdan sonra ücretsiz olarak kullanım ve diğer hafıza hataları için paha biçilmez test için.
  • [FONT:0] - Aşırı akış kontrollerini optimize etmekten kaçının (tavapla birlikte).

İşletim Sistemi Korumaları

Stack kanaryalar sadece bir tabakadır. Modern OSes'deki havai mitigation teknolojileri şunları içerir:

  • [FONT=0)Data Execution Prevention (DEP) / NX bit[DEPT:1) – Marks yığını ve kabuk yürütmesini önlemek için kullanılamaz.
  • [FONT=0)Address Space Layout Randomization (ASLR))[değiştir | kaynağı değiştir] - Randomizes memory adresleri (stack, heap, paylaşılan kütüphaneler) hedef tahmin etmek için daha zor hale getirmek için.
  • [FONT=0)Relocation Read-Only (RELRO))[KDKDKDKDKDKDAŞI)[Küresel Offset Masayı Korumak) Overgraph.

Bu korumaları (genellikle varsayılan) kötüye kullanmak için barı yükseltiyor ancak güvenli kodlamayı değiştirmiyor.

Kod Denetimleri ve Statik Analiz

Otomatik statik analiz ile birlikte insan incelemesi, buları geliştirme iş akışınıza entegre edebilir.

  • [FONT:0]Manual code inceleme[[[Dönemli fonksiyonlar, eksik boyut kontrolleri ve bu tür sınırların ötesinde yazılayan döngüler.
  • [FONT:0]Statik analiz araçları[Dönetici: 1 ), CI boru hatlarında çalıştırılabilir.
  • [FONT:0]Fuzning[[DÜT:1) – libFuzzer, AFL veya diğer fuzzersler giriş işlemlerini otomatik olarak uçabilen beklenmedik verilerle test ederler.

Güvenli Kodlar

Güvenli String Kopyaı Bounds Checking

#include <stdio.h>
#include <string.h>

int safe_string_copy(char *dest, size_t dest_size, const char *src) {
 if (!dest || !src || dest_size == 0) {
 return -1; // Invalid parameters
 }
 size_t src_len = strlen(src);
 if (src_len >= dest_size) {
 // Source too large; truncation or error
 // Option: copy what fits and null-terminate
 strncpy(dest, src, dest_size - 1);
 dest[dest_size - 1] = '\0';
 return 1; // Truncation occurred
 }
 strncpy(dest, src, dest_size);
 // strncpy fills remaining with null, so dest_size fits; no need to null-terminate if src shorter
 return 0; // Success, no truncation
}

Buffer Boyutlar için Güvenli Integer

Buffer Overflow, hesaplama boyutlarında tam tamsayılardan da sonuçlanabilir. Her zaman tahsis etmeden önce arithmetic kontrol edin.

#include <stdlib.h>
#include <limits.h>
#include <errno.h>

void *safe_malloc_array(size_t nmemb, size_t size) {
 if (nmemb == 0 || size == 0) {
 return NULL; // Or handle zero-size allocation
 }
 if (nmemb > SIZE_MAX / size) {
 // Integer overflow would occur
 errno = ENOMEM;
 return NULL;
 }
 return malloc(nmemb * size);
}

Formated Strings için snprintf kullanımı

char log_message[256];
int ret = snprintf(log_message, sizeof(log_message),
 "User %s logged in from %s", username, ip_address);
if (ret < 0) {
 // Output error
} else if ((size_t)ret >= sizeof(log_message)) {
 // Truncation occurred; handle if needed
}

Ek En İyi Uygulamalar

  • [FONT:0)Mutfakların ([Dönetici: 1)))) İmkansız hafızayı önlemek için her zaman sıfır ayarlı tamponlar.
  • [FONT:0]Bağışsız derinlikle yeniden bir araya gelme; – Üst akışlar derin recursion'dan oluşabilir; iteration veya limit derinliğini kullanabilir.
  • [FONT:0)UseENFLT:39] yarı iletkenlik[Dönetici:0)[[FONT:0)))[[FONTD:0)UseurFLT:39])))))))))))))))))) - Derleyici optimize etmeye yardımcı olur ve doğrudan akışları önlemez olsa da.
  • [FONT:0)Öylernek:0)Öylernek:0)[[[Üye Olmayanlar) - giriş dizelerinin kazalarını önlemek ve niyetlerini uygulamak.
  • [FONT=0)Implement hata işleme[[Dönetici: 1 ) - [[DÜDÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜNÜŞÜN, ÂFFT:0))

Daha Fazla Öğrenme Kaynakları

  • [FONT:0)SEI CERT C Coding Standard[Dönetici: 1 ) - Güvenli C kodlama için kapsamlı kurallar.
  • [FONT:0)CWE-120: Girişin Boyutlarını Kontrol etmeden Buffer Kopyalama[DÜT:1) – MITRE'nin buffer aşırı güçlerin sınıflandırılması.
  • [FONT:0)OWASP Buffer Overflow[Dönder] – Open Web Application Security Project'den pratik rehberlik.
  • [FONT=0)GNU C Library Manual: String ve Dizi Utilities[[Döneticiler) - Güvenli dize işlevleri için Belgeleme.
  • [FONT=0)[FONT][FONT=0}[Dönetici][Dönetici:0)[Döneticiler).

Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç Sonuç

C'deki buffer aşırı akışları önlemek istenmiyor; bu kırılganlıklarla çalışan herhangi bir geliştiricinin temel sorumluluğudur.In understand the processes of overflows, replace dangerous functions with more alternatives, titiz olarak geçerli olan girişler ve boyutlar, fikre korumaları sağlar ve statik analiz ve test edin, bu güvenlikli sistemlerin riskini dramatik bir şekilde azaltabilirsiniz.