YARN-9718. Fixed yarn.service.am.java.opts shell injection. Contributed by Eric Yang
(cherry picked from commit 2e2e5401f2
)
This commit is contained in:
parent
37d1f8c81e
commit
619bd1e876
|
@ -1049,6 +1049,9 @@ public class ServiceClient extends AppAdminClient implements SliderExitCodes,
|
|||
jvmOpts += DEFAULT_AM_JVM_XMX;
|
||||
}
|
||||
|
||||
// validate possible command injection.
|
||||
ServiceApiUtil.validateJvmOpts(jvmOpts);
|
||||
|
||||
CLI.setJVMOpts(jvmOpts);
|
||||
if (hasSliderAMLog4j) {
|
||||
CLI.sysprop(SYSPROP_LOG4J_CONFIGURATION, YARN_SERVICE_LOG4J_FILENAME);
|
||||
|
|
|
@ -127,4 +127,5 @@ public interface RestApiErrorMessages {
|
|||
" not contain a hostname.";
|
||||
String ERROR_KERBEROS_PRINCIPAL_MISSING = "Kerberos principal or keytab is" +
|
||||
" missing.";
|
||||
String ERROR_JVM_OPTS = "Invalid character in yarn.service.am.java.opts.";
|
||||
}
|
||||
|
|
|
@ -61,6 +61,8 @@ import java.util.LinkedHashMap;
|
|||
import java.util.List;
|
||||
import java.util.Map;
|
||||
import java.util.Set;
|
||||
import java.util.regex.Matcher;
|
||||
import java.util.regex.Pattern;
|
||||
|
||||
import static org.apache.hadoop.yarn.service.exceptions.RestApiErrorMessages.ERROR_COMP_DOES_NOT_NEED_UPGRADE;
|
||||
import static org.apache.hadoop.yarn.service.exceptions.RestApiErrorMessages.ERROR_COMP_INSTANCE_DOES_NOT_NEED_UPGRADE;
|
||||
|
@ -240,6 +242,16 @@ public class ServiceApiUtil {
|
|||
}
|
||||
}
|
||||
|
||||
public static void validateJvmOpts(String jvmOpts)
|
||||
throws IllegalArgumentException {
|
||||
Pattern pattern = Pattern.compile("[!~#?@*&%${}()<>\\[\\]|\"\\/,`;]");
|
||||
Matcher matcher = pattern.matcher(jvmOpts);
|
||||
if (matcher.find()) {
|
||||
throw new IllegalArgumentException(
|
||||
RestApiErrorMessages.ERROR_JVM_OPTS);
|
||||
}
|
||||
}
|
||||
|
||||
public static void validateKerberosPrincipal(
|
||||
KerberosPrincipal kerberosPrincipal) throws IOException {
|
||||
try {
|
||||
|
|
|
@ -718,6 +718,12 @@ public class TestServiceApiUtil extends ServiceTestUtils {
|
|||
}
|
||||
}
|
||||
|
||||
@Test(expected = IllegalArgumentException.class)
|
||||
public void testJvmOpts() {
|
||||
String jvmOpts = "`ping -c 3 example.com`";
|
||||
ServiceApiUtil.validateJvmOpts(jvmOpts);
|
||||
}
|
||||
|
||||
public static Service createExampleApplication() {
|
||||
|
||||
Service exampleApp = new Service();
|
||||
|
|
Loading…
Reference in New Issue