Возможны ли эксплойты переполнения буфера в C#?
Предполагая, что программа C# использует только управляемый код.NET, возможно ли иметь уязвимость безопасности переполнения буфера в этой программе? Если так, как такая уязвимость была бы возможна?
4 ответа
Да, но их гораздо сложнее производить. Вы можете получить переполнение буфера, только если вы используете определенные небезопасные конструкции, а не с "нормальным" кодом C#. Повреждение памяти в коде вообще не должно быть возможным, когда ваш код работает с пониженным доверием.
Несколько возможностей для переполнения буфера:
- С использованием
unsafe
Ключевое слово, которое позволяет указатели. Небезопасный код так же легко ошибиться, как и код на основе указателей в c или C++. - Использование небезопасных API, таких как методы из
Marshal
учебный класс - (Только моно) Вы можете отключить проверку диапазона массива (компромисс между безопасностью и производительностью)
Есть также несколько других способов повреждения памяти, кроме переполнения буфера.
StructLayoutKind.Explicit
- Неправильные родные подписи взаимодействия
(Сама среда выполнения написана на C++, поэтому ошибка во время выполнения может также повредить память или переполнить буфер, но я считаю, что это выходит за рамки этого вопроса)
Да, в небезопасных средах:
unsafe void bufferOverflow(string s)
{
char* ptr = stackalloc char[10];
foreach (var c in s)
{
*ptr++ = c; // Bufferoverflow if s.Length > 10
}
}
"Разрешить небезопасный код" должен быть проверен для этого для компиляции.
Вы не можете традиционное переполнение буфера с массивом. Он выполнит проверку границ перед обращением к массиву, если только он (CLR) не может гарантировать его безопасность.
В абсолютном смысле, да, использование буфера возможно из-за ошибок в среде выполнения.NET. Однако.NET предотвращает большинство видов кода конечного пользователя (за исключением "небезопасного" использования) от подобных проблем, поэтому в реальной жизни это менее рискованно.
В реальной жизни большинство подобных проблем возникает из-за собственных вызовов (dll COM и т. Д.), Вызываемых из управляемого кода.