Я хочу запускать пользовательские запросы codeql для повышенной безопасности в Azure DevOps (эта функция теперь доступна в Azure DevOps, а не только в GitHub). Встроенные запросы по умолчанию, такие как безопасность и качество, работают нормально. Я запускаю их партиями по ночам.
Но сейчас я строю новый отдельный конвейер, который будет работать и ночью пакетно. С его помощью я хочу выполнить несколько пользовательских запросов в поисках конкретного нежелательного шаблона в этом довольно большом репозитории JavaScript git.
Все это хранится и запускается в службах Azure DevOps. Я начал с простого запроса на поиск всех ToDo codeql, чтобы все заработало. Но я получаю эту ошибку, которую я не могу найти в документации или Часто задаваемые вопросы по сканированию кода, или посмотрите, что у кого-то еще было раньше:
/opt/hostedtoolcache/CodeQL/2.17.2/x64/codeql/codeql database init --codescanning-config=/home/vsts/work/1/s/.azuredevops/customcodeql/customconfig.yaml --db-cluster /home/vsts/work/_temp/advancedsecurity.codeql/d --source-root=/home/vsts/work/1/s --language=javascript --calculate-baseline
A fatal error occurred: No queries defined for javascript
##[warning] Error running the 'database init' CodeQL command for javascript (2)
##[error]Error running the 'database init' CodeQL command for javascript (2)
====================================================================================================
Analyzing CodeQL execution results.
CodeQL analysis finished with exit code 2.
У меня есть конвейер yaml с задачами
AdvancedSecurity-Codeql-Init@1
, AdvancedSecurity-Codeql-Autobuild@1
и AdvancedSecurity-Codeql-Analyze@1
.
Задача AdvancedSecurity-Codeql-Init@1
указывает на файл yaml codeqlconfig, и в этом файле я указываю на простой запрос todo codeql. Это точно, как это должно быть сделано в соответствии с документацией, которую я прочитал, например: Анализ с помощью пользовательских запросов.
Однажды я написал неверный путь в запросе codeql. Затем я получил сообщение об ошибке: A fatal error occurred: ./azuredevops/customcodeql/todos.ql is not a .ql file, .qls file, a directory, or a query pack specification.
Я исправил путь (добавил . infront, чтобы он стал ./.azuredevops....) и больше не получал ошибку типа «не могу найти файл», поэтому я предполагаю, что файл найден сейчас.
Но теперь я получаю другую ошибку: «Для javascript не определены запросы», поэтому предположим, что он находит мой todos.ql, но все равно не работает.
Вот три файла, которые я использую:
Вот todo.ql, взятый из примеров :
/**
* @id js/javascript/todocomment
* @name TODO_comments
* @description Finds comments containing the word TODO
* @kind problem
* @problem.severity recommendation
* @tags comment
* TODO
*/
import javascript
from Comment c
where c.getText().regexpMatch("(?si).*\\bTODO\\b.*")
select c
Вот код customconfig.yaml:
name: "Run custom queries"
disable-default-queries: true
queries:
- name: TODO_comments
uses: ./.azuredevops/customcodeql/todos.ql
paths:
- src
paths-ignore:
- '**/node_modules'
- '**/*.test.js'
query-filters:
- include:
kind: problem
Вот часть конвейера yaml, который запускается в Azure DevOps как пакетное задание.
Ошибка возникает в задаче AdvancedSecurity-Codeql-Init@1
версии 1.1.262 примерно через 7 секунд.
- stage: Analyze_Custom_CQL
jobs:
- job: Analyze
steps:
- task: AdvancedSecurity-Codeql-Init@1
inputs:
languages: 'javascript'
loglevel: '3'
configfilepath: '$(build.sourcesDirectory)/.azuredevops/customcodeql/customconfig.yaml'
- task: AdvancedSecurity-Codeql-Autobuild@1
displayName: 'Advanced Security Autobuild'
- task: AdvancedSecurity-Codeql-Analyze@1
Я что-то упустил в todos.ql, метаданных или что-то в этом роде? Я изменил фильтр и включил его в customconfig.yaml. Пробовал с ними или без них.
@AlvinZhao-MSFT В агенте сборки Linux в журнале написано: Запуск: Оформление заказа big-javascriptrepo@feature/CQL-HomeMade to s сделано . Afaik, я знаю, что это именно та база кода на сервере Linux, которая сканируется. Но сканирование не запускается, так как я получаю ошибку в задаче инициализации AdvancedSecurity-Codeql-Init@1. Или я неправильно понял ваш вопрос?
Я думаю, что ваша текущая файловая структура правильна, и я могу воспроизвести проблему на основе вашего описания. Но я не уверен, как изменить запрос. Могу ли я узнать, работает ли сканирование в вашей локальной среде с помощью CodeQL CLI?
Я спросил второго пилота, и он думает, даже когда я попросил его дважды проверить, что ключ использования не должен иметь отступ, хотя для обычного хакера YAML он выглядит правильно, потому что он соответствует форматированию в фильтрах запросов, который второй пилот считает правильным. . Другими словами, имя и использование должны находиться на одном уровне отступов. Дайте мне знать, сработает ли это, и я смогу добавить это в качестве ответа вместе с длинным объяснением второго пилота.
кстати, привет, Патрик! :D Меня, хотя я не знаком с codeql, беспокоит одна вещь — это пути. Каков путь относительно рабочего каталога или файла конфигурации? Пробовали ли вы поместить переменную build.sourcesdirectory в путь в файле customconfig.yaml? Звучит так, как будто он должен его найти, поскольку вы не получаете ошибку - если только отступ, о котором я упоминал выше, не был введен после того, как использование больше даже не замечается. Хотя Элвин воспроизводит поведение с правильным отступом, и его пути должны приводить к тому, что файл не найден, если относительность является проблемой...
@housten Я исправил намерение в своем примере кода. Это был просто плохой копипаст. > Пробовали ли вы поместить переменную build.sourcesdirectory в путь в файле customconfig.yaml? Я не уверен, что смогу это сделать. Поскольку customconfig.yaml предназначен для движка codeql. Относительный путь, если он уже от корня. Но я не думаю, что есть проблема с поиском запроса кода задачи, поскольку он выдает ошибку, когда путь неправильный.
Привет @PatrikLindström. Надеюсь, с момента наших последних преобразований все идет хорошо. После внутреннего обсуждения мы предлагаем добавить qlpack для запуска сканирования кода с помощью одного специального запроса. В нынешний документ он действительно не включен, что вызвало некоторую путаницу. Группа разработчиков заметила это, и мы ценим ваше время и усилия, чтобы сообщить об этой проблеме сообществу разработчиков. А сейчас, не могли бы вы попробовать выполнить действия, описанные в моем обновленном ответе ниже? Надеюсь, это сработает и для вас. Еще раз большое спасибо за идеи и обмен информацией. Хороших выходных.
Действительно, в документе Microsoft об этом не упоминается, но мы можем решить проблему, добавив файл qlpack.yml
в тот же каталог, что и todos.ql
, с содержимым ниже. И конвейеру удалось инициализировать базу данных CodeQL и сообщить о проблеме, обнаруженной этим пользовательским запросом.
qlpack.yml
version: 1.0.1
dependencies:
codeql/javascript-all: "*"
codeql/javascript-queries: "*"
Я могу воспроизвести ту же проблему с помощью упрощенного запроса CodeQL, конфигурации и определения конвейера ниже.
/.azuredevops/customcodeql/todos.ql (содержимое скопировано из github/codeql; также проверено с некоторыми другими запросами, но безуспешно.)
/**
* @id js/examples/todocomment
* @name TODO comments
* @description Finds comments containing the word TODO
* @kind problem
* @problem.severity recommendation
* @tags comment
* TODO
*/
import javascript
from Comment c
where c.getText().regexpMatch("(?si).*\\bTODO\\b.*")
select c, "TODO comments indicate that the code may not be complete."
/.azuredevops/customcodeql/customconfig.yml
name: "Run custom queries"
# When using a configuration file, if you do not disable default queries,
# then the default CodeQL queries in the `code-scanning` query suite will also execute upon analysis.
disable-default-queries: true
# To reference local queries saved to your repository,
# the path must start with `./` followed by the path to the custom query or queries.
# Names for each query referenced is optional.
queries:
- uses: ./.azuredevops/customcodeql/todos.ql
АОкодеQL.yml
steps:
- task: AdvancedSecurity-Codeql-Init@1
inputs:
languages: 'javascript'
loglevel: '2'
configfilepath: '$(build.sourcesDirectory)/.azuredevops/customcodeql/customconfig.yml'
Кроме того, я также проверил Руководство по метаданным файла запроса и предупреждающим сообщениям, файл запроса должен быть правильным.
По поводу этой проблемы и вашего требования выполнить собственный запрос Javascript CodeQL для сканирования кода вы можете сообщить о проблеме с результатами в Сообщество разработчиков — Azure DevOps, где группа поддержки может привлечь группу инженеров для получения дополнительной помощи и идей.
Я последовал вашему совету @Alvin Zhao и сообщил об этом сообществу разработчиков Azure DevOps по предоставленной вами ссылке. Также дал ссылку на этот вопрос sso. Спасибо за вашу помощь и поддержку.
Привет @PatrikLindström, ценю твое время и усилия. Хороших выходных впереди.
Ссылка на мой билет сообщества разработчиков, сейчас он в режиме сортировки. Отправлено команде разработчиков: Developercommunity.visualstudio.com/t/…
Большое спасибо, что нашли время поделиться новостями.
Кроме того, возможно, какой-то странный отступ в файле yaml (также из документации msft), который, как я вижу, прокомментировал Хаустен, альтернативным решением может быть упаковать это как пакет ql и ссылаться на него на этапе инициализации.
То, что вы делаете, должно работать, но лично мне больше нравится более модульный подход к созданию пакетов ql, поскольку он упрощает выполнение запросов и пакетов моделей более стандартизированным способом. Это, например, позволяет с минимальными усилиями запускать запросы локально на компьютере разработчика или в других решениях CI/CD.
Это то, что я обычно делаю, и это работает при сканировании, например, в Jenkins.
Ошибка воспроизводилась после устранения проблем с синтаксисом отступов. Пакет ql — это необязательный обходной путь, и в этой теме DC будет обсуждаться, как выполнить один пользовательский запрос. Developercommunity.visualstudio.com/t/…
tl;dr добавить определение qlpack.yml и дополнительный строковый столбец в запрос todo.ql.
В том же каталоге, где находится запрос todo.ql, добавьте файл yaml, например, с именем qlpack.yml. В этот файл добавьте следующее:
version: 1.0.1
dependencies:
codeql/javascript-all: "*"
codeql/javascript-queries: "*"
Мне также пришлось добавить дополнительный столбец в запрос выбора задачи. В противном случае это потерпит неудачу. Здесь я просто добавляю foobar ¯_(ツ)_/¯ . Но следует, конечно, добавить что-то более полезное. Например, вы можете добавить шаблоны, которые берут данные из запроса. См. пример заполнителей здесь.
/**
* @id js/javascript/todocomment
* @name TODO_comments
* @description Finds comments containing the word TODO
* @kind problem
* @problem.severity recommendation
* @tags comment
* TODO
*/
import javascript
from Comment c
where c.getText().regexpMatch("(?si).*\\bTODO\\b.*")
select c,"foobar"
Этот ответ основан на решении для билетов сообщества разработчиков и встречи с инженерами GitHub Adv Security.
Привет, могу ли я узнать, что ваш специальный запрос отправлен в ветку, код которой сканируется этим конвейером?