На прошлой неделе 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»