В прошлом году GitHub выпустил фичу сканирования кода, которая позволяет разработчикам добавлять проверки безопасности в свою среду CI/CD и в целом в рабочую среду. В этом посте демонстрируются основы использования CodeQL, механизма анализа, лежащего в основе сканирования кода, в связке с GitHub Actions.
Что такое CodeQL?
CodeQL - это механизм анализа, который автоматизирует проверки безопасности путем выполнения запросов к базе данных, созданной на основе вашей кодовой базы. Эта база данных CodeQL создается в процессе сборки и представляет исходный код в реляционной форме. По умолчанию сканирование кода запускает стандартные запросы CodeQL, написанные исследователями GitHub и сообществом, но вы также можете создавать свои собственные запросы.
В набор по умолчанию входят такие запросы, как “Pointer overflow check”, “Potentially overflowing call to snprintf”, “Uncontrolled format string”, и другие.
![](https://habrastorage.org/getpro/habr/upload_files/0bc/521/0c5/0bc5210c5fbb793905e1547682ff0a12.jpeg)
Настройка CodeQL с GitHub Actions
Сканирование кода с помощью CodeQL бесплатно для публичных репозиториев и является частью GitHub Advanced Security для GitHub Enterprise. Вот инструкции по быстрой установке в 4 клика. В качестве альтернативы я добавил гифку с приведенными ниже инструкциями:
![](https://habrastorage.org/getpro/habr/upload_files/e51/5f4/0ef/e515f40ef8a327057fda88fdd67dd43e.gif)
Вы можете просмотреть выходные данные сканирования на вкладке "Actions", и вы можете просматривать и управлять любыми предупреждениями сканирования кода на вкладке "Security".
Baselining
Иногда, особенно для больших legacy-кодовых баз, количество предупреждений может быть огромным. По этой причине CodeQL показывает только новые/исправленные предупреждения в pull request-ах. Если вы хотите управлять существующими предупреждениями, вы можете сделать это в разделе «Code scanning alerts» на вкладке «Security».
![](https://habrastorage.org/getpro/habr/upload_files/a86/436/d6b/a86436d6bc04428be6790e69f7bb0e11.jpeg)
Важно понимать разницу между Dismiss и Delete. Одно из ключевых различий заключается в том, что при отклонении (Dismissing) предупреждения тот же код не создает его повторно. При удалении (Deleting) предупреждения тот же код сгенерирует такое же предупреждение при следующем сканировании. В случае, если вы хотите массово отклонять предупреждения, вы можете сделать это из сводки предупреждений (после фильтрации списка по любому набору предупреждений, который вы хотите отклонить).