Рубрики
Uncategorized

Безопасность кода: Оценка нового сканирования кода GitHub

На прошлой неделе Github выпустил свою первую официальную версию сканирования кода. Это позволяет пользователям быстро … Помечено Github, Git, безопасность, дежопта.

На прошлой неделе Github выпустил свою первую официальную версию сканирования кода. Это позволяет пользователям быстро отсканировать свой исходный код для выявления уязвимостей. Но у меня есть вопрос.

Насколько это надежно?

В этом посте я постараюсь дать ответ на основании на основе образца C-кода.

Я буду использовать CodeQL для сканирования сознательно пробного кода, а затем проанализируем результаты для проверки производительности инструмента.

Кодовый код сканирования

Сканирование кода GitHub использует CodeQL , семантический анализ кода. Он запускает запросы в вашем коде для определения потенциальных угроз и плохих узоров. Он поддерживает огромное разнообразие языков (C/C ++, GO, Java, JavaScript, Python, ECC.) И у него есть крутое действие под названием Autobuild Что вы можете использовать для создания вашего кода.

Как настроить это

К Включить CodeQL в вашем репозитории GitHub, вы можете следовать за Официальная документация Отказ

Если вы являетесь пользователем VS код Есть также Расширение для тебя.

Справочная среда

Для этой оценки я начинаю со стандартной конфигурации CodeQL, то указываю язык исходного кода для анализа: Язык: [«CPP»] Плюс расширенный набор запросов: Запросы: + Удаление безопасности, Безопасность и качество Отказ

name: "CodeQL"

on:
  push:
    branches: [main]
  pull_request:
    # The branches below must be a subset of the branches above
    branches: [main]
  schedule:
    - cron: '0 13 * * 3'

jobs:
  analyze:
    name: Analyze
    runs-on: ubuntu-latest

    strategy:
      fail-fast: false
      matrix:
        language: ['cpp']

    steps:
    - name: Checkout repository
      uses: actions/checkout@v2
      with:
        fetch-depth: 2

    - run: git checkout HEAD^2
      if: ${{ github.event_name == 'pull_request' }}

    # Initializes the CodeQL tools for scanning.
    - name: Initialize CodeQL
      uses: github/codeql-action/init@v1
      with:
        languages: ${{ matrix.language }}
        queries: +security-extended, security-and-quality

    - run: |
        make

    - name: Perform CodeQL Analysis
      uses: github/codeql-action/analyze@v1

Код ссылки

Я использую C Code, который содержит, специально, некоторые черты и ошибки. Справочный код — это репозиторий Fuzzgoat из Пухание И содержит 4 основных уязвимости:

  • Использование памяти после свободного:
/******************************************************************************
WARNING: Fuzzgoat Vulnerability

The line of code below frees the memory block referenced by *top if
the length of a JSON array is 0. The program attempts to use that memory
block later in the program.
Diff       - Added: free(*top);
Payload    - An empty JSON array: []
Input File - emptyArray
Triggers   - Use after free in json_value_free()
******************************************************************************/

               free(*top);
/****** END vulnerable code **************************************************/
  • 2 Неверных осеях:
   switch (value->type)
      {
         case json_object:

            if (!value->u.object.length)
            {
               settings->mem_free (value->u.object.values, settings->user_data);
               break;
            }

/******************************************************************************
  WARNING: Fuzzgoat Vulnerability

  The line of code below incorrectly decrements the value of 
  value->u.object.length, causing an invalid read when attempting to free the 
  memory space in the if-statement above.
  Diff       - [--value->u.object.length] --> [value->u.object.length--]
  Payload    - Any valid JSON object : {"":0}
  Input File - validObject
  Triggers   - Invalid free in the above if-statement
******************************************************************************/

            value = value->u.object.values [value->u.object.length--].value;
/****** END vulnerable code **************************************************/

            continue;

         case json_string:

/******************************************************************************
  WARNING: Fuzzgoat Vulnerability

  The code below decrements the pointer to the JSON string if the string
  is empty. After decrementing, the program tries to call mem_free on the
  pointer, which no longer references the JSON string.
  Diff       - Added: if (!value->u.string.length) value->u.string.ptr--;
  Payload    - An empty JSON string : ""
  Input File - emptyString
  Triggers   - Invalid free on decremented value->u.string.ptr
******************************************************************************/

            if (!value->u.string.length){
              value->u.string.ptr--;
            }
/****** END vulnerable code **************************************************/
  • NULL Указатель развесел:
  /******************************************************************************
  WARNING: Fuzzgoat Vulnerability
  The code below creates and dereferences a NULL pointer if the string
  is of length one.
  Diff       - Check for one byte string - create and dereference a NULL pointer
  Payload    - A JSON string of length one : "A"
  Input File - oneByteString
  Triggers   - NULL pointer dereference
******************************************************************************/

            if (value->u.string.length == 1) {
              char *null_pointer = NULL;
              printf ("%d", *null_pointer);
            }
/****** END vulnerable code **************************************************/

Результаты анализа кода

Это результаты из CodeQL.

Известные уязвимости

Как вы можете видеть в анализе выше, ни одна из уязвимостей, которые были введены специально на Fuzzgoat, обнаружены CodeQL.

бесплатно Ошибки трудно обнаружить

Но это неправда для нулевого указателя размышления! Это может быть легко поймано другими инструментами, такими как Clang:

$ scan-build-8 make all
scan-build: Using '/usr/lib/llvm-8/bin/clang' for static analysis
/usr/share/clang/scan-build-8/bin/../libexec/ccc-analyzer -o fuzzgoat -I. main.c fuzzgoat.c -lm
fuzzgoat.c:298:29: warning: Dereference of null pointer (loaded from variable 'null_pointer')
              printf ("%d", *null_pointer);
                            ^~~~~~~~~~~~~

Новые выводы

С другой стороны, давайте проанализируем фактические результаты.

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

Кроме того, другие выводы:

  • Отсутствует случай enum в коммутаторе;
  • Плохо документированная большая функция;
  • Время проверки времени использования файловой системы гонки;
  • Неконтролируемые данные, используемые в выражении пути;
  • Потенциально неинициализированная локальная переменная.

Это оно!

После этой оценки я думаю, что CodeQL является Хороший инструмент для ежедневного использования Чтобы получить представление о качестве кода: легко использовать и настроить, его можно быстро интегрировать в ваш репозиторий GitHub, и он обеспечивает небольшие результаты действий.

вниз это то, что вы можете иметь большое количество Ложные позитивы иметь дело с.

Добраться до меня в Twitter @Gasparevitta и Позвольте мне знать ваши мысли!

Вы можете найти фрагменты кода на Гадость

Эта статья была первоначально опубликована на моем блог . Голова там, если вам нравится этот пост и хочу прочитать других, как это!

Оригинал: «https://dev.to/gasparev/code-security-evaluation-of-the-new-github-code-scanning-function-29ce»