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>
This commit is contained in:
Никита Sonic
2026-07-30 14:15:47 +03:00
committed by GitHub
parent f03e9106ee
commit 59b9cdd68c
3 changed files with 51 additions and 7 deletions
+37
View File
@@ -92,6 +92,43 @@ TGLock — это **локальный прокси** на твоём компь
> **🖥 `tglock-cli`** — тот же туннель без графического интерфейса, одним бинарём. Нужен там, где окно не создаётся: сервер, контейнер, виртуалка, машина без монитора. Доступен начиная с `v2.0.0-beta.2`. Подробности — [ниже](#-без-графического-интерфейса-tglock-cli). > **🖥 `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, при первом запуске может понадобиться: > **🍎 macOS:** пока сборка не нотарифицирована Apple, при первом запуске может понадобиться:
> ```bash > ```bash
> xattr -cr /Applications/TGLock.app > xattr -cr /Applications/TGLock.app
+8 -4
View File
@@ -118,10 +118,14 @@ Worker должен принимать WebSocket на:
заданные оператором значения не перезаписываются, а `TGLOCK_FORCE_GPU=1` заданные оператором значения не перезаписываются, а `TGLOCK_FORCE_GPU=1`
возвращает аппаратное ускорение. Для машин без монитора остаётся возвращает аппаратное ускорение. Для машин без монитора остаётся
`tglock-cli`, которому WebView не нужен вовсе (issues #10, #17). `tglock-cli`, которому WebView не нужен вовсе (issues #10, #17).
- Windows-инсталлятор не подписан, macOS-сборка не нотарифицирована. Часть - Windows-инсталлятор не подписан, macOS-сборка не нотарифицирована, и
антивирусов реагирует на неподписанный установщик, открывающий локальный подписывать их не планируется: сертификат — ежегодный платёж, а проект
сокет; проверяемый ответ — сборка из исходников либо публичные логи бесплатный. Часть антивирусов будет реагировать на неподписанный установщик,
GitHub Actions. который открывает локальный сокет и прописывается прокси-сервером — это тот
же профиль, по которому ищут прокси-трояны. Вместо доверия предлагаются
проверяемые пути: `sha256` каждого артефакта публикуется GitHub на странице
релиза, сборка идёт в GitHub Actions из публичного коммита с открытым логом,
CLI собирается одной командой. Подробно — в разделе README про антивирус.
- Работоспособность медиа зависит от конкретного DC аккаунта и доступности - Работоспособность медиа зависит от конкретного DC аккаунта и доступности
Telegram/Cloudflare у провайдера. Telegram/Cloudflare у провайдера.
- Пулы заранее открытых WebSocket-соединений будут добавлены после измерения, - Пулы заранее открытых WebSocket-соединений будут добавлены после измерения,
+6 -3
View File
@@ -23,9 +23,12 @@
> `v2.0.0-beta.2` она пересобрана универсальным `.dmg`. > `v2.0.0-beta.2` она пересобрана универсальным `.dmg`.
> - #9 (Android) остаётся единственным открытым — backlog без сроков. > - #9 (Android) остаётся единственным открытым — backlog без сроков.
> >
> Единственная претензия из публичного обсуждения, которую нельзя закрыть > Претензия из публичного обсуждения, которую нельзя закрыть кодом: инсталлятор
> кодом: инсталлятор не подписан, из-за чего часть антивирусов на него > не подписан, из-за чего часть антивирусов на него реагирует. Решение принято
> реагирует. Требует покупки сертификата. > и зафиксировано: подписи не будет, сертификат — ежегодный платёж, а проект
> бесплатный. Вместо неё в README описан механизм срабатывания и три
> проверяемых пути — сверка `sha256` с публикуемым GitHub digest, открытый лог
> сборки в Actions и сборка из исходников одной командой.
> >
> Дополнительно исправлено то, чего в issues не было: коллизия MTProto-init с > Дополнительно исправлено то, чего в issues не было: коллизия MTProto-init с
> байтом `0x05` (одно соединение из 256 уходило в SOCKS5-ветку и умирало), > байтом `0x05` (одно соединение из 256 уходило в SOCKS5-ветку и умирало),