Wprowadzenie do przepełnienia bufora

Przepełnienie bufora jest również znane jako Przepełnienie bufora, to stan komputera, w którym aplikacja próbuje zapisać więcej danych w pamięci bufora niż wielkość pamięci. Prowadzi to do przechowywania danych w sąsiedniej pamięci, która może czasami zastąpić istniejące dane, powodując potencjalną utratę danych, a czasem awarię systemu. Jest to powszechny błąd programowy, który większość programistów popełnia nieświadomie. Jest to najczęściej wykorzystywane przez hakerów w celu uzyskania dostępu do niechcianych danych.

Co to jest pamięć buforowa?

Doskonałe pytanie. Pamięć buforowa lub bufor jest po prostu sekwencyjną częścią pamięci RAM odłożonej do tymczasowego przechowywania danych podczas przesyłania ich z jednego miejsca do drugiego - miejscem zwykle będącym urządzeniem wejściowym lub wyjściowym. Odbywa się to w celu skompensowania różnicy prędkości, z jaką działają urządzenia.

Na przykład, gdy podajesz jakieś dokumenty do wydrukowania, twój najnowszy procesor i7 jest wystarczająco szybki, aby wykonać polecenie drukowania w nanosekundach, podczas gdy stara, słaba drukarka nie jest wyposażona w ten szybki procesor. Tak więc dokumenty są przechowywane w pamięci bufora i przekazywane do drukarki z prędkością akceptowaną przez drukarkę. Zwalnia to pamięć RAM procesora do innych zadań.

Atak przepełnienia bufora

Po zidentyfikowaniu luki w zabezpieczeniach komputerów hakerzy muszą ją wykorzystać i spróbować zaatakować różne systemy za pomocą ataków przepełnienia bufora. Teraz pojawia się pytanie, w jaki sposób haker dokonuje takiego ataku i jakie są konsekwencje?

W przypadku ataku przepełnienia bufora dodatkowe dane obejmują instrukcje, które mają na celu wywołać szkodliwe działania, takie jak uszkodzenie plików, zmiana danych, wysyłanie prywatnych informacji przez Internet itp. Osoba atakująca po prostu skorzysta z dowolnego programu, który czeka na określonego użytkownika wprowadzić i wprowadzić nadmiar danych do bufora.

Atak przepełnienia bufora można przede wszystkim podzielić na dwa typy

  • Oparte na stosie : gdy atak dotyczy alokacji pamięci opartej na stosie. Jest to łatwiejsze do wykorzystania i dlatego jest bardziej podatne na ataki.
  • Na podstawie sterty: gdy atak dotyczy alokacji pamięci na podstawie sterty. Nie jest to tak łatwe do wykorzystania i jest o wiele rzadsze.

Językami najbardziej narażonymi na ataki związane z przepełnieniem bufora są C, C ++, Fortran i asembler, ponieważ używają technik alokacji pamięci na stosach.

The Cure

Gdy dane są uszkodzone, nie ma lekarstwa na przywrócenie oryginalnych danych. Co więcej, intensywność ataku w dużej mierze determinuje wyleczenie. Jeśli atak jest skromny i dotyczy tylko części pamięci izolowanej maszyny, lekarstwem może być prosty format systemu. Podczas gdy atak jest szeroko rozpowszechniony i naraził na szwank dane na kilku komputerach, formatowanie całej sieci nie pomogłoby, chyba że naprawiony zostanie program wstrzykujący szkodliwy kod.

Lepiej jest zapobiegać niż leczyć

Jako programiści naszym obowiązkiem jest sprawdzenie przepełnienia bufora w naszym kodzie. Jeśli przepełnienie bufora jest obsługiwane w samym kodzie, bezpieczeństwo systemu nie jest ograniczane przez ataki przepełnienia bufora.

Oto kilka prostych kroków zapobiegawczych, które mogą pomóc w zapobieganiu przepełnieniu bufora.

  • Obsługa wyjątków musi być wykorzystywana do wykrywania przepełnień bufora i zapobiegania wykonywaniu kodu w przypadku jego wystąpienia.
  • Przydziel wystarczająco duży rozmiar, aby buforować, aby niepotrzebne duże ilości danych były traktowane w odpowiedni sposób.
  • Unikaj korzystania z funkcji bibliotecznych lub metod innych firm, które nie są sprawdzane pod kątem przepełnienia bufora. Typowe przykłady takich funkcji, których należy unikać, to gets (), scanf (), strcpy () Są to głównie w języku C / C ++.
  • Testowanie kodu powinno uwzględniać takie luki i rygorystycznie testować kod oraz naprawiać błędy, które mogą prowadzić do przepełnienia.
  • Nowoczesne języki programowania, systemy operacyjne i kompilatory kodu ewoluowały, aby zatrzymać wykonywanie poleceń w przypadku przepełnienia bufora. Jest to najbardziej niezawodny sposób automatycznego wykrywania przepełnień bufora.

Spróbuj sam…

Zrozumiałeś tyle o przepełnieniu bufora i atakach buforowych, więc dlaczego nie spróbować samodzielnie kodować czegoś złośliwego?

Zastrzeżenie - Poniższy program służy wyłącznie celom ilustracyjnym i nie należy go używać do wyrządzania jakichkolwiek szkód. Wszelkie podobieństwo do złośliwego kodu jest jedynie przypadkowe. Co więcej, systemy operacyjne są obecnie wystarczająco inteligentne, aby mieć kontrole zapobiegające atakom buforowym.

Poniżej znajduje się program C, który może spowodować potencjalne przekroczenie bufora. Dlaczego wybór języka C? Wynika to z faktu, że opracowano bardziej zaawansowane języki programowania, aby radzić sobie z przepełnieniami buforów tylko podczas kompilacji. Chociaż w dzisiejszych czasach kompilatory C mają również pewne kontrole, aby uniknąć wykrycia przepełnienia bufora. Tak więc zobaczysz tylko komunikat o błędzie wskazujący, że wykryto przekroczenie bufora.

#include
#include
#include
int main(int argc, char *argv())
(
char mybuffer(8);
// copy the user input to mybuffer, without any bound checking
printf("Storing user input to mybuffer…\n");
strcpy(mybuffer, argv(1));
printf("mybuffer content= %s\n", mybuffer);
return 0;
)

Co się stało, gdy 123456789 podano programowi jako argument linii poleceń? Program wygenerował błąd, który jest generowany, gdy kompilator wykryje przepełnienie bufora. Kompilatory i systemy operacyjne mają obecnie dodatkową warstwę ochronną. Ta warstwa jest niczym innym, jak zmiennymi zwanymi Kanarami, które są inicjowane do pewnych wartości w czasie kompilacji. Te zmienne są następnie przechowywane w sąsiednich jednostkach pamięci do bufora. Tak więc, gdy przepełnia się bufor, dodatkowe dane wpływają do sąsiedniej pamięci i psują wartość Wysp Kanaryjskich. Natychmiast po wykryciu uszkodzonego kanarka system przerywa wykonanie.

Kolejny przykład w języku C ++:

#include
using namespace std;
int main()
(
char buf(8);
cin>>buf;
return 0;
)

Wejście - 123456789

Wyjście -

Wniosek - Przepełnienie bufora

Jestem więc pewien, że zrozumiałbyś znaczenie obsługi buforów w swoim programie. Dołącz tę praktykę, aby sprawdzać granice buforów podczas pisania, a także testować kod. Pomoże Ci to napisać bezpieczny kod.

Polecane artykuły

To był przewodnik po przepełnieniu bufora. Tutaj omówiliśmy Definicja, zapobieganie, pamięć, atak w przepełnieniu bufora. Możesz także przejrzeć nasze inne sugerowane artykuły, aby dowiedzieć się więcej -

  1. Co to jest JavaScript?
  2. Co to jest Django?
  3. Co to jest programista SQL?
  4. Co to jest Azure?