
A collection of my Semgrep rules to facilitate vulnerability research.
«Поверхность атаки — это уязвимость. Найти там баг — всего лишь деталь.»
— Марк Дауд
«Некоторые детали важнее других.»
— Федор Г. Пикус
Коллекция моих правил Semgrep для облегчения исследования уязвимостей.
# сканирование с высоким приоритетом (быстрые победы)
semgrep --severity ERROR --config "p/0xdea"
# сканирование с высоким и средним приоритетом (рекомендуется)
semgrep --severity ERROR --severity WARNING --config "p/0xdea"
# полное сканирование (может включать пограничные находки и больше ложных срабатываний)
semgrep --config "p/0xdea"
В качестве альтернативы вы можете клонировать этот репозиторий GitHub локально и выполнить:
# полное сканирование
semgrep --config semgrep-rules/rules /путь/к/исходнику
# сканирование по конкретному правилу
semgrep --config semgrep-rules/rules/c/command-injection.yaml /путь/к/исходнику
[!TIP] Укажите флаг
--no-git-ignore, чтобы сканировать файлы независимо от статуса отслеживания git или правил.gitignore.
Для более удобной работы я рекомендую сохранять вывод сканирования Semgrep в формате SARIF и использовать SARIF Explorer в VS Code:
semgrep --sarif --sarif-output=/путь/к/исходнику/SEMGREP.sarif --config semgrep-rules/rules /путь/к/исходнику
code /путь/к/исходнику # затем откройте файл SEMGREP.sarif в VS Code с помощью SARIF Explorer
Также смотрите включенный пример вывода SARIF.
Протестировано с Semgrep CLI 1.169.0.
Проверенный в бою набор правил для C (и иногда C++).
gets.strcpy, stpcpy, strcat.sprintf и vsprintf.scanf.strncat.strlen к short может быть опасным.alloca.free.free.free для памяти, не находящейся в куче.malloc, calloc, realloc и т.д.putenv с переменной, размещённой на стеке.system или popen.access, stat, lstat и т.д.mktemp, tmpnam, tempnam.signal.setuid и seteuid.memset.rand и srand.scanf.atoi, atol, atof.Эти правила считаются потенциально слишком шумными и непригодными для общего использования.
--time на реальном коде для выявления медленных правил, нуждающихся в оптимизации.strncpymemcpysnprintfsizeof для указателя вместо его целевого объекта.strncpy и stpncpy.snprintf и vsnprintf.strlcpy и strlcat.