Безопасность доступа к памяти


Безопасность доступа к памяти — концепция в разработке программного обеспечения, целью которой является избежание программных ошибок, которые ведут к уязвимостям, связанным с доступом к оперативной памяти компьютера, таким как переполнения буфера и висячие указатели.

Языки программирования с низким уровнем абстракций, такие как Си и Си++, поддерживающие непосредственный доступ к памяти компьютера (произвольную арифметику указателей, выделение и освобождение памяти) и приведение типов, но не имеющие автоматической проверки границ[en] массивов, не являются безопасными с точки зрения доступа к памяти[1][2]. C и C++, тем не менее, содержат инструменты (такие как умные указатели), позволяющие повысить безопасность доступа к памяти. Этой же цели служат техники управления памятью[3]. Тем не менее, избежать ошибок доступа к памяти, особенно в сложных системах, зачастую не удаётся[4].

Одним из наиболее распространённых классов уязвимостей программного обеспечения являются проблемы безопасности памяти[5][6]. Данный тип уязвимости известен с 1980-х годов[7]. Безопасность памяти подразумевает предотвращение попыток использовать или модифицировать данные, если это не было намерено разрешено программистом при создании программного продукта[8].

Множество критических с точки зрения производительности программ реализованы на языках программирования c низким уровнем абстракций (Си и Си++), которые склонны к появлению уязвимостей данного типа. Отсутствие защищённости этих языков программирования позволяет атакующим получить полный контроль над программой, изменять поток управления, иметь несанкционированный доступ к конфиденциальной информации[9]. На данный момент предложены различные решения проблем, связанных с доступом к памяти. Механизмы защиты должны быть эффективны одновременно как с точки зрения безопасности, так и с точки зрения производительности[10].

Первую огласку ошибки памяти получили в 1972 году[11]. И далее они являлись проблемой многих программных продуктов, средством, позволяющим применять эксплоиты. Например, червь Морриса использовал множество уязвимостей, часть из которых была связана с ошибками работы с памятью[12].

Различают несколько видов ошибок памяти (уязвимостей), которые могут возникать в некоторых языках программирования[13][14][15]: