Одна важная вещь в коде - всегда проверять, отлаживаете ли вы свою программу построчно. Существуют отладчики, которые могут идентифицировать синтаксические ошибки, но логика не менее важна. Формальная проверка с использованием сторонней проверки или экспертной оценки обычно является даже лучшим решением, потому что другие могут указать на ошибки в логике и структуре, которые не были обнаружены отладчиком. Вот что приводит к эксплойтам. В других случаях код может быть просто плохо написан, как в случае «прославленных веб-дизайнеров», которые решают окунуться в программирование с менталитетом «вырезать и вставить». Они могут открыть уязвимости в системе, что сделает ее менее защищенной и более открытой для PWNING. В частности, одна из тех, которые могут позволить хакеру управлять удаленным компьютером, - это Атака переполнения буфера.

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

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

#include <stdio.h>

void secretFunction()
{
    printf("Hello & Welcome!\n");
    printf("You just called the secret function!\n");
}

void echo()
{
    char buffer[20];

    printf("Enter some text:\n");
    scanf("%s", buffer);
    printf("You entered: %s\n", buffer);    
}

int main()
{
    echo();

    return 0;
}

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

В этой программе эксплойт может быть запущен с помощью printf («Введите текст: \ n»). Вводится строка текста для ввода, называемая полезной нагрузкой. Что делает полезная нагрузка, так это меняет адрес возврата, разрешая доступ к буферу за пределами его области памяти. Это вызывает переполнение буферов. Идея здесь состоит в том, чтобы получить контроль над системой с помощью удаленного выполнения кода, эксплойт, объяснять который довольно долго, поэтому для простоты он будет резюмирован.

Enter some text: <payload input>
You entered: <payload input>
Hello & Welcome!
You just called the secret function!
Illegal instruction (core dumped)

Как мы видим в приведенном выше примере, ввод полезных данных создает переполнение в буфере [20] для ввода. Это приводит к эксплойту, поскольку он выполняет функцию secretFunction (), которую он не может делать. А теперь представьте, если бы эта функция была функцией администратора, которая разрешает доступ к настройкам безопасности системы. Не очень хорошо для атакуемой системы.

Если полезная нагрузка должна была переполнить буфер, то указатель можно использовать для ссылки на код злоумышленника, который может выполняться в системе. Программы, написанные на C или C ++, известны этой уязвимостью независимо от операционной системы, в которой они работают (например, Linux, Windows, macOS).

Смягчение

Согласно Cloudflare, для защиты от этих атак рекомендуется следующее.

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

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