Я создал простой REPL
бот для scala
.
Он работает в среде Linux и обрабатывает записанный scala
код в диалоговых окнах и дает результат:
Например
user| 1+1
bot | res0: Int = 2
user| res0 + 3
bot | res1: Int = 5
...
Я использовал для этой цели API интерпретатора scala .
Код, который обрабатывает данный string
как код scala:
private val settings = new Settings
settings.processArgumentString(
"""
|-deprecation
|-feature
|-Xfatal-warnings
|-Xlint
|-usejavacp
|""".stripMargin)
def run(code: String, id: Long): (Result, String) = {
stream.reset()
try {
val intp = intpMap.getOrElseUpdate(id, new IMain(settings, new PrintWriter(stream, true)))
timedRun(maxWorkTime)(intp.interpret(code)) -> stream.toString
} catch {
case e: TimeoutException => (Error, s"Долго считать - иди в пень")
}
}
НоВ следующем случае возникает проблема: что если пользователь попытается получить доступ к системным файлам?Например напишет строку:
scala.sys.process.stringToProcess("ls /").!!
бот даст доступ к системным файлам.Я также попробовал этот фрагмент кода в https://scastie.scala -lang.org / и получил доступ к системным файлам.Но я думаю, что они запускают REPL в Docker-контейнере, и с этим нет проблем.
Есть ли способы ограничить доступ экземпляра jvm, на котором работает мой бот, к системным файлам, или, может быть, я могу ограничить доступ к файлам в REPLКонфиги API?
В настоящее время я выполняю анализ заданной строки для подстрок 'scala.sys' или 'java.io', но думаю, что она ненадежна.
И есть ликакие-нибудь другие уязвимости в безопасности?