android - 如何在 Android 设备上启用和禁用 dm verity?

标签 android adb

这个问题与 device-mapper-verity (dm-verity) 内核特性有关,它提供 block 设备的透明完整性检查。 dm-verity 有助于防止持久性 rootkit,这些 rootkit 可以保留 root 权限并危及设备。

以下命令可以很好地禁用或启用 userdebug 构建的 verity。

adb disable-verity 
adb enable-verity

但是这些命令不适用于用户构建。在用户构建方面是否有其他选择?

最佳答案

简而言之,我还不能为您提供解决方案。

不过这里有一些有用的提示: 那是我得到的错误:

C:\Users\Test>adb remount
dm_verity is enabled on the system and vendor partitions.
Use "adb disable-verity" to disable verity.
If you do not, remount may succeed, however, you will still not be able to write to these volumes.
remount of system failed: Permission denied
remount failed

(^一些准确的文本对于在 google 中搜索的人来说也很重要^)

当使用 IDA Hex-rays 进行逆向工程/反编译 '\sbin\adbd' 时,我注意到 输出这个错误的相关adbd源码在net:

void remount_service(int fd, void *cookie)
{
    char buffer[200];
    char prop_buf[PROPERTY_VALUE_MAX];

    bool system_verified = false, vendor_verified = false;
    property_get("partition.system.verified", prop_buf, "0");
    if (!strcmp(prop_buf, "1")) {
        system_verified = true;
    }

    property_get("partition.vendor.verified", prop_buf, "0");
    if (!strcmp(prop_buf, "1")) {
        vendor_verified = true;
    }

    if (system_verified || vendor_verified) {
        // Allow remount but warn of likely bad effects
        bool both = system_verified && vendor_verified;
        snprintf(buffer, sizeof(buffer),
                 "dm_verity is enabled on the %s%s%s partition%s.\n",
                 system_verified ? "system" : "",
                 both ? " and " : "",
                 vendor_verified ? "vendor" : "",
                 both ? "s" : "");
        write_string(fd, buffer);
        snprintf(buffer, sizeof(buffer),
                 "Use \"adb disable-verity\" to disable verity.\n"
                 "If you do not, remount may succeed, however, you will still "
                 "not be able to write to these volumes.\n");
        write_string(fd, buffer);
    }

    if (remount("/system", &system_ro)) {
        snprintf(buffer, sizeof(buffer), "remount of system failed: %s\n",strerror(errno));
        write_string(fd, buffer);
    }

    if (hasVendorPartition()) {
        if (remount("/vendor", &vendor_ro)) {
            snprintf(buffer, sizeof(buffer), "remount of vendor failed: %s\n",strerror(errno));
            write_string(fd, buffer);
        }
    }

    if (!system_ro && (!vendor_ro || !hasVendorPartition()))
        write_string(fd, "remount succeeded\n");
    else {
        write_string(fd, "remount failed\n");
    }

    adb_close(fd);
}

http://www.contrib.andrew.cmu.edu/~rjkohler/android-tools-5.0.1+git20141213/core/adb/remount_service.c 顺便说一句,我以前 decomile 的 adb deamon 来自 Android 5.1.1。

所以这里的要点是partition.vendor.verifiedpartition.system.verified。如果它们设置为“1”,您将收到错误消息。

那么接下来将追查这些设置的原因和方式 ...以及如何防止这种情况发生。

然而,adb remount 所做的只是重新挂载 /system(可能还有 /vendor)。您也可以自己执行此操作:

adb shell su mount -o remount /system

那条小线通常可以帮助我完成同样的事情。 su - 就可以了。 (但是是的,su 命令只有在您的设备“root”后才会出现。)

关于android - 如何在 Android 设备上启用和禁用 dm verity?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38304435/

相关文章:

android - 在android studio中无限安装

android - 让两个 genymotion Android 模拟器在一个 SAME WiFi 中工作

android - 无法在 Root过的 Android 手机上运行 'adb root'

java - 在android中迁移房间数据库

android - 如何让 intellij android 预览窗口保持打开状态?

android - 如何在 Linux (Ubuntu) 上启用 Kindle Fire 的 USB 调试?

android - 如何通过电脑终端重启adbd?

android - 有没有办法覆盖Android中 View 的动画辅助功能设置

android - 工具栏标题全宽

android - android中的浏览器检测