2012-02-18 13 views
24

Zakładając, że program w języku C# używa tylko zarządzanego kodu .NET, czy możliwe jest wystąpienie luki w zabezpieczeniach związanej z przepełnieniem bufora w tym programie? Jeśli tak, w jaki sposób taka luka jest możliwa?Czy exploity przepełnienia bufora są możliwe w języku C#?

+0

Przepełnienie bufora w klasycznym sensie, czy też jakikolwiek rodzaj exploita przepełnienia bufora? – Dykam

+0

Sprawdź słowa kluczowe "niezaznaczone" i "niebezpieczne". –

+0

@Dykam: w sensie exploita. – poke

Odpowiedz

43

Tak, ale są one znacznie trudniejsze do wyprodukowania. Możesz dostać przepełnienie bufora tylko wtedy, gdy używasz pewnych niebezpiecznych konstrukcji, a nie "normalnego" kodu C#. Kod uszkodzenia pamięci nie powinien być w ogóle możliwy, gdy twój kod działa z obniżonym zaufaniem.

Kilka możliwości przepełnienia bufora:

  1. Korzystanie z unsafe słowa kluczowego, który pozwala wskaźników. Niebezpieczny kod jest równie łatwy do złego, jak kod oparty na wskaźniku wc lub C++.
  2. Korzystanie niebezpiecznych API, takich jak metody z klasy Marshal
  3. (mono) Można wyłączyć sprawdzanie zakresu array (bezpieczeństwo vs. wydajności kompromis)

Istnieje również kilka innych sposobów do uszkodzenia pamięci oprócz przepełnień bufora.

  1. StructLayoutKind.Explicit
  2. Błędne rodzime podpisy międzyoperacyjne

(Sam wykonawcze jest napisany w języku C++, więc błąd w czasie wykonywania mogą również uszkodzony pamięci lub przepełnienie bufora, ale uważam, że obecnie zakresu tego pytania)

3

W sensie absolutnym tak, exploit buforowy jest możliwy z powodu błędów w środowisku wykonawczym .NET. Jednak .NET zapobiega większości kodów użytkownika końcowego (z wyjątkiem "niebezpiecznego" użycia) z tego rodzaju problemów, więc w rzeczywistości jest mniej ryzykowny.

W prawdziwym życiu większość takich problemów wystąpi z połączeń natywnych (dll COM itp.) Wywoływanych z kodu zarządzanego.

14

Tak, w środowiskach niebezpiecznych:

unsafe void bufferOverflow(string s) 
{ 
    char* ptr = stackalloc char[10]; 

    foreach (var c in s) 
    { 
     *ptr++ = c; // Bufferoverflow if s.Length > 10 
    } 
} 

"Zezwalaj niebezpieczny kod" musi być zaznaczone, aby to skompilować.

Nie można tradycyjnego przepełnienia bufora za pomocą tablicy. Sprawdza granice przed uzyskaniem dostępu do tablicy, chyba że (CLR) może zagwarantować, że jest bezpieczna.

+2

+1 za podanie przykładu i wymienienie sprawdzenia kompilacji. –

+1

To jest trochę niepoprawne - stackalloc nie pozwoli na przepełnienie bufora. –

Powiązane problemy