当前位置: 首页 > 知识库问答 >
问题:

使用SecureASTCustomizer从groovy创建和删除限制等文件操作

赵高雅
2023-03-14

我希望限制文件操作,如创建文件、删除文件等。我已经与SecureASTCustomizer进行了检查,但这仅限于导入包级别。如果任何一个在groovy类中直接使用而没有导入包,那么它就是允许脚本和允许do操作,这就是我们面临的问题。我尝试过这一点,但没有成功。

MethodCallExpression methodCall = new MethodCallExpression(new VariableExpression("file"), "delete", MethodCallExpression.NO_ARGUMENTS);
           List l= new ArrayList<>();
            l.add(methodCall);
           secure.setExpressionsBlacklist(l);

是否可以仅限制特定类的少数方法,如文件的删除方法、新文件创建等。?请建议使用groovy实现这一点的任何方法。

共有1个答案

管翼
2023-03-14

据我所知,您不能禁止调用某些类,但您可以使用Groovy metaClass全局替换对某些方法的调用。

例如,在评估您可能拥有的任何脚本之前,可以将此代码段添加到其文本中:

File.metaClass.delete = {
    println "We ain't deleting no files!"
    return false
}

当一些Groovy代码调用File#delete()时,它将运行这个lambda而不是实际的方法

示例:

final shell = new GroovyShell()

final result = shell.evaluate '''
// our "protection"
File.metaClass.delete = {
    println "We ain't deleting no files!"
}

// the actual script
def f = new File('hello.txt')
def deleted = f.delete()
if (deleted) 'DELETED THE FILE!!'
else "File exists? ${f.isFile()}"
'''

println result

运行此命令将打印此内容(假设工作目录中存在hello.txt):

We ain't deleting no files!
File exists? true

这对于DSL来说已经足够好了,但是它很容易绕过。

旁路示例:

File.metaClass.delete = {
    println "We ain't deleting no files!"
}

// malicious scripts
@groovy.transform.CompileStatic
class NonGroovy {
    static deleteFile(File f) {
        f.delete()
    }
}
def f = new File('hello.txt')
def deleted = NonGroovy.deleteFile(f)
if (deleted) 'DELETED THE FILE!!'
else "File exists? ${f.isFile()}"

此打印:

DELETED THE FILE!!

有更多的旁路比你可能可以防御!

如果这是出于安全目的,我建议实际使用Java的SecurityManager,并仔细为脚本设置策略,或者告诉Groovy编译器使用您自己的类加载器实现,只加载可以安全使用的类(也可能很难做到,但加上您可以在SecureASTCustomizer上设置的限制,这可能是可以管理的)。

也检查这篇博文:https://levelup.gitconnected.com/secure-groovy-script-execution-in-a-sandbox-ea39f80ee87

它提到的这个GitHub项目试图在Jenkins CI的上下文中实现一个安全的沙盒:https://github.com/jenkinsci/groovy-sandbox

 类似资料:
  • 连接MySQL操作 mysql -h 主机地址 -u 用户名 -p 用户密码 注:-u与root可以不用加空格,其它参数也一样。 DEMO 打开电脑CMD,输入 mysql -h 127.0.0.1 -u root -p 回车,然后输入密码。就可以连接到本地的MySQL数据库。 创建MySQL用户 CREATE USER 'username'@'host' IDENTIFIED BY 'passw

  • 我在下面的代码中尝试在目录中创建新文件,它是文件,并且工作正常。 现在,每次运行代码时,我都希望在创建新的xml文件之前从这个目录中删除以前的xml文件,因为xml文件很大,可能会占用我的临时空间。xml文件具有特定的命名约定。所以它应该删除所有的文件。 我不确定我们是否可以使用在这里或如何使用它,因为我对java文件处理非常陌生,不知道在代码中做什么和在哪里做更改:

  • 在7.1节中介绍过,Entry的getDirectory和getFile方法可以获取和创建子目录和文件,在本节将主要讲解创建目录和文件。同时也会介绍删除目录和文件的方法。 在调用getDirectory方法时,如果在参数对象中指定create属性为true,则会创建相应的子目录,如: chrome.fileSystem.chooseEntry({type: 'openDirectory'}, fu

  • 我正在使用gradle构建一个Spring Boot应用程序,我希望从war中删除文件,因为该文件将从外部加载(它运行在tomcat容器中,而不是嵌入式的)。 我查看了StackOverflow和Gradle文档,试图找出该做什么,但我不知道该绑定到哪个阶段,以及在创建war之前还是之后排除该文件。处理文件似乎也有多种方法。 我相信Maven使用作为等价物。

  • 对于我当前的项目,我需要利用WatchService来跟踪给定目录中的事件。我的代码主要基于Oracles WatchService教程示例 但是,我需要将其限制为仅文件夹事件(例如ENTRY_CREATE C:\temp\folder_a)。 我试图做的是对目录的内容进行初始快照,并将每个内容路径存储到dirCache或fileCache中 如果注册了新事件,则应检查: 事件上下文是文件缓存中的