Поговорим о безопасности Lagoscope
В прошлом посте я показал Lagoscope — программу, которая следит за компьютером и сетью во время игры и называет причину лагов. В комментариях мне справедливо накидали:
Какой-то нейровысер без гитхаба, с установкой в систему.
Да ты, братишка, хакер, получается
....
Так это уважение а не обвинение. Так хорошо знать Винду, это круто.
Если с первым комментарием всё кристально прозрачно, то во втором случае, хоть я и не Кэл Лайтман, но мой сарказмометр знатно так запищал. В любом случае, отбросив рассуждения о токсичности комьюнити, можно выделить 2 основные проблемы, которые беспокоят потенциального пользователя:
- Предположение о нейросетевом происхождении инструмента, сомнение в качестве, устройстве программы и компетенции разработчика.
- Сомнение в безопасности установки на свой ПК стороннего приложения без подписи, репутации и истории.
Оба поинта весьма легитимны и подтолкнули меня к написанию этой статьи. Итак, сегодня мы попробуем разобраться в устройстве Lagoscope, по шагам пройдёмся по его компонентам и схеме работы.
Опасение по поводу безопасности клиента я предвидел заранее, поэтому после сборки каждая новая версия клиента автоматически отправляется на проверку в VirusTotal, а её результат публикуется на главной странице под кнопкой скачивания. Отчёт к актуальной, на момент написания статьи, версии клиента 0.0.11 я хотел разобрать в конце, но объём статьи слишком сильно вырос в процессе написания, так что мы разберём его в следующий раз.
Перед тем как мы начнём, небольшая оговорка про «без гитхаба». Да, репозиторий проекта закрыт, и это было осознанным решением. Причин несколько:
- Главное в Lagoscope — не клиент, а анализ на сервере: правила, которые по сырым метрикам находят фриз и называют виноватого. Ради них всё и делалось, и отдавать их в открытый доступ пока не хочется.
- Проект на ранней стадии и меняется каждый день. Открытый репозиторий — это ещё и чужие правки, задачи и вопросы, на которые надо отвечать, а заниматься этим пока некому.
- Не исключаю, что проект станет коммерческим или у него появится платная часть.
Пока я это писал, понял, что все три пункта относятся к серверной части, и я мог бы вынести клиент в отдельный открытый репозиторий и тем самым снять все вопросы. Правда, читать перед установкой больше 20 тысяч строк на Rust вряд ли кто-то станет (я бы не стал). Кроме того, это будет означать раскрытие протокола, а значит потенциальную возможность создания поддельных клиентов, что само по себе становится угрозой безопасности. В общем, подумаю в эту сторону...
Да, писал с ИИ
В прошлом посте я не писал о себе, потому что не хотелось переводить фокус с продукта на личность. Но раз уж об этом зашла речь — я разработчик с опытом, и ИИ в работе использую так же, как сейчас его использует почти любой разработчик. Хотите вы этого или нет — это стандарт индустрии.
Для чего он в этом проекте:
- Помнит больше системных API Windows, чем любой человек: события ядра, счётчики производительности, шифрование данных пользователя, планировщик задач — и у каждого свои подводные камни.
- Сильно ускоряет разработку.
- Находит баги, которые я бы сам никогда не нашёл.
И честно: продукт такого объёма — клиент на одном языке, сервер на втором, установщик, сайт и отчёт, больше 40 тысяч строк вместе с тестами — в одиночку за разумное время не написать.
Но «написано с ИИ» и «нейровысер» — немного разные вещи. Разница в том, понимает ли кто-то, что происходит в коде. Сейчас я попробую рассказать вам.
Как устроен Lagoscope
Скачивание. С сайта скачивается не сама программа, а маленький загрузчик. Он берёт с сервера Lagoscope установщик последней версии, сверяет его контрольную сумму и запускает. Зачем так сложно: это стандартная схема для программ, которые часто выпускают новые версии, — так делают, например, Chrome и Steam. У загрузчика файл один и тот же от версии к версии, поэтому Windows Smart Screen и антивирусы со временем к нему привыкают, а не видят каждый раз новый незнакомый exe.
Проверка на VirusTotal. При каждом выпуске на проверку уходит установщик версии — именно тот файл, который загрузчик скачивает и запускает. Сам загрузчик в эту проверку не входит. Ссылка на отчёт — на главной странице под кнопкой скачивания. Сверить можно и самому: установщик версии лежит по прямой ссылке (для 0.0.11 — lagoscope.app/releases/0.0.11/Lagoscope-Setup.exe), а его контрольную сумму покажет PowerShell командой Get-FileHash Lagoscope-Setup.exe. Она должна совпасть с SHA-256 в отчёте VirusTotal. Загрузчик делает ту же сверку сам: файл с другой суммой он удаляет и не запускает.
Установка. В Program Files\Lagoscope ложатся шесть файлов, ещё появляются ярлык в «Пуске» и задача Lagoscope в Планировщике заданий.
- lagoscope-client.exe — сама программа: окна, значок в трее, сбор большей части данных, отправка на сервер и обновления. Три следующих файла запускает она, и только на время сессии.
- PresentMon.exe — открытая утилита Intel, которая считает кадры. Это официальная сборка 2.6.0 с Гитхаба, без изменений: при сборке установщика её контрольная сумма сверяется с закреплённой. Lagoscope называет ей процесс игры и читает, что она выводит. Кадры она берёт из событий Windows, а не из самой игры.
- lagoscope-dpc-sidecar.exe — ловит задержки драйверов: какой драйвер сколько времени занимал процессор. Данные берёт из того же системного журнала ядра Windows, что и LatencyMon. Ещё он видит адреса, размер и направление сетевых пакетов игры (без содержимого), чтобы найти адрес игрового сервера и пинговать его.
- lagoscope-adlx-helper.exe — раз в секунду спрашивает у драйвера AMD показатели видеокарты: загрузку, температуру, потребление, видеопамять. Прав администратора ему не нужно, а если видеокарта не AMD, он сразу завершается. С NVIDIA клиент работает сам, поэтому отдельного файла для неё нет.
- unins000.exe и unins000.dat — стандартный деинсталлятор Inno Setup, на котором собран установщик, и его данные о том, что удалять. Такая пара лежит в папке любой программы, собранной на Inno Setup.
Во время обновления рядом появляется папка update с установщиком новой версии, при следующем запуске клиент её удаляет.
Зачем права администратора. Кадры и задержки драйверов Windows отдаёт только программам с правами администратора. Чтобы не спрашивать разрешение при каждом запуске, Lagoscope запускается через задачу планировщика: подтверждение нужно один раз, при установке. Без прав программа тоже работает, просто без кадров и задержек драйверов, а кадры — это главное, что нам нужно при детекции статтеров и подсчёте FPS.
Во время игры. Lagoscope читает то, что Windows и так отдаёт любой программе: загрузку процессора, видеокарты, памяти и дисков, состояние Wi-Fi, подключения USB-устройств, настройки компьютера и какие программы сильнее всего грузили его в фоне (только названия). Постоянно пингует роутер, DNS-сервер, публичный сервер Cloudflare и игровой сервер, чтобы понять, где ломается сеть — дома или дальше. В игру не лезет, не читает её память, ничего в неё не добавляет и не рисует поверх. А некоторые игры, например Dota 2, официально умеют передавать другим программам ход матча: фазы, игровое время, применение способностей. Игра отправляет их Lagoscope внутри вашего компьютера, а он оставляет из них только события матча для отчёта.
Что уходит на сервер. Только метрики сессии, по зашифрованному соединению и только на сервер Lagoscope. При первом запуске сервер выдаёт анонимный номер устройства, а Windows хранит его зашифрованным так, что прочитать его может только ваша учётная запись.
Срок жизни сессии. Сессия, отчёт которой ни разу не открывали, удаляется через сутки, а открытая — через 90 дней после последнего просмотра.
Обновления. При запуске Lagoscope спрашивает у сервера, нет ли новой версии. Если есть — скачивает установщик, сверяет контрольную сумму и ставит, всё как при первой загрузке. Это нужно, чтобы версия клиента всегда была актуальной и протокол передачи данных совпадал с серверной частью.
Удаление — как у любой программы, через «Установленные приложения». Вместе с файлами удаляется задача планировщика, а папку с настройками установщик предложит удалить или оставить.
Почему на это ругаются антивирусы
Теперь сложите всё вместе: программа с правами администратора, запускается через планировщик, сидит в фоне, читает системные события и сама качает и ставит обновления. Ровно так же ведёт себя половина вредоносного софта, и антивирусы, которые смотрят на поведение (это называется эвристикой), такое не любят.
Поэтому ноль срабатываний для Lagoscope пока недостижим, и порог проверки при выпуске равен 5 — если вредоносным установщик назовут больше пяти антивирусов из ~70, новая версия не выходит. Если проект полетит — можно будет работать с вендорами, сообщать о ложных срабатываниях и стремиться к 0/70, но пока что это не является моей основной целью, и текущие 3/70 лучше моих ожиданий.
Что в итоге
- Lagoscope написан с ИИ, и я этого не скрываю: сейчас так работает почти любой разработчик.
- Репозиторий закрыт из-за серверной части, и над тем, чтобы открыть клиент отдельно, я подумаю.
- Всё, что программа ставит, видно в Program Files, Планировщике и «Установленных приложениях», а удаляется она так же просто, как ставится.
- Данные сессии уходят только на сервер Lagoscope, без каких-либо личных данных. Это можно проверить самому: например, бесплатная утилита TCPView от Microsoft покажет, что lagoscope-client.exe соединяется с ingest.lagoscope.app, а при обновлении — ещё с lagoscope.app. Кроме этого, только пинги до роутера, DNS-сервера, Cloudflare и игрового сервера. Еще может быть запрос к Steam за списком его серверов.
- Права администратора нужны ради кадров, и именно из-за них, фоновой работы и самообновления антивирусы смотрят на Lagoscope косо.
- Ставить вслепую чужой exe по-прежнему не стоит, в том числе мой. Поэтому всё, что можно проверить самому, я постарался вынести на поверхность.
В следующей статье — обещанный разбор отчёта VirusTotal: что значит каждая вкладка, что за три антивируса отметили установщик и что увидела песочница, когда его запустила.
Если остались вопросы, особенно неудобные, — задавайте в комментариях, постараюсь ответить на каждый.
Скачать: lagoscope.app
Новости и обратная связь: t.me/lagoscope