CodeQL

CodeQL - это мощный инструмент статического анализа для анализа и поиска уязвимостей в коде.

Название импортера в Security Center: CodeQL Scan (SARIF)

CodeQL использует механизм семантического анализа кода для понимания его поведения и поиска потенциальных проблем безопасности, включая SQL-инъекции, межсайтовый скриптинг и многое другое. CodeQL можно использовать для анализа кода, написанного на широком спектре языков программирования, включая C++, Java, Python и JavaScript, что делает его универсальным инструментом для любой команды разработчиков.

CodeQL работает путем создания базы данных графов, которая моделирует поведение кода. Эта база данных позволяет CodeQL понять, как различные части кода взаимодействуют друг с другом, и выявить потенциальные проблемы безопасности, которые могут возникнуть в результате такого взаимодействия. CodeQL также предоставляет ряд мощных языков запросов, которые позволяют разработчикам создавать собственные запросы для поиска конкретных проблем безопасности или паттернов в коде.

Пример команды Curl

curl -X POST localhost/api/v1/scan/import/ -H "Authorization: Token a75bb26171cf391671e67b128bfc8ae1c779ff7b" -H "Content-Type: multipart/form-data" -F "file=@./" -F "product_name=Product1" -F "product_type=Application" -F "scanner_name=CodeQL Scan (SARIF)" -F "branch=dev" 

В этой команде используются следующие параметры:

  1. -X POST: задает используемый метод HTTP (в данном случае POST).

  2. -H "Authorization: Token <authorization_token>": задает токен авторизации, полученный от Security Center.

  3. -H "Content-Type: multipart/form-data": задает тип содержимого запроса.

  4. -F "file=@<report_file_path>": задает путь к файлу отчета, создаваемого сканером.

  5. -F "product_name=<product_name>": задает название сканируемого продукта.

  6. -F "product_type=<product_type>": задает тип сканируемого продукта.

  7. -F "scanner_name=<scanner_name>": задает имя сканера, используемого для создания отчета (CodeQL Scan (SARIF))

  8. -F "branch=<branch_name>": (необязательно) указывает имя ветки в репозитории исходного кода (если применимо). Этот параметр особенно полезен, когда вы хотите связать результаты сканирования с определенной веткой в вашем репозитории. Если параметр не указан, сканирование будет связано с веткой по умолчанию

Пример отчета:

{
  "$schema": "https://json.schemastore.org/sarif-2.1.0.json",
  "version": "2.1.0",
  "runs": [
    {
      "tool": {
        "driver": {
          "name": "Tool Name",
          "rules": [
            {
              "id": "R01"
                      ...
              "properties" : {
                 "id" : "java/unsafe-deserialization",
                 "kind" : "path-problem",
                 "name" : "...",
                 "problem.severity" : "error",
                 "security-severity" : "9.8",
               }
            }
          ]
        }
      },
      "results": [
        {
          "ruleId": "R01",
          "message": {
            "text": "Result text. This result does not have a rule associated."
          },
          "locations": [
            {
              "physicalLocation": {
                "artifactLocation": {
                  "uri": "fileURI"
                },
                "region": {
                  "startLine": 2,
                  "startColumn": 7,
                  "endColumn": 10
                }
              }
            }
          ],
          "partialFingerprints": {
            "primaryLocationLineHash": "39fa2ee980eb94b0:1"
          }
        }
      ]
    }
  ]
}

Last updated