Как обеспечить java безопасность для пакетов из белого списка, используя java менеджер безопасности? - PullRequest
0 голосов
/ 28 января 2020

Проблема: Я пытаюсь ввести все ограничения (черные списки) и разрешить только то, что я предоставил, когда мы выполняем groovy, используя GroovyClassLoader

Я могу выполнение пользовательской политики с ограниченным разрешением только для GroovyClassLoader .

Теперь я пытаюсь предоставить ограничение пакета, которое будет использоваться как часть выполнения groovy. Допустим, если я разрешил com.xy этот пакет, если какой-либо пакет, отличный от этого, использованного в groovy, должен выдать SecurityException

Я пытался добиться того же с настраиваемый менеджер безопасности и переопределение checkPackageAccess, но не удалось.

    public TestSecurityManager extends SecurityManager{

    List<String> whiteListedPkgList;

     public void checkPackageAccess(String pkg){
         if(!pkg.startWith(any of given white list pkg)){
           throw new SecurityException("Access Denied");
           }
        //If package not belong to whilelisted package list throw security exception
       }
    }

Когда я попробовал использовать вышеуказанный подход, нам нужно предоставить все пакеты для выполнения , например com, java et c вместо java .nio.file . в списке белого списка

ОБНОВЛЕНИЕ

Если мы попытаемся разрешить пакет типа com.xy , используя сравнение белого списка, используя запуск с проверкой доступа pkg, это разрешит этот пакет, но позже он сгенерирует исключение безопасности для com пакета.

Может ли кто-нибудь помочь так же, как мы можем его достичь?

Заранее спасибо

1 Ответ

1 голос
/ 28 января 2020

Если у вас есть возможность, вместо использования Java SecurityManager, использовать функции Groovy DSL, вам будет проще достичь этого.

См. https://www.groovy-lang.org/dsls.html#_secure_ast_customizer

Пример:

import groovy.transform.CompileStatic
import org.codehaus.groovy.control.CompilerConfiguration
import org.codehaus.groovy.control.customizers.CompilationCustomizer
import org.codehaus.groovy.control.customizers.SecureASTCustomizer

@CompileStatic
class Main {
    static final CompilationCustomizer scz = new SecureASTCustomizer().with {
        closuresAllowed = false // user will not be able to write closures
        methodDefinitionAllowed = false // user will not be able to define methods
        importsWhitelist = [] // empty whitelist means imports are disallowed
        staticImportsWhitelist = [] // same for static imports
        staticStarImportsWhitelist = ['java.lang.Math'] // only java.lang.Math is allowed
        constantTypesClassesWhiteList = [
                Integer,
                Float,
                Long,
                Double,
                BigDecimal,
                Integer.TYPE,
                Long.TYPE,
                Float.TYPE,
                Double.TYPE,
                Object,
                String,
        ].asImmutable() as List<Class>
        // method calls are only allowed if the receiver is of one of those types
        // be careful, it's not a runtime type!
        receiversClassesWhiteList = [
                Math,
                Integer,
                Float,
                Double,
                Long,
                BigDecimal,
                PrintStream,
                Object,
        ].asImmutable() as List<Class>

        it
    }

    static void main(args) {
        def configuration = new CompilerConfiguration()
        configuration.addCompilationCustomizers(scz)

        // evaluate sandboxed code
        new GroovyShell(configuration).evaluate(
                """ println 'hello world' """)
    }

}

Если все, что вам нужно, это внести в белый список определенные классы, вы также можете попробовать написать собственный загрузчик классов и использовать его для оценки изолированного сценария:

class MyClassLoader extends ClassLoader {

    Set<String> whiteListPackages = [
            'java.lang.', 'java.util.', 'groovy.', 'org.codehaus.groovy.', 'Script'
    ]

    MyClassLoader(ClassLoader parent) {
        super(parent)
    }

    @Override
    protected Class<?> loadClass(String name, boolean resolve) throws ClassNotFoundException {
        if (!whiteListPackages.any { okPkg -> name.startsWith(okPkg) }) {
            throw new ClassNotFoundException('Access is forbidden')
        }
        return super.loadClass(name, resolve)
    }
}

def shell = new GroovyShell(new MyClassLoader(GroovySystem.classLoader))

// evaluate the script with our own classloader
shell.evaluate('''
println 'hello'
println([1,2,3])

// This line throws an error because the `java.net` package is not whitelisted
println(new URL('https://groovy-lang.org'))
''')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...