Files
tglock/docs/ISSUE_AUDIT.md
T
Никита Sonic 59b9cdd68c docs(readme): объяснить срабатывания антивируса и зафиксировать отказ от подписи (#30)
Претензия про VirusTotal всплывала в обсуждениях и не была нигде объяснена.
Отмахнуться «это ложное срабатывание» нельзя: движок реагирует на реальное
поведение программы. Поэтому в README добавлен раздел, который объясняет
механизм и даёт способы проверить, не доверяя автору на слово.

Что написано:
- что увидит пользователь: SmartScreen на Windows, детекты у части движков на
  VirusTotal;
- почему: неподписанный файл проверяется эвристиками строже, а поведение —
  открыть локальный порт, объявить себя прокси и прописаться в настройки
  Telegram — совпадает с профилем прокси-троянов. Программа делает именно это,
  только по просьбе пользователя, и автоматически отличить одно от другого
  движок не может;
- что подписи не будет: сертификат это ежегодный платёж, проект бесплатный.
  Формулировка прямая, без «скоро подпишем»;
- три проверяемых пути: сверка sha256 с digest, который GitHub публикует на
  странице релиза (с командами под три ОС), открытый лог сборки в Actions с
  указанием конкретного run и коммита, сборка из исходников одной командой;
- если этого недостаточно — не запускать, и это названо нормальным решением, а
  не паранойей, со ссылкой на альтернативу.

Конкретные числа детектов не приводятся: они меняются от сборки к сборке и со
временем, обещать «4 из 59» значит закладывать в документацию то, что устареет.

Соответствующие пункты обновлены в ARCHITECTURE_V2.md (Current limitations) и
в статусе ISSUE_AUDIT.md — там это было записано как открытый вопрос,
требующий покупки сертификата, теперь как принятое решение.

Co-authored-by: by-sonic <171230345+by-sonic@users.noreply.github.com>
2026-07-30 14:15:47 +03:00

90 lines
7.9 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# TGLock 2.0 issue audit
Проверено 29 июля 2026 года: все 15 issues и 5 pull requests, существовавшие
в репозитории на момент аудита.
> **Статус на 30 июля 2026.** Аудит ниже оставлен как есть — это фиксация
> состояния на дату проверки. Что с тех пор сделано:
>
> - Разобраны все issues и pull requests. Открытых PR не осталось.
> - Закрыты #1#5, #8, #11, #13, #14, #19, #23 и #3 — с техническими
> объяснениями в самих issues.
> - #15 реализован заново поверх архитектуры 2.0 в #25: смерджить исходный PR
> было нельзя, он патчил `bypass.rs`, `network.rs` и `ws_proxy.rs`, которых
> больше нет, и правил системный DNS. Взято разделение GUI/CLI и произвольный
> bind-адрес; DNS-менеджмент и проверка root отброшены как ненужные.
> - #12 закрыт: относился к шрифту старого egui-интерфейса.
> - #10 и #17 закрыты выпуском `v2.0.0-beta.2`: GUI перед стартом просит у
> WebView программный рендер. Проверить это на машине без 3D-ускорения
> возможности не было, поэтому закрыто как «исправление выпущено», а не
> «исправлено» — репортерам предложено переоткрыть, если проблема осталась.
> Независимо от WebView работает `tglock-cli`.
> - #21 закрыт: репорт относился к сборке macOS, которой больше нет, в
> `v2.0.0-beta.2` она пересобрана универсальным `.dmg`.
> - #9 (Android) остаётся единственным открытым — backlog без сроков.
>
> Претензия из публичного обсуждения, которую нельзя закрыть кодом: инсталлятор
> не подписан, из-за чего часть антивирусов на него реагирует. Решение принято
> и зафиксировано: подписи не будет, сертификат — ежегодный платёж, а проект
> бесплатный. Вместо неё в README описан механизм срабатывания и три
> проверяемых пути — сверка `sha256` с публикуемым GitHub digest, открытый лог
> сборки в Actions и сборка из исходников одной командой.
>
> Дополнительно исправлено то, чего в issues не было: коллизия MTProto-init с
> байтом `0x05` (одно соединение из 256 уходило в SOCKS5-ветку и умирало),
> подсчёт туннеля до успешного рукопожатия, неверные подписи маршрутов в
> интерфейсе и генерация нового секрета при каждом старте сервиса. Подробности —
> в [ARCHITECTURE_V2.md](ARCHITECTURE_V2.md).
>
> Из списка «не подтверждённых обещаний» в конце документа закрыты все четыре
> пункта: формулировки про звонки и про «Подключено» приведены в соответствие с
> кодом, LAN-режим ограничен адресами Telegram на уровне типа, Cloudflare Worker
> остаётся исключительно пользовательской настройкой.
## Выводы
Главная причина жалоб «прокси подключён, но Telegram не работает» — приложение
считало успешный запуск локального SOCKS5-сервера успешным подключением к
Telegram. Единственный upstream `kws{dc}.web.telegram.org` может резолвиться в
недоступный IP или блокироваться провайдером.
TGLock 2.0 разделяет эти состояния и использует адаптивный список Telegram IP,
`kwsN`/`kwsN-1`, системный DNS и опциональный пользовательский Cloudflare
Worker. TLS SNI и WebSocket Host проверяются. Системный DNS и файл `hosts`
не изменяются.
## Классификация
| Issue | Наблюдение | Решение для 2.0 |
|---|---|---|
| #1 | Порт 1080 занят | Уже есть выбор порта; добавить автоматический подбор |
| #2, #11 | Неверный сетевой адаптер | В переписанном Rust-ядре привязка исходящего адаптера отсутствует; добавить только как расширенную настройку |
| #3 | Rust 1.75 не собирает зависимости | `Cargo.lock` зафиксирован; MSRV 1.88 документирована и проверяется в CI |
| #4 | Linux/серверный режим | Добавить headless CLI и systemd/Docker-примеры |
| #5 | macOS | Публиковать universal `.app`, затем подписанный и notarized DMG |
| #8, #19, #21, #23 | Нет подключения | Резервные маршруты, live-probe, понятная диагностика вместо ложного «Подключено» |
| #9 | Android | Не входит в desktop 2.0; LAN остаётся отдельным сценарием |
| #10, #17 | GUI не запускается без GPU/монитора | Headless CLI; отдельно проверить software rendering |
| #13 | Discord/YouTube | Вне области проекта; не смешивать с Telegram-транспортом |
| #14 | Медиа, звонки, LAN | Медиа тестировать отдельно; звонки не обещать без UDP; LAN ограничить Telegram-адресами |
## Pull requests
- #6 относится к старой Windows-реализации выбора адаптера.
- #12 относился к шрифту старого GUI. В v2 интерфейс перенесён на Tauri 2 и
использует системную типографику каждой платформы.
- #15 содержит полезное направление разделения GUI/CLI, но основан на старой
архитектуре и меняет DNS системы.
- #18 — экспериментальный Linux GUI без подтверждённого мобильного сценария.
- #7 не содержит продуктового изменения.
## Не подтверждённые обещания
- Голосовые и видеозвонки нельзя заявлять рабочими: SOCKS5 UDP Associate не
реализован, а Telegram может обходить proxy для части звонков.
- «Подключено» допустимо показывать только после успешного WebSocket handshake,
а не после открытия локального порта.
- LAN-режим не должен становиться открытым универсальным SOCKS5-прокси.
- Резерв через чужую Cloudflare-инфраструктуру нельзя включать без ясной модели
доверия, владельца, мониторинга и политики обновления endpoint-ов.