
инструмент статического анализа для поиска уязвимостей в исходном коде на C/C++
Это "flawfinder" от David A. Wheeler.
Flawfinder — это простая программа, которая сканирует исходный код на C/C++ и сообщает о потенциальных уязвимостях безопасности. Она может быть полезным инструментом для проверки программного обеспечения на уязвимости, а также может служить простым введением в инструменты статического анализа исходного кода в целом. Она спроектирована так, чтобы её было легко установить и использовать. Flawfinder поддерживает Common Weakness Enumeration (CWE) и официально совместим с CWE. Он поддерживает различные форматы вывода, включая SARIF, SonarQube и HTML.
Flawfinder можно использовать вместе с инструментами анализа кода на основе ИИ. Вывод Flawfinder можно использовать для быстрого определения тех участков кода, которые заслуживают более пристального внимания, а затем ИИ может изучить их более детально.
Для получения дополнительной информации посетите веб-сайт проекта.
Flawfinder предназначен для использования в системах Unix/Linux/POSIX (включая Cygwin, системы на базе Linux, MacOS и различные BSD) в качестве инструмента командной строки. Он требует Python (мы тестируем с Python 3; Python 2.7 должен работать, но это всё реже проверяется).
Если вы просто хотите использовать его, вы можете установить flawfinder с помощью "pip" от Python или через менеджер пакетов вашей системы (flawfinder имеет пакеты для многих систем). Он также поддерживает простую установку по обычным правилам исходной установки make install. В файле INSTALL.md приведены более подробные инструкции по установке. Вам не обязательно устанавливать его для запуска, но так проще всего.
Чтобы запустить flawfinder, просто укажите ему список исходных файлов или каталогов для проверки. Например, для проверки всех файлов в "src/" и рекурсивно вниз:
flawfinder src/
Для проверки всех файлов в текущем каталоге и рекурсивно вниз:
flawfinder ./
Совпадениям (находкам) присваивается уровень риска от 0 (очень низкий риск) до 5 (высокий риск). По умолчанию показываются находки с уровнем риска 1 и выше. Вы можете показать только совпадения с уровнем риска 4 и выше в текущем каталоге и ниже следующим образом:
flawfinder --minlevel 4 ./
Страница руководства (flawfinder.1 или flawfinder.pdf) описывает, как использовать flawfinder (включая его различные опции) и связанную информацию (например, как он поддерживает CWE). Например, опция --html генерирует вывод в формате HTML. Опция --help выводит краткий список опций.
Flawfinder должен правильно интерпретировать кодировку символов вашего исходного кода. В подавляющем большинстве случаев это не проблема, особенно если исходный код правильно закодирован в UTF-8, а ваша система настроена на использование UTF-8 (самая распространённая ситуация).
Однако возможно, что flawfinder остановится, если возникнет проблема с кодировкой символов, и вы используете Python3. Обычный симптом — сообщения об ошибках следующего вида:
Error: encoding error in FILENAME 'ENCODING' codec can't decode byte ... in position ...: invalid start byte
К сожалению, Python3 не предоставляет полезных встроенных средств для решения этой проблемы. Поэтому решить её без использования внешних библиотек (которых мы стараемся избегать) нетривиально.
Если у вас возникла эта проблема, обратитесь к странице руководства flawfinder, где приведён набор различных решений. Одно из самых простых — просто преобразовать исходный код и системную конфигурацию в UTF-8. Вы можете преобразовать исходный код в UTF-8 с помощью таких инструментов, как системная утилита iconv или программа на Python cvt2utf; установить cvt2utf можно с помощью pip install cvt2utf.
Если говорить более технически, flawfinder использует лексическое сканирование для поиска токенов (таких как имена функций), которые указывают на возможные уязвимости, оценивает их уровень риска (например, по тексту вызовов функций) и сообщает результаты. Flawfinder не использует и не имеет доступа к большей части информации о потоке управления, потоке данных, типах данных, пространствах имён и областях видимости. Таким образом, flawfinder неизбежно будет выдавать много ложных срабатываний на уязвимости и не сможет сообщить о многих уязвимостях. С другой стороны, flawfinder может находить уязвимости в программах, которые невозможно собрать или слинковать. Flawfinder также не так сильно путается в большинстве макроопределений и других особенностях, с которыми более сложные инструменты испытывают трудности.
Для тех, кто использует GitHub, доступно GitHub Action.
См. action.yml
Создайте файл .yml в каталоге .github/workflows со следующим содержимым:
- name: flawfinder_scan
uses: david-a-wheeler/[email protected]
with:
arguments: '--sarif ./'
output: 'flawfinder_results.sarif'
Вы можете добавить множество других дополнений к аргументам. Например, --error-level=4 приведёт к возврату ошибки, если flawfinder обнаружит уязвимость уровня 4 или выше. Обратите внимание на номер версии после символа @; вы можете выбрать другую версию.
Вы можете найти имя действия и строку версии в Marketplace, нажав кнопку "Use latest/xxx version".
Flawfinder интегрируется с плагином cxx от SonarQube. Добавьте правила Flawfinder в SonarQube в разделе "Administration > CXX External Analyers > Other Rule Definitions", запустив Flawfinder один раз со следующими параметрами.
flawfinder --listrules --sonar [...]
Затем в вашем CI/CD запустите Flawfinder следующим образом, чтобы сгенерировать вывод, понятный SonarQube.
flawfinder -CDQ --sonar [...]
Вы можете перенаправить вывод в файл, который затем можно загрузить в SonarQube через опцию sonar.cxx.other.reportPaths.
Мы приветствуем вклад! Для получения дополнительной информации о том, как внести вклад, обратитесь к файлу CONTRIBUTING.md.
Flawfinder выпущен под лицензией GNU GPL версии 2 или более поздней (GPL-2.0+). См. файл COPYING для получения информации о лицензии.