Переполнение буфера
Переполнение буфера — печальная ситуация, когда данные оказываются восраны за пределы буфера и оказываются утрачены.
Описание[править]
Когда объём записываемых данных превышает ёмкость буфера, избыточная информация перезаписывает соседние участки памяти, что приводит к непредсказуемому поведению программы. Это весьма популярная ошибка, связанная со слабой квалификацией программиста или использованием вибе-кодинга, который совмещает разные коды как кто горазд, особенно такой херовый кодер, как Claude.
Оно возникает преимущественно в языках низкого уровня, таких как C и C++, где отсутствует встроенная проверка границ массивов, а управление памятью осуществляется напрямую. В результате злоумышленник может не только вызвать сбой программы, но и зачастую выполнить произвольный машинный код, так что на самом деле сия ошибка является весьма опасной епта.
Да. Переполнение буфера в стеке позволяет перезаписать адрес возврата и перенаправить выполнение на код злоумышленника.
Именно на этой ошибке паразитировал вонючий червь Морриса, который работал через переполнение буфера в сервисе finger операционной системы Unix (функция gets()). Червь заразил тысячи компьютеров ARPANET, в общем-то хорошо поползал епта.
В 2001 году червь Code Red использовал переполнение в Microsoft Internet Information Services, заразив сотни тысяч серверов. В 2003 году SQL Slammer поразил Microsoft SQL Server 2000, вызвав глобальные сбои в интернете. Аналогичные уязвимости позволили запускать неофициальное ПО на игровых консолях, то есть работали в общем-то на благо, позволяя обходить ограничения вредителей.
Переполнение происходит, когда программа копирует данные без проверки их длины. В языках вроде C функции strcpy(), gets(), scanf() и им подобные не выполняют проверку границ, что собственно и приводит к плохо пахнущим и хрюкающим проблемам.