Skip to content

Commit 435ee4e

Browse files
committed
feat: secure class accessor for graalvm
1 parent a0c83c3 commit 435ee4e

File tree

5 files changed

+63
-9
lines changed

5 files changed

+63
-9
lines changed

README.md

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ For adding a library only:
1717
<dependency>
1818
<groupId>com.instancify.scriptify</groupId>
1919
<artifactId>core</artifactId>
20-
<version>1.3.1-SNAPSHOT</version>
20+
<version>1.3.3-SNAPSHOT</version>
2121
</dependency>
2222
```
2323

@@ -26,12 +26,12 @@ For adding a library with JS for Rhino or GraalVM:
2626
<dependency>
2727
<groupId>com.instancify.scriptify</groupId>
2828
<artifactId>script-js-rhino</artifactId>
29-
<version>1.3.1-SNAPSHOT</version>
29+
<version>1.3.3-SNAPSHOT</version>
3030
</dependency>
3131
<dependency>
3232
<groupId>com.instancify.scriptify</groupId>
3333
<artifactId>script-js-graalvm</artifactId>
34-
<version>1.3.1-SNAPSHOT</version>
34+
<version>1.3.3-SNAPSHOT</version>
3535
</dependency>
3636
```
3737
## Gradle
@@ -45,11 +45,11 @@ maven {
4545

4646
For adding a library only:
4747
```groovy
48-
implementation "com.instancify.scriptify:core:1.3.1-SNAPSHOT"
48+
implementation "com.instancify.scriptify:core:1.3.3-SNAPSHOT"
4949
```
5050

5151
For adding a library with JS for Rhino or GraalVM:
5252
```groovy
53-
implementation "com.instancify.scriptify:script-js-rhino:1.3.1-SNAPSHOT"
54-
implementation "com.instancify.scriptify:script-js-graalvm:1.3.1-SNAPSHOT"
53+
implementation "com.instancify.scriptify:script-js-rhino:1.3.3-SNAPSHOT"
54+
implementation "com.instancify.scriptify:script-js-graalvm:1.3.3-SNAPSHOT"
5555
```

build.gradle.kts

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ java {
1212

1313
allprojects {
1414
group = "com.instancify.scriptify"
15-
version = "1.3.2-SNAPSHOT"
15+
version = "1.3.3-SNAPSHOT"
1616
}
1717

1818
subprojects {

script-js-graalvm/src/main/java/com/instancify/scriptify/script/JsScript.java

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -7,12 +7,13 @@
77
import com.instancify.scriptify.api.script.function.ScriptFunction;
88
import com.instancify.scriptify.api.script.function.ScriptFunctionManager;
99
import com.instancify.scriptify.api.script.security.ScriptSecurityManager;
10+
import com.instancify.scriptify.api.script.security.exclude.ClassSecurityExclude;
11+
import com.instancify.scriptify.api.script.security.exclude.SecurityExclude;
1012
import com.instancify.scriptify.core.script.security.StandardSecurityManager;
1113
import org.graalvm.polyglot.*;
1214

1315
public class JsScript implements Script<Value> {
1416

15-
private final Context context = Context.create();
1617
private final ScriptSecurityManager securityManager = new StandardSecurityManager();
1718
private ScriptFunctionManager functionManager;
1819
private ScriptConstantManager constantManager;
@@ -44,6 +45,25 @@ public void setConstantManager(ScriptConstantManager constantManager) {
4445

4546
@Override
4647
public Value eval(String script) throws ScriptException {
48+
Context.Builder builder = Context.newBuilder("js")
49+
.allowHostAccess(HostAccess.ALL);
50+
51+
// If security mode is enabled, search all exclusions
52+
// and add the classes that were excluded to JsSecurityClassAccessor
53+
if (securityManager.getSecurityMode()) {
54+
JsSecurityClassAccessor classAccessor = new JsSecurityClassAccessor();
55+
for (SecurityExclude exclude : securityManager.getExcludes()) {
56+
if (exclude instanceof ClassSecurityExclude classExclude) {
57+
classAccessor.addAllowedClass(classExclude.getValue());
58+
}
59+
}
60+
builder.allowHostClassLookup(classAccessor);
61+
} else {
62+
builder.allowHostClassLookup(className -> true);
63+
}
64+
65+
Context context = builder.build();
66+
4767
Value bindings = context.getBindings("js");
4868

4969
if (functionManager != null) {
@@ -62,6 +82,8 @@ public Value eval(String script) throws ScriptException {
6282
return context.eval("js", script);
6383
} catch (Exception e) {
6484
throw new ScriptException(e);
85+
} finally {
86+
context.close();
6587
}
6688
}
6789
}
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
package com.instancify.scriptify.script;
2+
3+
import com.instancify.scriptify.api.script.security.SecurityClassAccessor;
4+
import org.graalvm.polyglot.PolyglotException;
5+
6+
import java.util.HashSet;
7+
import java.util.Set;
8+
import java.util.function.Predicate;
9+
10+
public class JsSecurityClassAccessor implements Predicate<String>, SecurityClassAccessor {
11+
12+
private final Set<String> allowedClasses = new HashSet<>();
13+
14+
public JsSecurityClassAccessor() {
15+
this.allowedClasses.add(PolyglotException.class.getName());
16+
}
17+
18+
@Override
19+
public Set<String> getAllowedClasses() {
20+
return allowedClasses;
21+
}
22+
23+
@Override
24+
public void addAllowedClass(String allowedClass) {
25+
this.allowedClasses.add(allowedClass);
26+
}
27+
28+
@Override
29+
public boolean test(String className) {
30+
return this.allowedClasses.contains(className);
31+
}
32+
}

script-js-rhino/src/main/java/com/instancify/scriptify/script/JsScript.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,7 +50,7 @@ public Object eval(String script) throws ScriptException {
5050
ScriptableObject scope = context.initStandardObjects();
5151

5252
// If security mode is enabled, search all exclusions
53-
// and add the classes that were excluded to JsSafeClassShutter
53+
// and add the classes that were excluded to JsSecurityClassAccessor
5454
if (securityManager.getSecurityMode()) {
5555
JsSecurityClassAccessor classAccessor = new JsSecurityClassAccessor();
5656
for (SecurityExclude exclude : securityManager.getExcludes()) {

0 commit comments

Comments
 (0)