Geräte-IDs

Unter Android 10 werden die Berechtigungen für Geräte-IDs geändert, sodass alle Geräte-IDs jetzt durch die Berechtigung READ_PRIVILEGED_PHONE_STATE geschützt sind. Vor Android 10 wurden persistente Geräte-IDs (IMEI/MEID, IMSI, SIM und Build-Seriennummer) durch die Laufzeitberechtigung READ_PHONE_STATE geschützt. Die Berechtigung READ_PRIVILEGED_PHONE_STATE wird nur Apps gewährt, die mit dem Plattformschlüssel signiert sind, und privilegierten System-Apps.

Weitere Informationen zu den neuen Berechtigungsanforderungen finden Sie auf den Javadoc-Seiten für TelephonyManager.java und Build.java.

Diese Änderung betrifft die folgenden APIs:

  • TelephonyManager#getDeviceId
  • TelephonyManager#getImei
  • TelephonyManager#getMeid
  • TelephonyManager#getSimSerialNumber
  • TelephonyManager#getSubscriberId
  • Build#getSerial

Zugriff für Mobilfunkanbieter-Apps ohne Berechtigung READ_PRIVILEGED_PHONE_STATE

Für vorinstallierte Mobilfunkanbieter-Apps, die nicht für die Berechtigung READ_PRIVILEGED_PHONE_STATE infrage kommen, kann eine der Optionen in der folgenden Tabelle implementiert werden.

Option Beschreibung Beschränkungen
UICC-Mobilfunkanbieterberechtigungen Die Android-Plattform lädt auf der UICC gespeicherte Zertifikate und gewährt Apps, die mit diesen Zertifikaten signiert sind, die Berechtigung, spezielle Methoden aufzurufen. Legacy-Mobilfunkanbieter haben eine große Anzahl an SIM-Karten, die sich nicht einfach aktualisieren lassen. Außerdem können Mobilfunkanbieter, die keine Autorisierungsrechte für neue SIM-Karten haben (z. B. MVNOs, die SIM-Karten von MNOs ausstellen), keine Zertifikate auf den SIM-Karten hinzufügen oder aktualisieren.
OEM-Zulassungsliste OEMs können mit OP_READ_DEVICE_IDENTIFIER Geräte-IDs für die Zulassungsliste von Mobilfunkanbieter-Apps bereitstellen. Diese Lösung ist nicht für alle Mobilfunkanbieter skalierbar.
Type Allocation Code (TAC) Verwenden Sie die Methode getTypeAllocationCode, die in Android 10 eingeführt wurde, um den TAC bereitzustellen, über den die Informationen zum Hersteller und zum Modell zurückgegeben werden. Die Informationen im TAC reichen nicht aus, um ein bestimmtes Gerät zu identifizieren.
MSISDN Mobilfunkanbieter können die Telefonnummer (MSISDN) unter TelephonyManager mit der Berechtigungsgruppe PHONE verwenden, um die IMEI in ihren Backend-Systemen abzurufen. Das erfordert erhebliche Investitionen für die Mobilfunkanbieter. Mobilfunkanbieter, die ihre Netzwerkschlüssel mithilfe der IMSI zuordnen, benötigen erhebliche technische Ressourcen, um zu MSISDN zu wechseln.

Alle Mobilfunkanbieter-Apps können auf Geräte-IDs zugreifen, indem sie die Datei CarrierConfig.xml mit dem Hash des Signaturzertifikats der Mobilfunkanbieter-App aktualisieren. Wenn die Mobilfunkanbieter-App eine Methode zum Lesen privilegierter Informationen aufruft, sucht die Plattform nach einer Übereinstimmung des Hash des Signaturzertifikats der App (SHA-1- oder SHA-256-Signatur des Zertifikats) in der Datei CarrierConfig.xml. Wenn eine Übereinstimmung gefunden wird, werden die angeforderten Informationen zurückgegeben. Wenn keine Übereinstimmung gefunden wird, wird eine Sicherheitsausnahme zurückgegeben.

Für die Implementierung dieser Lösung MÜSSEN Mobilfunkanbieter die folgenden Schritte ausführen:

  1. Aktualisieren Sie CarrierConfig.xml mit dem Hash des Signaturzertifikats der Mobilfunkanbieter-App und reichen Sie einen Patch ein.
  2. Bitten Sie die OEMs, ihren Build mit QPR1 oder höher (empfohlen) ODER diesen erforderlichen Plattform-Patches und dem Patch mit der aktualisierten CarrierConfig.xml-Datei aus Schritt 1 oben zu aktualisieren.

Implementierung

Aktualisieren Sie die Zulassungsliste für Berechtigungen mit erhöhten Zugriffsrechten, um die Berechtigung READ_PRIVILEGED_PHONE_STATE für Apps mit erhöhten Zugriffsrechten zu gewähren, die Zugriff auf Geräte-IDs benötigen.

Weitere Informationen zu Zulassungslisten finden Sie unter Zulassungslisten für Berechtigungen mit erhöhten Berechtigungen.

Damit die betroffenen APIs aufgerufen werden können, muss eine App eine der folgenden Anforderungen erfüllen:

  • Wenn es sich bei der App um eine vorab geladene App mit Berechtigungen handelt, ist die in AndroidManifest.xml deklarierte Berechtigung READ_PRIVILEGED_PHONE_STATE erforderlich. Außerdem muss die App diese Berechtigung auf die Zulassungsliste setzen.
  • Für über Google Play bereitgestellte Apps sind Berechtigungen des Mobilfunkanbieters erforderlich. Weitere Informationen zum Gewähren von Berechtigungen für Mobilfunkanbieter finden Sie auf der Seite UICC-Berechtigungen für Mobilfunkanbieter.
  • Eine App für Geräte- oder Profilinhaber, der die Berechtigung READ_PHONE_STATE gewährt wurde.

Bei einer App, die keine dieser Anforderungen erfüllt, ist Folgendes zu beachten:

  • Wenn die App auf Versionen vor Android Q ausgerichtet ist und die Berechtigung READ_PHONE_STATE nicht gewährt wurde, wird SecurityException ausgelöst. Das ist das aktuelle Verhalten vor Android Q, da diese Berechtigung zum Aufrufen dieser APIs erforderlich ist.
  • Wenn die App auf Pre-Q ausgerichtet ist und die Berechtigung READ_PHONE_STATE erteilt wurde, erhält sie für alle TelephonyManager APIs einen Nullwert und Build.UNKNOWN für die Build#getSerial-Methode.
  • Wenn die App auf Android 10 oder höher ausgerichtet ist und keine der neuen Anforderungen erfüllt, wird eine SecurityException ausgegeben.

Validierung und Tests

Die Compatibility Test Suite (CTS) umfasst Tests, mit denen das erwartete Zugriffsverhalten auf Geräte-IDs für Apps mit Berechtigungen von Mobilfunkanbietern, Geräte- und Profilinhaber sowie Apps überprüft wird, die voraussichtlich keinen Zugriff auf Geräte-IDs haben.

Die folgenden CTS-Tests sind spezifisch für diese Funktion.

cts-tradefed run cts -m CtsCarrierApiTestCases -t
    android.carrierapi.cts.CarrierApiTest

cts-tradefed run cts -m CtsTelephonyTestCases -t
    android.telephony.cts.TelephonyManagerTest

cts-tradefed run cts -m CtsTelephony3TestCases

cts-tradefed run cts -m CtsPermissionTestCases -t
    android.permission.cts.TelephonyManagerPermissionTest

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCanGetDeviceIdentifiers

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCanGetDeviceIdentifiers

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.ManagedProfileTest#testProfileOwnerCannotGetDeviceIdentifiersWithoutPermission

cts-tradefed run cts -m CtsDevicePolicyManagerTestCases -t
    com.android.cts.devicepolicy.DeviceOwnerTest#testDeviceOwnerCannotGetDeviceIdentifiersWithoutPermission

Häufig gestellte Fragen

Wie viele Apps können in CarrierConfig.xml für ein bestimmtes (Kundencenter, Mobilfunkanbieter) auf die Zulassungsliste gesetzt werden?

Die Anzahl der Zertifikatshasches im Array ist nicht begrenzt.

Welche CarrierConfig-Parameter in CarrierConfig.xml muss ich verwenden, damit eine App auf die Zulassungsliste gesetzt wird?

Verwenden Sie das folgende Konfigurationselement der obersten Ebene in der spezifischen CarrierConfig.xml aus den konfigurierten AOSP-Optionen:

<string-array name="carrier_certificate_string_array" num="2">
    <item value="BF02262E5EF59FDD53E57059082F1A7914F284B"/>
    <item value="9F3868A3E1DD19A5311D511A60CF94D975A344B"/>
</string-array>

Gibt es eine Basisvorlage für CarrierConfig, die ich verwenden kann?

Verwenden Sie die folgende Vorlage. Dieser sollte dem relevanten Asset hinzugefügt werden.

<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<carrier_config>
    <string-array name="carrier_certificate_string_array"
num="1">
        <item value="CERTIFICATE_HASH_HERE"/>
    </string-array>
</carrier_config>

Muss die SIM-Karte des Mobilfunkanbieters im Gerät sein, um auf Geräte-IDs zugreifen zu können?

Welche CarrierConfig.xml verwendet wird, hängt von der aktuell eingelegten SIM ab. Wenn also die App des Mobilfunkanbieters X versucht, Zugriffsberechtigungen zu erhalten, während die SIM-Karte des Mobilfunkanbieters Y eingelegt ist, findet das Gerät keine Übereinstimmung für den Hashwert und gibt eine Sicherheitsausnahme zurück.

Bei Geräten mit mehreren SIM-Karten hat Mobilfunkanbieter 1 nur Zugriffsberechtigungen für SIM-Karte 1 und umgekehrt.

Wie wandeln Mobilfunkanbieter das Signaturzertifikat einer App in einen Hash um?

So wandeln Sie Signaturzertifikate in einen Hash um, bevor Sie sie CarrierConfig.xml hinzufügen:

  1. Konvertieren Sie die Signatur des Signaturzertifikats mit toByteArray in ein Byte-Array.
  2. Verwenden Sie MessageDigest, um das Byte-Array in einen Hash vom Typ „byte[]“ zu konvertieren.
  3. Wandelt den Hash von byte[] in ein Hexadezimal-Stringformat um. Ein Beispiel finden Sie unter IccUtils.java.

    List<String> certHashes = new ArrayList<>();
    PackageInfo pInfo; // Carrier app PackageInfo
    MessageDigest md =
    MessageDigest.getInstance("SHA-256");
    for (Signature signature : pInfo.signatures) {
        certHashes.add(bytesToHexString(md.digest(signature.toByteArray()));
    }
  4. Wenn certHashes ein Array mit der Größe 2 mit dem Wert 12345 und 54321 ist, fügen Sie der Konfigurationsdatei des Mobilfunkanbieters Folgendes hinzu:

    <string-array name="carrier_certificate_string_array" num="2">
        <item value="12345"/>
        <item value="54321"/>
    </string-array>