Tailscale исправил опасную уязвимость в версиях младше 1.66.0. Проблема была в недостаточной фильтрации входящих пакетов на Linux-нодах, которые работают как exit nodes, subnet routers и app connectors. Если в ACL стояло "src": "*" (например, в дефолтных правилах), эти ноды пропускали соединения из локальной сети на другие узлы tailnet. Формально * означает любые IP-адреса — ["0.0.0.0/0", "::/0"]. Атаковать можно было только из той же LAN, потому что трафик завязан на next-hop routing, а адреса tailnet лежат в непубличном диапазоне CGNAT 100.64.0.0/10.
Уязвимость касалась всех Linux-нод с версией Tailscale ≤ 1.65, а также обычных узлов на любых платформах, которые подключались к таким нодам. Если в tailnet использовали кастомные ACL без "src": "*", проблема не затрагивала. Активной эксплуатации не зафиксировано. Сценарий атаки: злоумышленник на той же LAN, что и packet-forwarding нода, мог добавить маршрут до tailnet-узла через неё и отправлять пакеты с произвольным source IP. Если ACL разрешал этот IP, трафик доходил до жертвы. Для shared exit nodes (из другой tailnet) риск был ниже из-за встроенного карантина — такие ноды раньше блокировались по source IP, но могли подменить его; теперь это тоже закрыли.
В версии 1.66.0 Tailscale внедрил три независимые защиты. Первая: изменили поведение "src": "*" в ACL. Теперь * включает только все узлы tailnet и IP из одобренных подсетей (нужно для site-to-site). Кто хочет старое поведение — может использовать новый autogroup: danger-all. Вторая: на Linux packet-forwarding нодах включили stateful packet filtering — они отслеживают только ответные пакеты для исходящих соединений, всё остальное дропается. Фильтрация включена по умолчанию, отключить можно через tailscale up --stateful-filtering=false. На не-Linux платформах она не нужна из-за другой реализации маршрутизации. Третья: клиенты 1.66.0+ блокируют любые входящие соединения от карантинных (shared) нод, независимо от source IP — как при включённом режиме «shields up».
Отдельное спасибо Hakan Ergan за похожий репорт, который помог найти уязвимость. Рекомендуется обновить все ноды до 1.66.0, а для exit nodes — серверное изменение уже смягчило проблему.