linux - 使用 Scala 解释器 API 时保护系统

标签 linux scala security scala-reflect scala-repl

我为 scala 创建了简单的 REPL 机器人。

它在linux环境下运行,在对话框中处理编写的scala代码,并给出结果:

例如

user| 1+1
bot | res0: Int = 2
user| res0 + 3
bot | res1: Int = 5
...

我用了scala interpreter API为此目的。

将给定的 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 /").!!

bot 将提供对系统文件的访问权限。 我还在 https://scastie.scala-lang.org/ 中尝试了这个代码片段并可以访问系统文件。但我认为他们在 docker 容器中运行 REPL 并且没有问题。

有什么方法可以限制运行我的机器人的 jvm 实例访问系统文件,或者我可以在 REPL API 配置中限制文件访问?

此时我正在对'scala.sys'或'java.io'子字符串给定字符串进行分析,但我认为它不可靠。

还有其他安全漏洞吗?

最佳答案

据我所知,构建到 JVM 中的解决方案是 SecurityManager .

您可以使用它来限制对 JVM 各种功能的访问,例如限制对文件、请求、反射等的访问。不过我还没有测试过它(尤其是在 REPL 的上下文中),您可能会以根本不会阻止 REPL 工作的方式限制事物存在问题。

替代方案,我认为会更安全,将您的 REPL 作为一个单独的进程运行,在系统级别没有访问权限 - 基本上创建一个非常受限的用户,在该进程中运行第二个 JVM 并通过一些 RPC 进行通信 - 这种方式操作系统本身将负责阻止所有恶意用户的尝试。

尽管为了更安全,我还是将两者结合起来:在单独的进程中运行 REPL,在系统级别上具有有限的访问权限,以及 SecurityManager

正如您所注意到的,Scastie 只需使用 Docker 即可解决此问题 - 如果您将 Docker 配置为限制每个图像的 CPU、内存和磁盘空间量,并且不从主机向图像公开任何内容。

那么你“唯一”的麻烦就是崩溃/幽灵之类的漏洞利用。但在这一点上,您应该咨询一些安全专家,因为 SO 对此可能过于笼统。

关于linux - 使用 Scala 解释器 API 时保护系统,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56269848/

相关文章:

linux - 如何安装 Fortran 编译器 (gcc42-fortran)

在 c 中创建一个识别注释的 shell

scala - 选项[io.databaker.env.EnvValue],但类型F在类型上是不变的

php - mysql_real_escape_string 的 PDO 等效项是什么?

c++ - 使用 SDDL 或手动创建安全描述符之间的区别?

linux - 读取用户输入(应该是 linux 命令)并执行

linux - GIT 提交后,我做了 GIT 推送,但消息说一切都是最新的

scala - 在我停止作业之前,Spark Structured Streaming writestream 不会写入文件

scala - 使用 Specs2 测试 Akka

c# - NetSqlAzMan vs AzMan vs (?????)