Форум программистов, компьютерный форум, киберфорум
C# для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.92/13: Рейтинг темы: голосов - 13, средняя оценка - 4.92
141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
1

Как вы защищаете свои приложения от переполнения буфера?

10.07.2015, 22:27. Показов 2562. Ответов 15
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Как вы защищаете свои приложения от переполнения буфера? Нужно ли для этого усложнять код?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
10.07.2015, 22:27
Ответы с готовыми решениями:

Как вы защищаете свои сайты ASP.NET MVC от DDoS?
Интересно, есть ли способы справиться с ними, не привлекая провайдера, хостинг и IIS.

Ошибка переполнения буфера
При первом запуске програма работает, после второго появляеться ошибка переполнения буфера. В чем...

Заблокировано защитой от переполнения буфера
Здарова народ, не знаю в какую тему это написать, поэт написал сюда При запуске Windows media...

Избавиться от переполнения буфера (asm)
Всем привет, на вашем форуме первый раз) Имея базовые знания по C++ и Assembler решил сварганить...

15
870 / 720 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
10.07.2015, 23:23 2
Alex9,
Если вы не используете unsafe код, то переполнение буфера не возможно
1
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
11.07.2015, 10:31 3
XRoy, ты хочешь сказать, что в .NET-языках невозможно
(без unsafe-кода) вылезти за пределы буфера, намеренно или случайно ?
Чет как-то не верится...
1
870 / 720 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
11.07.2015, 10:43 4
Убежденный,
Если конечно нет бага где-то в самой виртуальной машине
Там где возможно переполнение буфера в неуправляемых языка, то здесь будет выброшено исключение
0
Ушел с форума
Эксперт С++
16473 / 7436 / 1187
Регистрация: 02.05.2013
Сообщений: 11,617
Записей в блоге: 1
11.07.2015, 11:00 5
Да не, я не об этом.

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

Конечно, получить классическое переполнение буфера с перезаписью адреса
возврата в стеке через такую уязвимость не получится, если только нет бага в
реализации самой виртуальной машины, как ты написал.

Ну короче, я хотел сказать, что между понятиями "маловероятно, практически
нереализуемо" или "невозможно в принципе" все-таки есть определенная граница.
0
141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
11.07.2015, 16:56  [ТС] 6
здесь будет выброшено исключение
Меня как раз этот момент интересует. Кто как с ним справляется?
0
870 / 720 / 304
Регистрация: 15.04.2013
Сообщений: 2,047
Записей в блоге: 5
11.07.2015, 17:00 7
Alex9,
Использовать try catch
1
Администратор
Эксперт .NET
9603 / 4745 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
11.07.2015, 17:21 8
Цитата Сообщение от XRoy Посмотреть сообщение
Там где возможно переполнение буфера в неуправляемых языка, то здесь будет выброшено исключение
Цитата Сообщение от XRoy Посмотреть сообщение
Использовать try catch
Как я понимаю, речь про AccessViolationException? А оно разве перехватываемо?
Сейчас попробуем...

Добавлено через 17 минут
Про небезопасный код уже было оговорено, но пока других идей не пришло.
Для удобства, чиркнул на C++/CLI
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
using namespace System;
 
int main(array<System::String ^> ^args)
{
    int* arr = new int[10];
    // с этими границами может и не воспроизвестись
    for (int i = 1000; i < 10000; i++) {
        try {
            arr[i] = 0;
        }
        catch (OutOfMemoryException^) {
            Console::WriteLine("Gotcha!");
        }
        catch (ExecutionEngineException^) {
            Console::WriteLine("Gotcha!");
        }
    }
    return 0;
}
Эти исключения не обрабатываются, что неудивительно. StackOverflowException - тоже (так, кстати).
Есть идеи, как создать AccessViolationException из безопасного кода?
1
Эксперт .NET
17689 / 12874 / 3366
Регистрация: 17.09.2011
Сообщений: 21,138
11.07.2015, 17:24 9
Цитата Сообщение от Убежденный Посмотреть сообщение
ты хочешь сказать, что в .NET-языках невозможно (без unsafe-кода) вылезти за пределы буфера, намеренно или случайно ?
Смотря что вы подразумеваете под буфером.
Если буфер — это массив данных, который логически разбит на несколько частей, как в вашем примере со строкой подключения и паролем, то рантайм, разумеется, ничего не знает об использовании этого массива и позволит вам менять его по своему желанию, перезаписывая в нем что угодно и как угодно.
Но вот выйти за пределы самого массива рантайм вам уже не позволит — при попытке вылетит исключение.

Добавлено через 1 минуту
Цитата Сообщение от tezaurismosis Посмотреть сообщение
Есть идеи, как создать AccessViolationException из безопасного кода?
Комбинация классов GCHandle, Marshal и Random
2
Администратор
Эксперт .NET
9603 / 4745 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
11.07.2015, 17:39 10
Цитата Сообщение от kolorotur Посмотреть сообщение
Комбинация классов GCHandle, Marshal и Random
Поймал, все до единой!
C#
1
2
3
4
5
6
7
8
9
10
11
int counter = 100;
int excCount = 0;
var rnd = new Random();
while (counter-- > 0) {
    try {
        Marshal.WriteByte(new IntPtr(rnd.Next(100, 1000)), 0);
    }
    catch (AccessViolationException) {
        Console.WriteLine("Gotcha #{0}", excCount++);
    }
}
Вот такой код валит программу даже без генерации к.-л. исключения (судя по тексту, вместе со средой исполнения)
C#
1
2
3
4
5
int counter = 100;
var rnd = new Random();
while (counter-- > 0) {
    GCHandle.FromIntPtr(new IntPtr(rnd.Next(100, 1000)));
}
Помощник отладки управляемого кода "FatalExecutionEngineError" обнаружил неполадку в "C:\Development\C#\SharpConsoleTest\bin\Debug\SharpConsoleTest.vshost.exe".

Дополнительные сведения: В среде выполнения обнаружена критическая ошибка. Ошибка произошла по адресу 0x70b3efac в потоке 0xf20. Код ошибки 0xc0000005. Она может быть вызвана ошибкой в CLR или в небезопасных либо не поддающихся проверке фрагментах пользовательского кода. Обычно источниками таких ошибок бывают ошибки упаковки, допускаемые пользователями при COM-взаимодействии, либо PInvoke, повредивший стек.
0
141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
11.07.2015, 21:44  [ТС] 11
В случае с массивом стоит ли делать с помощью индексаторов проверку на допустимость диапазона индекса?
0
Эксперт .NETАвтор FAQ
10413 / 5143 / 1825
Регистрация: 11.01.2015
Сообщений: 6,226
Записей в блоге: 34
11.07.2015, 23:24 12
Цитата Сообщение от Alex9 Посмотреть сообщение
В случае с массивом стоит ли делать с помощью индексаторов проверку на допустимость диапазона индекса?
Нет, не нужно. В .NET автоматическая проверка границ массива. Вам не удастся выйти за рамки массива без использования unsafe кода.

И в целом: .NET относится к платформам с управляемой памятью. Это значит что среда исполнения самостоятельно занимается выделением памяти и всегда знает точный размер объектов, которые она хранит.
Избегание побочных эффектов - одна из сильных сторон систем управляемой памяти. Собственно ради этого они и создавались. Поэтому переполнение буфера это последнее о чем вам нужно думать при разработке в .NET.
1
141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
12.07.2015, 09:37  [ТС] 13
А если при каждой записи в массив по вводящемуся пользователем индексу нужно проверять диапазон индекса и такие случаи разбросаны по всему коду?
0
Администратор
Эксперт .NET
9603 / 4745 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
12.07.2015, 10:39 14
Цитата Сообщение от Alex9 Посмотреть сообщение
такие случаи разбросаны по всему коду?
Обрабатывать IndexOutOfRangeException по всем участкам. Мне эта идея не особо нравится - слишком большой код в блоке try и с этим - трудности в отладке.
Можно предложить ещё идею - класс-обёртка над массивом - этакая "молчаливая коллекция", которая будет молча съедать неверные индексы, не генерируя исключения, а просто выставляя флаг ошибки.
Накидал на скорую руку - ООП-подобие errno из Си.
C#
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
/// <summary>
/// Безмятежный массив, которому пофиг на выход за границы.
/// </summary>
// TODO: Реализовать IEnumerable<T>, ICollection<T> и тд
public class SerenityArray<T> where T: class
{
    struct Errno
    {
        public T LastValue { set; get; }
        public int LastIndex { set; get; }
    }
    
    private T[] _Data;
    public Errno LastIndexError { set; get; }
    public int Capacity { private set; get; }
    
    public T this[int index] {
        set {
            if (index < 0 || index >= Capacity) {
                LastIndexError = new Errno { LastValue = value, LastIndex = index };
                return;
            }
            _Data[index] = value;
        }
        get {
            if (index < 0 || index >= Capacity) {
                LastIndexError = new Errno { LastValue = value, LastIndex = index };
                // Будьте внимательны! Если забыть проверить LastIndexError
                // в вызывающем коде это может привести к трудноуловимым ошибкам!
                return null;
            }
            return _Data[index];
        }
    }
    
    public SerenityArray<T>(int capacity) {
        // TODO: Проверка параметра capacity
        _Data = new T[capacity];
        Capacity = capacity;
    }
}
1
141 / 181 / 44
Регистрация: 25.04.2012
Сообщений: 2,623
Записей в блоге: 5
12.07.2015, 12:37  [ТС] 15
tezaurismosis, а более производительное решение есть?
0
Администратор
Эксперт .NET
9603 / 4745 / 761
Регистрация: 17.04.2012
Сообщений: 9,592
Записей в блоге: 14
12.07.2015, 18:57 16
Alex9, ещё более производительное? Этот метод должен работать быстрее обработки исключений (если их будет достаточно много).
Других идей пока нет, можно этот код как-нибудь оптимизировать. Можно массив заменить неуправляемым (stackalloc, например), но про обобщения тогда придётся позабыть, да и будет ли работать намного быстрее?
1
12.07.2015, 18:57
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
12.07.2015, 18:57
Помогаю со студенческими работами здесь

Отлов исключения переполнения буфера
Вот код #include &lt;iostream&gt; #include &lt;string&gt; #include &lt;conio.h&gt; #include &lt;locale.h&gt; #include...

Завершение программы из-за переполнения буфера WebBrowser
завершение программы из-за переполнения буфера WebBrowser на c# сам код довольно длинный, но...

Динамическое обнаружение ошибки переполнения буфера
Дипломное задание написать программу, которая на вход берет .exe и после обработки показывает...

Простой эксплоит переполнения буфера не работает(
Здравствуйте, есть простая программа использующая уязвимость переполнения буфера, по сути должна...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru