Предполагая, что программа С# использует только управляемый код .NET, возможно ли иметь уязвимость в переполнении буфера в этой программе? Если да, то как такая уязвимость будет возможна?
Возможно ли использование переполнения буфера в С#?
Ответ 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 и т.д.), вызванных из управляемого кода.