Skip to content

Commit 41d7f47

Browse files
Sebastien Hertzandi34
authored andcommitted
Allow debugging only for apps forked from zygote
When starting the runtime from app_process, we only pass JDWP options if starting zygote. It prevents from opening a JDWP connection in non-zygote programs while Android apps (forked from zygote) remain debuggable. CVE-2015-3865 Bug: 23050463 (cherry picked from commit 7a09b83) Change-Id: Ib5b6d3bc4d45389993c3c54226df5a7b72479d19
1 parent 04463e6 commit 41d7f47

File tree

3 files changed

+16
-12
lines changed

3 files changed

+16
-12
lines changed

cmds/app_process/app_main.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -221,14 +221,14 @@ int main(int argc, char* const argv[])
221221

222222
if (zygote) {
223223
runtime.start("com.android.internal.os.ZygoteInit",
224-
startSystemServer ? "start-system-server" : "");
224+
startSystemServer ? "start-system-server" : "", zygote);
225225
} else if (className) {
226226
// Remainder of args get passed to startup class main()
227227
runtime.mClassName = className;
228228
runtime.mArgC = argc - i;
229229
runtime.mArgV = argv + i;
230230
runtime.start("com.android.internal.os.RuntimeInit",
231-
application ? "application" : "tool");
231+
application ? "application" : "tool", zygote);
232232
} else {
233233
fprintf(stderr, "Error: no class name or --zygote supplied.\n");
234234
app_usage();

core/jni/AndroidRuntime.cpp

Lines changed: 12 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -432,7 +432,7 @@ void AndroidRuntime::parseExtraOpts(char* extraOptsBuf)
432432
*
433433
* Returns 0 on success.
434434
*/
435-
int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
435+
int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote)
436436
{
437437
int result = -1;
438438
JavaVMInitArgs initArgs;
@@ -633,11 +633,15 @@ int AndroidRuntime::startVm(JavaVM** pJavaVM, JNIEnv** pEnv)
633633
}
634634
}
635635

636-
/* enable debugging; set suspend=y to pause during VM init */
637-
/* use android ADB transport */
638-
opt.optionString =
639-
"-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y";
640-
mOptions.add(opt);
636+
/*
637+
* Enable debugging only for apps forked from zygote.
638+
* Set suspend=y to pause during VM init and use android ADB transport.
639+
*/
640+
if (zygote) {
641+
opt.optionString =
642+
"-agentlib:jdwp=transport=dt_android_adb,suspend=n,server=y";
643+
mOptions.add(opt);
644+
}
641645

642646
ALOGD("CheckJNI is %s\n", checkJni ? "ON" : "OFF");
643647
if (checkJni) {
@@ -802,7 +806,7 @@ char* AndroidRuntime::toSlashClassName(const char* className)
802806
* Passes the main function two arguments, the class name and the specified
803807
* options string.
804808
*/
805-
void AndroidRuntime::start(const char* className, const char* options)
809+
void AndroidRuntime::start(const char* className, const char* options, bool zygote)
806810
{
807811
ALOGD("\n>>>>>> AndroidRuntime START %s <<<<<<\n",
808812
className != NULL ? className : "(unknown)");
@@ -835,7 +839,7 @@ void AndroidRuntime::start(const char* className, const char* options)
835839
JniInvocation jni_invocation;
836840
jni_invocation.Init(NULL);
837841
JNIEnv* env;
838-
if (startVm(&mJavaVM, &env) != 0) {
842+
if (startVm(&mJavaVM, &env, zygote) != 0) {
839843
return;
840844
}
841845
onVmCreated(env);

include/android_runtime/AndroidRuntime.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,7 +64,7 @@ class AndroidRuntime
6464

6565
int addVmArguments(int argc, const char* const argv[]);
6666

67-
void start(const char *classname, const char* options);
67+
void start(const char *classname, const char* options, bool zygote);
6868

6969
void exit(int code);
7070

@@ -116,7 +116,7 @@ class AndroidRuntime
116116
private:
117117
static int startReg(JNIEnv* env);
118118
void parseExtraOpts(char* extraOptsBuf);
119-
int startVm(JavaVM** pJavaVM, JNIEnv** pEnv);
119+
int startVm(JavaVM** pJavaVM, JNIEnv** pEnv, bool zygote);
120120

121121
Vector<JavaVMOption> mOptions;
122122
bool mExitWithoutCleanup;

0 commit comments

Comments
 (0)