weggli — это быстрый и надёжный инструмент семантического поиска для кодовых баз на C и C++. Он предназначен для того, чтобы помочь исследователям безопасности выявлять интересные функции в больших кодовых базах.
weggli выполняет сопоставление с образцом по абстрактным синтаксическим деревьям на основе запросов, предоставленных пользователем. Его язык запросов напоминает код на C и C++, что упрощает превращение интересных шаблонов кода в запросы.
weggli вдохновлён такими замечательными инструментами, как Semgrep, Coccinelle, joern и CodeQL, но принимает несколько иные проектные решения:
Поддержка C++: weggli имеет первоклассную поддержку современных конструкций C++, таких как лямбда-выражения, циклы for на основе диапазонов и constexprs.
Минимальная настройка: weggli должен работать из коробки с большинством программного обеспечения, с которым вы столкнётесь. weggli не требует возможности сборки программного обеспечения и может работать с неполными исходными кодами или отсутствующими зависимостями.
Интерактивность: weggli разработан для интерактивного использования и быстрой работы с запросами. В большинстве случаев запрос weggli будет выполняться быстрее, чем поиск grep. Цель состоит в том, чтобы обеспечить интерактивный рабочий процесс, в котором возможно быстрое переключение между проверкой кода и созданием/улучшением запроса.
Жадность: сопоставление шаблонов weggli предназначено для нахождения как можно большего количества (полезных) совпадений для конкретного запроса. Хотя это увеличивает риск ложных срабатываний, это упрощает создание запросов. Например, запрос $x = 10;
будет соответствовать как выражениям присваивания (foo = 10;
), так и объявлениям (int bar = 10;
).
Используйте -h для кратких описаний и --help для получения более подробной информации.
Домашняя страница: https://github.com/weggli-rs/weggli
ИСПОЛЬЗОВАНИЕ: weggli [OPTIONS] <ШАБЛОН> <ПУТЬ>
АРГУМЕНТЫ:
<ШАБЛОН>
Шаблон поиска weggli. Язык запросов weggli очень похож на
C и C++ с небольшим количеством дополнительных функций.
Например, шаблон '{_ $buf[_]; memcpy($buf,_,_);}' найдёт все вызовы memcpy, которые непосредственно записывают данные в буфер стека.
Помимо обычных конструкций C и C++, язык запросов weggli поддерживает следующие функции:
_ Подстановочный знак. Будет соответствовать любому узлу AST.
$var Переменные. Можно использовать для написания запросов, независимых
от идентификаторов. Переменные соответствуют идентификаторам, типам,
именам полей или пространствам имён. Опция --unique дополнительно обеспечивает, что $x != $y != $z. Опция --regex может
обеспечить соответствие переменной (или несоответствие) регулярному выражению.
_(..) Подвыражения. Подстановочный знак _(..) соответствует произвольным
подвыражениям. Это может быть полезно, если вы ищете какую-то
операцию с участием переменной, но больше ничего о ней не знаете.
Например, _(test) будет соответствовать таким выражениям, как test+10,
buf[test->size] или f(g(&test));
not: Отрицательные подзапросы. Показывать только результаты, которые не соответствуют
следующему подзапросу. Например, '{not: $fv==NULL; not: $fv!=NULL *$v;}'
найдёт разыменования указателей, которым не предшествует проверка NULL.
strict: Включить более строгое сопоставление. Это отключает разворачивание операторов и жадное сопоставление имён функций. Например 'strict: func();'
больше не будет соответствовать 'if (func() == 1)..' или 'a->func()'.
weggli автоматически разворачивает выражения в запросе, чтобы искать внутреннее выражение вместо этого. Это означает, что запрос `{func($x);}`
будет соответствовать `func(a);`, но также `if (func(a)) {..}` или `return func(a)`. Сопоставление с `func(a)` также будет соответствовать `func(a,b,c)` или `func(z,a)`. ### Аналогично, `void func($t $param)` также будет соответствовать определениям функций с несколькими параметрами.
Дополнительные шаблоны можно указать с помощью опции `--pattern` (`-p`). Это позволяет выполнять поиск по функциям или определениям типов.
**<PATH>**
Входной каталог или файл для поиска. По умолчанию, weggli будет искать внутри файлов `.c` и `.h` для режима C по умолчанию или файлов `.cc`, `.cpp`, `.cxx`, `.h` и `.hpp` при выполнении в режиме C++ (с использованием опции `--cpp`).
Альтернативные окончания файлов можно задать с помощью опции `--extensions` (`-e`).
При объединении weggli с другими инструментами или шагами предварительной обработки файлы также могут быть указаны через STDIN путём установки каталога на `-` и передачи списка имён файлов.
### **Опции:**
* `-A`, `--after <after>`: строки для печати после совпадения. По умолчанию = 5.
* `-B`, `--before <before>`: строки для печати перед совпадением. По умолчанию = 5.
* `-C`, `--color`: принудительное включение цветного вывода.
* `-X`, `--cpp`: включение режима C++.
* `--exclude <exclude>...`: исключить файлы, соответствующие заданному регулярному выражению.
* `-e`, `--extensions <extensions>...`: расширения файлов для включения в поиск.
* `-f`, `--force`: принудительный поиск, даже если запросы содержат синтаксические ошибки.
* `-h`, `--help`: выводит справочную информацию.
* `--include <include>...`: поиск только файлов, соответствующих заданному регулярному выражению.
* `-l`, `--limit`: показать только первое совпадение в каждой функции.
* `-p`, `--pattern <p>...`: дополнительные шаблоны поиска.
* `-R`, `--regex <regex>...`: фильтрация совпадений переменных на основе регулярного выражения. Эта функция использует Rust regex crate, поэтому поддерживается большинство функций регулярных выражений в стиле Perl. (см. https://docs.rs/regex/1.5.4/regex/#syntax)
Примеры:
Найти вызовы функций, начинающиеся со строки «mem»:
weggli -R 'func=^mem' '$func(_);'
Найти вызовы memcpy, где последний аргумент не назван «size»:
weggli -R 's!=^size$' 'memcpy(,,$s);'
* `-u`, `--unique`: обеспечение уникальности совпадений переменных. По умолчанию две переменные, такие как `$a` и `$b`, могут совпадать по одинаковым значениям. Например, запрос `$x=malloc($a); memcpy($x, _, $b);` будет соответствовать обоим
void *buf = malloc(size); memcpy(buf, src, size);
и
void *buf = malloc(some_constant); memcpy(buf, src, size);
Использование флага unique отфильтрует первое совпадение, поскольку `$a==$b`.
* `-v`, `--verbose`: устанавливает уровень детализации.
* `-V`, `--version`: выводит информацию о версии.
## Примеры
Вызовы memcpy, которые записывают в буфер стека:
```c
weggli '{
_ $buf[_];
memcpy($buf,_,_);
}' ./target/src
Вызовы foo, которые не проверяют возвращаемое значение:
weggli '{
strict: foo(_);
}' ./target/src
Потенциально уязвимые пользователи snprintf():
weggli '{
$ret = snprintf($b,_,_);
$b[$ret] = _;
}' ./target/src
Потенциальные неинициализированные указатели:
weggli '{ _* $p;
NOT: $p = _;
$func(&$p);
}' ./target/src
Потенциально небезопасное использование WeakPtr:
weggli --cpp '{
$x = _.GetWeakPtr();
DCHECK($x);
$x->_;}' ./target/src
Проверка итератора только для отладки:
weggli -X 'DCHECK(_!=_.end());' ./target/src
Функции, выполняющие запись в буфер стека на основе аргумента функции:
weggli '_ $fn(_ $limit) {
_ $buf[_];
for (_; $i<$limit; _) {
$buf[$i]=_;
}
}' ./target/src
Функции со строкой decode в их имени:
weggli -R func=decode '_ $func(_) {_;}'
Функции кодирования/преобразования:
weggli '_ $func($t *$input, $t2 *$output) {
for (_($i);_;_) {
$input[$i]=_($output);
}
}' ./target/src
## Установка
```sh
$ cargo install weggli
# опционально: установить rust
``` ## Детали реализации
Weggli создан на основе библиотеки для синтаксического анализа *tree-sitter* и её грамматик для *C* и *C++*.
Поисковые запросы сначала анализируются с помощью расширенной версии соответствующей грамматики, а полученный *AST* преобразуется в набор запросов *tree-sitter* в файле *builder.rs*.
Фактическое сопоставление запросов реализовано в *query.rs*, который представляет собой относительно небольшую оболочку вокруг механизма запросов *tree-sitter*, добавляющую специфические функции *Weggli*.
## Вклад
Подробности см. в *CONTRIBUTING.md*.
## Лицензия
Apache 2.0; подробности см. в *LICENSE*.
## Отказ от ответственности
Этот проект не является официальным проектом Google. Он не поддерживается Google, и Google специально отказывается от всех гарантий относительно его качества, товарной пригодности или пригодности для определённой цели.
Вы можете оставить комментарий после Вход в систему
Неприемлемый контент может быть отображен здесь и не будет показан на странице. Вы можете проверить и изменить его с помощью соответствующей функции редактирования.
Если вы подтверждаете, что содержание не содержит непристойной лексики/перенаправления на рекламу/насилия/вульгарной порнографии/нарушений/пиратства/ложного/незначительного или незаконного контента, связанного с национальными законами и предписаниями, вы можете нажать «Отправить» для подачи апелляции, и мы обработаем ее как можно скорее.
Опубликовать ( 0 )