Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 171217cb authored by Eric Biggers's avatar Eric Biggers
Browse files

With native FBE, lock user directories when framework is started

If the framework is restarted, the user must unlock their device in the
same way as after a reboot.  But with FBE, vold was never told to lock
the credential-encrypted storage directories, so any that were unlocked
at the time the framework stopped remain unlocked, i.e. their keys are
still in the kernel.  This is unexpected and differs from a reboot.

Fix this by locking all user directories when the framework is started.
This was already done for emulated FBE, but this change extends it to
native FBE too.

Test: Unlock device with PIN.  Then in adb shell: 'stop; start;
      sleep 10; ls /data/data/' shows filenames in ciphertext form.
Change-Id: If993d93d9837b09ff8029642f8641dec69af04e0
parent 1279c3ff
Loading
Loading
Loading
Loading
+14 −7
Original line number Original line Diff line number Diff line
@@ -943,13 +943,20 @@ class StorageManagerService extends IStorageManager.Stub
    private void initIfBootedAndConnected() {
    private void initIfBootedAndConnected() {
        Slog.d(TAG, "Thinking about init, mBootCompleted=" + mBootCompleted
        Slog.d(TAG, "Thinking about init, mBootCompleted=" + mBootCompleted
                + ", mDaemonConnected=" + mDaemonConnected);
                + ", mDaemonConnected=" + mDaemonConnected);
        if (mBootCompleted && mDaemonConnected
        if (mBootCompleted && mDaemonConnected) {
                && !StorageManager.isFileEncryptedNativeOnly()) {
            // Tell vold to lock or unlock the user directories based on the
            // When booting a device without native support, make sure that our
            // current file-based encryption status.
            // user directories are locked or unlocked based on the current
            final boolean initLocked;
            // emulation status.
            if (StorageManager.isFileEncryptedNativeOrEmulated()) {
            final boolean initLocked = StorageManager.isFileEncryptedEmulatedOnly();
                // For native FBE this is a no-op after reboot, but this is
            Slog.d(TAG, "Setting up emulation state, initlocked=" + initLocked);
                // still needed in case of framework restarts.
                Slog.d(TAG, "FBE is enabled; ensuring all user directories are locked.");
                initLocked = true;
            } else {
                // This is in case FBE emulation was turned off.
                Slog.d(TAG, "FBE is disabled; ensuring the FBE emulation state is cleared.");
                initLocked = false;
            }
            final List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
            final List<UserInfo> users = mContext.getSystemService(UserManager.class).getUsers();
            for (UserInfo user : users) {
            for (UserInfo user : users) {
                try {
                try {