Обеспечение кодирования является практикой разработки компьютерного программного обеспечения таким образом , что обеспечивает защиту от случайного внедрения уязвимостей. Дефекты, ошибка и логические недостатки последовательно основная причина часто используемых уязвимостей программного обеспечения.На основе анализа тысяч зарегистрированных уязвимостей, специалисты по безопасности обнаружили , что большинство уязвимостей проистекают из относительно небольшого числа ошибок программирования общего программного обеспечения. Путь выявления небезопасного кодирования практики , которые ведут к этим ошибкам и обучению разработчиков на безопасных альтернативах, организации могут принимать активные меры , чтобы помочь значительно уменьшить или устранить уязвимости в программном обеспечении перед развертыванием.
Buffer Предотвращение перелива
Переполнение буфера , общая уязвимость программного обеспечения, происходит , когда процесс пытается сохранить данные за пределы буфера фиксированной длины. Например , если у вас есть 8 слотов для хранения вещей в, и попытаться поставить 9 пунктов вы в конечном итоге с проблемой. В памяти компьютера переполненные данные могут перезаписать данные в следующем месте , которое может привести к уязвимости безопасности (стек разбив) или завершение программы (ошибки сегментации).
Пример программы C склонен к переполнению буфера является
INT vulnerable_function ( символ * large_user_input ) { символ ДСТ [ МАЛАЯ ]; зЬгср ( ДСТ , large_user_input ); }
Если пользовательский ввод больше целевого буфера, переполнение буфера будет происходить. Чтобы исправить эту небезопасную программу, использовать strncpy для предотвращения возможного переполнения буфера.
INT secure_function ( символ * user_input ) { символ ДСТ [ BUF_SIZE ]; // скопировать максимум BUF_SIZE байт strncpy ( ДСТ , user_input , BUF_SIZE ); }
Другой безопасной альтернативой является динамическое выделение памяти в куче с помощью таНос .
символ * secure_copy ( символ * SRC ) { INT Len = StrLen ( SRC ); символ * ДСТ = ( символ * ) таНос ( Len + 1 ); если ( ДСТ =! NULL ) { strncpy ( ДСТ , ЦСИ , лен ); // добавить нулевой терминатор DST [ LEN ] = '\ 0' ; } Вернуть ДСТ ; }
В приведенном выше фрагменте кода, программа пытается скопировать содержимое ЦСИ в целевой_адрес, в то же время проверять возвращаемое значение таНос ,чтобы обеспечить достаточный объем памяти был в состоянии быть выделены для целевого буфера.
Формат строки Предотвращение Attack
Формат атака Строки , когда злонамеренный пользователь предоставляет конкретные материалы , которые в конечном итоге будут введены в качестве аргумента функции , которая выполняет форматирование, такие как Е () . Нападение включает противник чтение или запись в стек .
Функция C Printf записывает выходные данные на стандартный вывод. Если параметр функции PRINTF не отформатирован, некоторые ошибки безопасности могут быть введены. Ниже приводится программа, которая уязвима для формата строка атаки.
INT vulnerable_print ( символ * malicious_input ) { Printf ( malicious_input ); }
Вредоносный аргумент, передаваемый программе может быть «% s% s% s% s% s% s% s», что может привести к сбою программы ненадлежащей памяти читает.
Integer Предотвращение перелива
Целочисленное переполнение происходит , когда арифметическая операцию приводит целое число слишком велико , чтобы быть представленными в пределах доступного пространства. Программа , которая не должным образом проверить целочисленное переполнение вводит потенциальные ошибки программного обеспечения и эксплойты.
Ниже приведена программа, которая проверяет наличие переполнения, подтвердив сумму больше или равна х и у. Если сумма сделала переполнение, то сумма будет меньше, чем х или меньше, чем у.
BOOL IsValid ( беззнаковый INT х , беззнаковая INT у ) { беззнаковая INT сумма = х + у ; вернуть сумму < MAX ; }
Если сумма х и у меньше, чем заданный MAX, программа возвращает истину, в противном случае IsValid вернет ложь. Проблема с кодом он не проверяет целочисленное переполнение в операции сложения. Если сумма х и у больше, чем доступное пространство для хранения целого числа, целое число будет переполнение и «пролонгировать» до значения меньше, чем MAX.
Ниже приведена программа, которая проверяет наличие переполнения, подтвердив сумму больше или равна х и у. Если сумма сделала переполнение, то сумма будет меньше, чем х или меньше, чем у.
BOOL IsValid ( беззнаковый INT х , беззнаковая INT у ) { беззнаковая INT сумма = х + у ; возврат суммы > = х && сумма > = у && суммы < MAX ; }