Как да предотвратите атаки на препълване на буфер

Атаките на препълване на батерията причиняват системите да разлеят данни, причинявайки хаос.

Стъпка 1

Напишете кода за защита, за да избегнете атаки с препълване. В C съществуват редица функции за уязвимост, които хакерите могат да експлоатират, за да препълнят буферите. Минимизирайте използването на strcpy (), strcat (), sprintf () и vsprintf (), които не проверяват границите. Ако е възможно, избягвайте използването на get (), което не уточнява колко знака трябва да се прочетат и по този начин оставят кода ви уязвим. Ако използвате scanf (), не забравяйте да определите ширина за формата% s, за да избегнете преливане.

Стъпка 2

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

Стъпка 3

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

Стъпка 4

Инсталирайте инструменти като libsafe, за да проверите сигурността в динамична среда за изпълнение. Libsafe работи на Linux и проверява най-близкия адрес за връщане на пакета от стекове, след което се уверява, че адресът не е презаписан. Libsafe също ще замени не-защитени функции като get (), strcpy () и scanf ().