
Обход правил системных вызовов на основе connect() с помощью TCP Fast Open (PoC для CVE-2026-63828)
TCP Fast Open (TFO) — это метод инициализации TCP-соединения, при котором клиент может отправлять данные в самом начальном SYN-пакете, отправляемом серверу. Это хорошо для скорости, поскольку позволяет пропустить обмен сообщениями при начальном TCP-рукопожатии. В деталях реализации есть нюансы, если вы планируете использовать это в продакшене, но этот метод полезен для обхода некоторых механизмов правил, основанных на системных вызовах, поскольку это один из способов открытия TCP-соединений без явного использования системного вызова connect.
С точки зрения системных вызовов, обычное TCP-соединение в общем виде выглядит так:
socket() -> connect() -> write()/read()
Однако TFO-соединение инициализируется с помощью системного вызова sendto с флагом MSG_FASTOPEN:
socket() -> sendto(...,MSG_FASTOPEN,...) -> write()/read()
Я в некотором роде исследовал это как побочную задачу для другого проекта, над которым работал, но в ходе дальнейшего изучения TFO всплыл CVE-2026-63828 как (недавний) известный обход, специфичный для процессов с сетевыми ограничениями в AppArmor. Однако он применим не только к AppArmor, поэтому я решил опубликовать здесь базовый PoC.
Допустим, вы хотите выполнить запрос к API-серверу Kubernetes изнутри контейнера в рамках пост-эксплуатационной разведки, но при этом действуют правила мониторинга/блокировки на основе eBPF, AppArmor или каких-либо других системных вызовов.
Если вы не хотите использовать более тяжеловесную сетевую реализацию/библиотеку в пользовательском пространстве, а другие примитивы обхода системных вызовов, такие как io_uring, недоступны, TFO может оказаться полезным. Опять же, это просто простой PoC, а не полноценный TFO-стек.
Переносимая сборка:
CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build test.go
Ссылки: