При написании программного кода или при редактировании конфигурационных файлов порой можно случайно оставить чувствительные данные (такие данные обычно называют секретами или просто secrets). Обычно к секретам относят такую информацию как логины, пароли, ключи, API-токены и т. д.
Чем может грозить случайно обнаруженный токен, например, от сервиса аутентификации? Если исходный код хранится, например, на таких площадках, как GitHub или Bitbucket, любой пользователь, у которого есть доступ до репозитория, сможет просмотреть файлы (а также историю коммитов), содержащие секреты, и найти логин/пароль и другую конфиденциальную информацию с целью компрометации ключей и получения несанкционированного доступа к конечной системе. Чтобы в будущем избежать ситуаций с отправкой чувствительных данных, был разработан инструмент под названием TruffleHog.
Независимый разработчик Дилан Эйри создал TruffleHog в 2016 году. В 2019 году была основана компания Truffle Security Co., которой ныне принадлежит TruffleHog. Первые версии программы были написаны на языке программирования Python. Начиная с 3 версии, программа полностью переписана на языке программирования Go. Также уже с 3 версии был существенно расширен функционал и изменен принцип работы программы.
Среди основных преимуществ TruffleHog можно выделить следующие:
Бесплатный проект с открытым исходным кодом;
Наличие коммерческой версии продукта — TruffleHog Enterprise;
Большая поддержка различных систем — поиск секретов в таких системах как Git, GitHub, GitLab, Docker, Amazon S3, syslog, circleci (с полным списком поддерживаемых систем можно ознакомиться на официальной странице проекта в GitHub);
Встраивание в процессы CI/CD;
Высокая скорость работы программы.
Принцип работы TruffleHog
До версии 3 TruffleHog использовал энтропию Шеннона для поиска секретов. Энтропия Шеннона представляет меру неопределенности некоторой системы или информации, которая позволяет определять появление какого-либо символа первичного алфавита. При применении энтропии Шеннона TruffleHog искал фрагменты текста, состоящие из шестнадцатеричных или base64-символов. Если была обнаружена строка длинной более 20 символов, то TruffleHog выводил эту строку, так как она попадала под высокую энтропию и, вероятнее всего, это был забытый в коде API-токен или другой секрет. При использовании данного метода основным недостатком являлось то, что могли быть отображены данные, которые ошибочно принятые за секреты.
Однако с 3 версии TruffleHog полностью перешел на новый механизм. Он заключается в использовании детекторов — небольших программ, внутри которых используются регулярные выражения для поиска секретов. Рассмотрим данный способ на конкретном примере. Переходим в официальный репозиторий программы на GitHub и ищем директорию с именем detectors. В данной папке находится конфигурация каждого из используемых детекторов. Переходим в директорию aws и открываем в ней файл aws.go. Для того чтобы распознать токен от сервиса AWS, TruffleHog использует 2 регулярных выражения — первое для того чтобы опознать ID префикс токена (строка кода 72), и второе регулярное выражение для самого секрета (строка кода 73):
Конкретно в сервисе AWS токены обозначаются своим уникальным префиксом. В данном случае TruffleHog будет искать токены которые начинаются с префикса AKIA, ABIA, ACCA, или ASIA (строка кода 72). Секрет может содержать в себе цифры от 0 до 9, буквы латинского алфавита, причем как в нижнем регистре (a-z), так и в верхнем регистре (A-Z) (строка кода 73). Соответственно, TruffleHog будет искать значения, которые соответствуют этим двум регулярным выражениям для поиска именно токенов от AWS. У каждого детектора свой синтаксис регулярных выражений.
1 детектор строго равен одному конкретному сервису — AWS, Azure, GitHub, GitLab, Docker и т. д. TruffleHog поддерживает работу с более чем 740 детекторами.
Установка TruffleHog
TruffleHog является кроссплатформенным ПО и может быть установлен на такие ОС, как Windows, Linux/Unix и MacOS. Доступен вариант запуска в контейнере Docker. Также присутствует возможность сборки из исходного кода. Варианты установки перечислены в разделе «Installation» в официальном репозитории GitHub. В качестве теста установим утилиту на ОС Ubuntu Server версии 22.04.3 LTS, воспользовавшись официальным скриптом для установки:
curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main
/scripts/install.sh | sudo sh -s -- -b /usr/local/bin
Команда выше установит последний актуальный релиз (в данном случае это версия с номером 3.59.0). Для того чтобы установить определенную версию, необходимо выполнить следующую команду, где v3.57.0 — это номер релиза:
curl -sSfL https://raw.githubusercontent.com/trufflesecurity/trufflehog/main/scripts/install.sh | sh -s -- -b /usr/local/bin/v3.57.0
История версий доступна на официальном репозитории GitHub.
После того как установка будет завершена, необходимо проверить корректность установки. Для этого необходимо ввести команду trufflehog:
Если откроется интерактивное меню программы (см. скриншот выше), то установка выполнена успешно.
Способы запуска TruffleHog
Запускать TruffleHog можно двумя способами:
Используя интерактивную команду trufflehog. При использовании команды trufflehog без параметров открывается интерактивное меню:
При выборе параметра Scan a source using wizard откроется новое меню, в котором необходимо выбрать целевую систему, где будет производиться сканирование для поиска секретов:
При выборе, например, git откроется раздел, в котором необходимо ввести URI репозитория:
Далее необходимо нажать на клавишу Enter, и откроется второй шаг, в котором можно задать дополнительные параметры (описание данных параметров приведено далее в статье в разделе Описание основных функций TruffleHog):
После нажатия на клавишу Enter начинается процесс сканирования.
Стандартный запуск утилиты при помощи ключей.
Второй способ запуска заключается в вызове программы trufflehog с ключами (параметрами). Например:
trufflehog git --json https://github.com/trufflesecurity/test_keys
Далее мы будем запускать trufflehog с ключами.
Описание основных функций TruffleHog
При запуске TruffleHog можно использовать следующие функции:
-j или --json — вывод результатов в формате JSON;
--no-verification — отображение только проверенных секретов;
--exclude-detectors=<названия детекторов которые должны быть исключены при сканировании> — исключить из поиска определенные типы секретов, например, не отображать ключи AWS или токены от GitHub;
--concurrency=1 — количество агентов, необходимых для параллельного поиска различных типов секретов. Если это значение не задано явно, то по умолчанию оно равно количеству ядер процессора, доступных на сервере, на котором запущен TruffleHog. Чем больше ядер процессора, тем быстрее производится сканирование.
Использование TruffleHog для поиска секретов
В качестве первого теста просканируем репозиторий GitHub, который находится по адресу https://github.com/trufflesecurity/test_keys
Команда для запуска выглядит следующим образом:
trufflehog git https://github.com/trufflesecurity/test_keys
В данном примере TruffleHog нашел 3 секрета — токен от AWS, URI и закрытый ключ. На примере найденного токена от AWS разберем вывод некоторых полей TruffleHog.
Detector Type — название сервиса или платформы, от которой был найден секрет. TruffleHog поддерживает 740+ различных сервисов, включая GitLab, LDAP, RabbitMQ, RubyGems и другие. С полным списком всех поддерживаемых детекторов можно ознакомиться по ссылке.
Decoder Type — формат найденного секрета. TruffleHog умеет обнаруживать секреты в текстовом формате (plain text), а также в кодировках base64, utf16 и utf8.
Raw result — непосредственно найденный секрет. Отображается как обычный текст.
Rotation_guide — предоставляется ссылка на сайт howtorotate.com, на котором описано, как произвести ротацию ключей. После того как ключ или токен был раскрыт, необходимо произвести его ротацию с целью замены на новый. При ротации создается новая версия ключа. Данный параметр отображается, только если ключ или токен найден в некоторых сервисах, таких как AWS, Azure, GitLab. С полным списком можно ознакомиться по ссылке в разделе Getting Started.
Commit — отображает id коммита, в котором был найден секрет. Даже если коммит был удален, TruffleHog сканирует не только файлы, но и историю коммитов.
File — имя файла, в котором был найден секрет.
Line — строка в файле, в которой находится секрет.
Repository — URL репозитория, в котором был найден секрет.
Также одной из главных особенностей TruffleHog является то, что секреты делятся на подтвержденные и неподтвержденные. Подтвержденный результат означает, что TruffleHog успешно прошел аутентификацию в целевой службе с использованием этих учетных данных. Стоит отметить, что непроверенный результат все равно может содержать действующий ключ. Это означает, что TruffleHog не смог успешно пройти аутентификацию в соответствующем сервисе.
Как было упомянуто ранее, TruffleHog умеет находить секреты не только в репозиториях Git, но также в отдельных файлах и образах Docker. Рассмотрим данные примеры на практике. Предположим, что у нас на локальной машине есть копия репозитория от Twilio, которая называется twillo-python. Для того чтобы выполнить сканирование репозитория (в данном случае директорию с проектом), необходимо выполнить следующую команду:
trufflehog filesystem twilio-python/
Как можно увидеть, программа обнаружила секреты в отдельных файлах.
Для того чтобы просканировать образ Docker, необходимо воспользоваться следующей командой (где mysql — имя образа):
trufflehog docker --image mysql
Можно сканировать как образы, находящиеся во внешних и внутренних реестрах, так и локальные образы Docker (образы, которые находятся на текущем сервере).
Подводя итог, можно сказать, что программа TrufflHog является основным инструментов безопасности для поиска секретов в репозиториях Git и различных сервисах. Утилита имеет простой и понятный интерфейс, что, вкупе с быстрой работоспособностью, делает ее незаменимым помощником любого пентестера или инженера по безопасности.
НЛО прилетело и оставило здесь промокод для читателей нашего блога:
-15% на заказ любого VDS (кроме тарифа Прогрев) — HABRFIRSTVDS.