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:
- Aktualisieren Sie
CarrierConfig.xml
mit dem Hash des Signaturzertifikats der Mobilfunkanbieter-App und reichen Sie einen Patch ein. - 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, wirdSecurityException
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 undBuild.UNKNOWN
für dieBuild#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:
- Konvertieren Sie die Signatur des Signaturzertifikats mit
toByteArray
in ein Byte-Array. - Verwenden Sie
MessageDigest
, um das Byte-Array in einen Hash vom Typ „byte[]“ zu konvertieren. -
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())); }
Wenn
certHashes
ein Array mit der Größe2
mit dem Wert12345
und54321
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>