7 ноября 2026 года вышел 3proxy 1.0.3 с исправлениями ошибок, которые затрагивали проверку ответов RADIUS и обработку обратных DNS-записей. Обновление также устраняет сбои при одновременной проверке правил PCRE, улучшает работу TLS-соединений и вводит отдельный параметр -B для разделения TLS ClientHello по полю SNI.

Ответ RADIUS мог повредить память ещё до проверки подлинности
В 3proxy обнаружили ошибку при обработке ответов сервера RADIUS — системы, которую администраторы могут использовать для централизованной проверки доступа к прокси. Прежде программа вычисляла контрольное значение ответа, дописывая общий секрет RADIUS непосредственно после полученных данных. Если ответ занимал 4100 байт, а длина секрета составляла не менее 17 символов, операция могла записать до 47 байт за пределами буфера в стеке процесса.
Проблема возникала до завершения проверки подлинности ответа. Повреждение памяти при обработке сетевых данных потенциально влияет на безопасность и устойчивость процесса, хотя опубликованные примечания к версии не содержат подтверждений эксплуатации этой ошибки.
В 1.0.3 контрольное значение вычисляется без записи секрета за границами полученного ответа. Разработчики одновременно ужесточили проверку пакета: теперь учитываются IP-адрес и порт RADIUS-сервера, которому направлялся запрос, а также идентификатор и длина ответа. Раньше эти параметры проверялись неполностью.
Таким образом, исправление касается как работы с памятью, так и сопоставления ответа с исходным запросом на авторизацию. Для конфигураций с RADIUS это два отдельных аспекта одной проблемы.
Обратный DNS допускал выход за границы буфера при разборе PTR
Второе исправление безопасности связано с PTR-записями DNS. Они позволяют определить имя хоста по IP-адресу и могут использоваться, в частности, при аутентификации по обратному DNS.
При разборе ответа 3proxy раньше проходил по меткам имени до конца всего DNS-сообщения, хотя должен был ограничиваться данными конкретной записи. Из-за этого программа могла ошибочно принять указатель DNS-сжатия за длину метки. По описанию разработчиков, ответ размером от 3841 байта мог привести к выходу за пределы буфера в стеке.
В новой версии разбор останавливается на границе данных PTR-записи. Сжатые, пустые и усечённые имена в этом сценарии отклоняются. Изменение затрагивает обработку DNS-ответов при обратном определении имени, поэтому его следует отличать от исправления службы dnspr в версии 1.0.2: тогда разработчики усилили проверку источника, идентификатора и вопроса в пересылаемых DNS-ответах.
Одновременные проверки PCRE больше не используют общий изменяемый буфер
Правила доступа с префиксами pcre: и regex: позволяют сопоставлять имена хостов с регулярными выражениями. До 1.0.3 несколько соединений могли одновременно обращаться к одному блоку данных сопоставления, в который функция pcre2_match() записывает результат.
Когда проверки выполнялись параллельно, возникала гонка между потоками: они изменяли одни и те же данные, что могло повредить память и завершить процесс 3proxy под нагрузкой. Теперь каждое соединение получает собственный блок данных для проверки выражения. Исправление особенно относится к конфигурациям, в которых фильтрация обращений построена на PCRE-правилах и одновременно обслуживается много клиентов.
Ошибки работы с соединениями затронули и TLS. Прежде ситуация, когда чтение из TLS-сокета требовало предварительной записи или запись зависела от чтения, могла ошибочно завершать соединение. Один из приведённых разработчиками примеров — обновление ключей TLS 1.3 при временно недоступной записи в сокет. В 1.0.3 TLS-соединение сохраняет информацию о том, какого действия ожидает текущая операция, а механизм ожидания учитывает это состояние. В Windows дополнительно исправлено распознавание сетевых ошибок при повторных попытках чтения и записи.
Параметр -B исправил конфликт между разделением SNI и splice в Linux
В 3proxy 1.0.3 появилась отдельная опция -B для TCP-служб. Она разделяет передаваемое через tlspr начальное сообщение TLS ClientHello внутри имени сервера SNI — поля, по которому некоторые системы глубокой проверки трафика (DPI) определяют запрашиваемый домен. Механизм рассчитан на DPI-системы, которые не собирают разделённые части TCP-потока обратно перед анализом. Универсального обхода DPI он не гарантирует.
Раньше для похожего поведения использовался параметр -s, но на Linux возник конфликт с функцией splice(), предназначенной для передачи данных между сокетами. В issue #1283 пользователь показал, что в сборке 1.0.2 с WITHSPLICE параметр -s включал режим splice, а разделение ClientHello фактически не происходило. В тесте первые порции данных при 12 подключениях имели одинаковый размер — 1569 байт, как и без этой опции.
Теперь для разделения ClientHello предусмотрено отдельное обозначение -B; прежний -s сохраняет такой эффект в сборках, где он не занят функцией splice. Разработчики отдельно указали, что включённый TCP_NODELAY нужен для сохранения разделения: иначе ядро может снова объединить отправляемые сегменты. В актуальной ветке 1.0 TCP_NODELAY включён по умолчанию.
Исходящие подключения Linux и вспомогательные службы получили исправления
При большом числе исходящих соединений с явно выбранного внешнего IP-адреса 3proxy мог тратить время на поиск свободного локального порта или получать ошибку привязки. Начиная с Linux 4.2 новая версия использует IP_BIND_ADDRESS_NO_PORT: конкретный порт назначается при connect() с учётом адреса назначения. Это позволяет эффективнее использовать диапазон временных портов, когда соединения к разным серверам работают одновременно или прежние подключения находятся в состоянии TIME_WAIT.
Исправлена и служба обратных подключений connect back (-R). Раньше один клиент мог застрять в ожидании соединения, которое уже принял другой клиент той же службы, причём ожидание продолжалось даже после истечения тайм-аута или перезагрузки конфигурации. Теперь соответствующий сокет работает в неблокирующем режиме.
В ftppr устранено зависание при входе на FTP-серверы, которые подтверждают авторизацию ответом 230 сразу после команды USER, без необходимости в PASS. Ответ сервера ранее не доходил до клиента, из-за чего тот ждал завершения входа до тайм-аута. Сценарий описан в issue #1284. Отдельные исправления затронули работу плагинов StringsPlugin и FilePlugin с буферами и параметрами TLS-соединения.
3proxy 1.0.3 доступен для Windows, Linux и OpenWrt вместе с обновлением LTS
Для 3proxy 1.0.3 опубликованы ZIP-сборки под Windows, пакеты DEB и RPM для Linux, варианты для OpenWrt 24.10 и подписанный архив исходного кода. Официальные каналы current и lts предусмотрены в репозиториях APT и DNF. Файлы выпуска сопровождаются контрольными суммами SHA-256 и подписями OpenPGP.
В тот же день разработчики выпустили 3proxy 0.9.9.3 LTS с исправлениями безопасности RADIUS и PTR, гонки при проверке PCRE, ошибок соединений и поддержкой -B. Таким образом, описанные проблемы затронуты в обеих поддерживаемых линиях: актуальной 1.0 и длительно поддерживаемой 0.9.
В версии 1.0.3 команда 3proxy --help также показывает, с какими возможностями собран конкретный исполняемый файл, включая TLS и его реализацию, RADIUS, PCRE, IPv6, Unix-сокеты и дополнительные службы. Это позволяет отличить отсутствие функции в конкретной сборке от ошибки конфигурации.
Исправления 3proxy затрагивают безопасность авторизации и работу под нагрузкой
Выпуск 1.0.3 закрывает ошибки обработки внешних ответов RADIUS и PTR, устраняет гонку памяти при параллельном применении PCRE-правил и корректирует работу нескольких типов соединений. Отдельный параметр -B решает ранее задокументированный конфликт настроек в Linux. В опубликованных материалах разработчики описали условия возникновения ошибок, но не привели статистику их распространённости или подтверждённых атак.