Local privilege escalation in snapd in Ubuntu on Linux allows local attackers to get root privilege by re-creating snap’s private /tmp directory when systemd-tmpfiles is enabled to automatically clean up this directory.
Фиксы вышли для всех поддерживаемых версий, от 16 и выше. Значит все, кто сидел на 14 и ниже, останутся с огроменной дырой.
Работал ведущим инженером в сфере энергетики. С 2014 года увлекаюсь разработкой игровых серверов — началось как хобби, затянуло серьёзно. Недавно попал под сокращение, живу в Норильске. Пока не могу устроиться на новую работу из-за компенсации от работодателя. Появилось много свободного времени — и я решил наконец довести до ума свой главный проект.
Сервер World of Warcraft, который я пилю с 2022 года. Называется Valor, версия WotLK 3.3.5a. Вчера открыл бету для всех.
Расскажу путь от первых попыток поднять сервер до рабочего проекта с 26 расами, 800 ботами и кастомным мировым боссом.
Как это началось
Играл на разных приватках — но нигде не мог найти то, что хотелось. Пустой мир, мёртвый аукцион, одни и те же стандартные расы. Подумал: «Да я сам лучше сделаю». Классическая ошибка.
Скачал исходники AzerothCore, поставил Ubuntu, два дня гуглил почему не компилируется. Оказалось — не тот компилятор. Добро пожаловать в разработку.
Первый сервер вообще стоял у меня дома на подоконнике. В Норильске. Кто не знает — это город за полярным кругом, где зимой бывает минус 50 и ветер сносит с ног. Однажды прихожу домой — а на системник с сервером намело снега через щель в окне. Сервер работал. В снегу. Охлаждение, так сказать, природное.
Моя серверная машина)
После этого случая я всё-таки перенёс сервер на нормальный хостинг в Красноярск. Но фото сохранил — на память.
Чему пришлось научиться
Опыт в энергетике помог с логикой и системным мышлением, но программирование — совсем другой мир. Всё с нуля. Без курсов, без менторов — только документация, Stack Overflow и упорство.
C++ — ядро сервера. Первые полгода боялся трогать что-то кроме конфигов. Потом начал править скрипты. Потом лез в ядро. Сейчас пишу свои модули и патчу баги в чужих.
Linux — сервер крутится на Ubuntu. Научился работать с systemd, nginx, iptables, fail2ban, MySQL. Когда первый раз настраивал файрволл — случайно заблокировал себе SSH. Пришлось ехать к серверу физически.
PHP/Laravel — сделал сайт с личным кабинетом и системой регистрации.
.NET — написал лаунчер с автообновлением клиента, чтобы игрокам не качать 15 гигов вручную.
DBC-файлы — бинарные файлы клиента с данными о расах, спеллах, моделях. Однажды случайно удалил папку с DBC для всех кастомных рас. 26 рас. Восстанавливал из облака три часа, попутно переосмысливая жизненные решения.
Мой напарник
Кстати, работаю я не совсем в одиночку. Мой кот Нафаня — бессменный тимлид проекта. Сидит рядом, контролирует процесс, иногда ложится на клавиатуру в самый ответственный момент. Пару раз «помогал» дебажить — случайно нажимал Enter и отправлял недописанные SQL-запросы в базу. Один раз удалил строку в конфиге хвостом. Но в целом — моральная поддержка бесценна. Когда в три часа ночи ловишь segfault, а рядом мурчит кот — уже не так одиноко.
Знакомтесь домовенок Нафаня))
26 рас — самая безумная часть
Захотел добавить расы из поздних дополнений в клиент 2008 года. Вулпера, Ворген, Пандарен, Драктир, Войд Эльф, Ночнорождённые, Зандалари, Кул-Тирас, и ещё куча. Каждая раса — это патч DBC, модели, фракции, стартовые зоны, все 10 классов.
Клиент 2008 года не знает что такое Вулпера, и ему от этого плохо. Каждая новая раса — это десятки правок в бинарных файлах, куча тестов и неизбежные баги на ровном месте.
Меню создания персонажей
Эредар
Зандалар
800 ботов — чтобы мир не казался мёртвым
На любом новом сервере главная проблема — некому играть. Подключил модуль AI-ботов. 800 штук. Бродят по миру, качаются, записываются в данжи через LFG. Танк танкует, хил лечит, ДПС бьют. У них даже тактики на боссов прописаны — все данжи Вотлка плюс рейды: ICC, Ульдуар, Ониксия.
Но баги. Бот-танк заходит в Азжол-Неруб, группа прыгает в яму после первого босса — а бот стоит наверху. Не умеет прыгать с высоты. Пришлось писать автотелепорт: если бот в данже далеко от группы — перемещается к лидеру.
Ещё: сервер падал раз в сутки. Дебажил неделю. Оказалось — несколько ботов одновременно умирают, одновременно ищут кладбище, гонка потоков повреждает хэш-таблицу. Segfault. Добавил shared_mutex — починилось.
Боты в LFG
Мировой босс — Пуджа Нерасстроенный
Какой WoW без мировых боссов? Добавил своего — Пуджа Нерасстроенный. Да, отсылка к Dota. Огромная абоминация, бродит по Нордсколу, примерно 7 миллионов HP. Притягивает игроков хуком как Death Grip, бьёт Hateful Strike, плюётся слизью. На 5% здоровья впадает в ярость, а через 6 минут — берсерк. В одиночку не убить, нужна группа.
Дропает тринки из ToC, эмблемы фроста и триумфа, Primordial Saronite. Но самое забавное — когда его никто не бьёт, он патрулирует территорию и троллит в чат. «Пуджа хочет играть! Где его друзья?», «Никто не приходит к Пудже... Пуджа грустит», «Мясо... Пуджа чует свежее мясо...». А когда кто-то всё-таки приходит — «Пуджа голоден! Пуджа разорвёт!». Грустный одинокий босс, который просто хочет внимания.
Мировой босс - Пуджа Нерасстроенный
Что есть на сервере к ОБТ
Кратко что удалось собрать за эти годы:
— 26 рас (10 стандартных + 16 кастомных) — Рейт x10, но каждый игрок настраивает под себя от x1 до x10 командой — 800 AI-ботов в мире и LFG — Рефорджинг и трансмогрификация — Мировой босс Пуджа Нерасстроенный — Аукцион-бот (АХ всегда наполнен) — Ежедневные бонусы каждый день недели — Кастомный лаунчер — Никакого доната за шмот
Аукцион бот
Рефорджинг
Свой лаунчер
Почему без pay-to-win
Это принципиальный момент. Я сам играл в WoW 8 лет. За всё это время так и не прошёл цепочку квестов на Шадоумурн — это легендарное оружие из ICC, которое нужно выбивать месяцами. Реально сложная цель, к которой идёшь всем рейдом.
А потом заходишь на популярный сервер — и каждый пятый бегает с Шадоумурном. Купил за донат и пошёл. Ты качался полгода, собирал рейд, вайпался на Лич Кинге — а рядом чувак, который просто закинул денег и получил всё за пять минут. И он тебя ваншотит на БГ.
Это убивает весь смысл игры. Когда легендарное оружие можно купить — оно перестаёт быть легендарным. Новичок заходит, видит эту несправедливость и уходит. А за ним уходят и остальные.
На Valor я делаю сервер мечты — где все равны. Шадоумурн? Иди в ICC, собирай рейд, проходи цепочку. Как задумали разработчики. Купить нельзя. Ни за какие деньги.
VIP на сервере — это только удобства: банк, почта, ремонт в любом месте, телепорт друзей к себе. На силу персонажа не влияет вообще.
Прокси и пинг
Сервер стоит в Красноярске. Первый прокси поставил в Москве — пинг 160мс. Перенёс в Новосибирск — упал до 68мс. 800 км вместо 4000. География решает.
Что самое сложное
Не код. Самое сложное — мотивация. Когда сидишь один, пилишь фичу неделю, выкатываешь — и онлайн два человека. Включая тебя.
А потом кто-то заходит, играет три часа, пишет «офигенный сервер» — и ты понимаешь зачем.
Вчера открыл ОБТ. Страшно и волнительно одновременно. Если кому интересно — сервер называется Valor (valor.su). Заходите потыкать, буду рад любому фидбеку.
Оч кайфовая связка под Quick Terminal access, за одно наконец подрезал лишние процессы при инициализации оболочки терминала (fish+rocketship) — снова шустро всё работает. И ничего лишнего.
VIM-like linux i3 вайбы кайфовые. По скорости и удобству напоминает чем-то времена когда я себе SWAY настроил на ArchLinux ✨ Тогда Alacritty в тайлинге использовал по хоткею, но перейдя на MacOS поставил iTerm2, не особо выбирая, тк табы понадобились.
В новом сетапе из коробки норм конфиги, только включил QuickTerminal и его высоту изменил в Ghostty — 5 строчек. Больше ничего не надо, Zellij решает.
Какой терминал используете? Знакомы с Tmux, Zellij?
Всё началось с того, что мой бэклог игр жил в одном месте, список фильмов — в другом, аниме — в третьем. Надоело жонглировать, и я решил сделать одно приложение, где всё это живёт вместе. Так родился Tonkatsu Box.
Что умеет
Ищет по пяти базам данных: IGDB (250 000+ игр на 220 платформах — от Atari 2600 до PS5), TMDB (фильмы и сериалы), VNDB (визуальные новеллы), AniList (манга). Добавляешь в коллекцию, ставишь статус — играю, смотрю, прошёл, бросил, запланировал. Оценка от 1 до 10, личные заметки с мини-маркдауном (жирный, курсив, кликабельные ссылки).
Для сериалов и аниме есть трекер по эпизодам — отмечаешь серии, видишь прогресс по сезонам.
Импорт Steam
Подключаешь аккаунт — приложение подтягивает всю библиотеку, сопоставляет с IGDB, добавляет обложки и рейтинги. Наигранные часы сохраняются в заметках. DLC и саундтреки автоматически фильтруются. Повторный импорт не дублирует — обновляет данные.
Тир-листы
Моя любимая фича. Создаёшь тир-лист из коллекции, перетаскиваешь обложки в ряды S/A/B/C. Можно менять цвета, названия, добавлять свои ряды. Экспорт в PNG для шеринга. Работает для всего — игр, фильмов, аниме.
Почему сделал: люблю тир-листы, ненавижу их создавать. Обычно тратишь 20 минут на поиск обложек и загрузку — а тут всё уже есть из базы данных.
Визуальные доски
Свободный канвас — перетаскиваешь постеры, добавляешь заметки, рисуешь связи между элементами. Удобно для франшиз или планирования просмотров.
Готовые коллекции ретро-игр
Отдельно собрал полные библиотеки для 23 ретро-платформ — NES, SNES, Genesis, PS1, Game Boy и т.д. 25 000+ игр с обложками и рейтингами. Скачиваешь файл, импортируешь — видишь все игры, которые когда-либо выходили на платформе.
Главное
Все API ключи встроены — скачал, открыл, пользуйся. Без регистрации, без облака, без рекламы, без подписок. Все данные хранятся локально на устройстве, работает оффлайн. Open source.
Windows, Linux, Android.
Сейчас в работе интеграция с RetroAchievements и поддержка геймпада на Steam Deck.
За два года непрерывной работы мой неттоп BMAX B2 перестал видеть систему UmbrelOS и, следовательно остановил загрузку/отдачу данных.
Присоединяю к нему монитор и смотрю что не так. Установлена Debian 12.4 без графического интерфейса. На все команды отвечает ошибкой. Решил снести и установить чистую Debian 13. Не получилось. Пишет: ошибка диска.
Вскрываю корпус. Откручиваю M2 SATA-накопитель, переворачиваю, смотрю на наклейку, а там… KSton.
Вот где карма меня настигла. А ведь некоторым людям я рекомендовал этот SSD (правда там были обычные SATA-III), а хватило ему всего двух лет.
Подсоединил накопитель к адаптеру, воткнул в USB-порт – надо же проверить: определит или нет. Определил. Все файлы на месте. Все читаются, но диск показывается полным на 100%. Удалил несколько файлов. Всё равно показывает полный диск.
Теперь нужно купить новый. Цены на брендовые накопители сейчас, конечно, кусаются. Дилемма: купить на пару лет китайский шлак или установить дорогой NvME?
Часто бывает, когда в огромном зоопарке серверов, забываешься где root, а где sudo доступ. Печатаешь по привычке какую команду вроде:
tail /var/log/syslog | grep -i "cron"
и получаешь Permission denied, произносишь "Ну ёшкин кот!" (заменить на свое) и начинаешь листать историю и курсором перемещаться в начало команды чтобы вписать волшебное sudo.
Для себя открыл
sudo !!
Эта команда работает благодаря встроенной функции Bash (и большинства других шеллов, таких как Zsh), где два восклицательных знака (!!) автоматически заменяются на предыдущую выполненную команду целиком.
В этом блоге о Linux публикую полезные команды, терминальные лайфхаки и разные мелочи, которые иногда спасают нервы .
Недавно я начал экспериментировать с OpenClaw - системой агентных инструментов, которая может выполнять задачи на сервере: запускать команды, редактировать файлы, работать с инфраструктурой.
У OpenClaw есть удобная возможность - агент может отправлять уведомления о своей работе в мессенджеры. Например, в Telegram. Идея понятная: агент выполняет задачу, пишет отчёт, а ты можешь следить за этим прямо с телефона.
Но довольно быстро стало понятно, что мессенджеры для этого подходят плохо.
Когда агент начинает работать активно, появляется множество сообщений:
результаты команд
вывод инструментов
изменения файлов
промежуточные шаги выполнения
И всё это превращается в длинную ленту сообщений.
Проблема в том, что мессенджеры просто не рассчитаны на такой тип данных.
В них неудобно:
просматривать результаты tool-вызовов
смотреть diff файлов
понимать структуру выполнения задачи
быстро находить нужный шаг агента
В какой-то момент я поймал себя на мысли, что постоянно делаю одно и то же:
получаю уведомление от агента
открываю SSH
захожу на сервер
проверяю, что он там сделал
И тогда возникла простая мысль: а почему бы не сделать нормальный мобильный интерфейс для наблюдения за работой агента?
Изначально я хотел написать просто viewer для OpenClaw. Приложение, которое может:
подключаться к gateway
показывать список сессий
отображать сообщения агента
показывать результаты инструментов
отображать изменения файлов
Но довольно быстро стало понятно, что одного просмотра недостаточно.
Самой первой задачей было подключение к gateway и отображение истории работы агента.
Хотелось видеть:
список сессий
сообщения
tool results
цепочку выполнения
А также восстанавливать историю, если приложение закрыли.
Технически это оказалось интереснее, чем казалось сначала. Gateway работает через WebSocket, а подключение к нему удобнее всего делать через SSH-туннель.
Поэтому схема подключения получилась примерно такой:
приложение открывает SSH-соединение
поднимает локальный туннель
подключается к gateway через WebSocket
восстанавливает активную сессию
После этого можно смотреть, как агент выполняет задачи.
Но довольно быстро стало понятно, что просто наблюдать недостаточно.
Когда появился SSH
Практически каждый раз возникала одна и та же ситуация:
агент что-то сделал → хочется самому проверить результат.
Например:
открыть файл
посмотреть процессы
проверить логи
запустить команду
И каждый раз приходилось выходить из приложения и открывать обычный SSH-клиент.
Поэтому следующим шагом стало добавление SSH прямо в приложение.
Но хотелось, чтобы это был не просто терминал.
Большинство мобильных SSH-клиентов по сути выполняют команды как отдельные exec-вызовы. Это неудобно, потому что не сохраняется состояние shell.
Я попробовал сделать терминал как persistent shell-сессию, где сохраняются:
текущая директория
окружение
состояние shell
Приложение ставит shell hooks и может понимать:
начало и конец команды
текущую директорию
интерактивные запросы вроде password или yes/no
Это позволило немного лучше интегрировать терминал с остальной частью приложения.
Проблема мобильного терминала
Когда начинаешь работать с сервером с телефона, быстро становится понятно, что многие команды просто плохо читаются.
Например:
docker ps kubectl get pods ps aux
На маленьком экране это превращается в таблицу, которую приходится постоянно скроллить.
Поэтому появилась идея сделать систему rich-output plugins.
Некоторые команды автоматически преобразуются в более удобное представление. Например:
ls
ps
top
docker
kubectl
Вместо стены текста можно показать структурированную карточку с данными.
Это сильно упрощает просмотр состояния системы с телефона.
Ещё одна вещь, которая неожиданно оказалась очень удобной — работа с execution-контекстами.
Когда агент работает с инфраструктурой, он может находиться:
на хосте
внутри Docker-контейнера
внутри Kubernetes pod
И постоянно приходится переключаться между ними.
Поэтому появилась идея execution context stack.
Из приложения можно перейти:
host → container → pod
После такого перехода:
терминал
файловая система
команды
работают уже внутри этого контекста.
То есть можно буквально провалиться в контейнер или pod и продолжить работу.
Работа с файлами
Следующая проблема, которая быстро проявилась — работа с файлами.
Когда агент редактирует файлы, важно понимать:
что именно изменилось
какие строки были добавлены или удалены
Поэтому приложение умеет:
читать файлы на сервере
показывать diff
принимать или отклонять изменения
Это оказалось особенно полезно при работе с агентами.
Docker и Kubernetes
Когда проект начал немного расти, стало понятно, что постоянно вводить команды для проверки состояния контейнеров тоже не очень удобно.
Поэтому появились отдельные экраны для управления инфраструктурой.
Docker:
список контейнеров
volumes
networks
live logs
Kubernetes:
nodes
pods
services
namespaces
live logs
Можно выбрать контейнер или pod и сразу перейти в его execution-контекст.
Ещё одна вещь, которая оказалась полезной — быстрый просмотр состояния сервера.
Приложение периодически собирает базовые метрики через SSH:
CPU
RAM
disk
load average
uptime
Это скорее лёгкий operational dashboard, который позволяет быстро понять, что происходит с сервером.
Позже появился ещё один эксперимент — локальный агент внутри приложения.
В отличие от gateway-режима, где runtime работает на сервере, здесь orchestration происходит прямо в приложении.
Он может:
использовать SSH
выполнять команды
работать с файлами
запрашивать подтверждения
По сути это попытка сделать локального AI-оператора для сервера.
Что получилось в итоге
Изначально это должен был быть просто viewer для OpenClaw.
Но постепенно проект оброс функциями и превратился в нечто большее.
Сейчас из приложения можно:
смотреть работу OpenClaw
подключаться к серверу по SSH
запускать команды
редактировать файлы
управлять Docker
работать с Kubernetes
смотреть системные метрики
И всё это внутри одной сессии.
В какой-то момент это начало выглядеть примерно так:
телефон → OpenClaw → SSH → сервер → контейнер → Kubernetes pod
В каком-то смысле получилась мобильная консоль для сервера.
Что дальше
Проект всё ещё активно развивается, и многие вещи пока остаются экспериментальными.
Мне будет интересно услышать мнение людей, которые:
используют OpenClaw
работают с DevOps инфраструктурой
администрируют свои серверы
Интересно, насколько вообще востребован такой формат — управление сервером с телефона.