Сканер утёкших секретов
Сканер утёкших секретов проверяет, может ли кто угодно получить с вашего сайта файлы и учётные данные, которые никогда не должны быть публичными: файл .env с паролями от базы данных, папку .git, отдающую всю историю исходного кода, архив резервной копии, забытый в корневом веб-каталоге, или настоящий API-ключ внутри пакета JavaScript. Введите URL, и этот сканер опрашивает известные пути раскрытия, проверяет содержимое всего, что ответило, и ищет в странице и её скриптах известные шаблоны секретов — показывая только маскированные значения, никогда сам секрет. Сопутствующее руководство открытые файлы .env и утёкшие ключи объясняет, как возникают такие раскрытия и почему одного удаления файла никогда не достаточно. Сочетайте его с проверкой заголовков безопасности для усиления ответов и с аудитом сторонних скриптов для скриптов, которые вы загружаете у других.
Последнее обновление:
Хотите следить за этим постоянно? Следите бесплатно с myeventwatch — оповещения об истечении срока и простоях, карта не нужна.
Что считается раскрытым — а что нет
Сканер опрашивает опубликованный список известных путей — /.env и его обычные варианты, /.git/HEAD и /.git/config, конфигурационные файлы, архивы резервных копий и файлы ключей — обычными публичными GET-запросами, ровно теми, что мог бы отправить злоумышленник, поисковая система или любопытный посетитель. Путь считается раскрытым только тогда, когда содержимое ответа соответствует тому, как этот файл должен выглядеть на самом деле: файл env должен разбираться как строки «ключ–значение», а HEAD репозитория Git должен выглядеть как ссылка Git. Многие серверы отвечают 200 на каждый путь — резервные страницы одностраничных приложений, собственные страницы ошибок, универсальные перезаписи — и ответ 200 с HTML вашей главной страницы не является утечкой. Такие пути перечислены в результате отдельно как ответили, но не подтверждены, чтобы вы могли судить сами; этот инструмент никогда не называет неподтверждённый ответ 200 утечкой, и никакой сканер, которым вы пользуетесь, не должен этого делать.
Помимо опроса файлов, сканер получает саму страницу и до примерно пятнадцати её пакетов JavaScript и ищет в них известные формы секретов: идентификаторы ключей доступа к облаку, заголовки закрытых ключей, общие присваивания API-ключей и токенов, строки подключения к базам данных и похожие шаблоны с сильным сигналом. Клиентский код публичен по определению — всё, что отправляется в браузер, может прочитать каждый посетитель, — поэтому настоящие учётные данные, найденные в пакете, раскрыты, даже если ни один файл не был настроен неправильно. Находки сообщаются по типу, по исходному файлу и по числу вхождений, со значением, маскированным не более чем до первых четырёх символов: достаточно, чтобы вы узнали, какой это ключ, и никогда не достаточно, чтобы читатель отчёта мог им воспользоваться. Полный секрет никогда не получается, не хранится и не показывается в этом отчёте.
Ограничения, сказанные прямо
Это публичный опрос известных путей только для чтения, и его ограничения — часть результата. Он запрашивает только пути из опубликованного списка — секрет в файле с необычным именем найден не будет. Он сканирует целевую страницу и примерно пятнадцать пакетов скриптов, а не каждый ресурс большого сайта, и он не выполняет вход, не обходит страницы за аутентификацией, не перебирает имена файлов и не тестирует ничего, что и так не достижимо неаутентифицированным GET-запросом. Сканирования ограничены 5 в час на посетителя, а результаты кэшируются на 10 минут, поэтому повторное сканирование в этом окне может показать кэшированный вердикт. У сканирования есть и бюджет времени: когда медленная цель его исчерпывает, результат помечается как частичный и прямо говорит об этом — относитесь к частичному чистому результату как к «проверено не полностью», а не как к «чисто».
Если сканирование что-то находит, порядок работы важнее скорости удаления. Сначала смените учётные данные — отзовите раскрытый ключ и выпустите новый, — потому что копии уже могут существовать в кэшах, архивах и чужих руках; удаление файла останавливает новые загрузки, но ничего не делает с ключом, который уже ушёл. Затем удалите или заблокируйте файл на сервере, очистите кэши CDN и прокси, которые могут хранить копию, и проверьте журналы доступа на предмет более ранних обращений к тому же пути. Сопутствующая статья открытые файлы .env и утёкшие ключи по порядку проходит план первого часа, которым пользуются злоумышленники, и полную последовательность восстановления.
Соседние проверки дополняют картину: аудит сторонних скриптов охватывает внешние скрипты, которые загружают ваши страницы, — иной риск цепочки поставок, нежели ваши собственные утёкшие файлы, — а проверка заголовков безопасности оценивает защиту браузера, которую несут ваши ответы. Замечание о методе: чистый результат означает, что ни один из опрошенных путей не ответил совпадающим содержимым и ни один известный шаблон секрета не встретился в просканированных файлах — на момент сканирования и с сетевой позиции проверяющего. Это свидетельство об этих путях и файлах, а не гарантия для всего сервера — держите файлы вне корневого веб-каталога с самого начала и повторяйте сканирование после каждого изменения развёртывания, которое затрагивает то, что публикует ваш сервер.
Список опроса, опубликован
| /.env и варианты | Файлы окружения (.env, .env.local, .env.production и подобные) с паролями от баз данных, почтовыми учётными данными и API-ключами. Подтверждается только тогда, когда тело разбирается как строки «ключ–значение». |
| /.git/HEAD и /.git/config | Отдаваемая папка .git раскрывает репозиторий: HEAD доказывает структуру, config часто называет удалённый репозиторий. С обоими полная история кода обычно может быть восстановлена. |
| Конфигурационные файлы | Известные пути конфигурации (например, резервные копии wp-config, копии config.php и файлы конфигурации фреймворков), несущие учётные данные открытым текстом. |
| Резервные и архивные файлы | Дампы баз данных, архивы сайта .zip / .tar.gz и резервные копии редакторов, оставленные в корневом веб-каталоге, — часто полная копия сайта, учётные данные включены. |
| Файлы ключей и сертификатов | Файлы в форме закрытого ключа (.pem, .key, имена в стиле id_rsa), которые никогда не должны быть доступны через веб; отдаваемый закрытый ключ сам по себе — критическая находка. |
| Пакеты JavaScript | Страница плюс до примерно 15 пакетов скриптов, проверяемых на идентификаторы облачных ключей, заголовки закрытых ключей, присваивания токенов и строки подключения. Значения маскируются не более чем до четырёх начальных символов. |
| Правило подтверждения | Опрос считается раскрытием только тогда, когда содержимое ответа соответствует ожидаемой форме файла. Голый ответ 200 перечисляется как ответивший-неподтверждённый и никогда не сообщается как утечка. |
| Бюджет и кэширование | Только публичные GET-опросы, только чтение, 5 сканирований в час на посетителя, результаты кэшируются 10 минут. Сканирование, исчерпавшее бюджет времени, помечается частичным. |
Частые вопросы
Сканирование говорит, что путь «ответил, но не подтверждён». Это утечка?
По этому свидетельству — нет. Это означает, что путь ответил HTTP 200, но содержимое не совпало с формой опрашиваемого файла — обычная причина — универсальный маршрут или резервная страница, отвечающие на каждый URL вашей главной страницей или оболочкой приложения. Откройте путь сами в приватном окне и посмотрите, что на самом деле возвращается: если вы видите настоящее содержимое файла, относитесь к нему как к раскрытому; если вы видите свой обычный сайт, это резервная страница.
Сканер нашёл один из моих ключей. Что делать сначала?
Смените его — отзовите раскрытые учётные данные и выпустите замену — раньше всего остального. Копии публичного файла быстро убегают в кэши, архивы и базы данных сканеров, поэтому удаление файла не «отменяет утечку» ключа. Затем удалите или заблокируйте файл, очистите кэши CDN и прокси, просмотрите журналы доступа для этого пути и проверьте, где ещё использовались те же учётные данные.
Хранит ли сканер или показывает ли полные секреты, которые находит?
Нет. Проверяющий сообщает тип секрета, файл, в котором он найден, и число вхождений, со значением, маскированным не более чем до первых четырёх символов, — достаточно, чтобы опознать, какие это учётные данные, и никогда не достаточно, чтобы ими воспользоваться. Отчёт намеренно не содержит ничего, что стоило бы красть: отчёт об утечке не должен становиться второй утечкой.
Может ли он сканировать мой тестовый сайт или страницу за входом?
Нет. Сканер отправляет только неаутентифицированные публичные GET-запросы, поэтому всё, что находится за входом, VPN или списком разрешённых IP, недостижимо — намеренно, потому что вопрос, на который он отвечает, — что может получить незнакомец из интернета. Заблокированные цели, включая адреса инфраструктуры этого самого сайта, отклоняются outright.
Почему мой результат кэширован или частичен?
Результаты кэшируются на 10 минут, чтобы повторные проверки оставались дешёвыми и чтобы сканер был вежливым гостем на целевом сервере; результат отмечает, когда он взят из кэша. Частичный результат означает, что сканирование достигло бюджета времени — обычно медленная цель или много больших пакетов — до завершения каждого опроса; баннер говорит об этом, и частичный чистый результат следует запустить заново, а не доверять ему как полностью чистому.