diff options
| author | 2018-01-18 01:23:32 +0000 | |
|---|---|---|
| committer | 2018-01-18 01:23:32 +0000 | |
| commit | dec688691d6ef8f45dcb6c67d4fc9fe72d0baf9b (patch) | |
| tree | 2639763487fb41975897cc00922cfc0d0f88f544 | |
| parent | 2746e9ab16d9621f398b44d9c7d52315759769e7 (diff) | |
| parent | 42494665621ad8b20e1cf8e0e81f4913b616b060 (diff) | |
Merge "Reland: Move zygote's seccomp setup to post-fork" am: 7839672e22
am: 4249466562
Change-Id: Idbf4d7add5e41d2d01f4a3c2ff6e8f1b1735faeb
| -rw-r--r-- | core/java/android/os/Seccomp.java | 24 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/Zygote.java | 3 | ||||
| -rw-r--r-- | core/java/com/android/internal/os/ZygoteInit.java | 6 | ||||
| -rw-r--r-- | core/jni/Android.bp | 1 | ||||
| -rw-r--r-- | core/jni/AndroidRuntime.cpp | 2 | ||||
| -rw-r--r-- | core/jni/android_os_seccomp.cpp | 47 | ||||
| -rw-r--r-- | core/jni/com_android_internal_os_Zygote.cpp | 30 | 
7 files changed, 35 insertions, 78 deletions
| diff --git a/core/java/android/os/Seccomp.java b/core/java/android/os/Seccomp.java deleted file mode 100644 index f14e93fe9403..000000000000 --- a/core/java/android/os/Seccomp.java +++ /dev/null @@ -1,24 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package android.os; - -/** - * @hide - */ -public final class Seccomp { -    public static final native void setPolicy(); -} diff --git a/core/java/com/android/internal/os/Zygote.java b/core/java/com/android/internal/os/Zygote.java index 3ee8b472869b..9167076474ff 100644 --- a/core/java/com/android/internal/os/Zygote.java +++ b/core/java/com/android/internal/os/Zygote.java @@ -69,6 +69,9 @@ public final class Zygote {      private Zygote() {} +    /** Called for some security initialization before any fork. */ +    native static void nativeSecurityInit(); +      /**       * Forks a new VM instance.  The current VM must have been started       * with the -Xzygote flag. <b>NOTE: new instance keeps all diff --git a/core/java/com/android/internal/os/ZygoteInit.java b/core/java/com/android/internal/os/ZygoteInit.java index 212cdcbce0b1..21f1fb652794 100644 --- a/core/java/com/android/internal/os/ZygoteInit.java +++ b/core/java/com/android/internal/os/ZygoteInit.java @@ -30,7 +30,6 @@ import android.os.IInstalld;  import android.os.Environment;  import android.os.Process;  import android.os.RemoteException; -import android.os.Seccomp;  import android.os.ServiceManager;  import android.os.ServiceSpecificException;  import android.os.SystemClock; @@ -781,12 +780,11 @@ public class ZygoteInit {              // Zygote.              Trace.setTracingEnabled(false, 0); +            Zygote.nativeSecurityInit(); +              // Zygote process unmounts root storage spaces.              Zygote.nativeUnmountStorageOnInit(); -            // Set seccomp policy -            Seccomp.setPolicy(); -              ZygoteHooks.stopZygoteNoThreadCreation();              if (startSystemServer) { diff --git a/core/jni/Android.bp b/core/jni/Android.bp index 551d54ab9053..bc98716ebc9c 100644 --- a/core/jni/Android.bp +++ b/core/jni/Android.bp @@ -86,7 +86,6 @@ cc_library_shared {          "android_os_MessageQueue.cpp",          "android_os_Parcel.cpp",          "android_os_SELinux.cpp", -        "android_os_seccomp.cpp",          "android_os_SharedMemory.cpp",          "android_os_SystemClock.cpp",          "android_os_SystemProperties.cpp", diff --git a/core/jni/AndroidRuntime.cpp b/core/jni/AndroidRuntime.cpp index 047fa8489453..35ab56a1a456 100644 --- a/core/jni/AndroidRuntime.cpp +++ b/core/jni/AndroidRuntime.cpp @@ -163,7 +163,6 @@ extern int register_android_os_Parcel(JNIEnv* env);  extern int register_android_os_SELinux(JNIEnv* env);  extern int register_android_os_VintfObject(JNIEnv *env);  extern int register_android_os_VintfRuntimeInfo(JNIEnv *env); -extern int register_android_os_seccomp(JNIEnv* env);  extern int register_android_os_SystemProperties(JNIEnv *env);  extern int register_android_os_SystemClock(JNIEnv* env);  extern int register_android_os_Trace(JNIEnv* env); @@ -1420,7 +1419,6 @@ static const RegJNIRec gRegJNI[] = {      REG_JNI(register_android_os_GraphicsEnvironment),      REG_JNI(register_android_os_MessageQueue),      REG_JNI(register_android_os_SELinux), -    REG_JNI(register_android_os_seccomp),      REG_JNI(register_android_os_Trace),      REG_JNI(register_android_os_UEventObserver),      REG_JNI(register_android_net_LocalSocketImpl), diff --git a/core/jni/android_os_seccomp.cpp b/core/jni/android_os_seccomp.cpp deleted file mode 100644 index 06e2a167de0a..000000000000 --- a/core/jni/android_os_seccomp.cpp +++ /dev/null @@ -1,47 +0,0 @@ -/* - * Copyright (C) 2017 The Android Open Source Project - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - *      http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -#include "core_jni_helpers.h" -#include <nativehelper/JniConstants.h> -#include "utils/Log.h" -#include <selinux/selinux.h> - -#include "seccomp_policy.h" - -static void Seccomp_setPolicy(JNIEnv* /*env*/) { -    if (security_getenforce() == 0) { -        ALOGI("seccomp disabled by setenforce 0"); -        return; -    } - -    if (!set_seccomp_filter()) { -        ALOGE("Failed to set seccomp policy - killing"); -        exit(1); -    } -} - -static const JNINativeMethod method_table[] = { -    NATIVE_METHOD(Seccomp, setPolicy, "()V"), -}; - -namespace android { - -int register_android_os_seccomp(JNIEnv* env) { -    return android::RegisterMethodsOrDie(env, "android/os/Seccomp", -                                         method_table, NELEM(method_table)); -} - -} diff --git a/core/jni/com_android_internal_os_Zygote.cpp b/core/jni/com_android_internal_os_Zygote.cpp index 32ef3dc0aed4..63dba43a5eb3 100644 --- a/core/jni/com_android_internal_os_Zygote.cpp +++ b/core/jni/com_android_internal_os_Zygote.cpp @@ -53,6 +53,7 @@  #include <private/android_filesystem_config.h>  #include <utils/String8.h>  #include <selinux/android.h> +#include <seccomp_policy.h>  #include <processgroup/processgroup.h>  #include "core_jni_helpers.h" @@ -76,6 +77,8 @@ static const char kZygoteClassName[] = "com/android/internal/os/Zygote";  static jclass gZygoteClass;  static jmethodID gCallPostForkChildHooks; +static bool g_is_security_enforced = true; +  // Must match values in com.android.internal.os.Zygote.  enum MountExternalKind {    MOUNT_EXTERNAL_NONE = 0, @@ -229,6 +232,20 @@ static void PreApplicationInit() {    mallopt(M_DECAY_TIME, 1);  } +static void SetUpSeccompFilter(uid_t uid) { +  if (!g_is_security_enforced) { +    ALOGI("seccomp disabled by setenforce 0"); +    return; +  } + +  // Apply system or app filter based on uid. +  if (getuid() >= AID_APP_START) { +    set_app_seccomp_filter(); +  } else { +    set_system_seccomp_filter(); +  } +} +  static void EnableKeepCapabilities(JNIEnv* env) {    int rc = prctl(PR_SET_KEEPCAPS, 1, 0, 0, 0);    if (rc == -1) { @@ -541,6 +558,11 @@ static pid_t ForkAndSpecializeCommon(JNIEnv* env, uid_t uid, gid_t gid, jintArra        RuntimeAbort(env, __LINE__, "Call to sigprocmask(SIG_UNBLOCK, { SIGCHLD }) failed.");      } +    // Must be called when the new process still has CAP_SYS_ADMIN.  The other alternative is to +    // call prctl(PR_SET_NO_NEW_PRIVS, 1) afterward, but that breaks SELinux domain transition (see +    // b/71859146). +    SetUpSeccompFilter(uid); +      // Keep capabilities across UID change, unless we're staying root.      if (uid != 0) {        EnableKeepCapabilities(env); @@ -698,6 +720,12 @@ static uint64_t GetEffectiveCapabilityMask(JNIEnv* env) {  namespace android { +static void com_android_internal_os_Zygote_nativeSecurityInit(JNIEnv*, jclass) { +  // security_getenforce is not allowed on app process. Initialize and cache the value before +  // zygote forks. +  g_is_security_enforced = security_getenforce(); +} +  static void com_android_internal_os_Zygote_nativePreApplicationInit(JNIEnv*, jclass) {    PreApplicationInit();  } @@ -832,6 +860,8 @@ static void com_android_internal_os_Zygote_nativeUnmountStorageOnInit(JNIEnv* en  }  static const JNINativeMethod gMethods[] = { +    { "nativeSecurityInit", "()V", +      (void *) com_android_internal_os_Zygote_nativeSecurityInit },      { "nativeForkAndSpecialize",        "(II[II[[IILjava/lang/String;Ljava/lang/String;[I[ILjava/lang/String;Ljava/lang/String;)I",        (void *) com_android_internal_os_Zygote_nativeForkAndSpecialize }, |