> Что такое MITM (man-in-the-middle) атака и как с ней бороться (Go)
Уровень: junior · Роль: backend · Категория: Технические вопросы
Компании: VK
Стек: Go
> Пример ответа
Короткий ответ
MITM (man-in-the-middle) - атака, при которой злоумышленник незаметно встраивается между двумя сторонами, перехватывая и модифицируя их трафик. Основные методы защиты: TLS/HTTPS с проверкой сертификатов, взаимная аутентификация (mTLS), certificate pinning, защита DNS (DNSSEC, DoH/DoT) и проверка целостности данных. В Go важно использовать стандартные безопасные конфигурации TLS и не отключать проверку сертификатов.
Подробное объяснение
MITM-атака работает по принципу перехвата коммуникации. Злоумышленник может:
- перехватывать данные (sniffing) - читать пароли, токены, персональные данные;
- модифицировать данные - подменять содержимое запросов и ответов;
- встраивать вредоносный код - например, инъекции в HTML или JavaScript;
- перенаправлять трафик - через ARP-spoofing, подмену DNS, фальшивые Wi-Fi точки.
Классические векторы атаки:
- подмена DNS-ответов - жертва попадает на фейковый сервер;
- ARP-spoofing в локальной сети - трафик идёт через атакующего;
- SSL stripping - понижение HTTPS до HTTP;
- перехват на уровне прокси или роутера.
Основная защита - шифрование и аутентификация. TLS решает проблему конфиденциальности и целостности, но только если клиент проверяет сертификат. Атака возможна, если:
- клиент не проверяет сертификат;
- в системе установлен корневой сертификат атакующего;
- используется HTTP вместо HTTPS;
- сертификат подписан скомпрометированным CA.
Дополнительные меры:
- certificate pinning - фиксация ожидаемого сертификата или публичного ключа;
- mTLS - взаимная проверка сертификатов обеих сторон;
- HSTS - запрет на понижение до HTTP;
- DNSSEC - защита от подмены DNS-ответов;
- мониторинг аномалий - например, неожиданные смены сертификатов.
В Go стандартная библиотека crypto/tls по умолчанию проверяет сертификаты. Опасные практики - установка InsecureSkipVerify: true или использование кастомных VerifyPeerCertificate без должной проверки.
На практике
Для backend-разработчика на Go MITM-защита сводится к нескольким правилам:
- Всегда использовать HTTPS, не допускать HTTP-эндпоинтов.
- Не отключать проверку сертификатов в production.
- Для внутренних сервисов использовать mTLS.
- При работе с внешними API - certificate pinning, если это критично.
- Настраивать HSTS на уровне прокси или веб-сервера.
- Использовать безопасные конфигурации TLS: минимум TLS 1.2, предпочтительно TLS 1.3.
Пример опасного кода:
GOclient := &http.Client{Transport: &http.Transport{TLSClientConfig: &tls.Config{InsecureSkipVerify: true, // никогда так не делать в production},},}
Такой код делает приложение уязвимым к MITM: любой, кто сможет перехватить трафик, сможет подменить сертификат.
Пример кода
Безопасная конфигурация HTTP-клиента в Go:
GOpackage mainimport ("crypto/tls""crypto/x509""net/http""os")func main() {// Загрузка CA-сертификата для pinningcaCert, err := os.ReadFile("ca.pem")if err != nil {panic(err)}caPool := x509.NewCertPool()if !caPool.AppendCertsFromPEM(caCert) {panic("failed to append CA cert")}tlsConfig := &tls.Config{MinVersion: tls.VersionTLS13,RootCAs: caPool,// InsecureSkipVerify не устанавливаем - проверка включена по умолчанию}client := &http.Client{Transport: &http.Transport{TLSClientConfig: tlsConfig,},}resp, err := client.Get("https://api.example.com")if err != nil {panic(err)}defer resp.Body.Close()}
Для mTLS на стороне сервера:
GOserver := &http.Server{Addr: ":8443",TLSConfig: &tls.Config{ClientAuth: tls.RequireAndVerifyClientCert,ClientCAs: caPool,MinVersion: tls.VersionTLS13,},}err := server.ListenAndServeTLS("server.crt", "server.key")
Как отвечать на собеседовании
Начни с краткого определения: MITM - это перехват и модификация трафика между клиентом и сервером. Затем перечисли основные векторы: подмена DNS, ARP-spoofing, SSL stripping. Объясни, почему TLS сам по себе не всегда спасает - важно, чтобы клиент проверял сертификат. Упомяни mTLS и certificate pinning как дополнительные меры. Для Go подчеркни, что стандартная библиотека безопасна по умолчанию, а главная ошибка - InsecureSkipVerify: true. Если спросят про конкретный сценарий - например, как защитить API от MITM - предложи HTTPS + HSTS + mTLS для внутренних сервисов.
Что проверяет интервьюер
Интервьюер оценивает:
- понимание сути атаки, а не заученных терминов;
- знание реальных векторов и сценариев;
- понимание роли TLS и сертификатов;
- осознание опасности отключения проверки сертификатов;
- умение предложить практические меры защиты;
- знание специфики Go - стандартные конфигурации, типичные ошибки.
Для junior-уровня достаточно уверенного ответа про HTTPS, проверку сертификатов и базовые сценарии. Упоминание mTLS и pinning - плюс, но не обязательно.
Типичные ошибки
- Ответ "нужно использовать HTTPS" без объяснения, почему это защищает.
- Утверждение, что TLS полностью исключает MITM - это не так, если клиент не проверяет сертификат.
- Предложение отключить проверку сертификатов "для ускорения" или "в тестовой среде" без оговорки, что это опасно.
- Путаница между MITM и простым перехватом трафика - MITM подразумевает возможность модификации.
- Игнорирование роли CA и цепочки доверия.
- В Go - использование
InsecureSkipVerify: trueкак "нормальной" практики. - Отсутствие упоминания HSTS, DNSSEC или других дополнительных мер.
> Похожие задачи по backend
Что такое CSRF и как определить поддельный запрос
Для чего нужны центры сертификации и чем самоподписанные сертификаты отличаются от выданных центрами
Стоит ли кэшировать пустые результаты запросов к базе данных
Что такое негативный кэш и почему он вреден
> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?
Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью