Перейти к содержимому
Taoshi

Безопасность: Автоматическая блокировка клавиатуры

Рекомендуемые сообщения

Краткий пример кода для openOS, позволяющий обезопасить ваш терминал от посторонних.

 

Если вы играете на сервере, то наверняка сталкивались с проблемой необходимости блокировки доступа ввода данных посторонними в ваш компьютер/робота. Этот коротенький скрипт поможет вам.

 

План действий:

Итак, включаем компьютер.

Пишем в консоли edit z_protect (или любое другое название файла)

В открывшемся редакторе файлов вписываем (или просто копируем отсюда) следующий код:

Цитата

event=require('event')

function nah(_,_,_,_,u)

  if u~='ник_игрока' --сюда вместо ник_игрока надо вписать ваш ник в игре

    then io.read()

  end

end

return event.listen('key_up',nah)

Не забудьте вписать ваш игровой ник.

Сохраняем, выходим из редактора.

 

Теперь после запуска этого файла никто кроме вас не сможет вводить команды в терминал.

 

Отключить 'слушателя' можно командой

Цитата

event.cancel(номер_слушателя)

Если вам неизвестен номер, можно отключить всех слушателей:

Цитата

local n=0 while event.cancel(true) do print ('listener '..n..'terminated') n=n+1 end

Но это, конечно, если у вас нет каких-то важных перехватчиков. Если они есть вам следует позаботиться о том, чтобы знать номер каждого из них.

 

Если у вас возникнет желание сделать автозапуск скрипта при включении компьютера - просто впишите название этого файла в файл .shrc

Цитата

z_protect

После этого выключите и включите компьютер. 

Готово! Скрипт запустился и будет подменять строку ввода в консоль на своё поле ввода текста если ник пользователя не совпал.

 

Вы можете добавить проверки  для нескольких пользователей. Сделать это просто.

Вписываем между if u~='ник пользователя' и then

Цитата

or u~='ник пользователя 2'

Вставляем так ники всех, кому разрешён доступ к этому компу.

 

 

 

На этом всё.

Успеха в предотвращении доступа к вводу скриптов через ваши терминалы злоумышленниками.

 

Изменено пользователем Taoshi
Добавлено описание метода отключения скрипта

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
38 минут назад, hohserg сказал:

Есть же computer.addUser

https://ocdoc.cil.li/computer_users

Если это робот, то оно при движении слетает. Так что да, как вариант такой способ вполне себе рабочий. Хотя достаточно зажать ctrl+alt+c и вся защита пропадает. А блокировать комбинацию не всегда надо.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, Taoshi сказал:

Отключить 'слушателя' можно командой

Цитата

event.cancel(номер_слушателя)

event.cancel() отменяет таймер. Для отмены слушателя нужен event.ignor(), а для его работы нужен указатель на функцию-слушатель, который остался в z_protect. Так что просто так отключить не получится.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Это просто пример как можно осуществить протект, не более.

Кстати комбо ctrl+alt+c у меня не работает :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 29.01.2022 в 17:08, Asior сказал:

Если это робот, то оно при движении слетает.

Вроде бы раньше список пользователей слетал только при переустановке робота, а движение самого робота не приводило к сбросу списка. Когда это изменилось? Или оно всегда так работало?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
2 часа назад, eu_tomat сказал:

Вроде бы раньше список пользователей слетал только при переустановке робота, а движение самого робота не приводило к сбросу списка. Когда это изменилось? Или оно всегда так работало?

Список изменится (обнулится) только в случае смены адреса устройства. При движении робота его адрес не меняется.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 29.01.2022 в 18:28, hohserg сказал:

Есть же computer.addUser

https://ocdoc.cil.li/computer_users

addUser не во всех случаях применим. Например, в софте могут использоваться ивенты касания монитора другими игроками (руками или ногами, не столь важно). 

П.С.: Также может быть использовано больше одной клавиатуры. В этом случае необходимо дополнительно проверять адрес откуда пришло событие. Но это уже частности.

Изменено пользователем Taoshi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 29.01.2022 в 19:08, Asior сказал:

 

 

В 29.01.2022 в 19:08, Asior сказал:

Хотя достаточно зажать ctrl+alt+c и вся защита пропадает.

А достаточно ли? Попробуйте... 

Мои тесты показали, что комбо неуказанного игрока перехватывается.

 

В 29.01.2022 в 20:46, Zer0Galaxy сказал:

event.cancel() отменяет таймер. Для отмены слушателя нужен event.ignor(), а для его работы нужен указатель на функцию-слушатель, который остался в z_protect. Так что просто так отключить не получится.

Тут я с вами полностью согласен. Отключить полностью не удастся. И для безопасности это довольно хорошо. А после редактирования/отключения в автозагрузке и перезагрузки системы оно само пройдёт. Впрочем, если возникнет необходимость налёту отключать защиту (что в мои планы не входит), то реализовать это довольно просто. Например отправкой необходимых данных в <куда_нибудь>

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 29.01.2022 в 13:40, Taoshi сказал:

Теперь после запуска этого файла никто кроме вас не сможет вводить команды в терминал.

Ой, да сможет...

Скрытый текст

Может, новичка это остановит. Но достаточное количество переводов строк в буфере обмена поможет и препятствия вроде io.read() прочистить, и любую последовательность команд передать на выполнение. Доступ к интерпретатору команд Lua тоже не особо усложнится.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 29.01.2022 в 15:40, Taoshi сказал:

никто кроме вас не сможет вводить команды в терминал.

Но кто угодно сможет скопировать команду в буфер обмена и вставить в комп.

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
4 часа назад, eu_tomat сказал:

Но достаточное количество переводов строк в буфере обмена поможет и препятствия вроде io.read() прочистить, и любую последовательность команд передать на выполнение. Доступ к интерпретатору команд Lua тоже не особо усложнится

 

1 час назад, ProgramCrafter сказал:

Но кто угодно сможет скопировать команду в буфер обмена и вставить в комп.

Угу. Инсерт не перехватывается внутренними средствами. А для ввода команды её надо запуллить после скопированного перевода строки

Изменено пользователем Taoshi

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
15 минут назад, Taoshi сказал:

Нет? Не пробовали?

Ну, теперь попробовал. Получилось. Что и было логично, потому что событие clipboard тоже надо перехватывать.

И лучше бы (возможно) подменять computer.pullSignal, чтобы эвент просто не доходил до системы: в нынешнем варианте кто-то сможет мешать владельцу компа работать.

 

13 минуты назад, Taoshi сказал:

выполнить файл который УЖЕ есть на диске

В том числе и reboot.

А код с pastebin - так тоже просто, есть же команда "pastebin run ..."

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
5 часов назад, ProgramCrafter сказал:

И лучше бы (возможно) подменять computer.pullSignal, чтобы эвент просто не доходил до системы

А может, лучше по старинке через computer.addUser?

Или этот механизм всё-таки ломается при каких-то условиях?

В 29.01.2022 в 17:08, Asior сказал:

Если это робот, то оно при движении слетает.

Есть какие-то идеи на этот счёт?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
19 часов назад, eu_tomat сказал:

Есть какие-то идеи на этот счёт?

Метод защиты робота есть. Он не так короток и прост, как хотелось бы, но всё ещё элементарен.

 

Предварительно устанавливаем таймеры всех обработчиков событий в openOS в бесконечность(0). После этого прервать работу исполняемых программ с клавиатуры не представляется возможным.

Роботу при сборке комплектуем motion sensor. Устанавливаем ранг сканирования в, допустим, 7 блоков.

Запускаем новый обработчик события настроенный на работу с сенсором. Теперь, если в пределах указанного расстояния появляется неизвестный игрок и если расстояние меньше 5 (то есть может дотянуться до робота), есть варианты.

Например:

1. Робот продолжает работу, так как после остановки обработчиков событий его программу прервать с клавиатуры вроде как невозможно.

2. Робот ничего не делал, автозапуска программ на нём нет, и ему надо защищаться. В обработчике событий движения смотрим, кто тут, и если что не так, то просто выполняем цикл ожидания в предпочитаемом по размеру промежутке времени. Например, начинаем 'зоонаблюдать' изнутри обработчика за дальнейшими ивентами датчика движения. Или агрессивно нападаем. Или предпочитаем тактический манёвр отступления. Ну тут уже вариантов уйма, лишь бы выполнялся код и не мельтешило приглашающее поле ввода на экране монитора робота.

 

Экран, кстати говоря, можно отключить на период событий. Притвориться, что его и вовсе нет. Как, возможно, и клавиатуры :-)

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Так же предварительная остановка всех системных обработчиков событий и выполнение кода ожидания после включения должно предотвратить несанкционированный доступ, прекращая свою работу только по получению эвента нажатия от ожидаемого пользователя d:-D.

Конечно, это не так элегантно как хотелось бы. А хотелось бы манить мерцающим полем ввода и не пущать :-)

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
1 час назад, Taoshi сказал:
22 часа назад, eu_tomat сказал:

Есть какие-то идеи на этот счёт?

Метод защиты робота есть. Он не так короток и прост, как хотелось бы, но всё ещё элементарен.

Ой! Спасибо, конечно, но не такого ответа я ожидал. Уточню свой вопрос. Костыли меня интересуют в последнюю очередь. Интереснее другое: можно ли в данном случае обойтись без костылей?

 

До этой темы многие из нас использовали стандартное решение:

В 29.01.2022 в 16:28, hohserg сказал:

Есть же computer.addUser

https://ocdoc.cil.li/computer_users

Но, как оказалось, не все столь же оптимистичны:

В 29.01.2022 в 17:08, Asior сказал:

Если это робот, то оно при движении слетает.

 

Мой вопрос:  Действительно ли список доступа computer.users слетает при движении робота, и как это воспроизвести?

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

В локалке установил список доступа:

userAdd Zer0Galaxy

Проверил список:

local computer = require "computer"

for k,user in pairs({computer.users()}) do
  print( user )
end
-- Zer0Galaxy

Выполнил несколько движений, поворотов, действий с блоками:

r=require"robot"
for i=1,10 do
  r.forward(1)
end
r.swingDown()
r.turnLeft()
r.turnLeft()
for i=1,10 do
  r.forward(1)
end
r.place()

Снова проверил список:

local computer = require "computer"

for k,user in pairs({computer.users()}) do
  print( user )
end
-- Zer0Galaxy

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

@Zer0Galaxy У меня в локальной игре тоже всё работает. Да и на серверах раньше работало. Точнее говоря, я не помню каких-либо проблем.

@Asior А ты можешь воспроизвести этот эксперимент на том сервере, где список пользователей слетает? И что за сервер, если не секрет?

 

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах
В 03.02.2022 в 13:01, eu_tomat сказал:

А ты можешь воспроизвести этот эксперимент на том сервере, где список пользователей слетает? И что за сервер, если не секрет?

Так, эксперимент провел на сервере кристаликса. Да, действительно useradd не слетает. И я собственно вспомнил, почему я считал, что такая защита не имеет смысла. Если заприватить компьютер, он становится практически нерушимым. А приват робота не дает только открыть его, а срубить и упереть может любой игрок. Ну а при разрушении собственно useradd слетает.

Так что да, придется городить защиту.

 

Поделиться сообщением


Ссылка на сообщение
Поделиться на других сайтах

Присоединяйтесь к обсуждению

Вы можете написать сейчас и зарегистрироваться позже. Если у вас есть аккаунт, авторизуйтесь, чтобы опубликовать от имени своего аккаунта.

Гость
Ответить в тему...

×   Вы вставили отформатированное содержимое.   Удалить форматирование

  Разрешено использовать не более 75 эмодзи.

×   Ваша ссылка была автоматически встроена.   Отобразить как ссылку

×   Ваш предыдущий контент был восстановлен.   Очистить редактор

×   Вы не можете вставлять изображения напрямую. Загружайте или вставляйте изображения по ссылке.


×
×
  • Создать...