Как называется атака, при которой данные превышают объем памяти, выделенный приложению

Обновлено: 02.07.2024

См. статью OWASP об атаках с переполнением буфера.

Как избежать уязвимостей переполнения буфера

См. статью OWASP Development Guide о том, как избежать уязвимостей, связанных с переполнением буфера.

Как проверять код на наличие уязвимостей переполнения буфера

Как проверить наличие уязвимостей переполнения буфера

См. статью OWASP Testing Guide о том, как тестировать уязвимости переполнения буфера.

Обзор

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

Описание

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

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

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

Хотя этот тип переполнения буфера стека по-прежнему распространен на некоторых платформах и в некоторых сообществах разработчиков, существует множество других типов переполнения буфера, в том числе переполнение буфера кучи и ошибка Off-by-one. Другой очень похожий класс недостатков известен как атака строки формата. Существует ряд отличных книг, в которых содержится подробная информация о том, как работают атаки на переполнение буфера, в том числе «Создание безопасного программного обеспечения» [1], «Написание безопасного кода» [2] и «Справочник шеллкодера» [3].

На уровне кода уязвимости, связанные с переполнением буфера, обычно связаны с нарушением предположений программиста. Многие функции управления памятью в C и C++ не выполняют проверку границ и могут легко перезаписать выделенные границы буферов, с которыми они работают. Даже ограниченные функции, такие как strncpy(), могут создавать уязвимости при неправильном использовании. Комбинация манипуляций с памятью и ошибочных предположений о размере или составе фрагмента данных является основной причиной большинства переполнений буфера.

Уязвимости переполнения буфера обычно возникают в коде, который:

  • Использует внешние данные для управления своим поведением.
  • Зависит от свойств данных, которые применяются вне непосредственной области действия кода.
  • Настолько сложен, что программист не может точно предсказать его поведение.

Переполнение буфера и веб-приложения

Злоумышленники используют переполнение буфера для повреждения стека выполнения веб-приложения. Отправляя тщательно обработанные данные в веб-приложение, злоумышленник может заставить веб-приложение выполнить произвольный код, фактически захватив компьютер.

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

Переполнения буфера также могут быть обнаружены в пользовательском коде веб-приложений и даже более вероятны из-за отсутствия тщательной проверки, которую обычно проходят веб-приложения. Ошибки переполнения буфера в пользовательских веб-приложениях с меньшей вероятностью будут обнаружены, потому что обычно гораздо меньше хакеров пытаются найти и использовать такие уязвимости в конкретном приложении. В случае обнаружения уязвимости в пользовательском приложении возможности использования уязвимости (кроме сбоя приложения) значительно снижаются из-за того, что исходный код и подробные сообщения об ошибках приложения обычно недоступны хакеру.

Последствия

  • Категория:Доступность. Переполнение буфера обычно приводит к сбоям.Возможны и другие атаки, приводящие к недоступности, в том числе перевод программы в бесконечный цикл.
  • Контроль доступа (обработка инструкций). Переполнение буфера часто может использоваться для выполнения произвольного кода, что обычно выходит за рамки неявной политики безопасности программы.
  • Другое. Когда последствием является выполнение произвольного кода, его часто можно использовать для подрыва любой другой службы безопасности.

Время воздействия

  • Спецификация требований: можно выбрать язык, который не подвержен этим проблемам.
  • Дизайн: могут быть внедрены смягчающие технологии, такие как библиотеки безопасных строк и абстракции контейнеров.
  • Реализация. Многие логические ошибки могут привести к этому условию. Это может усугубляться отсутствием или неправильным использованием смягчающих технологий.

Затронутые среды

Почти все известные веб-серверы, серверы приложений и среды веб-приложений подвержены переполнению буфера, заметным исключением являются среды, написанные на интерпретируемых языках, таких как Java или Python, которые невосприимчивы к этим атакам (за исключением переполнения в самом интерпретаторе). ).

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

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

Если ваша компания использует поставщика облачных баз данных, очень важно обеспечить максимальную безопасность. Ознакомьтесь с функциями безопасности .

Новейшее аппаратное обеспечение Cisco и привязка Intersight к общедоступному облаку Kubernetes расширяют возможности гибридных облачных продуктов для клиентов. Но .

Чтобы преодолеть разрыв между командами NetOps и SecOps, сетевые специалисты должны знать основы безопасности, включая различные типы .

Какова реальность новых сетевых технологий? Здесь эксперты определяют риски — реальные или предполагаемые — и преимущества, которые они несут .

Подробнее об основных функциях, отличительных чертах, сильных и слабых сторонах платформ блокчейна, которые получают максимальную отдачу .

Эксперты высоко оценивают недавно предложенное Комиссией по ценным бумагам и биржам США правило раскрытия информации о климатических рисках, которое требует от компаний выявлять климатические риски .

Недавнее мероприятие Accenture Technology Vision подчеркнуло трансформационные возможности виртуальных миров, а также указало на .

ИТ-администраторам, рассматривающим возможность перехода на Windows 11, следует узнать, как функции версии Enterprise могут помочь их .

Последняя сборка для разработчиков Windows 11 позволяет открывать несколько папок в приложении для управления файлами. Предполагается, что эта функция .

Администраторам настольных компьютеров следует обратить внимание на собственные функции безопасности и архитектуру Windows 10, чтобы установить базовый уровень настольных компьютеров.

Nvidia запустила облачную версию своей платформы Omniverse для 3D-моделирования. Компания также представила Omniverse .

Преодолейте сбои AWS, научившись создавать многорегиональную архитектуру, обеспечивающую отказоустойчивость в случае аварии.

Чтобы добиться высокой доступности и отказоустойчивости в AWS, ИТ-администраторы должны сначала понять различия между двумя моделями.

ЕС и США согласовывают структуру конфиденциальности данных, разрешающую трансатлантическую передачу данных после того, как США предложат уступки в отношении слежки и новых данных.

Европейская комиссия предложила новые правила кибербезопасности и информационной безопасности для создания минимального набора стандартов.

Семь человек арестованы лондонской полицией в связи с кибератаками, совершенными группой Lapsus$, которая несет ответственность за ряд .

Меган Качановски

Меган Качановски

Что такое атака переполнения буфера и как ее остановить

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

Хотя C, C++ и Objective-C являются основными языками с уязвимостями переполнения буфера (поскольку они имеют более прямое отношение к памяти, чем многие интерпретируемые языки), они составляют основу большей части Интернета.

Даже если код написан на «безопасном» языке (например, Python), если он вызывает какие-либо библиотеки, написанные на C, C++ или Objective C, он все равно может быть уязвим для переполнения буфера.

Распределение памяти

Чтобы понять, что такое переполнение буфера, важно немного разобраться в том, как программы выделяют память. В программе C вы можете выделить память в стеке во время компиляции или в куче во время выполнения.

Чтобы объявить переменную в стеке: int numberPoints = 10;

Или в куче: int* ptr = malloc (10 * sizeof(int));

Переполнение буфера может произойти в стеке (переполнение стека) или в куче (переполнение кучи).

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

Поскольку кучи редко хранят эти обратные адреса, запустить эксплойт гораздо сложнее (хотя и не невозможно). Память в куче обычно содержит данные программы и динамически распределяется по мере выполнения программы. Это означает, что при переполнении кучи, скорее всего, придется перезаписывать указатель на функцию, что сложнее и менее эффективно, чем при переполнении стека.

Поскольку переполнение стека является наиболее часто используемым типом переполнения буфера, мы кратко рассмотрим, как именно оно работает.

Переполнение стека

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

Диаграмма стека для ясности:

Итак, что такое стекфрейм?

Во-первых, стек вызовов — это код на ассемблере для конкретной программы. Это стек переменных и фреймов стека, которые сообщают компьютеру, в каком порядке выполнять инструкции. Для каждой функции, выполнение которой еще не завершено, будет создан кадр стека, а функция, выполняющаяся в данный момент, будет находиться на вершине стека.

Чтобы отслеживать это, компьютер хранит в памяти несколько указателей:

  • Указатель стека: указывает на вершину стека вызовов процесса (или на последний элемент, помещенный в стек).
  • Указатель инструкции: указывает на адрес следующей инструкции ЦП, которая должна быть выполнена.
  • Базовый указатель (BP): (также известный как указатель кадра) указывает на основание текущего кадра стека. Он остается постоянным, пока программа выполняет текущий кадр стека (хотя указатель стека изменится).

Например, для следующей программы:

Стек вызовов будет выглядеть следующим образом сразу после вызова firstFunction и выполнения оператора int x = 1+z:

Screen-Shot-2021-04-03-at-12.04.52-PM

Здесь функция main вызвала firstFunction (которая выполняется в данный момент), поэтому она находится на вершине стека вызовов. Адрес возврата — это адрес памяти вызвавшей его функции (он хранится в указателе команд при создании кадра стека). Локальные переменные, которые все еще находятся в области видимости, также находятся в стеке вызовов. Когда они выполняются и выходят за рамки, они «выталкиваются» из вершины стека.

Таким образом, компьютер может отслеживать, какая инструкция должна быть выполнена и в каком порядке. Переполнение стека предназначено для перезаписи одного из этих сохраненных адресов возврата собственным вредоносным адресом.

Пример уязвимости переполнения буфера (C):

В этом простом примере считывается произвольное количество данных (gets считывает до конца файла или до символа новой строки). Размышляя о стеке вызовов, который мы рассмотрели выше, вы можете понять, почему это опасно. Если пользователь вводит больше данных, чем количество, назначенное переменной, введенная пользователем строка перезапишет следующие ячейки памяти в стеке вызовов. Если он достаточно длинный, он может даже перезаписать адрес возврата вызывающей функции.

Как на это отреагирует компьютер, зависит от того, как реализованы стеки и как распределена память в конкретной системе. Реакция на переполнение буфера может быть совершенно непредсказуемой: от ошибок программы до сбоев и выполнения вредоносного кода.

Почему происходит переполнение буфера?

Причина, по которой переполнение буфера стало серьезной проблемой, заключается в том, что многие функции управления памятью в C и C++ не выполняют никакой проверки границ. Несмотря на то, что переполнение буфера в настоящее время довольно хорошо известно, они также очень часто используются (например, WannaCry использовал переполнение буфера).

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

Веб-серверы, серверы приложений и среды веб-приложений подвержены переполнению буфера.

Исключение составляют среды, написанные на интерпретируемых языках, хотя сами интерпретаторы могут быть подвержены переполнениям.

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

  • Используйте интерпретируемый язык, который не подвержен этим проблемам.
  • Избегайте использования функций, которые не выполняют проверки буфера (например, в C вместо gets() используйте fgets()).
  • Используйте компиляторы, которые помогут выявить небезопасные функции или ошибки.
  • UseCanaries, "защитное значение", которое помогает предотвратить переполнение буфера. Они вставляются перед адресом возврата в стек и проверяются до обращения к адресу возврата. Если программа обнаружит изменение канареечного значения, она прервет процесс, не позволяя злоумышленнику добиться успеха. Канарейка может быть либо случайной (поэтому злоумышленнику очень трудно угадать), либо строкой символов, которую по техническим причинам невозможно перезаписать.
  • Переупорядочивание локальных переменных таким образом, чтобы скалярные переменные (отдельные объекты данных фиксированного размера) располагались над переменными-массивами (содержащими несколько значений). Это означает, что если переменные массива переполнятся, они не повлияют на скалярные переменные. Этот метод в сочетании с канареечными значениями может помочь предотвратить успешные атаки на переполнение буфера.
  • Сделайте стек неисполняемым, установив бит NX (No-eXecute), чтобы злоумышленник не мог вставить шелл-код непосредственно в стек и выполнить его там. Это не идеальное решение, так как даже неисполняемые стеки могут стать жертвами атак переполнения буфера, таких как атака return-to-libc. Эта атака происходит, когда адрес возврата кадра стека заменяется адресом библиотеки, уже находящейся в адресном пространстве процесса. Кроме того, не все процессоры позволяют устанавливать бит NX.
  • ASLR (рандомизация расположения адресного пространства) может служить в качестве общей защиты (а также специальной защиты от атак с возвратом к libc). Это означает, что всякий раз, когда файл библиотеки или другая функция вызывается запущенным процессом, его адрес смещается на случайное число. Это делает почти невозможным связать фиксированный адрес памяти процесса с функциями, а это означает, что злоумышленнику может быть трудно, если не невозможно, узнать, откуда вызывать определенные функции. ASLR включен по умолчанию во многих версиях Linux, OS X и Android (его можно отключить в командной строке).

Примечание о незаполнении стека:

Также возможна уязвимость опустошения буфера, когда две части одной и той же программы по-разному обрабатывают один и тот же блок памяти. Например, если вы выделяете массив размера X, но заполняете его массивом размера x < X, а затем пытаетесь получить все X байтов, вы, скорее всего, получите ненужные данные для X - x байтов.

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

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

Состояние безопасности программного обеспечения v11

Ключевые понятия переполнения буфера

  • Эта ошибка возникает, когда в буфере больше данных, чем он может обработать, что приводит к переполнению данных в соседнее хранилище.
  • Эта уязвимость может привести к сбою системы или, что еще хуже, создать точку входа для кибератаки.
  • C и C++ более подвержены переполнению буфера.
  • Практики безопасной разработки должны включать регулярное тестирование для обнаружения и устранения переполнения буфера. Эти методы включают автоматическую защиту на уровне языка и проверку границ во время выполнения.
  • Двоичная технология SAST Veracode выявляет уязвимости кода, такие как переполнение буфера, во всем коде, включая компоненты с открытым исходным кодом и сторонние компоненты, чтобы разработчики могли быстро устранять их до того, как они будут использованы.

Определение переполнения буфера

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

Многие языки программирования подвержены атакам переполнения буфера.Однако масштабы таких атак различаются в зависимости от языка, на котором написана уязвимая программа. Например, код, написанный на Perl и JavaScript, обычно не подвержен переполнению буфера. Однако переполнение буфера в программе, написанной на C, C++, Fortran или ассемблере, может позволить злоумышленнику полностью скомпрометировать целевую систему.

Выполнение атаки переполнения буфера

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

Причины переполнения буфера

Ошибки кодирования обычно являются причиной переполнения буфера. Распространенные ошибки разработки приложений, которые могут привести к переполнению буфера, включают неспособность выделить достаточно большие буферы и пренебрежение проверкой проблем переполнения. Эти ошибки особенно проблематичны для C/C++, в котором нет встроенной защиты от переполнения буфера. Следовательно, приложения C/C++ часто становятся объектами атак переполнения буфера.

Пример атаки на переполнение буфера

[Адаптировано из статьи «Атака с переполнением буфера, объясненная на примере программы на C», Химаншу Арора, 4 июня 2013 г., The Geek Stuff]

В некоторых случаях злоумышленник внедряет вредоносный код в память, поврежденную переполнением. В других случаях злоумышленник просто пользуется переполнением и порчей соседней памяти. Например, рассмотрим программу, которая запрашивает пароль пользователя, чтобы предоставить пользователю доступ к системе. В приведенном ниже коде правильный пароль предоставляет пользователю привилегии root. Если пароль неверный, программа не предоставит пользователю привилегии.

Однако в этой программе существует вероятность переполнения буфера, поскольку функция gets() не проверяет границы массива.

Вот пример того, что злоумышленник может сделать с этой ошибкой кодирования:

В приведенном выше примере программа предоставляет пользователю привилегии root, несмотря на то, что пользователь ввел неправильный пароль. В этом случае злоумышленник предоставил ввод с длиной, превышающей размер буфера, создав переполнение буфера, которое перезаписало память целочисленного «прохода». Поэтому, несмотря на неправильный пароль, значение «pass» стало ненулевым, и злоумышленник получает привилегии root.

Решение проблемы переполнения буфера

Чтобы предотвратить переполнение буфера, разработчикам приложений C/C++ следует избегать стандартных библиотечных функций, для которых не выполняется проверка границ, таких как gets, scanf и strcpy.

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

Veracode помогает выявлять переполнения буфера

Облачный сервис Veracode выявляет уязвимости кода, такие как переполнение буфера, чтобы разработчики могли устранить их до того, как они будут использованы.

Уникальная в отрасли запатентованная Veracode бинарная технология статического тестирования безопасности приложений (SAST) анализирует весь код, включая компоненты с открытым исходным кодом и сторонние компоненты, без необходимости доступа к исходному коду.

SAST дополняет моделирование угроз и проверку кода, выполняемую разработчиками, быстрее и с меньшими затратами находит ошибки и упущения в коде за счет автоматизации. Обычно он запускается на ранних этапах жизненного цикла разработки программного обеспечения, потому что проще и дешевле исправить проблемы, прежде чем переходить к производственному развертыванию.

SAST выявляет критические уязвимости, такие как внедрение кода SQL, межсайтовый скриптинг (XSS), переполнение буфера, необработанные ошибки и потенциальные лазейки. Кроме того, наша двоичная технология SAST предоставляет полезную информацию, которая определяет приоритеты недостатков в соответствии с их серьезностью и предоставляет подробную информацию об устранении, чтобы помочь разработчикам быстро устранить их.

Integer Overflow

За последние несколько лет число угроз, связанных с программным обеспечением, увеличилось в геометрической прогрессии. Уязвимости, связанные с программным обеспечением и приложениями, наносят большой ущерб различным организациям и отдельным лицам. Ниже приведен краткий обзор уязвимостей, обнаруженных в приложениях, с разбивкой по категориям:

Источник: Статистический отчет об уязвимостях EdgeScan 2020

Эти уязвимости отрицательно сказываются на конфиденциальности, целостности и доступности актива. Некоторые атаки, связанные с программным обеспечением, включают:

  • Переполнение буфера
  • Атака на формат строки
  • Целые ошибки
  • Атака целочисленного переполнения

Помимо вышеперечисленных существует множество других атак, связанных с программированием и программным обеспечением. В этой статье мы сосредоточимся на атаке с переполнением целых чисел; как это работает, как это может привести к эксплуатации и шаги, которые мы можем предпринять, чтобы предотвратить это.

Введение в целочисленное переполнение

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

Например, у нас есть 16-битное целое значение, в котором может храниться целое число без знака в диапазоне от 0 до 65 535 или целое число со знаком в диапазоне от -32768 до 32767. Таким образом, во время арифметической операции, если результаты требуют больше, чем выделенное пространство (например, 65535+1), компилятор может:

  • полностью игнорировать возникшую ошибку или
  • прервать программу.

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

Стандарт C [ISO/IEC 9899:2011] гласит:

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

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

Приведенный выше код вычисляет оценки учащихся по случайному количеству учащихся. Если мы рассмотрим 32-битную компьютерную архитектуру, целочисленное переполнение произойдет, когда значение целого числа без знака превысит 2 30 – 1.

Если используется значение 2 30 + 1, расчетный размер массива учащихся, который передается в malloc, равен 2 30, умноженному на 4, поскольку размер int равен 4 байтам. Вычисленное значение 2 32 +4 превышает максимальный размер целого числа без знака. Цикл for будет обрабатывать 4-байтовый выделенный буфер, как если бы он хранил значение массива из 2 30-битных целых чисел, и будет записывать данные за пределы указанного буфера, что приведет к переполнению буфера.

Давайте рассмотрим еще один пример, в котором мы пытаемся сохранить переменную с большим значением в переменной с меньшим значением:

Вот результат:


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

Теперь, когда у нас есть общее представление о целочисленном переполнении, давайте рассмотрим риски и уязвимости, связанные с атакой целочисленного переполнения.

Атака целочисленного переполнения

В списке 25 самых опасных слабых мест программного обеспечения CWE 2020 года целочисленное переполнение занимает 11-е место среди самых опасных слабых мест программного обеспечения, и ему присвоен идентификатор CWE-190 .

Эта уязвимость классифицируется как критическая, поскольку ее относительно легко обнаружить и использовать. Эксплуатация приводит к полному захвату системы, краже данных, краже данных или невозможности корректной работы приложения. Эта ошибка обычно возникает при реализации жизненного цикла программного обеспечения. Ниже приводится краткая информация о том, как эта атака влияет на Триаду ЦРУ, что является очень важным фактором с точки зрения информационной безопасности:

Область действия

Влияние

Риски, связанные с атакой целочисленного переполнения

В базе данных Common Vulnerability Exposure (CVE) содержится более 1113 уязвимостей, связанных с целочисленными атаками с переполнением. Из многих уязвимостей, отмеченных в CVE, атаки переполнения буфера очень распространены и являются излюбленными местами хакеров и злоумышленников.

Переполнение буфера происходит, когда разработчик не очищает или не проверяет вводимые пользователем данные перед выделением для них места в буфере. Целочисленное переполнение приводит к реализации уязвимости переполнения буфера, которая позволяет злоумышленнику получить шелл и повысить свои привилегии после использования этой уязвимости. Проверки проверки фактически отключены из-за уязвимости целочисленного переполнения, что приводит к переполнению буфера.

Один пример целочисленного переполнения, который приводил к переполнению буфера, был обнаружен в OpenSSH (3.3) (старая версия). Вот фрагмент кода, демонстрирующий это:

Если nresp имеет значение 1073741824, а sizeof(char*) имеет обычное значение 4, результат операции nresp*sizeof(char*) переполняется, и аргумент xmalloc() будет равен 0 . Большинство выполнений malloc() будут учитывать выделение 0-байтового буфера, что приводит к тому, что последующие циклы цикла заполняют ответ буфера кучи, позволяя злоумышленнику использовать произвольный код

Предотвращение атак целочисленного переполнения

Из-за неопределенного поведения целочисленного переполнения их трудно обнаружить и отладить. Нам необходимо убедиться, что мы применяем правильные методы и стратегии на этапах требований, реализации, архитектуры и проектирования при разработке определенной программы, программного обеспечения или приложения. Давайте рассмотрим эти этапы шаг за шагом, чтобы убедиться, что мы применяем правильные методы смягчения последствий.

Этап требования

Нам необходимо обеспечить строгое определение всех правил и протоколов для всех внешних операций. Программы должны иметь возможность обрабатывать исключения, связанные с выходящими за границы значениями. Выберите язык программирования, который может обрабатывать исключения, возникающие из-за этой уязвимости. Компилятор или язык программирования, которые проверяют наличие операций, выходящих за рамки, предпочтительнее.

Архитектура и дизайн

Рекомендуется использовать библиотеки и платформы, которые используются в безопасном кодировании, а также лучшие практики, чтобы избежать неопределенного или ошибочного поведения при обработке чисел. Такие пакеты, как SafeInt или IntergerLib, могут использоваться для обработки такого типа поведения. Убедитесь, что проверки безопасности дублируются как на стороне клиента, так и на стороне сервера, поскольку существуют методы, позволяющие обойти проверки безопасности на стороне клиента.

Этап реализации

Как указывалось ранее, не забудьте обеспечить проверку ввода для чисел, которые вводит пользователь. Определите четкие диапазоны в случае чисел со знаком, указав минимальное и максимальное значения для желаемого целочисленного типа. Четко понимать структуру языка программирования, которая используется при обработке чисел.

Вы также должны внимательно проанализировать усечение, манипулирование размером байта, приведение типов и то, как язык программирования обрабатывает слишком большие или маленькие числа. Если вы обнаружите какие-либо ошибки компилятора, тщательно их проанализируйте и устраните, внедрив соответствующие методы безопасного кодирования.

Существует множество методов обнаружения таких уязвимостей, как целочисленное переполнение. Вот некоторые из них:

Ручной анализ

Метод обнаружения, включающий анализ человека с помощью тестирования на проникновение, инструментов и т. д., который позволяет тестировщику тестировать сеансы в реальном времени и взаимодействовать с ними, а также более эффективно сообщать о проблемах.

Тестирование черного ящика

Тестирование методом «черного ящика» — это метод, при котором функциональные возможности программного обеспечения проверяются без знания его кода, внутренних путей или структуры программного обеспечения. Определенные входные данные передаются программе и проверяются на наличие выходных данных.

Метод автоматизированного тестирования программного обеспечения, направленный на предоставление программе недопустимых команд, выражений или случайных чисел для анализа поведения программного обеспечения или приложения.

Статический анализ вручную

Этот метод включает анализ исходного кода приложения или программного обеспечения для проверки потенциальных недостатков или слабых мест.

Автоматический статический анализ

Автоматический статический анализ включает тестирование программы на наличие уязвимостей без ее фактического выполнения.

В заключение

Всегда помните, что злоумышленники всегда ищут способы использовать потенциальные уязвимости. Даже самая маленькая лазейка, оставленная при кодировании приложения или программного обеспечения, может привести к разрушительным результатам, от полного отказа системы или захвата приложения до финансовых потерь, неудовлетворенности клиентов и утраты доверия. Использование передовых методов и методов безопасного кодирования может снизить эти риски.

Читайте также: