> Что такое 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-защита сводится к нескольким правилам:

  1. Всегда использовать HTTPS, не допускать HTTP-эндпоинтов.
  2. Не отключать проверку сертификатов в production.
  3. Для внутренних сервисов использовать mTLS.
  4. При работе с внешними API - certificate pinning, если это критично.
  5. Настраивать HSTS на уровне прокси или веб-сервера.
  6. Использовать безопасные конфигурации TLS: минимум TLS 1.2, предпочтительно TLS 1.3.

Пример опасного кода:

GO
client := &http.Client{
Transport: &http.Transport{
TLSClientConfig: &tls.Config{
InsecureSkipVerify: true, // никогда так не делать в production
},
},
}

Такой код делает приложение уязвимым к MITM: любой, кто сможет перехватить трафик, сможет подменить сертификат.

Пример кода

Безопасная конфигурация HTTP-клиента в Go:

GO
package main
import (
"crypto/tls"
"crypto/x509"
"net/http"
"os"
)
func main() {
// Загрузка CA-сертификата для pinning
caCert, 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 на стороне сервера:

GO
server := &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 или других дополнительных мер.

> ГОТОВЫ К СЛЕДУЮЩЕМУ СОБЕСЕДОВАНИЮ?

Запустите тренировочную сессию с ИИ и получите детальную обратную связь, чтобы увереннее проходить реальные интервью