Въведение в буферния преливник

Буферното преливане е известно още като Buffer overrun, състояние на компютъра, при което приложение се опитва да съхранява повече данни в буферната памет, отколкото размера на паметта. Това води до съхранение на данни в съседно съхранение, което понякога може да презапише съществуващите данни, причинявайки потенциална загуба на данни, а понякога и срив на системата. Това е често срещана грешка в програмирането, която повечето разработчици извършват несъзнателно. Това най-често се използва от хакерите, за да получат достъп до нежелани данни.

Какво представлява буферната памет?

Отличен въпрос. Буферната памет или буферът е просто последователна част от RAM паметта, задържаща данните временно, докато се прехвърля от едно място на друго - мястото обикновено е устройство за вход или изход. Това се прави, за да се компенсира разликата в скоростите, с които устройствата работят.

Например, когато давате някои документи за печат, най-новият ви i7 процесор е достатъчно бърз, за ​​да изпълни командата за печат в наносекунди, докато лошият стар принтер не е оборудван с този бърз процесор. Така че документите се държат върху буферната памет и се предават на принтера със скорост, която принтерът приема. Това освобождава оперативната памет на вашия процесор за други задачи.

Buffer Overflow Attack

Сега, когато е идентифицирана уязвимост с компютрите, хакерите са длъжни да я използват и се опитват да атакуват различни системи чрез атаки на препълване на буфер. Сега възниква въпросът, как хакер извършва такава атака и какви са последствията?

При атака с преливане на буфер допълнителните данни включват инструкции, които са предназначени да задействат вредни дейности като повреждане на файлове, промяна на данни, изпращане на частна информация през интернет и др. Нападателят просто ще се възползва от всяка програма, която чака определен потребител въвеждане и въвеждане на излишни данни в буфера.

Атаката с преливане на буфер може да бъде класифицирана основно в два типа

  • Стак-базиран: Когато атаката е на разпределение на базата на стека. Това е по-лесно за експлоатация и по този начин е по-податливо на атаки.
  • На базата на купчина : Когато атаката е на разпределение на паметта на базата на купчина. Това не е толкова лесно за експлоатация и по този начин е далеч по-рядко.

Езиците, които са най-уязвими за атаки на препълване на буфер, са C, C ++, Fortran и Assembly, тъй като използват техники за разпределение на паметта, базирани на стек.

Лекарството

След като данните са повредени, просто няма лек за възстановяване на оригиналните данни. Освен това интензивността на атаката до голяма степен определя лечението. Ако атаката е слаба и засяга само част от паметта на изолирана машина, лек системен формат може да бъде лек. Като има предвид, че ако атаката е широко разпространена и компрометира данните на няколко машини, форматирането на цялата мрежа няма да помогне, освен ако не бъде фиксирана програмата, която инжектира злонамерения код.

Превенцията е по-добра от лечението

Като разработчици наша отговорност е да проверяваме за буфери в нашия код. Ако буферните преливания се обработват в самия код, защитата на системата не е възпрепятствана чрез атаки на буфер-препълване.

Следват няколко прости предпазни стъпки, които могат да помогнат за предотвратяване на буферните преливания.

  • Работата с изключенията трябва да се използва, за да се открият препълненията на буфера и да се предотврати изпълнението на код в случай на него.
  • Разпределете достатъчно голям размер, за да буферирате, така че непредвидените големи обеми от данни да се обработват правилно.
  • Избягвайте използването на библиотечни функции или методи на трети страни, които не са проверени за препълване на буфер. Най-често срещаните примери за такива функции, които трябва да се избягват, са get (), scanf (), strcpy () Те са предимно на C / C ++ език.
  • Тестването на кода трябва да отчита такива уязвимости и стриктно да тества кода и да коригира грешки, които могат да доведат до препълване.
  • Съвременните езици за програмиране, операционните системи и компилаторите на кодове са се развили, за да спрат изпълнението на командите в случай на препълване на буфер. Това се превърна в най-надеждният начин за автоматично откриване на буферни преливания.

Опитайте сами …

Разбрахте толкова много за Buffer Overflow и Buffer Attacks, защо да не се опитате сами да кодирате нещо злонамерено?

Отказ от отговорност - Следващата програма е само за илюстрация и не трябва да се използва за причиняване на вреда от всякакъв вид. Всяка прилика със злонамерен код е просто случайна. Нещо повече, операционните системи в днешно време са достатъчно интелигентни, за да могат да извършват превантивни буферни атаки.

По-долу е програмата C, която може да причини превишаване на потенциалния буфер. Защо изборът на език C? Това е така, защото по-модерните програмни езици са разработени, за да се справят с буферните превишения само по време на компилиране. Въпреки че в наши дни компилаторите на C също имат определени проверки, за да избегнат откриването на буферния преливник. Така че ще видите само съобщение за грешка, което показва, че е открито превишаване на буфера.

#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;
)

Какво се случи, когато 123456789 беше даден като аргумент на командния ред на програмата? Програмата генерира грешка, която се хвърля, когато компилаторът открие препълване на буфера. Днес компилаторите и операционните системи имат добавен защитен слой. Този слой е нищо, но променливи, наречени Канари, които се инициират към определени стойности по време на компилиране. След това тези променливи се съхраняват в съседни памет памет към буфера. Така че, когато буферът прелива, допълнителните данни се вливат в съседната памет и развалят стойността на Канарите. Веднага щом бъде открит корумпиран канар, системата прекратява изпълнението.

Друг пример на език C ++:

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

Вход - 123456789

Резултат -

Заключение - преливане на буфер

И така, до сега съм сигурен, че бихте разбрали значението на обработката на буферите във вашата програма. Включете тази практика, за да проверите за буферни граници по време на писане, както и да тествате кода си. Това ще ви помогне да напишете защитен код.

Препоръчителни статии

Това е ръководство за това какво е буфер преливане. Тук обсъдихме дефиницията, превенцията, паметта, атаката в Buffer Overflow. Можете да разгледате и другите ни предложени статии, за да научите повече -

  1. Какво е JavaScript?
  2. Какво е Django?
  3. Какво е SQL Developer?
  4. Какво е Azure?