«Мы зациклились на сложных атаках с нулевым днем и продвинутыми угрозами, но реальные убытки приносят до смешного простые вещи: пароли по умолчанию в системах, которые должны контролировать сети и производства. В итоге, сложная инфраструктура защищается годами, а падает от того, что забыли выключить отладчик на продакшене.»
Пароль «admin» в продакшене и другие классические ошибки
Тот самый базовый набор ошибок, который разбирают на вводных лекциях, не уходит в прошлое, а перекочёвывает из одного промышленного проекта в другой. Их опасность не в сложности, а в устойчивом заблуждении: «с нами такого не случится, мы же серьёзная компания». Случается. Часто — в системах с реальными физическими процессами, где последствия измеряются не гигабайтами утекших данных, а остановленными производствами.
Учётные записи по умолчанию в промышленных системах
Проблема выходит далеко за рамки web-интерфейса с логином admin. В промышленных системах АСУ ТП и SCADA учётные данные по умолчанию — это не просто слабый пароль, а часть заводской конфигурации, описанная в документации, которую десятилетиями не обновляют. Речь о сервисных аккаунтах встроенного ПО контроллеров, ПЛК и шлюзов, пароли к которым можно найти в открытых PDF-мануалах 2005 года выпуска.
Эти системы часто выводятся из-под регулярных аудитов под предлогом «стабильности технологического процесса». Обновить прошивку — значит остановить линию, а проверить учётные записи — получить доступ к системе, которую обслуживает сторонний интегратор. В итоге злоумышленнику не нужен изощрённый эксплойт. Достаточно стандартного сканера или даже простого перебора по списку паролей, специфичному для производителя оборудования. Полученный доступ — это не утечка базы данных, а возможность изменить уставки котла или логику работы конвейера.
[ИЗОБРАЖЕНИЕ: Схема промышленной сети с выделенными красным цветом узлами, где обнаружены учётные данные по умолчанию: HMI-панель, ПЛК, шлюз данных. Стрелка от ноутбука злоумышленника ведёт напрямую к ним, минуя периметр безопасности.]
Хранение секретов в клиентском коде
Антипаттерн, который постоянно возрождается в новых формах. Раньше это были пароли в JavaScript, теперь — API-ключи, жёстко прописанные в коде мобильного приложения или в конфигурации SPA-фронтенда. Механизм один: попытка «спрятать» чувствительные данные там, что по умолчанию доступно конечному пользователю.
Любой статический анализ APK-файла Android-приложения или декомпиляция IPA для iOS вытащит эти ключи за считанные минуты. В вебе достаточно открыть «Инструменты разработчика» и посмотреть исходный код или сетевые запросы. Распространённое оправдание — «ключ ограничен по квотам или доменам» — лишь иллюзия безопасности. Скомпрометированный ключ можно использовать напрямую через API, имитируя легитимные запросы, пока квота не иссякнет или не последут счета на огромные суммы.
Единственный корректный подход — вся работа с секретами должна вестись на защищённом бэкенде. Если клиенту нужен доступ к стороннему API, запрос должен проксироваться через ваш сервер, который контролирует лимиты и логирует действия. Для клиентской аутентификации использовать временные токены (например, JWT) с минимальным временем жизни и узкой областью действия (scope).
Ошибки конфигурации, которые открывают двери нараспашку
Некорректная настройка — это не баг, а сознательное решение оставить сейф с открытой дверцей. Часто оно принимается из соображений «удобства» в момент настройки и благополучно забывается на годы.
Отладчики и административные интерфейсы, доступные извне
Классика: на тестовом стенде разработчики включают отладчик Django, Flask Debug Toolbar или активируют режим Xdebug для PHP. Это удобно. Затем конфигурационный файл, docker-compose.yml или образ виртуальной машины переносится в промышленное окружение без изменений. И теперь любой, кто угадает или найдёт путь вроде /debug или /admin, получает доступ к ядру приложения.
Через интерфейс отладчика можно не только увидеть исполняемый код и переменные окружения, но и выполнять произвольные команды в контексте приложения. Административные панели CMS, phpMyAdmin, pgAdmin, оставленные в публичном доступе, становятся первой целью для сканеров. Проблема усугубляется ошибками в настройке групп безопасности облачных провайдеров: правило 0.0.0.0/0 для всех портов вместо точечного разрешения только для портов 80 и 443.

Некорректные права доступа к файлам и каталогам
Проблема существует на двух уровнях. Первый — файлы с секретами (.env, application.properties, config.yml), имеющие права 644 (владелец и группа могут читать и писать, все остальные — только читать). На shared-хостинге или в плохо изолированном Docker-контейнере это позволяет соседнему процессу или пользователю системы прочитать пароли от базы данных.
Второй уровень — директории с правами на запись для процесса веб-сервера (часто это uploads/, cache/, static/). Если в настройках веб-сервера (Nginx, Apache) для этой локации разрешено выполнение скриптов, то загруженный злоумышленником файл с расширением .php или .py будет исполнен. Это прямой путь к RCE (Remote Code Execution). Стандартная практика — явно запрещать выполнение скриптов в директориях для загрузки пользовательского контента.
Логические уязвимости и странные «оптимизации»
Иногда система уязвима не из-за бага, а потому что её бизнес-логика изначально была спроектирована без учёта злонамеренного сценария.
«Упрощённая» авторизация через параметр URL
Паттерн, который встречается в legacy-системах и внутренних сервисах «для своих». Идея проста: чтобы пользователю не вводить логин и пароль, ему высылается «магическая» ссылка вида https://internal.corp/report?user_id=101&auth=abc123def. Параметр «auth» часто является простым хэшем от user_id и какого-то статичного «секрета», известного серверу. Токен не имеет срока жизни и не инвалидируется после выхода.
Уязвимость здесь двойная. Во-первых, если такой токен попадёт в логи веб-сервера, историю браузера или будет переслан по почте, аккаунт скомпрометирован навсегда. Во-вторых, изучив алгоритм, можно подобрать токен для другого user_id. Это грубейшее нарушение принципа «never trust client-side data» — идентификатор пользователя и факт его аутентификации должны проверяться исключительно на стороне сервера, в защищённой сессии.
Отсутствие ограничений на критичные операции
Типичный сценарий: в системе есть функция смены пароля или привязки нового email. Для её вызова достаточно быть авторизованным в системе. Подтверждение через старый пароль или код на уже привязанную почту не требуется. Этим может воспользоваться злоумышленник, получивший временный доступ к сессии (через XSS, перехват cookies с незащищённого HTTP-соединения).
Он меняет пароль и email на свои, получая полный контроль над аккаунтом, в то время как законный владелец теряет доступ. Близкая проблема — отсутствие rate limiting на любые операции, связанные с подбором: ввод кода подтверждения, восстановление пароля, вызов «тяжёлых» API-методов. Это открывает двери как к brute-force атакам, так и к тривиальным DoS-атакам, когда ресурсы сервера исчерпываются за счёт тысяч бесполезных запросов.
Уязвимости, порождённые непониманием технологий
Ошибки возникают, когда инструмент используют, не вникая в принципы его работы, полагаясь на магию или устаревшие практики.
Самоподписанные SSL-сертификаты «для экономии»
Попытка сэкономить на сертификатах для внутренних и тестовых систем оборачивается куда большими рисками. Самоподписанный сертификат не является частью цепочки доверия. Браузеры и клиенты будут каждый раз показывать пугающие предупреждения. Со временем пользователи привыкают их игнорировать, нажимая «Принять риск и продолжить».
Главная опасность — это обучение персонала не обращать внимания на признаки компрометации TLS-соединения. Если злоумышленник внутри корпоративной сети развернёт атаку «человек посередине» и предъявит свой самоподписанный сертификат, пользователь, привыкший к постоянным предупреждениям, даже не заподозрит неладного. К тому же, приватные ключи от таких сертификатов часто хранятся с минимальной защитой.
Использование устаревших и уязвимых компонентов
Зависимости проекта — это чужие программы, которые выполняются внутри вашего приложения со всеми его правами. Использование библиотеки обработки изображений, фреймворка или CMS с известными критичными уязвимостями — это осознанный риск. Мотивация «система работает, обновление может всё сломать» понятна, но она лишь откладывает неизбежное.
Злоумышленники не пишут эксплойты с нуля. Они используют автоматизированные сканеры (например, Nuclei), которые содержат тысячи шаблонов для проверки на конкретные CVE в конкретных версиях ПО. Необновлённый сервер с публичным IP, работающий на WordPress 4.0 или старом ядре Linux, будет обнаружен и атакован в течение нескольких часов после размещения в сети. Промышленные системы на базе Windows XP Embedded — отдельная история, где обновлений больше не будет в принципе.
Как не допускать «глупых» уязвимостей
Борьба с этим классом проблем — это не про покупку дорогого софта, а про настройку процессов и изменение подхода.
| Мера | Суть и реализация |
|---|---|
| Шаблоны безопасной конфигурации | Использование Infrastructure as Code (Terraform, Ansible) и hardened Docker-образов. В шаблонах по умолчанию отключены отладчики, выставлены минимальные права, изменены стандартные пароли. Это исключает ручные ошибки при каждом новом развёртывании стенда. |
| Автоматизированный аудит в CI/CD | Внедрение инструментов статического анализа (SAST) для поиска секретов в коде, сканеров зависимостей (SCA) для выявления уязвимых библиотек и динамических сканеров (DAST) для проверки работающего приложения. Критические уязвимости должны блокировать сборку или деплой. |
| Принцип наименьших привилегий | Системное применение на всех уровнях: от прав пользователя базы данных (отказ от роли superuser для приложения) до политик IAM в облаке и прав файловой системы в контейнере. Аккаунт или сервис получает ровно те права, которые необходимы для его задачи, и не более. |
| Глубокое понимание вместо заучивания правил | Важно, чтобы разработчики и администраторы понимали принципы, а не просто следовали чек-листу. Почему нельзя доверять данным с клиента? Почему сессия должна инвалидироваться? Без этого понимания ошибки будут возникать в новых, неочевидных формах. |
| Культура ответственности за безопасность | Безопасность — это не задача одного специалиста или отдела. Это часть процесса для каждого, кто пишет код, настраивает сервис или выбирает библиотеку. Внедрение ролей Security Champion в командах разработки помогает распространять знания и вовремя выявлять проблемы на ранних этапах. |
«Глупые» уязвимости обходятся дороже всего именно потому, что их так легко было предотвратить. Их эксплуатация не требует дорогостоящих нулевых дней, а исправление — переписывания архитектуры. Их наличие — это яркий маркер системного сбоя в процессах. И именно их устранение даёт максимальный прирост защищённости при минимальных вложениях.