Угон префикса: BGP, утечки и обход RPKI
BGP — единственный протокол, который связывает независимые сети в Интернет 7. Он не вычисляет кратчайший путь и не знает о загрузке каналов: он распространяет объявления о том, какие префиксы доступны через какую автономную систему. Доверие здесь не между людьми, а между операторами: если сеть объявила префикс, остальные сети обязаны рассмотреть это объявление.
Отсюда класс атак, которых нет в других протоколах: не нужно взламывать оборудование, достаточно объявить чужой префикс. Ошибка конфигурации в одной сети может изменить маршруты в другой, а злонамеренный анонс — перенаправить трафик через себя, не касаясь ни одного пакета жертвы.
Тема 10 основной программы разбирала BGP как протокол: сессии, атрибуты, политики, выбор маршрута. Здесь те же механизмы рассматриваются со стороны доверия и проверяемости: что именно проверяется, чего не хватает и какие фильтры работают. Границы: IGP и внутренняя маршрутизация — тема 09 основной программы.
Тень базового курса: объявление как факт
В основной программе BGP выглядел как протокол маршрутизации, который обменивается достижимостью. Ключевое слово — «объявляет»: маршрутизатор не доказывает, что префикс ему принадлежит, он просто сообщает, что может доставить туда пакеты.
Это свойство — не дефект, а основа масштабирования. В Интернете нет единого реестра, которому все доверяют; есть реестры (RIR, IRR) и подпись происхождения (RPKI), но их поддержка добровольна. Поэтому BGP по умолчанию доверяет соседу, а сосед — своему соседу.
Атака начинается там, где это доверие пересекает границу организации. Угон префикса — не взлом, а ложное объявление; утечка — не атака, а ошибка политики, которая распространяется по цепочке.
Как устроена сессия и маршрут
Конечный автомат и сообщения
Сессия BGP устанавливается по TCP/179 и проходит состояния Idle, Connect, Active, OpenSent, OpenConfirm, Established 1. В Established стороны обмениваются сообщениями KEEPALIVE, UPDATE и NOTIFICATION.
vtysh -c "show bgp summary"
vtysh -c "show bgp ipv4 unicast"
Neighbor V AS MsgRcvd MsgSent TblVer InQ OutQ Up/Down State/PfxRcd
192.0.2.1 4 64500 1024 1030 0 0 0 01:12:44 12
198.51.100.1 4 64501 980 990 0 0 0 00:58:12 8
State/PfxRcd показывает число полученных префиксов; если там Active или Idle, сессия не установлена. Up/Down — время в текущем состоянии.
UPDATE содержит withdrawn-маршруты, атрибуты и NLRI. Главные атрибуты: AS_PATH (список пройденных AS), NEXT_HOP, LOCAL_PREF, MED, COMMUNITY. Выбор маршрута идёт по порядку: наибольший LOCAL_PREF, кратчайший AS_PATH, наименьший origin, наименьший MED, eBGP предпочтительнее iBGP, наименьший IGP-метрик, старейший маршрут, наименьший router ID.
Политики импорта и экспорта
Политика — это фильтр и набор действий. На импорте отбрасываются нежелательные префиксы и меняются атрибуты; на экспорте — что и с какими атрибутами объявлять.
router bgp 64500
neighbor 198.51.100.1 remote-as 64501
neighbor 198.51.100.1 route-map FROM-ISP in
neighbor 198.51.100.1 route-map TO-ISP out
!
ip prefix-list OUR-NETS seq 10 permit 203.0.113.0/24
!
route-map TO-ISP permit 10
match ip address prefix-list OUR-NETS
!
route-map FROM-ISP permit 10
set local-preference 200
Здесь TO-ISP разрешает объявлять только свой префикс, а FROM-ISP повышает приоритет маршрутов от этого провайдера. Практические требования к таким фильтрам собраны в RFC 7454 4. Без первого фильтра сеть может объявить всё, что знает.
Угон префикса
More-specific и subprefix hijack
Самый простой угон — объявить более специфичный префикс: если жертва объявляет 203.0.113.0/24, атакующий объявляет 203.0.113.128/25. Правило longest prefix match отправит половину адресов атакующему, и трафик пойдёт через него.
router bgp 64502
network 203.0.113.128/25
neighbor 198.51.100.1 remote-as 64501
neighbor 198.51.100.1 route-map HIJACK out
!
route-map HIJACK permit 10
Более сложный вариант — объявить тот же /24, но с лучшим AS_PATH (короче или с поддельным origin). Тогда выбор маршрута может уйти к атакующему даже без more-specific.
Anycast и route reflector
Anycast объявляет один и тот же префикс из нескольких точек; трафик идёт в ближайшую. Угон anycast-префикса перенаправляет пользователей в точку атакующего, и обнаружить это сложно, потому что «ближайшая» точка формально легитимна.
Route reflector пересылает маршруты внутри AS. Если он скомпрометирован или настроен без фильтров, он распространяет неверные маршруты на всех клиентов. Отравление RR — атака на доверие внутри автономной системы, а не между ними.
Утечки и valley-free
Route leak
Утечка — объявление маршрутов, полученных от одного провайдера, другому. Если сеть C получает маршрут от A и объявляет его B, трафик B может пойти через C, хотя у C нет на это права. Последствия — перегрузка, асимметрия, потеря связности.
Правило valley-free описывает допустимые отношения: клиент — провайдер, пиринг, провайдер — клиент. Маршрут не должен проходить из «долины» обратно в «гору» через пиринг. Утечка нарушает это правило и распространяется быстро, потому что BGP не имеет механизма «отозвать чужую ошибку».
Подмена AS_PATH и origin
AS_PATH можно дополнить (prepend), чтобы удлинить путь и сделать маршрут менее предпочтительным. Это штатный инструмент. Подделка origin — объявление префикса с чужим номером AS в конце пути; конструкции с AS_SET, которые раньше это упрощали, сегодня не рекомендуются 6 — обходит фильтры, которые проверяют только длину пути.
Атаки на сессию
TCP MD5, GTSM и RST-инъекция
BGP-сессия — это TCP-соединение, и к ней применимы атаки на TCP. Историческая RST-инъекция 2004 года обрывала сессии, подделывая RST с угаданным номером последовательности.
Защита: TCP MD5 (RFC 2385), TTL security (GTSM, RFC 5082) и BGPsec для подписи атрибутов. MD5 защищает от подделки сегментов, но не от слабых паролей; GTSM проверяет, что TTL равен 255, и отбрасывает пакеты, пришедшие издалека.
neighbor 198.51.100.1 password s3cret
neighbor 198.51.100.1 ttl-security hops 1
RPKI и ROV
ROA и валидатор
RPKI — инфраструктура открытых ключей для префиксов 2. Владелец префикса выпускает ROA (Route Origin Authorization): какой AS имеет право объявлять префикс 5. Валидатор собирает ROA и отдаёт маршрутизатору статус: valid, invalid, notfound.
routinator --http 127.0.0.1:8323
vtysh -c "show bgp ipv4 unicast 203.0.113.0/24"
Маршрут со статусом invalid должен отбрасываться (ROV, RFC 6811) 3. Проблема в том, что notfound — это большинство: ROA выпущены не для всех префиксов, и политика «отбрасывать всё, что не valid» ломает связность.
Почему подделка проходит
ROV проверяет только origin: совпадает ли AS, объявившая префикс, с той, что указана в ROA. Если атакующий объявляет префикс от имени правильной AS (подделав origin в AS_PATH), проверка проходит. Если префикс не имеет ROA, проверка бессильна.
ASPA (Autonomous System Provider Authorization) — следующий шаг: подпись того, какие провайдеры могут объявлять маршруты через данную AS. На момент написания ASPA разворачивается частично, и полной защиты от утечек нет.
Числа: таблица, сходимость и цена ошибки
Полная таблица IPv4 в 2024 году содержит около миллиона префиксов. Каждый маршрут занимает память в FIB и TCAM; на бюджетном оборудовании переполнение TCAM приводит к тому, что часть маршрутов уходит в медленный путь или отбрасывается.
Сходимость после изменения анонса занимает секунды: BGP рассылает UPDATE, соседи применяют политику, FIB пересчитывается. Для угонщика это окно, в котором трафик уже пошёл по новому пути, а защита ещё не среагировала.
maximum-prefix задаёт порог по числу маршрутов. Если провайдер обычно получает 800 префиксов от клиента, порог 1000 оставляет запас и при этом ловит утечку, которая добавляет десятки тысяч. Слишком низкий порог рвёт сессию при легитимном росте; слишком высокий пропускает утечку.
router bgp 64500
neighbor 198.51.100.1 maximum-prefix 1000 80
Второе число — процент, при котором генерируется предупреждение: при 800 полученных префиксах из 1000 сработает предупреждение, и у оператора будет время разобраться до разрыва сессии.
Обнаружение и защита
| Приём | Признак | Контрмера |
|---|---|---|
| More-specific hijack | новый более специфичный префикс | prefix-list, RPKI, мониторинг |
| Origin hijack | смена origin для известного префикса | ROV, IRR, фильтры |
| Route leak | рост числа маршрутов, аномальный AS_PATH | max-prefix, фильтры, детекторы |
| RST-инъекция | обрыв сессии без причины | MD5, GTSM, BGPsec |
| Отравление RR | неверные маршруты внутри AS | фильтры на RR, аутентификация |
| Anycast hijack | смена ближайшей точки | мониторинг задержек, RPKI |
neighbor 198.51.100.1 maximum-prefix 1000 80
neighbor 198.51.100.1 prefix-list ISP-IN in
maximum-prefix ограничивает число принимаемых маршрутов и защищает от утечки, которая раздувает таблицу. Порог подбирается по базовой линии: 1000 префиксов от одного провайдера — норма для одного, катастрофа для другого.
Итоги темы
BGP распространяет не истину, а объявления. Угон префикса не требует доступа к оборудованию: достаточно объявить чужой адрес более специфично или с лучшим путём. Утечка — та же ошибка, но без злого умысла, и распространяется она так же быстро.
RPKI и ROV закрывают часть проблемы: они проверяют origin, но не путь и не право объявлять. ASPA и BGPsec дополняют картину, но развёрнуты не полностью. Поэтому защита строится на нескольких слоях: фильтры префиксов, max-prefix, MD5 и GTSM, мониторинг и детекторы аномалий.
Следующая тема спускается с глобальной маршрутизации к следам, которые оставляет любой трафик, — и к тому, как их не оставить.
Литература
- Rekhter Y., Li T., Hares S. A Border Gateway Protocol 4 (BGP-4). — RFC 4271, IETF, 2006. https://www.rfc-editor.org/rfc/rfc4271
- Lepinski M., Kent S. An Infrastructure to Support Secure Internet Routing. — RFC 6480, IETF, 2012. https://www.rfc-editor.org/rfc/rfc6480
- Mohapatra P., Scudder J., Ward D., Bush R., Austein R. BGP Prefix Origin Validation. — RFC 6811, IETF, 2013. https://www.rfc-editor.org/rfc/rfc6811
- Durand J., Pepelnjak I., Doering G. BGP Operations and Security. — RFC 7454, IETF, 2015. https://www.rfc-editor.org/rfc/rfc7454
- Huston G., Michaelson G., Loomans R. A Profile for Route Origin Authorizations (ROAs). — RFC 6482, IETF, 2012. https://www.rfc-editor.org/rfc/rfc6482
- Kumari W., Sriram K. Recommendation for Not Using AS_SET and AS_CONFED_SET in BGP. — RFC 6472, IETF, 2012. https://www.rfc-editor.org/rfc/rfc6472
- Kurose J. F., Ross K. W. Computer Networking: A Top-Down Approach. 8th ed. — Pearson, 2021.