gpt4 book ai didi

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

转载 作者:太空狗 更新时间:2023-10-29 11:16:59 25 4
gpt4 key购买 nike

我为 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com