2012-02-18 2 views
24

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

+0

Переполнение буфера в классическом смысле или просто какой-либо эксплойт переполнения буфера? – Dykam

+0

Проверьте ключевые слова 'unchecked' и' unsafe'. –

+0

@ Dykam: В смысле эксплойта. – poke

ответ

43

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

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

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

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

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

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

3

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

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

14

Да, в небезопасных условиях:

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

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

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

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

+2

+1 для предоставления примера и упоминания проверки компиляции. –

+1

Это несколько некорректно: stackalloc не позволяет переполнять буфер. –

Смежные вопросы