安全的開發人員選項

根據 Android 相容性定義說明文件,原始設備製造商必須提供啟用應用程式開發功能的方法。不過,在車輛中提供類似行動裝置的開發人員選項,會讓車輛容易受到攻擊。現在 OEM 可以使用經過驗證的加密權杖機制,控管開發人員選項的存取權。具體來說,OEM 可以:

  • 請在首次啟動前指定預設限制。
  • 安全地授權開發人員,並視需要使用加密權杖。
  • 開發人員通過驗證和授權後,即可套用限制變更。

本頁說明參考實作項目,包括偵錯限制控制器應用程式和遠端權杖核發端點。

術語

除了術語,本頁面還會使用下列詞彙:

  • RFC 7515 中定義的 JSON Web Signature (JWS)
  • 國家標準暨技術研究院 (NIST)

設計

原始設備製造商 (OEM) 可以使用 JSON Web Signature (JWS) 權杖 (RFC7515) 授權開發人員。在參考實作中,存取權杖是由 OEM 核發,並由限制控制器應用程式使用。存取權杖的設計目的是為了防範重送攻擊和偽造權杖。

圖 1. 設計

整合與設定

原始設備製造商必須在首次啟動時指定預設限制。OEM 會使用多個靜態資源疊加層來覆寫 Android 開放原始碼計畫架構中的預設值。

無頭系統使用者的預設限制可透過 config_defaultFirstUserRestrictions 字串在 frameworks/base/core/res/res/values/config.xml 中設定,例如:

<!-- User restrictions set when the first user is created.
         Note: Also update appropriate overlay files. -->
    <string-array translatable="false" name="config_defaultFirstUserRestrictions">
        <item>no_debugging_features</item>
        <item>no_install_unknown_sources</item>
        <item>no_install_unknown_sources_globally</item>
    </string-array>

您可以在 frameworks/base/core/res/res/xml/config_user_types.xml 中設定駕駛人、乘客和訪客的預設限制。原始設備製造商可以疊加這些字串,分別為每種使用者設定預設限制,例如:

<user-types>
    <full-type name="android.os.usertype.full.SECONDARY" >
        <default-restrictions
            no_debugging_features="true"
            no_install_unknown_sources="true"/>
    </full-type>
    <full-type name="android.os.usertype.full.GUEST" >
        <default-restrictions
            no_debugging_features="true"
            no_install_unknown_sources="true"/>
    </full-type>
</user-types>

版本號碼偏好設定控制器

在 AAOS 中,使用者與「設定」中的「版本號碼」偏好設定列互動時,系統會透過 BuildNumberPreferenceController.java (位於 packages/apps/Car/Settings/src/com/android/car/settings/system/BuildNumberPreferenceController.java) 處理。

設定 no_debugging_features (UserManager.DISALLOW_DEBUGGING_FEATURES) 使用者限制後,輕觸 BuildNumberPreferenceController 會在正式版 (user) 建構作業中抑制開發人員倒數計時:

@Override
protected boolean handlePreferenceClicked(Preference preference) {
    if (DevelopmentSettingsUtil.isDevelopmentSettingsEnabled(getContext())) {
        return true;
    }

    // Enforce restriction on production (user) builds
    if (Build.IS_USER && mUserManager.hasUserRestriction(UserManager.DISALLOW_DEBUGGING_FEATURES)) {
        showToast(R.string.dev_access_blocked_toast);
        return true;
    }

    mDevHitCountdown--;
    if (mDevHitCountdown == 0) {
        DevelopmentSettingsUtil.setDevelopmentSettingsEnabled(getContext(), true);
        showToast(R.string.show_dev_on);
    }
    return true;
}

使用 Build.IS_USER 可確保正式版建構作業嚴格執行安全鎖定,而 userdebug 建構作業的內部工程團隊仍可使用 7 次輕觸手勢存取開發人員選項進行測試,不必手動覆寫指令列介面 (CLI)。

偵錯 Restriction Controller

AOSP 位於 packages/apps/Car/DebuggingRestrictionController,提供偵錯限制控制器 (DRC) 的參考實作。

OEM 可透過 DRC,為授權服務技術人員和開發人員,動態且暫時解除生產車輛的 no_debugging_features 限制。車內 DRC 應用程式會提示使用者向原始設備製造商 (OEM) 後端驗證,並提交以密碼編譯簽署的存取權杖,以啟用 adb 和「開發人員選項」,進行有限的診斷工作階段,不必永久開啟偵錯工具或重新刷寫韌體。

DRC 參考實作包含兩個核心元件:

  • 車載 DRC 用戶端應用程式 (app/):主機上的具備權限系統應用程式 (持有 MANAGE_USERS 權限),可驗證開發人員、驗證傳入 JWS 權杖的 X.509 憑證簽章、主機名稱、隨機數和到期時間,並使用 UserManager 動態切換 no_debugging_features 限制。
  • 雲端權杖簽發者 (server/):後端網路服務 (可部署為 Firebase Cloud Functions),用於驗證開發人員憑證,並簽發具有有限效期且經過加密簽署的 RS256 JWS 存取權杖。

如需完整的設定說明、憑證產生工具和部署步驟,請參閱「Debugging Restriction Controller integration guide」。

測試

Google 建議原始設備製造商從參考實作開始,再逐步擴充。

  1. 在疊加檔案中設定限制後,請編譯 AAOS 並驗證定義的流程。使用參考應用程式和支援 JWS 的本機服務,驗證存取設定。
  2. 選用:設定系統,使用啟用 JWS 的雲端服務。確認後端服務是否按照預期流程運作。