Общее перечисление слабых мест (CWE™) - это словарь распространенных типов слабых мест в программном обеспечении, которые могут возникать в архитектуре, дизайне, коде или реализации программного обеспечения. Эти недостатки могут привести к возникновению уязвимостей в системе безопасности.
Словарь CWE присваивает уникальный идентификатор каждому типу слабости программного обеспечения. Эти идентификаторы служат общим языком для описания слабых мест в системе безопасности программного обеспечения и стандартом для программных средств защиты, предназначенных для этих слабых мест. Дополнительные сведения см. в разделе Перечисление общих слабых мест.
Результаты Finder™ ошибок Polyspace ® могут быть сопоставлены идентификаторам CWE. С помощью Bug Finder можно проверить и задокументировать наличие слабых мест в программном обеспечении, перечисленных в словаре CWE. Bug Finder поддерживает следующие аспекты программы совместимости и эффективности CWE:
CWE Searchable: для каждого поддерживаемого идентификатора CWE можно увидеть все экземпляры кода, имеющие слабые места, соответствующие идентификатору.
Вывод CWE: Для каждого дефекта Polyspace Bug Finder:
Можно просмотреть связанный идентификатор CWE.
Можно сообщить соответствующий идентификатор CWE.
Результаты поиска ошибок сопоставляются идентификаторам CWE. Результаты поиска ошибок позволяют оценить код по стандарту CWE. Например, CWE ID 119 (Неправильное ограничение операций в пределах буфера памяти) отображает дефекты Bug Finder, доступ массива вне границ и доступ указателя вне границ.
Дополнительные сведения о программе совместимости и эффективности CWE см. в разделе Совместимость CWE.
Используйте следующий рабочий процесс, если вы хотите сфокусировать анализ Bug Finder на стандарте CWE.
Анализ: Проверьте свой код только на те дефекты Bug Finder, которые соответствуют стандарту. Использовать опцию Find defects (-checkers) со значением CWE.
Результаты: Если включить только проверки дефектов, соответствующие стандарту CWE, вы увидите только те дефекты, которые соответствуют стандарту. Исправьте или оправдайте каждый дефект.
Вместе с дефектами можно просмотреть идентификаторы CWE, сопоставленные каждому дефекту в столбце CWE ID на панели Список результатов (Results List). Если по умолчанию столбец не включен, щелкните правой кнопкой мыши любой заголовок столбца и выберите CWE ID.
Отчет: При создании отчета выберите SecurityCWE шаблон, адаптированный для стандарта CWE. В отчете отображаются идентификаторы CWE, соответствующие каждому результату.
В следующей таблице перечислены идентификаторы CWE (версия 3.3), адресованные Polyspace Bug Finder с соответствующими им проверками дефектов. С помощью средств проверки дефектов Polyspace Bug Finder можно проверить наличие 133 идентификаторов CWE.
Существует три типа идентификаторов CWE: Class, Base и Variant. Идентификаторы типа Class определяют слабые стороны безопасности на абстрактном уровне независимо от конкретного языка или технологии, в то время как идентификаторы типа Base и Variant являются более конкретными. С другой стороны, результаты Polyspace Bug Finder разработаны таким образом, чтобы пользователи могли получить точную диагностику дефекта в своем коде и быстро понять его. Поэтому:
Результаты поиска ошибок сопоставляются с определенными идентификаторами типов Base и Variant, а не с универсальными идентификаторами типа Class.
Результат сопоставляется с более общим родительским типом только в том случае, если результат покрывает больше основания, чем определенный идентификатор CWE. Например, доступ массива проверки дефектов за пределами границ охватывает множество видов переполнения буфера, в то время как CWE-788 относится только к «Доступу к местоположению памяти после окончания буфера». Поэтому средство проверки дефектов сопоставляется с его родителем CWE-119, который ссылается на «Неправильное ограничение операций в пределах буфера памяти». Однако для сохранения точности отображения делается попытка сопоставить с конкретными идентификаторами CWE.
Часто несколько результатов поиска ошибок сопоставляются определенному идентификатору CWE.
Например, CWE-908 ссылается на «Использование неинициализированного ресурса». Чтобы выделить определенные виды неинициализированных ресурсов, Bug Finder имеет три различных элемента: Элемент, не инициализированный в конструкторе, Неинициализированный указатель и Неинициализированная переменная.
Сопоставление с подмножествами CWE-658 и CWE-659 см. в разделе Сопоставление между результатами CWE-658 или 659 и результатами Polyspace.
| ИДЕНТИФИКАТОР CWE | Описание идентификатора CWE | Средство проверки дефектов поиска ошибок Polyspace |
|---|---|---|
| 15 | Внешнее управление системой или настройкой конфигурации | |
| 20 | Неправильная проверка ввода | |
| 22 | Неправильное ограничение пути к каталогу с ограниченным доступом («Путь прохождения») | |
| 23 | Относительное прохождение пути | |
| 36 | Абсолютное прохождение пути | |
| 67 | Неправильная обработка имен устройств Windows | |
| 77 | Неправильная нейтрализация специальных элементов, используемых в команде | |
| 78 | Неправильная нейтрализация специальных элементов, используемых в команде ОС | |
| 88 | Ввод или изменение аргумента | |
| 114 | Управление технологическим процессом |
|
| 119 | Неправильное ограничение операций в пределах буфера памяти | |
| 120 | Копия буфера без проверки размера входных данных («Classic buffer overflow») |
|
| 121 | Переполнение буфера на основе стека | |
| 122 | Переполнение буфера на основе кучи | |
| 124 | Буферная подложка ('Buffer underflow') |
|
| 125 | Чтение вне границ |
|
| 126 | Переполнение буфера | |
| 127 | Недостаточно прочитанный буфер | |
| 128 | Ошибка свертки |
|
| 129 | Неправильная проверка индекса массива | |
| 130 | Неправильная обработка несогласованности параметров длины | |
| 131 | Неверный расчет размера буфера |
|
| 134 | Неконтролируемая строка формата | |
| 135 | Неверный расчет длины многобайтовой строки |
|
| 170 | Неправильное завершение со значением NULL | |
| 188 | Использование структуры данных/памяти |
|
| 189 | Числовые ошибки |
|
| 190 | Переполнение или переполнение целого числа |
|
| 191 | Целочисленный недопоток (обтекание или обтекание) |
|
| 192 | Ошибка целочисленного принуждения |
|
| 194 | Непредвиденное расширение знака | |
| 195 | Подпись на неподписанную ошибку преобразования | |
| 196 | Ошибка преобразования без подписи | |
| 197 | Ошибка числового усечения | |
| 198 | ||
| 226 | Конфиденциальная информация, не очищенная перед выпуском | |
| 227 | Ненадлежащее выполнение договора API |
|
| 240 | Неправильное обращение с несогласованными элементами конструкции | |
| 242 | Использование по своей сути опасной функции | |
| 243 | Создание хроотной тюрьмы без изменения рабочего каталога | |
| 244 | Неправильное удаление памяти кучи перед выпуском | |
| 250 | Выполнение с ненужными привилегиями | |
| 251 | Часто используется неправильно: управление строками | |
| 252 | Значение возврата без флажка | |
| 253 | Неправильная проверка возвращаемого значения функции |
|
| 273 | Неправильная проверка отброшенных привилегий | |
| 287 | Неправильная аутентификация | |
| 297 | Неправильная проверка сертификата с несоответствием хоста | |
| 304 | Отсутствует критический шаг проверки подлинности | |
| 310 | Криптографические проблемы |
|
| 311 | Отсутствует шифрование конфиденциальных данных | |
| 312 | Прозрачное хранение конфиденциальной информации | |
| 316 | Прозрачное хранение конфиденциальной информации в памяти | |
| 320 | Ключевые ошибки управления | |
| 321 | Использование жестко закодированного криптографического ключа | |
| 322 | Обмен ключами без проверки подлинности сущности | |
| 325 | Отсутствует необходимый шаг шифрования |
|
| 326 | Недостаточная прочность шифрования |
|
| 327 | Использование нарушенного или рискованного криптографического алгоритма |
|
| 328 | Обратимый односторонний хэш | |
| 329 | Не использовать случайный IV с режимом CBC |
|
| 330 | Использование недостаточно случайных значений |
|
| 336 | То же начальное число в PRNG | |
| 337 | Предсказуемое начальное значение в PRNG | |
| 338 | Использование криптографически слабого генератора псевдослучайных чисел (PRNG) | |
| 353 | Отсутствует поддержка проверки целостности | |
| 354 | Неправильная проверка значения проверки целостности | |
| 362 | Одновременное выполнение с использованием общего ресурса с неправильной синхронизацией («Условие гонки») | |
| 364 | Условие гонки обработчика сигнала |
|
| 366 | Условие гонки в потоке |
|
| 367 | Состояние гонки времени использования (TOCTOU) | |
| 369 | Делить на ноль |
|
| 372 | Неполное внутреннее различие состояний |
|
| 375 | Возврат изменяемого объекта ненадежному вызывающему абоненту | |
| 377 | Небезопасный временный файл | |
| 387 | Ошибки сигнала |
|
| 391 | Непроверенное условие ошибки | |
| 398 | Показатель низкого качества кода | |
| 401 | Неправильное освобождение памяти перед удалением последней ссылки | |
| 404 | Неправильное завершение работы или освобождение ресурса | |
| 413 | Неправильная блокировка ресурсов |
|
| 415 | Двойной бесплатный | |
| 416 | Использовать после бесплатного | |
| 426 | Ненадежный путь поиска | |
| 427 | Неконтролируемый элемент пути поиска |
|
| 456 | Отсутствует инициализация переменной | |
| 457 | Использование неинициализированной переменной | |
| 465 | Проблемы с указателями | |
| 466 | Возврат значения указателя за пределы ожидаемого диапазона | |
| 467 | Использование sizeof () для типа указателя | |
| 468 | Неправильное масштабирование указателя | |
| 469 | Использование вычитания указателя для определения размера |
|
| 471 | Изменение предполагаемых неизменяемых данных | |
| 474 | Использование функции с несогласованными реализациями | |
| 475 | Неопределенное поведение для ввода в API | |
| 476 | Отмена привязки указателя NULL | |
| 477 | Использование устаревших функций | |
| 478 | Отсутствует вариант по умолчанию в инструкции switch | |
| 479 | Использование обработчиком сигнала непереходной функции |
|
| 480 | Использование неверного оператора | |
| 481 | Назначение вместо сравнения | |
| 482 | Сравнение вместо назначения | |
| 483 | Неправильное разграничение блоков | |
| 484 | Пропущенная инструкция break в коммутаторе | |
| 522 | Недостаточно защищенные учетные данные | |
| 532 | Экспозиция информации через файлы журналов | |
| 534 | Доступность информации с помощью файлов журнала отладки | |
| 535 | Экспозиция информации через сообщение об ошибке оболочки | |
| 547 | Использование жестко закодированных, релевантных для безопасности констант | |
| 558 | Использование getlogin () в многопоточном приложении | |
| 560 | Использование umask () с аргументом в стиле chmod | |
| 561 | Мертвый код | |
| 562 | Возврат адреса переменной стека |
|
| 573 | Неправильное следование спецификации вызывающим абонентом |
|
| 587 | Назначение фиксированного адреса указателю | |
| 590 | Не хватает памяти в куче | |
| 606 | Отсутствие флажка на входе для условия цикла | |
| 628 | Вызов функции с неправильно заданными аргументами |
|
| 658 | См. раздел Сопоставление между результатами CWE-658 или 659 и результатами Polyspace. | |
| 659 | См. раздел Сопоставление между результатами CWE-658 или 659 и результатами Polyspace. | |
| 663 | Использование непереходной функции в параллельном контексте |
|
| 664 | Неправильное управление ресурсом в течение его жизненного цикла |
|
| 665 | Неправильная инициализация | |
| 666 | Работа с ресурсом в неправильной фазе срока службы | |
| 667 | Неправильная блокировка | |
| 672 | Операция с ресурсом после истечения срока действия или выпуска | |
| 675 | Повторяющиеся операции с ресурсом | |
| 676 | Использование потенциально опасной функции | |
| 681 | Неправильное преобразование между числовыми типами | |
| 682 | Неправильный расчет |
|
| 683 | Вызов функции с неправильным порядком аргументов | |
| 685 | Вызов функции с неверным количеством аргументов |
|
| 686 | Вызов функции с неверным типом аргумента |
|
| 687 | Вызов функции с неверно заданным значением аргумента | |
| 690 | Отмененное возвращаемое значение для отмены привязки нулевого указателя |
|
| 691 | Недостаточное управление потоком управления | |
| 693 | Отказ механизма защиты | |
| 696 | Неправильный порядок поведения | |
| 703 | Ненадлежащая проверка или обработка исключительных условий | |
| 704 | Неверное преобразование типа или приведение |
|
| 705 | Неверное определение объема потока управления | |
| 710 | Нарушение стандарта кодирования | |
| 732 | Неправильное назначение разрешений для критического ресурса | |
| 754 | Неправильная проверка на наличие необычных или исключительных условий | |
| 755 | Неправильное обращение с исключительными условиями | |
| 758 | Зависимость от неопределенного, неопределенного или определяемого реализацией поведения |
|
| 759 | Использование одностороннего хэша без соли | |
| 762 | Несоответствующие процедуры управления памятью | |
| 764 | Несколько блокировок критического ресурса | |
| 765 | Множественные разблокировки критического ресурса | |
| 767 | Доступ к критической частной переменной с помощью общедоступного метода | |
| 770 | Распределение ресурсов без ограничений или регулирования | |
| 772 | Отсутствует освобождение ресурса после фактического срока службы | |
| 780 | Использование алгоритма rsa без oaep | |
| 783 | Логическая ошибка приоритета оператора |
|
| 785 | Использование функции манипуляции трактом без буфера максимального размера |
|
| 786 | Доступ к ячейке памяти перед запуском буфера | |
| 787 | Внеплановая запись | |
| 789 | Неконтролируемое выделение памяти |
|
| 805 | Доступ к буферу с неправильным значением длины | |
| 822 | Отмена привязки ненадежного указателя | |
| 823 | Использование смещения указателя вне диапазона | |
| 824 | Доступ к неинициализированному указателю | |
| 825 | Прекращение ссылки указателя с истекшим сроком действия |
|
| 826 | Преждевременное высвобождение ресурса в течение ожидаемого срока службы | |
| 828 | Обработчик сигналов с функциональными возможностями, которые не являются асинхронно-безопасными |
|
| 832 | Разблокировка ресурса, который не заблокирован | |
| 833 | Тупик | |
| 843 | Доступ к ресурсу с использованием несовместимого типа (путаница типов) | |
| 872 | CERT C++ Раздел 04 безопасного кодирования - целые числа (INT) | |
| 873 | CERT C++ Раздел 05 безопасного кодирования - арифметика с плавающей запятой (FLP) | |
| 908 | Использование неинициализированного ресурса | |
| 910 | Использование дескриптора файла с истекшим сроком действия |
|
| 922 | Небезопасное хранение конфиденциальной информации |
|