Возможны ли эксплойты переполнения буфера в C#?

Предполагая, что программа C# использует только управляемый код.NET, возможно ли иметь уязвимость безопасности переполнения буфера в этой программе? Если так, как такая уязвимость была бы возможна?

4 ответа

Решение

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

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

  1. С использованием unsafe Ключевое слово, которое позволяет указатели. Небезопасный код так же легко ошибиться, как и код на основе указателей в c или C++.
  2. Использование небезопасных API, таких как методы из Marshal учебный класс
  3. (Только моно) Вы можете отключить проверку диапазона массива (компромисс между безопасностью и производительностью)

Есть также несколько других способов повреждения памяти, кроме переполнения буфера.

  1. StructLayoutKind.Explicit
  2. Неправильные родные подписи взаимодействия

(Сама среда выполнения написана на C++, поэтому ошибка во время выполнения может также повредить память или переполнить буфер, но я считаю, что это выходит за рамки этого вопроса)

Да, в небезопасных средах:

unsafe void bufferOverflow(string s)
{
    char* ptr = stackalloc char[10];

    foreach (var c in s)
    {
        *ptr++ = c; // Bufferoverflow if s.Length > 10
    }
}

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

Вы не можете традиционное переполнение буфера с массивом. Он выполнит проверку границ перед обращением к массиву, если только он (CLR) не может гарантировать его безопасность.

Только если вы используете unsafe ключевое слово.

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

В реальной жизни большинство подобных проблем возникает из-за собственных вызовов (dll COM и т. Д.), Вызываемых из управляемого кода.

Другие вопросы по тегам