From 59b9cdd68ceb1b6ded22b78d0c0991970d0a50c5 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=D0=9D=D0=B8=D0=BA=D0=B8=D1=82=D0=B0=20Sonic?= Date: Thu, 30 Jul 2026 14:15:47 +0300 Subject: [PATCH] =?UTF-8?q?docs(readme):=20=D0=BE=D0=B1=D1=8A=D1=8F=D1=81?= =?UTF-8?q?=D0=BD=D0=B8=D1=82=D1=8C=20=D1=81=D1=80=D0=B0=D0=B1=D0=B0=D1=82?= =?UTF-8?q?=D1=8B=D0=B2=D0=B0=D0=BD=D0=B8=D1=8F=20=D0=B0=D0=BD=D1=82=D0=B8?= =?UTF-8?q?=D0=B2=D0=B8=D1=80=D1=83=D1=81=D0=B0=20=D0=B8=20=D0=B7=D0=B0?= =?UTF-8?q?=D1=84=D0=B8=D0=BA=D1=81=D0=B8=D1=80=D0=BE=D0=B2=D0=B0=D1=82?= =?UTF-8?q?=D1=8C=20=D0=BE=D1=82=D0=BA=D0=B0=D0=B7=20=D0=BE=D1=82=20=D0=BF?= =?UTF-8?q?=D0=BE=D0=B4=D0=BF=D0=B8=D1=81=D0=B8=20(#30)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Претензия про 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> --- README.md | 37 +++++++++++++++++++++++++++++++++++++ docs/ARCHITECTURE_V2.md | 12 ++++++++---- docs/ISSUE_AUDIT.md | 9 ++++++--- 3 files changed, 51 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index e6ae63a..2afdd50 100644 --- a/README.md +++ b/README.md @@ -92,6 +92,43 @@ TGLock — это **локальный прокси** на твоём компь > **🖥 `tglock-cli`** — тот же туннель без графического интерфейса, одним бинарём. Нужен там, где окно не создаётся: сервер, контейнер, виртуалка, машина без монитора. Доступен начиная с `v2.0.0-beta.2`. Подробности — [ниже](#-без-графического-интерфейса-tglock-cli). +### 🛡 Антивирус ругается, SmartScreen предупреждает, VirusTotal показывает детекты + +Так и будет. Объясню механизм и дам способы проверить, не доверяя мне на слово. + +**Что ты увидишь.** На Windows — «Система Windows защитила ваш компьютер» от SmartScreen. На VirusTotal — детекты у части движков, обычно единицы из примерно шестидесяти. + +**Почему.** Складываются две вещи. Установщик не подписан сертификатом, а неподписанные файлы проверяются эвристиками гораздо строже, чем подписанные. И само поведение программы — открыть локальный порт, объявить себя прокси-сервером, прописаться в настройки соединения Telegram — это ровно тот профиль, по которому эвристики ищут прокси-трояны. Программа делает именно это, только по твоей просьбе. Отличить одно от другого автоматически движок не может, поэтому и реагирует. + +**Подписи не будет.** Сертификат — это ежегодный платёж, а проект бесплатный и ничего не зарабатывает. Значит предупреждение останется, и делать вид, что «скоро подпишем», я не буду. + +**Как проверить вместо доверия.** Три способа, все не требуют верить мне: + +1. **Сверить контрольную сумму.** GitHub публикует `sha256` каждого файла прямо на [странице релиза](https://github.com/by-sonic/tglock/releases/latest) — разверни `Assets` и увидишь digest рядом с именем. Сравни с тем, что скачалось: + + ```powershell + Get-FileHash .\TGLock_2.0.0-beta.2_x64-setup.exe -Algorithm SHA256 + ``` + + ```bash + sha256sum tglock-cli-x86_64-unknown-linux-gnu # Linux + shasum -a 256 tglock-cli-universal-apple-darwin # macOS + ``` + + Это доказывает, что файл не подменили по пути к тебе. + +2. **Посмотреть, как файл собирался.** Бинарники собирает GitHub Actions из публичного коммита, лог открыт и его никто не может отредактировать задним числом. Сборка релиза `v2.0.0-beta.2` — [run 30535555083](https://github.com/by-sonic/tglock/actions/runs/30535555083), коммит `b062724`. Видно, какой исходник взят и какими командами собран. + +3. **Собрать самому.** Для CLI это одна команда и никаких зависимостей кроме Rust: + + ```bash + cargo build --release --locked --no-default-features --bin tglock-cli + ``` + + Полная сборка с интерфейсом — [ниже](#-сборка-из-исходников). + +**Если этого недостаточно — не запускай.** Это нормальное решение, а не паранойя: исполняемый файл из интернета без подписи заслуживает недоверия по умолчанию. Собери из исходников или возьми [tg-ws-proxy](https://github.com/Flowseal/tg-ws-proxy) — он решает ту же задачу и тоже открыт. + > **🍎 macOS:** пока сборка не нотарифицирована Apple, при первом запуске может понадобиться: > ```bash > xattr -cr /Applications/TGLock.app diff --git a/docs/ARCHITECTURE_V2.md b/docs/ARCHITECTURE_V2.md index 7f4ec37..8af9adb 100644 --- a/docs/ARCHITECTURE_V2.md +++ b/docs/ARCHITECTURE_V2.md @@ -118,10 +118,14 @@ Worker должен принимать WebSocket на: заданные оператором значения не перезаписываются, а `TGLOCK_FORCE_GPU=1` возвращает аппаратное ускорение. Для машин без монитора остаётся `tglock-cli`, которому WebView не нужен вовсе (issues #10, #17). -- Windows-инсталлятор не подписан, macOS-сборка не нотарифицирована. Часть - антивирусов реагирует на неподписанный установщик, открывающий локальный - сокет; проверяемый ответ — сборка из исходников либо публичные логи - GitHub Actions. +- Windows-инсталлятор не подписан, macOS-сборка не нотарифицирована, и + подписывать их не планируется: сертификат — ежегодный платёж, а проект + бесплатный. Часть антивирусов будет реагировать на неподписанный установщик, + который открывает локальный сокет и прописывается прокси-сервером — это тот + же профиль, по которому ищут прокси-трояны. Вместо доверия предлагаются + проверяемые пути: `sha256` каждого артефакта публикуется GitHub на странице + релиза, сборка идёт в GitHub Actions из публичного коммита с открытым логом, + CLI собирается одной командой. Подробно — в разделе README про антивирус. - Работоспособность медиа зависит от конкретного DC аккаунта и доступности Telegram/Cloudflare у провайдера. - Пулы заранее открытых WebSocket-соединений будут добавлены после измерения, diff --git a/docs/ISSUE_AUDIT.md b/docs/ISSUE_AUDIT.md index f5be903..8ef0e28 100644 --- a/docs/ISSUE_AUDIT.md +++ b/docs/ISSUE_AUDIT.md @@ -23,9 +23,12 @@ > `v2.0.0-beta.2` она пересобрана универсальным `.dmg`. > - #9 (Android) остаётся единственным открытым — backlog без сроков. > -> Единственная претензия из публичного обсуждения, которую нельзя закрыть -> кодом: инсталлятор не подписан, из-за чего часть антивирусов на него -> реагирует. Требует покупки сертификата. +> Претензия из публичного обсуждения, которую нельзя закрыть кодом: инсталлятор +> не подписан, из-за чего часть антивирусов на него реагирует. Решение принято +> и зафиксировано: подписи не будет, сертификат — ежегодный платёж, а проект +> бесплатный. Вместо неё в README описан механизм срабатывания и три +> проверяемых пути — сверка `sha256` с публикуемым GitHub digest, открытый лог +> сборки в Actions и сборка из исходников одной командой. > > Дополнительно исправлено то, чего в issues не было: коллизия MTProto-init с > байтом `0x05` (одно соединение из 256 уходило в SOCKS5-ветку и умирало),