🛠 Практики DevSecOps для C
Салют,
Давай сегодня посмотрим с тобой на ООП, со стороны не типовых рекомендаций для C. Я считаю это полезным стартом, особенно когда ты только смотришь в сторону разработки, да и так ты сможешь понять для себя куда лучше двигаться дальше.
Для указателей необходимо учитывать:
- Подделку указателей, где нельзя использовать их не по назначению для доступа, дублирования или изменения переменных объекта
- Адресную арифметику, где осуществляется динамического выделения памяти массиву, что может привести к ошибкам чтения смежных областей памяти
- Висячие указатели, где происходит удаление/ освобождение объекта без изменения значения связанного с ним указателя
- Блуждающие указатели, где запрещено использование указателя без предварительной инициализации для любого состояния, так как аналогичное поведение как у висячих указателях
А теперь смотри, есть не типовые вещи как рекомендации:
- Использование принудительной инициализации указателей для удаления диких указателей
- После удаления указателя необходимо установить его на нулевой или недействительный адрес
- Вместо перебора массива с использованием адресной арифметики необходимо использовать отдельную индексную переменную и проверить, что бы индекс не превышал размер массива
- Использовать Garbage Collector для освобождения памяти, используемую объектами, на которые больше нет ссылок с system.gc, delete
- Контролировать вызов операций суперкласса для исключения type confusion из-за нестрогой проверки типов в языке
- Необходимо исключить использование функций, которые не выполняют проверку границ, таких как strcpy(), strcat(), sprintf(), vsprintf() и gets() с заменой на strncpy(), strncat(), snprintf() и fgets()
- При использовании функций scanf(), scanf(), fscanf(), sscanf(), vscanf(), vsscanf() и vfscanf() должна контролироваться длина
- Необходимо исключить использование функций позволяющих реализовать возможности переполнения буфера: realpath(3), getopt(3), getpass(3), stradd(3), strecpy(3) и strtrns(3)
- Использовать calloc() вместо malloc() для динамического выделения памяти
- Реализовать проверку диапазона целых чисел как часть проверки ввода из-за усечения
- Объявлять переменную как volatile для удаления
- Использовать системный вызов mlock() для UNIX и VirtualLock() для Windows, который предотвращает выгрузку заблокированной памяти на диск
- Использовать IndexOutOfRangeException для отслеживания попыток обращения по некорректному индексу
- Использовать небезопасный контекст с unsafe для работы с указателями, что отключает автоматические проверки безопасности при условии их зачистки после и контроля проверки границ, корректного управление памятью
- Доступ к unsafe строго регламентируется и используется как исключение
- Исключить формирование SQL-запросов путём конкатенации строк
- Делать ориентацию на параметризированные запросы
- Использовать современные криптографические алгоритмы BCrypt или Argon2 с солью и итерациями для хранения хэшей паролей
- Избегать прямого вывода пользовательского ввода
- Стараться использовать контекстно-зависимую очистку
- Использовать потокобезопасные коллекции (ConcurrentDictionary, ConcurrentQueue)
Вот теперь отличия для C#, что именно следует игнорировать:
- Работа с указателями: подделка, висячие и блуждающие указатели, принудительная инициализация, обнуление после удаления
- Адресная арифметика для массивов
- Использование malloc(), calloc(), free(); ручное управление памятью
- Использование функций типа strcpy(), sprintf(), gets(), scanf() и подобных для ввода/вывода
- Системные вызовы mlock() и VirtualLock() (кроме специфичных случаев с секретами)
- Использование volatile для управления удалением объектов
- Проверка type confusion через вызов суперкласса (C# строго типизирован)
Итого: такой концепт снижает риски ИБ при работе с кодом на ООП, поэтому соблюдая их и базово понимая принципы их работы сможешь выстраивать процесс разработки качественно, а также это поможет тебе дальше смотреть на подобные моменты при взаимодействии с командой разработки.
#appsec #devsecops #reco #specialty #pmcases
