强制执行

授权是软件定义汽车 (SDV) 通信堆栈安全模型的一项关键必需组件。

如果授权处于 启用 状态,则仅当相应 权限允许访问时,系统才会授予访问权限。

如果授权处于 停用 状态,则无论 相应权限如何,系统都会授予访问权限。

SDV 授权强制执行是按虚拟机进行的,并且控制在本地虚拟机上执行的授权决策。鉴于 SDV 架构的分布式特性,我们建议在网状网络中的所有虚拟机之间同步授权强制执行配置。

SDV 授权强制执行适用于所有 SDV 平台:核心、IVI 和旧版 IVI。

用户 build

SDV 授权在用户 build 中强制执行,并且无法停用。

用于控制授权强制执行的属性会被忽略。

非用户 build

默认情况下,强制执行处于启用状态。

出于开发目的,您可能需要在非用户 build 中启用或停用强制执行。

系统属性

sdv.authz.enable 是一个系统属性,用于控制非用户 build 中的授权强制执行。

在运行时更改此属性可更改授权强制执行。使用 disabledpermissions_only

(root) setprop sdv.authz.enable disabled
(root) setprop sdv.authz.enable permissions_only

此系统属性不是持久性的,因此在虚拟机重启后,授权强制执行会重置为默认值。

启动时系统属性

在运行时控制系统属性可能会在系统中引入竞态条件,因此务必在启动时控制授权,然后再启动任何代理和第三方服务。

ro.boot.sdv.authz.enable 是一个布尔值启动系统属性,用于 在 SDV 启动开始时设置 sdv.authz.enable 系统属性。

启动后,您仍然可以更改 sdv.authz.enable 系统属性,从而更改授权强制执行。

该系统属性并非在所有虚拟机中都是全局的,它仅影响特定虚拟机。 不过,权限是全局的。在某些虚拟机上启用该系统属性,而在其他虚拟机上停用该系统属性可能会导致强制执行拆分,即仅在某些虚拟机上执行强制执行。这可能会导致意外行为。

您可以使用 bootconfig 或内核 cmdline ro-boot-property 设置 ro.boot.sdv.authz.enable 系统属性。

测试支持

使用 atest 框架运行命令以准备用于测试的虚拟机,然后运行测试并进行清理。您可以利用 atest 框架来控制集成和端到端测试的授权强制执行。

使用 AndroidTest.xml 配置设置,并分配适当的系统属性值。

对于 Rust 目标,请使用 authz_enforcement_flag_disabled_config_template.xml

<configuration description="Config to run {MODULE} device tests.">

    {EXTRA_CONFIGS}

    <!-- NOTE: To run tests using this template in a local dev env, use:

         NOTIFY_AS_NATIVE=<Test device serial #> atest <test target>

         For example,
           NOTIFY_AS_NATIVE=0.0.0.0:6520 atest sdv_core_middleware_unit_comms_rs_sdk_test
    -->
    <target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
        <!-- Needed to prevent DeviceSetup from trying to set device features,
             unsupported on minimal SDV device. -->
        <option name="force-skip-settings" value="true" />
        <!-- Ensure authz is set to "disabled" for this test -->
        <option name="set-property" key="sdv.authz.enable" value="disabled" />
        <!-- Restore default authz setting on teardown -->
        <option name="restore-properties" value="true" />
        <!-- Needed to prevent DeviceSetup from trying to list device features,
             unsupported on minimal SDV device. -->
        <option name="screen-always-on" value="IGNORE" />
        <!-- Add this line to disable the external storage space check -->
        <option name="min-external-storage-kb" value="0" />
    </target_preparer>

    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
        <option name="cleanup" value="true" />
        <option name="push" value="{MODULE}->/data/local/tmp/{MODULE}" />
    </target_preparer>

    <test class="com.android.tradefed.testtype.rust.RustBinaryTest" >
        <option name="test-device-path" value="/data/local/tmp" />
        <option name="module-name" value="{MODULE}" />
    </test>

</configuration>

对于 C++ 目标,请使用 authz_enforcement_flag_disabled_gtest_config_template.xml

<configuration description="Config to run {MODULE} device tests.">

    {EXTRA_CONFIGS}

    <!-- NOTE: To run tests using this template in a local dev env, use:
        NOTIFY_AS_NATIVE=<Test device serial #> atest <test target>
    -->
    <target_preparer class="com.android.tradefed.targetprep.DeviceSetup">
        <!-- Needed to prevent DeviceSetup from trying to set device features,
             unsupported on minimal SDV device. -->
        <option name="force-skip-settings" value="true" />
        <!-- Ensure authz is set to "disabled" for this test -->
        <option name="set-property" key="sdv.authz.enable" value="disabled" />
        <!-- Restore default authz setting on teardown -->
        <option name="restore-properties" value="true" />
        <!-- Needed to prevent DeviceSetup from trying to list device features,
             unsupported on minimal SDV device. -->
        <option name="screen-always-on" value="IGNORE" />
        <!-- Add this line to disable the external storage space check -->
        <option name="min-external-storage-kb" value="0" />
    </target_preparer>

    <target_preparer class="com.android.tradefed.targetprep.PushFilePreparer">
        <option name="cleanup" value="true" />
        <option name="push" value="{MODULE}->/data/local/tmp/{MODULE}" />
    </target_preparer>

    <test class="com.android.tradefed.testtype.GTest" >
        <option name="native-test-device-path" value="/data/local/tmp" />
        <option name="module-name" value="{MODULE}" />
    </test>

</configuration>

使用 Android.bp 声明 Rust 目标、C++ 目标和文件组。

filegroup {
    name: "sdv_authz_enforcement_flag_disabled_config_template",
    srcs: ["test_configs/authz_enforcement_flag_disabled_config_template.xml"],
}

rust_test {
    name: "sdv_authz_enforcement_flag_disabled_test",
    srcs: ["tests/authz_enforcement_flag_disabled_test.rs"],
    defaults: ["sdv_authz_enforcement_flag@rust_defaults"],
    test_suites: [
        "automotive-sdv-tests",
        "general-tests",
    ],
    test_options: {
        unit_test: false,
    },
    require_root: true,
    auto_gen_config: true,
    test_config_template: ":sdv_authz_enforcement_flag_disabled_config_template",
    compile_multilib: "first",
    rustlibs: [
        "libsdv_authz_enforcement_flag",
    ],
}

filegroup {
    name: "sdv_authz_enforcement_flag_disabled_gtest_config_template",
    srcs: ["authz_enforcement_flag_disabled_gtest_config_template.xml"],
}

cc_test {
    name: "sdv_comms_cpp_sdk_tests",
    srcs: ["cpp/**/*_test.cpp"],
    defaults: ["sdv_comms_cpp_sdk_test_defaults"],
    test_options: {
        unit_test: true,
    },
    test_config_template: ":sdv_authz_enforcement_flag_disabled_gtest_config_template",
    test_suites: [
        "automotive-sdv-tests",
        "general-tests",
    ],
}