polyglot API を使用して、非常に単純な Python コードを実行しようとしています。次のような単純なテストでも実行しようとすると:
@Test
public void printSomTextPythonTest() throws ScriptExecutionException, IOException {
String code = "print('Python will print this to the console!')";
String[] supportedLangs = { "js", "python", "R" };
Context testContext = Context.newBuilder(supportedLangs)
.allowAllAccess(false)
.allowHostAccess(false)
.allowHostClassLoading(false)
.allowIO(false)
.allowNativeAccess(false)
.allowCreateThread(false)
.build();
Source source = Source.newBuilder("python", code, "pyScript").build();
Value result = testContext.eval(source);
testContext.close();
}
または:
@Test
public void setAVariablePythonTest() throws ScriptExecutionException, IOException {
String code = "someNumber = 11";
String[] supportedLangs = { "js", "python", "R" };
Context testContext = Context.newBuilder(supportedLangs)
.allowAllAccess(false)
.allowHostAccess(false)
.allowHostClassLoading(false)
.allowIO(false)
.allowNativeAccess(false)
.allowCreateThread(false)
.build();
Source source = Source.newBuilder("python", code, "pyScript").build();
Value result = testContext.eval(source);
testContext.close();
}
このエラーが発生します (以下のスタック トレース):
org.graalvm.polyglot.PolyglotException: java.lang.SecurityException: Operation is not allowed for: /code/polyglot-test
コンテキストを構築するときに allowIO を true に変更すると、コードは正常に実行され、期待される結果が得られます。より複雑なコードでも試してみましたが、同じ結果が得られました。
Python コードを実行するために IO アクセスが必要なのはなぜですか?
JS で記述および実行される同等のコードは、allowIO を true に設定する必要がないため、Python 固有のもののように思えます。
ご協力いただきありがとうございます。
アップデート
R もゲスト言語としてテストしています。次のテストを実行します。
@Test
public void helloWorldRTest() throws ScriptExecutionException, IOException {
String code = "print(\"R will print this to the console!\")";
String[] supportedLangs = { "js", "python", "R" };
Context testContext = Context.newBuilder(supportedLangs)
.allowAllAccess(false)
.allowHostAccess(false)
.allowHostClassLoading(false)
.allowIO(false)
.allowNativeAccess(false)
.allowCreateThread(false)
.build();
Source source = Source.newBuilder("R", code, "rScript").build();
Value result = testContext.eval(source);
testContext.close();
}
次のエラーが表示されます。
FastR の予期しないエラー: /Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/languages/R/lib/libR.dylib からの libR の読み込み中にエラーが発生しました。NFI バックエンドで実行している場合、システム プロパティ「truffle.nfi.library」の値として libtrufflenfi.so の場所を指定しましたか? 現在の値は「null」です。OpenMP ランタイム ライブラリ (libgomp.so) はシステムに存在しますか? このライブラリは、たとえば、通常、GCC パッケージの一部です。詳細: ホスト環境によってネイティブ コードへのアクセスが許可されていません。
ただし、「allowNativeAccess」を true に設定すると、コードはエラーなしで正常に実行されます。
言語が異なれば、実行するために必要なアクセス権限の種類も異なりますか?
私のユースケースでは、実行を可能な限りサンドボックス化しようとしています。スクリプトがどの言語で書かれているかに関係なく、与えられたデータにのみアクセスできるようにするスクリプトが必要です。ゲスト言語で実行されるスクリプトは、ホスト システムにアクセスできません。これは達成可能ですか?
部分的なスタック トレース(デバッグに必要な場合は、完全なスタック トレースを提供できます):
org.graalvm.polyglot.PolyglotException: java.lang.SecurityException: 操作は許可されていません: /code/polyglot-test at com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.forbidden(FileSystems.java:489) com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.checkAccess(FileSystems.java:367) at com.oracle.truffle.api.TruffleFile.checkAccess(TruffleFile.java:983) at com.oracle.truffle.api. TruffleFile.exists(TruffleFile.java:102) at com.oracle.graal.python.builtins.modules.PosixModuleBuiltins$StatNode.stat(PosixModuleBuiltins.java:404) at com.oracle.graal.python.builtins.modules.PosixModuleBuiltins$ StatNode.doStat(PosixModuleBuiltins.java:397) com.oracle.graal.python.builtins.modules.PosixModuleBuiltinsFactory$StatNodeFactory$StatNodeGen.executeAndSpecialize(PosixModuleBuiltinsFactory.java:855) com.oracle.graal.python.builtins.modules.PosixModuleBuiltinsFactory$StatNodeFactory$StatNodeGen.execute(PosixModuleBuiltinsFactory.java:807) at com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode$BuiltinBinaryCallNode.execute(BuiltinFunctionRootNode.java:103) com.oracle.graal.python.nodes.function.BuiltinFunctionRootNode.execute(BuiltinFunctionRootNode.java:229) at stat(不明) at stat(../../../../../Library/Java/JavaVirtualMachines /graalvm-ee-1.0.0-rc4/Contents/Home/jre/languages/python/lib-graalpython/posix.py:51:2230-2247) at _path_stat(../../../../ ../Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/languages/python/lib-python/3/importlib/_bootstrap_external.py:82:2759-2772) at _path_is_mode_type( ../../../../../Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/languages/python/lib-python/3/importlib/_bootstrap_external.py:88:2901-2916) _path_isdir(../../../../../ Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/languages/python/lib-python/3/importlib/_bootstrap_external.py:103:3245-3278) で path_hook_for_FileFinder(../ ../../../../Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/languages/python/lib-python/3/importlib/_bootstrap_external.py: 1333:50397-50413) PathFinder._path_hooks(../../../../../Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/languages/ python/lib-python/3/importlib/_bootstrap_external.py:1083:40517-40526) で PathFinder._path_importer_cache(../../../../../Library/Java/JavaVirtualMachines/graalvm-ee- 1.0。0-rc4/Contents/Home/jre/languages/python/lib-python/3/importlib/_bootstrap_external.py:1107:41279-41299) で PathFinder._get_spec(../../../../. ./Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/languages/python/lib-python/3/importlib/_bootstrap_external.py:1135:42391-42421) で PathFinder.find_spec (../../../../../Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/languages/python/lib-python/3/importlib/ _bootstrap_external.py:1166:43686-43722) で _find_spec(../../../../../Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/ languages/python/lib-python/3/importlib/_bootstrap.py:892:28932-28960) at _find_and_load_unlocked(../../../../../Library/Java/JavaVirtualMachines/graalvm-ee- 1.0.0-rc4/Contents/Home/jre/languages/python/lib-python/3/importlib/_bootstrap.py:953:31192-31213) _find_and_load(../../../../../Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/languages/python/lib- で) python/3/importlib/_bootstrap.py:968:31701-31738) _gcd_import(../../../../../Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/で) Contents/Home/jre/languages/python/lib-python/3/importlib/_bootstrap.py:985:32285-32317) で インポート(../../../../../Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/languages/python/lib-python/3/importlib /_bootstrap.py:1066:35366-35382) で (../../../../../Library/Java/JavaVirtualMachines/graalvm-ee-1.0.0-rc4/Contents/Home/jre/言語/python/lib-graalpython/ builtins_patches.py:48:2220-2224) で org.graalvm.polyglot.Context.eval(Context.java:313) で Bolt.tests.BoltEngineGraalTest.helloWorldPythonTest(BoltEngineGraalTest.java:66) で sun.reflect.NativeMethodAccessorImpl.invoke0( Native Method) で sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) で sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) で java.lang.reflect.Method.invoke(Method.java:498) でorg.junit.runners.model.FrameworkMethod$1.runReflectiveCall(FrameworkMethod.java:50) で org.junit.internal.runners.model.ReflectiveCallable.run(ReflectiveCallable.java:12) で org.junit.runners.model. FrameworkMethod.invokeExplosively(FrameworkMethod.java:47) org.junit.internal.runners.statements.InvokeMethod.evaluate(InvokeMethod.java:17) org.junit.internal.org.junit.internal.runners.statements.RunAfters.evaluate(RunAfters.java:27) の runners.statements.RunBefores.evaluate(RunBefores.java:26) org.junit.runners.ParentRunner.runLeaf(ParentRunner.java: 325) org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:78) で org.junit.runners.BlockJUnit4ClassRunner.runChild(BlockJUnit4ClassRunner.java:57) で org.junit.runners.ParentRunner$3.run(ParentRunner. java:290) org.junit.runners.ParentRunner$1.schedule(ParentRunner.java:71) で org.junit.runners.ParentRunner.runChildren(ParentRunner.java:288) で org.junit.runners.ParentRunner.access$000 (ParentRunner.java:58) org.junit.runners.ParentRunner$2.evaluate(ParentRunner.java:268) org.junit.runners.ParentRunner.run(ParentRunner.java:363) org.eclipse.jdt.internal .junit4.runner.org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) の JUnit4TestReference.run(JUnit4TestReference.java:86) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests( RemoteTestRunner.java:538) の org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) の org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java: 460) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) 元の内部エラー: java.lang.SecurityException: 操作は許可されていません: /code/polyglot-test at com. oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.forbidden(FileSystems.java:489) at com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.checkAccess(FileSystems.java:367) ...run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner. java:538) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) で org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) でorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) 元の内部エラー: java.lang.SecurityException: 操作は許可されていません: com.oracle の /code/polyglot-test。 truffle.api.vm.FileSystems$DeniedIOFileSystem.forbidden(FileSystems.java:489) com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.checkAccess(FileSystems.java:367) ...run(JUnit4TestReference.java:86) at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38) at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner. java:538) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) で org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) でorg.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) 元の内部エラー: java.lang.SecurityException: 操作は許可されていません: com.oracle の /code/polyglot-test。 truffle.api.vm.FileSystems$DeniedIOFileSystem.forbidden(FileSystems.java:489) com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.checkAccess(FileSystems.java:367) ...org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538) の TestExecution.run(TestExecution.java:38) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests( RemoteTestRunner.java:760) の org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) の org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java: 206) 元の内部エラー: java.lang.SecurityException: Operation is not allowed for: /code/polyglot-test at com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.forbidden(FileSystems.java:489) at com. oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.checkAccess(FileSystems.java:367) ...org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:538) の TestExecution.run(TestExecution.java:38) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests( RemoteTestRunner.java:760) の org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) の org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java: 206) 元の内部エラー: java.lang.SecurityException: Operation is not allowed for: /code/polyglot-test at com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.forbidden(FileSystems.java:489) at com. oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.checkAccess(FileSystems.java:367) ...538) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) で org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) で org .eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) 元の内部エラー: java.lang.SecurityException: 操作は許可されていません: com.oracle.truffle の /code/polyglot-test。 api.vm.FileSystems$DeniedIOFileSystem.forbidden(FileSystems.java:489) at com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.checkAccess(FileSystems.java:367) ...538) org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:760) で org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:460) で org .eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:206) 元の内部エラー: java.lang.SecurityException: 操作は許可されていません: com.oracle.truffle の /code/polyglot-test。 api.vm.FileSystems$DeniedIOFileSystem.forbidden(FileSystems.java:489) at com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.checkAccess(FileSystems.java:367) ...main(RemoteTestRunner.java:206) 元の内部エラー: java.lang.SecurityException: Operation is not allowed for: /code/polyglot-test at com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.forbidden(FileSystems.java :489) com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.checkAccess(FileSystems.java:367) で ...main(RemoteTestRunner.java:206) 元の内部エラー: java.lang.SecurityException: Operation is not allowed for: /code/polyglot-test at com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.forbidden(FileSystems.java :489) com.oracle.truffle.api.vm.FileSystems$DeniedIOFileSystem.checkAccess(FileSystems.java:367) で ...