Geneva

Anonymizers v1.2

ИИ-инструмент от University of Maryland, автоматически обнаруживающий новые стратегии обхода цензуры с помощью генетического алгоритма. Комбинирует четыре базовых действия над пакетами (drop, duplicate, fragment, tamper) в произвольные цепочки и эволюционирует их против реального DPI. Не требует помощи снаружи цензурируемой сети (в отличие от Tor, VPN). Обнаружил десятки ранее неизвестных багов в DPI-системах Китая, Индии, Ирана, Казахстана. Работает как на стороне клиента, так и на стороне сервера. Стратегии, найденные Geneva, применяются в zapret, GoodbyeDPI и TiredVPN.

v1.2
current
Добавлен 24.06.2026 · Обновлён 07.07.2026 · Anonymizers
Установка
git clone https://github.com/Kkevsterrr/geneva
cd geneva
pip install -r requirements.txt

# Запуск найденной стратегии (без эволюции)
python engine.py --server [::]:443 \
  --strategy "[TCP:flags:SA]-duplicate(tamper{TCP:dataofs:replace:10},)-|" \
  --log debug

# Запуск генетической эволюции (ищет новые стратегии)
python evolve.py --population 100 --generations 50 \
  --server forbidden.example.com:443
переведено ИИ

Geneva Build Status codecov Documentation Status

Вы используете Geneva? Если да, сообщите нам! Напишите нам по адресу geneva@cs.umd.edu, или, чтобы использовать PGP, отправьте нам письмо напрямую с нашими ключами на нашем сайте.

Geneva — это инструмент искусственного интеллекта, разработанный исследователями из Мэрилендского университета, который побеждает цензуру, используя ошибки в системах цензуры, таких как в Китае, Индии и Казахстане. В отличие от многих других антицензурных решений, которые требуют помощи извне цензурного режима (Tor, VPN и т.д.), Geneva работает исключительно на одной стороне соединения (либо на стороне клиента, либо на стороне сервера). Geneva следует рассматривать как исследовательский проект для исследователей, и он не построен с графическим пользовательским интерфейсом.

Под капотом Geneva использует генетический алгоритм для эволюции стратегий обхода цензуры и обнаружил несколько ранее неизвестных ошибок в системах цензуры. Стратегии Geneva манипулируют сетевым потоком, чтобы запутать систему цензуры, не влияя на коммуникацию клиента/сервера. Это делает Geneva эффективным против многих типов сетевой цензуры (хотя его нельзя использовать против цензуры на основе блокировки IP-адресов).

Geneva состоит из двух основных компонентов: его генетического алгоритма (который он использует для эволюции новых стратегий обхода цензуры) и его движка стратегий (который он использует для запуска отдельной стратегии обхода цензуры через сетевое соединение).

Этот кодовая база содержит полную реализацию Geneva: её генетический алгоритм, движок стратегий, Python API и набор опубликованных стратегий. С помощью этих инструментов пользователи и исследователи могут развивать новые стратегии или использовать существующие для обхода цензуры. Чтобы узнать больше о том, как работает Geneva, см. Как это работает или ознакомьтесь с нашей документацией.

Настройка

Geneva был разработан и протестирован для систем на базе Centos или Debian. Из-за ограничений netfilter и raw-сокетов Geneva не работает в OS X или Windows в настоящее время и требует python3.6. Более подробные инструкции по настройке доступны в нашей документации.

Установите зависимости netfilterqueue:

# sudo apt-get install build-essential python-dev libnetfilter-queue-dev libffi-dev libssl-dev iptables python3-pip

Установите зависимости Python:

# python3 -m pip install -r requirements.txt

В системах Debian 10 некоторые пользователи сообщали о необходимости установки netfilterqueue напрямую из Github:

# sudo python3 -m pip install --upgrade -U git+https://github.com/kti/python-netfilterqueue

В системах Arch некоторые пользователи сообщали о необходимости сделать liblibc.a доступной для netfilterqueue:

sudo ln -s -f /usr/lib64/libc.a /usr/lib64/liblibc.a 

Запуск стратегии

Стратегия обхода цензуры — это просто описание того, как должен модифицироваться сетевой трафик. Стратегия — это не код, это описание, которое говорит движку, как он должен работать с трафиком. Для более полного описания синтаксиса ДНК см. Стратегии обхода цензуры.

# python3 engine.py --server-port 80 --strategy "[TCP:flags:PA]-duplicate(tamper{TCP:dataofs:replace:10}(tamper{TCP:chksum:corrupt},),)-|" --log debug
2019-10-14 16:34:45 DEBUG:[ENGINE] Engine created with strategy \/ (ID bm3kdw3r) to port 80
2019-10-14 16:34:45 DEBUG:[ENGINE] Configuring iptables rules
2019-10-14 16:34:45 DEBUG:[ENGINE] iptables -A OUTPUT -p tcp --sport 80 -j NFQUEUE --queue-num 1
2019-10-14 16:34:45 DEBUG:[ENGINE] iptables -A INPUT -p tcp --dport 80 -j NFQUEUE --queue-num 2
2019-10-14 16:34:45 DEBUG:[ENGINE] iptables -A OUTPUT -p udp --sport 80 -j NFQUEUE --queue-num 1
2019-10-14 16:34:45 DEBUG:[ENGINE] iptables -A INPUT -p udp --dport 80 -j NFQUEUE --queue-num 2

Обратите внимание, что если у вас есть устаревшие правила iptables или другие правила, которые используют очереди по умолчанию Geneva, это не удастся. Чтобы исправить это, удалите эти правила.

Также обратите внимание, что если вы хотите указать несколько портов для мониторинга Geneva, вы можете указать диапазон портов, используя --server-port 4000:5000, чтобы мониторить все порты в диапазоне 4000-5000, или вы можете указать список, такой как --server-port 80,443,4444, чтобы мониторить только указанные порты.

Библиотека стратегий

Geneva нашел десятки стратегий, которые работают против цензуры в Китае, Казахстане, Индии и Иране. Мы включили несколько из этих стратегий в strategies.md). Обратите внимание, что этот файл содержит показатели успешности для каждой отдельной страны; стратегия, которая работает в одной стране, может работать не так хорошо в других странах.

Исследователи наблюдали, что стратегии могут иметь разные показатели успешности в зависимости от вашего точного местоположения. Хотя мы не наблюдали этого с наших позиций, вы можете обнаружить, что некоторые стратегии могут работать по-другому в стране, которую мы тестировали. Если это так, не пугайтесь. Однако, пожалуйста, не стесняйтесь связаться напрямую с членом команды или открыть проблему на этой странице, чтобы мы могли отслеживать, как стратегии работают из других географических местоположений.

Отказ от ответственности

Запуск этих стратегий может поставить вас под угрозу, если вы используете их в цензурном режиме. Geneva предпринимает откровенные действия, которые мешают нормальной работе цензуры, и его стратегии обнаруживаются в сети. В процессе обучения Geneva намеренно будет многократно нарушать цензуру. Geneva не является инструментом анонимности и не шифрует какой-либо трафик. Поймите риски запуска Geneva в вашей стране, прежде чем пробовать его.


Как это работает

См. нашу статью для глубокого понимания того, как работает Geneva. Ниже приведено описание основных концепций, стоящих за Geneva, основных компонентов кодовой базы и того, как они могут быть использованы.

Стратегии обхода цензуры

Стратегия обхода цензуры — это просто описание того, как следует изменять сетевой трафик. Стратегия — это не код, это описание, которое сообщает движку стратегий Geneva, как манипулировать сетевым трафиком. Цель стратегии обхода цензуры — изменять сетевой трафик таким образом, чтобы цензор не мог его заблокировать, при этом связь между клиентом и сервером оставалась незатронутой.

Стратегия обхода цензуры состоит из одного или нескольких базовых элементов работы на уровне пакетов. Основные строительные блоки Geneva: 1. duplicate: берёт один пакет и возвращает две его копии 2. drop: берёт один пакет и не возвращает ни одного пакета (отбрасывает пакет) 3. tamper: берёт один пакет и возвращает изменённый пакет 4. fragment: берёт один пакет и возвращает два фрагмента или два сегмента

Поскольку duplicate и fragment создают ветвление, эти действия объединяются в бинарную древовидную структуру, называемую деревом действий. Каждое дерево также имеет триггер. Триггер описывает, на какие пакеты дерево должно срабатывать, а дерево описывает, что должно происходить с каждым из этих пакетов при срабатывании триггера. Как только триггер срабатывает на пакете, он «затягивает» пакет в дерево для модификаций, а пакеты, выходящие из дерева, отправляются в сеть. Помните, что Geneva работает на уровне пакетов, поэтому все триггеры являются триггерами уровня пакетов.

Несколько деревьев действий вместе образуют лес. Geneva по-разному обрабатывает исходящие и входящие пакеты, поэтому стратегии состоят из двух лесов: леса исходящих пакетов и леса входящих пакетов.

Рассмотрим следующий пример простой стратегии Geneva.

                   +---------------+

                   |  TCP:flags:A  |         <-- срабатывает на TCP-пакетах с полем flags, установленным в 'ACK'
                   +-------+-------+             совпадающие пакеты захватываются и затягиваются в дерево

                           |
                 +---------v---------+
                       duplicate             <-- делает две копии данного пакета. дерево обрабатывается 
                 +---------+---------+           в порядке inorder, поэтому сначала выполняется левая ветвь

                           |
             +-------------+------------+

             |                          |
+------------v----------+               v    <-- у duplicate нет правого потомка, поэтому этот пакет будет отправлен в сеть без изменений
          tamper              
  {TCP:flags:replace:R}      <-- параметры этого действия описывают, как следует изменять пакет 
+------------+----------+

             |
+------------v----------+
          tamper
   {TCP:chksum:corrupt}
+------------+----------+

             |
             v               <-- пакеты, которые появляются в результате обхода листьев дерева в порядке inorder, отправляются в сеть

Эта стратегия срабатывает на TCP-пакетах с полем flags, установленным в ACK. Она создает дубликат пакета ACK; у первого дубликата поле flags изменено на RST, а поле контрольной суммы (chksum) повреждено; второй дубликат остается без изменений. Затем оба пакета отправляются в сеть.

ДНК стратегии

Эти стратегии могут быть произвольно сложными, и Geneva определяет хорошо отформатированный строковый синтаксис для однозначного выражения стратегий.

Стратегия делит обработку исходящих и входящих пакетов: они разделяются в ДНК символом "\/". Конкретно, формат стратегии — <лес исходящих пакетов> \/ <лес входящих пакетов>. Если в стратегии отсутствует \/, все деревья действий находятся в лесу исходящих пакетов.

Оба леса состоят из деревьев действий, и для каждого леса допустимо произвольное количество деревьев.

Деревья действий всегда начинаются с триггера, который форматируется как: [<протокол>:<поле>:<значение>]. Например, триггер: [TCP:flags:S] будет запускать соответствующее дерево каждый раз, когда оно видит TCP-пакет с полем flags, установленным в SYN. Если соответствующее дерево действий — [TCP:flags:S]-drop-|, это дерево действий заставит движок отбрасывать любые пакеты SYN. [TCP:flags:S]-duplicate-| заставит движок дублировать любые пакеты SYN.

Синтаксически деревья действий заканчиваются на -|.

В зависимости от типа действия некоторые действия могут иметь до двух потомков (например, duplicate). Это представляется следующим образом: [TCP:flags:S]-duplicate(<левый_потомок>,<правый_потомок>)-|, где <левый_потомок> и <правый_потомок> являются сами деревьями. Если (,) не указано, любые пакеты, появляющиеся из действия, будут отправлены в сеть. Если действие имеет только одного потомка (например, tamper), он всегда является левым потомком. [TCP:flags:S]-tamper{<параметры>}(<левый_потомок>,)-|

Действия, имеющие параметры, указывают эти параметры в {}. Например, передача параметров действию tamper может выглядеть так: [TCP:flags:S]-tamper{TCP:flags:replace:A}-|. Эта стратегия будет срабатывать на TCP-пакетах SYN и заменять поле flags TCP на ACK.

Объединяя всё вышесказанное, ниже представлена ДНК-стратегия для приведенной выше схемы:

[TCP:flags:A]-duplicate(tamper{TCP:flags:replace:R}(tamper{TCP:chksum:corrupt},),)-| \/

Geneva содержит код для разбора этой ДНК-стратегии в стратегии, которые могут быть применены к сетевому трафику с помощью движка.

Обратите внимание, что из-за ограничений Scapy и NFQueue действия, вводящие ветвление (fragment, duplicate), отключены для лесов входящих действий.

Движок

Движок стратегий (engine.py) применяет стратегию к сетевому соединению. Движок работает, захватывая весь трафик, идущий на/с указанного порта. Пакеты, соответствующие активному триггеру, передаются через связанное дерево действий, а пакеты, появляющиеся из дерева, отправляются в сеть.

Движок также имеет Python API для использования его в вашем приложении. Его можно использовать как контекстный менеджер или запускать в фоновом режиме как поток. Например, рассмотрим следующее простое приложение.

import os
import engine

# Порт для запуска движка
port = 80
# Стратегия для использования
strategy = "[TCP:flags:A]-duplicate(tamper{TCP:flags:replace:R}(tamper{TCP:chksum:corrupt},),)-| \/"

# Создание движка в режиме отладки
with engine.Engine(port, strategy, log_level="debug") as eng:
    os.system("curl http://example.com?q=ultrasurf")

Этот скрипт создает экземпляр движка с указанной стратегией, которая будет работать для всего в контексте контекстного менеджера. При выходе из контекстного менеджера движок автоматически очистит себя. Более полные примеры использования движка см. в папке examples/.

Из-за ограничений scapy и NFQueue движок не может использоваться для связи с localhost.

Цитирование

Если вам нравится эта работа или вы планируете использовать ее в своих проектах, пожалуйста, следуйте инструкциям в citation.bib.

Статья

Смотрите нашу статью из CCS или остальные наши статьи и презентации для глубокого понимания того, как работает Geneva и как ее можно применить.

Участники

Kevin Bock

George Hughey

Xiao Qiang

Dave Levin

Комментарии
Войдите, чтобы оставить комментарий