Недавно в открытом доступе появился новый инструмент для поиска приватной информации в открытом коде. Это Entropy — утилита командной строки, которая сканирует кодовую базу на предмет строк с высокой энтропией. Предположительно, такие строки могут содержать секретную информацию: токены, пароли и др.
Подход логичный. Пароли и токены — это по определению строки с высокой энтропией, поскольку они создаются с помощью генераторов случайных или псевдослучайных чисел. Символы в такой последовательности в идеале непредсказуемы.
В теории информации энтропия случайной величины — это средний уровень «информации», «неожиданности» или «неопределённости», присущий возможным исходам этой величины. То есть по сути непредсказуемость её появления. При отсутствии информационных потерь энтропия численно равна количеству информации на символ передаваемого сообщения.
Если дискретная случайная величина Х принимает значения в множестве ? и распределяется в [0,1], то энтропия равняется
где Σ обозначает сумму возможных значений переменной. Выбор основания для логарифма варьируется для различных приложений. Основание 2 показывает количество бит энтропии (шенноны), основание e — «натуральные единицы» (наты), а основание 10 — единицы dit или хартли.
В случае с паролями (или строками кода) обычно принято говорить о битах энтропии. Например, энтропию конкретного пароля можно посчитать на калькуляторе Password Entropy.
Упомянутая утилита Entropy выполняет такой же расчёт, только в кодовой базе для всех строчек кода.
Обычный программный код имеет шаблонную, предсказуемую структуру, а это означает низкую энтропию, которая близка к энтропии естественных языков. С другой стороны, токены и пароли — это обычно последовательность случайных символов с высокой энтропией. Так можно просканировать всю кодовую базу и автоматически найти токены/пароли в ней.
Предпочтительным вариантом считается установка с помощью инсталлятора Go:
Альтернативный вариант установки с Brew:
И через Docker:
Параметр
Докер-контейнер лежит на Docker Hub.
В принципе, относительную энтропию текста можно определить по степени его компрессии с помощью стандартных архиваторов. Таким образом, в качестве альтернативного инструмента для оценки энтропии можно использовать, например, такую команду с применением Perl:
Вообще, опенсорсная программа предназначена для сканирования на уязвимости собственных репозиториев. Но злоумышленники могут использовать этот приём для поиска чужих секретов в чужой кодовой базе.
Утечки секретной информации через открытые репозитории — очень распространённая проблема. Многие слышали о недавнем происшествии, когда хакеры украли исходный код New York Times с использованием открытого токена Github.
Неизвестно, откуда злоумышленник взял токен Github, но вполне возможно, что он случайно попал в открытые исходники, как это часто бывает.
Таких случаев немало. Злоумышленники используют специальные инструменты для мониторинга свежих репозиториев Github и свежих коммитов на предмет секретных токенов AWS и другой конфиденциальной информации. Вышеупомянутая программа Entropy может использоваться ими как один из инструментов для анализа кода. Нужно иметь в виду, что у них есть такой инструмент. Поэтому любые приватные токены и пароли в открытом доступе практически сразу после публикации станут доступны третьим лицам.
Другие инструменты для поиска секретов (учётных данных и др.) в исходном коде и репозиториях:
Подход логичный. Пароли и токены — это по определению строки с высокой энтропией, поскольку они создаются с помощью генераторов случайных или псевдослучайных чисел. Символы в такой последовательности в идеале непредсказуемы.
Информационная энтропия
В теории информации энтропия случайной величины — это средний уровень «информации», «неожиданности» или «неопределённости», присущий возможным исходам этой величины. То есть по сути непредсказуемость её появления. При отсутствии информационных потерь энтропия численно равна количеству информации на символ передаваемого сообщения.
Если дискретная случайная величина Х принимает значения в множестве ? и распределяется в [0,1], то энтропия равняется
где Σ обозначает сумму возможных значений переменной. Выбор основания для логарифма варьируется для различных приложений. Основание 2 показывает количество бит энтропии (шенноны), основание e — «натуральные единицы» (наты), а основание 10 — единицы dit или хартли.
В случае с паролями (или строками кода) обычно принято говорить о битах энтропии. Например, энтропию конкретного пароля можно посчитать на калькуляторе Password Entropy.
Инструмент Entropy
Упомянутая утилита Entropy выполняет такой же расчёт, только в кодовой базе для всех строчек кода.
Обычный программный код имеет шаблонную, предсказуемую структуру, а это означает низкую энтропию, которая близка к энтропии естественных языков. С другой стороны, токены и пароли — это обычно последовательность случайных символов с высокой энтропией. Так можно просканировать всю кодовую базу и автоматически найти токены/пароли в ней.
Предпочтительным вариантом считается установка с помощью инсталлятора Go:
go install github.com/EwenQuim/entropy@latest
entropy
# Дополнительные опции
entropy -h
entropy -top 20 -ext go,py,js
entropy -top 5 -ignore-ext min.js,pdf,png,jpg,jpeg,zip,mp4,gif my-folder my-file1 my-file2
Альтернативный вариант установки с Brew:
brew install ewenquim/repo/entropy
entropy
# Дополнительные опции
entropy -h
entropy -top 20 -ext go,py,js
entropy -top 5 -ignore-ext min.js,_test.go,pdf,png,jpg my-folder my-file1 my-file2
И через Docker:
docker run --rm -v $(pwd):/data ewenquim/entropy /data
# Дополнительные опции
docker run --rm -v $(pwd):/data ewenquim/entropy -h
docker run --rm -v $(pwd):/data ewenquim/entropy -top 20 -ext go,py,js /data
docker run --rm -v $(pwd):/data ewenquim/entropy -top 5 /data/my-folder /data/my-file
Параметр
-v
используется для монтирования текущего каталога. Каталог /data
используется по умолчанию для файлов с кодом. Если не указать каталог, то программа будет искать файлы в контейнере, а не в локальной файловой системе.Докер-контейнер лежит на Docker Hub.
В принципе, относительную энтропию текста можно определить по степени его компрессии с помощью стандартных архиваторов. Таким образом, в качестве альтернативного инструмента для оценки энтропии можно использовать, например, такую команду с применением Perl:
perl -lne 'next unless $_; $z = qx(echo "$_" | gzip | wc -c); printf "%5.2f %s\n", $z/length($_), $_'
Вообще, опенсорсная программа предназначена для сканирования на уязвимости собственных репозиториев. Но злоумышленники могут использовать этот приём для поиска чужих секретов в чужой кодовой базе.
Утечки учётных данных
Утечки секретной информации через открытые репозитории — очень распространённая проблема. Многие слышали о недавнем происшествии, когда хакеры украли исходный код New York Times с использованием открытого токена Github.
Неизвестно, откуда злоумышленник взял токен Github, но вполне возможно, что он случайно попал в открытые исходники, как это часто бывает.
Таких случаев немало. Злоумышленники используют специальные инструменты для мониторинга свежих репозиториев Github и свежих коммитов на предмет секретных токенов AWS и другой конфиденциальной информации. Вышеупомянутая программа Entropy может использоваться ими как один из инструментов для анализа кода. Нужно иметь в виду, что у них есть такой инструмент. Поэтому любые приватные токены и пароли в открытом доступе практически сразу после публикации станут доступны третьим лицам.
Другие инструменты для поиска секретов (учётных данных и др.) в исходном коде и репозиториях:
GospodinKolhoznik
Нужен инструмент deentropy, который будет спамить в github и тому подобные хранилища огромную кучу бессмысленных токенов, чтобы entropy захлебнулся в бесконечном потоке дерьма.
Desprit
Не нужен, с бесконечным потоком сегодня неплохо справляются javascript-разработчики :D
randomsimplenumber
Если кто-то свои исходники решит сделать нечитаемыми, чтобы хакеры не смогли найти там пароль.. назло всем хакерам отморожу уши.