Подтвердить что ты не робот

Возможно ли использование переполнения буфера в С#?

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

4b9b3361

Ответ 1

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

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

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

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

  • StructLayoutKind.Explicit
  • Неверные подписи для подписчиков

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

Ответ 2

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

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

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

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

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

Ответ 3

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

Ответ 4

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

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