Sichere Kodierungstechnik: Das Problem der benutzerdefinierten Berechtigung

Veröffentlicht Okt 25, 2017
von Pieter De Cremer
FALLSTUDIE

Sichere Kodierungstechnik: Das Problem der benutzerdefinierten Berechtigung

Veröffentlicht Okt 25, 2017
von Pieter De Cremer
Ressource anzeigen
Ressource anzeigen

Bei der Entwicklung für Mobiltelefone müssen Anwendungen oft einige Berechtigungen vom System anfordern. Sie benötigen möglicherweise Zugriff auf die Kontakte des Benutzers, auf die Bluetooth-Verbindung oder die Möglichkeit, SMS-Nachrichten zu senden. Alle oben genannten Berechtigungen sind Plattformberechtigungen, die durch das Android-Framework definiert sind.

Aber es gibt Fälle, in denen diese nicht ausreichen und die Anwendung ihre eigene benutzerdefinierte Berechtigung definieren muss. Ich nehme unser eigenes Unternehmen als Beispiel. Secure Code Warrior könnte eine App erstellen, die einige private Daten als Teil eines Profils speichert, einschließlich der Leistung des Benutzers auf der SCW-Plattform. Und wir möchten einer anderen Sicherheitsschulungs-App, sagen wir DevTrainer, erlauben, diese Daten zu verwenden, wenn der Benutzer ihr die Erlaubnis dazu gibt. Dies sind sensible Daten, der Benutzer möchte sicherlich nicht, dass irgendjemand diese Daten kennt, aber die SCWApp sollte sie nicht komplett verstecken und schützen, da sie nützlich sein könnten. Also möchten wir dem Benutzer die Kontrolle darüber geben. Hier kommen die benutzerdefinierten Berechtigungen ins Spiel.

Die SCWApp erstellt eine benutzerdefinierte Berechtigung, DevTrainer fordert diese Berechtigung an und der Benutzer kann entscheiden, ob er dies zulassen möchte oder nicht. Dies ist eine gängige Praxis und eine gute Möglichkeit, den Zugriff auf White-Listed-Anwendungen zu beschränken.

Leider gibt es einige unintuitive Verhaltensweisen rund um benutzerdefinierte Berechtigungen, die sie aus Sicherheitsaspekten riskant machen. Konkret können benutzerdefinierte Berechtigungen von jeder App zu jeder Zeit definiert werden, und "der Erste gewinnt", und diese Strategie hat einige Konsequenzen.

Für das folgende Szenario definieren wir zwei App-Profile, die wir oben vorgestellt haben (alle diese Anwendungen sind zu Demonstrationszwecken fiktiv):

1. SCWApp: die App, die eine benutzerdefinierte Berechtigung definiert und eine Komponente mit dieser Berechtigung verteidigt.

2. DevTrainer: diese App definiert die gleiche Berechtigung wie SCWApp und erklärt dem Benutzer, dass sie diese Berechtigung besitzen möchte.

Dies ist ein häufiges Szenario, das als "Peer Apps Case" bezeichnet wird. Wenn die DevTrainer-App nur ein Plugin für die SCWApp wäre, müsste sie die benutzerdefinierte Berechtigung nicht definieren. Die Annahme ist in diesem Fall, dass SCWApp vor DevTrainer installiert wird und kein unerwartetes Verhalten auftritt. Wenn der Benutzer irgendwie DevTrainer zuerst installiert, wird der Benutzer nicht über die Anforderung der Berechtigung informiert. Wenn der Benutzer dann später SCWApp installiert, wird DevTrainer die Berechtigung nicht rückwirkend erteilt, sodass die Versuche der DevTrainer-App, die gesicherte Komponente zu verwenden, fehlschlagen.

Hier kommt der Fall der Peers-App ins Spiel. In manchen Fällen können Sie nicht erwarten, dass eine App vor der anderen installiert wird. Sagen wir, wenn Facebook und Twitter beide die Komponenten des jeweils anderen nutzen wollen, müssen sie die benutzerdefinierten Berechtigungen des jeweils anderen definieren.

An dieser Stelle wird es jedoch knifflig. Wenn die DevTrainer-App zuerst installiert wird, wird der Benutzer nicht über seine Anfrage nach der benutzerdefinierten Berechtigung informiert. Zu diesem Zeitpunkt, obwohl der Benutzer nicht informiert wurde, besitzt DevTrainer die benutzerdefinierte Berechtigung und kann auf die gesicherte Komponente zugreifen.

Es wird noch kniffliger. Die DevTrainer-App kann die Berechtigungsschutzstufe ändern. Android verwendet nicht die Schutzstufe des Verteidigers, sondern die Schutzstufe, die zuerst definiert wurde, d.h. diejenige App, die zuerst installiert wurde, kann diese definieren. Das bedeutet, wenn DevTrainer die Berechtigungsstufe auf normal ändert, dann müssen alle zukünftigen Apps, die diese Berechtigung anfordern, nicht vom Benutzer bestätigt werden, sondern erhalten automatisch Zugriff.

Dieses Szenario wurde durch die Erklärung für dieses Problem inspiriert, die auf dem cwac-security github gefunden wurde.

Die "Wer zuerst kommt, mahlt zuerst"-Strategie hat einige gefährliche Konsequenzen. Wenn der Entwickler das Verhalten nicht kennt, könnte er Sicherheitsentscheidungen auf der Grundlage von nicht vertrauenswürdigen Eingaben treffen und unbeabsichtigten Apps den Zugriff auf sensible Daten oder geschützte Dienste ermöglichen. Um mehr über die Vermeidung von Sicherheitsentscheidungen durch nicht vertrauenswürdige Eingaben zu erfahren, besuchen Sie unsere Plattform. Dieses Verhalten wurde ab Android 5.0 (Lollipop) geändert. Da aber derzeit noch mehr als 22 % der Android-Geräte mit einer niedrigeren Version von Android laufen, ist es wichtig, die Risiken des ursprünglichen Verhaltens in Ihrer App zu mindern. Prüfen Sie, ob die Berechtigung bereits beim ersten Start Ihrer App definiert wurde und ergreifen Sie in diesem Fall entsprechende Maßnahmen, um eventuelle Sicherheitsrisiken zu beheben.

Viel Glück beim Codieren und bis nächste Woche!

Durch die Definition von benutzerdefinierten Berechtigungen kann eine App ihre Ressourcen und Fähigkeiten mit anderen Apps teilen.

https://developer.android.com/guide/topics/permissions/defining.html

Ressource anzeigen
Ressource anzeigen

Autor

Pieter De Cremer

Sie wollen mehr?

Tauchen Sie ein in unsere neuesten Erkenntnisse über sichere Kodierung im Blog.

Unsere umfangreiche Ressourcenbibliothek zielt darauf ab, die menschliche Herangehensweise an eine sichere Weiterbildung im Bereich der Programmierung zu stärken.

Blog ansehen
Sie wollen mehr?

Holen Sie sich die neuesten Forschungsergebnisse zur entwicklergesteuerten Sicherheit

Unsere umfangreiche Ressourcenbibliothek ist voll von hilfreichen Ressourcen, von Whitepapers bis hin zu Webinaren, die Ihnen den Einstieg in die entwicklungsorientierte sichere Programmierung erleichtern. Erforschen Sie sie jetzt.

Ressourcendrehscheibe

Sichere Kodierungstechnik: Das Problem der benutzerdefinierten Berechtigung

Veröffentlicht Okt 25, 2017
Von Pieter De Cremer

Bei der Entwicklung für Mobiltelefone müssen Anwendungen oft einige Berechtigungen vom System anfordern. Sie benötigen möglicherweise Zugriff auf die Kontakte des Benutzers, auf die Bluetooth-Verbindung oder die Möglichkeit, SMS-Nachrichten zu senden. Alle oben genannten Berechtigungen sind Plattformberechtigungen, die durch das Android-Framework definiert sind.

Aber es gibt Fälle, in denen diese nicht ausreichen und die Anwendung ihre eigene benutzerdefinierte Berechtigung definieren muss. Ich nehme unser eigenes Unternehmen als Beispiel. Secure Code Warrior könnte eine App erstellen, die einige private Daten als Teil eines Profils speichert, einschließlich der Leistung des Benutzers auf der SCW-Plattform. Und wir möchten einer anderen Sicherheitsschulungs-App, sagen wir DevTrainer, erlauben, diese Daten zu verwenden, wenn der Benutzer ihr die Erlaubnis dazu gibt. Dies sind sensible Daten, der Benutzer möchte sicherlich nicht, dass irgendjemand diese Daten kennt, aber die SCWApp sollte sie nicht komplett verstecken und schützen, da sie nützlich sein könnten. Also möchten wir dem Benutzer die Kontrolle darüber geben. Hier kommen die benutzerdefinierten Berechtigungen ins Spiel.

Die SCWApp erstellt eine benutzerdefinierte Berechtigung, DevTrainer fordert diese Berechtigung an und der Benutzer kann entscheiden, ob er dies zulassen möchte oder nicht. Dies ist eine gängige Praxis und eine gute Möglichkeit, den Zugriff auf White-Listed-Anwendungen zu beschränken.

Leider gibt es einige unintuitive Verhaltensweisen rund um benutzerdefinierte Berechtigungen, die sie aus Sicherheitsaspekten riskant machen. Konkret können benutzerdefinierte Berechtigungen von jeder App zu jeder Zeit definiert werden, und "der Erste gewinnt", und diese Strategie hat einige Konsequenzen.

Für das folgende Szenario definieren wir zwei App-Profile, die wir oben vorgestellt haben (alle diese Anwendungen sind zu Demonstrationszwecken fiktiv):

1. SCWApp: die App, die eine benutzerdefinierte Berechtigung definiert und eine Komponente mit dieser Berechtigung verteidigt.

2. DevTrainer: diese App definiert die gleiche Berechtigung wie SCWApp und erklärt dem Benutzer, dass sie diese Berechtigung besitzen möchte.

Dies ist ein häufiges Szenario, das als "Peer Apps Case" bezeichnet wird. Wenn die DevTrainer-App nur ein Plugin für die SCWApp wäre, müsste sie die benutzerdefinierte Berechtigung nicht definieren. Die Annahme ist in diesem Fall, dass SCWApp vor DevTrainer installiert wird und kein unerwartetes Verhalten auftritt. Wenn der Benutzer irgendwie DevTrainer zuerst installiert, wird der Benutzer nicht über die Anforderung der Berechtigung informiert. Wenn der Benutzer dann später SCWApp installiert, wird DevTrainer die Berechtigung nicht rückwirkend erteilt, sodass die Versuche der DevTrainer-App, die gesicherte Komponente zu verwenden, fehlschlagen.

Hier kommt der Fall der Peers-App ins Spiel. In manchen Fällen können Sie nicht erwarten, dass eine App vor der anderen installiert wird. Sagen wir, wenn Facebook und Twitter beide die Komponenten des jeweils anderen nutzen wollen, müssen sie die benutzerdefinierten Berechtigungen des jeweils anderen definieren.

An dieser Stelle wird es jedoch knifflig. Wenn die DevTrainer-App zuerst installiert wird, wird der Benutzer nicht über seine Anfrage nach der benutzerdefinierten Berechtigung informiert. Zu diesem Zeitpunkt, obwohl der Benutzer nicht informiert wurde, besitzt DevTrainer die benutzerdefinierte Berechtigung und kann auf die gesicherte Komponente zugreifen.

Es wird noch kniffliger. Die DevTrainer-App kann die Berechtigungsschutzstufe ändern. Android verwendet nicht die Schutzstufe des Verteidigers, sondern die Schutzstufe, die zuerst definiert wurde, d.h. diejenige App, die zuerst installiert wurde, kann diese definieren. Das bedeutet, wenn DevTrainer die Berechtigungsstufe auf normal ändert, dann müssen alle zukünftigen Apps, die diese Berechtigung anfordern, nicht vom Benutzer bestätigt werden, sondern erhalten automatisch Zugriff.

Dieses Szenario wurde durch die Erklärung für dieses Problem inspiriert, die auf dem cwac-security github gefunden wurde.

Die "Wer zuerst kommt, mahlt zuerst"-Strategie hat einige gefährliche Konsequenzen. Wenn der Entwickler das Verhalten nicht kennt, könnte er Sicherheitsentscheidungen auf der Grundlage von nicht vertrauenswürdigen Eingaben treffen und unbeabsichtigten Apps den Zugriff auf sensible Daten oder geschützte Dienste ermöglichen. Um mehr über die Vermeidung von Sicherheitsentscheidungen durch nicht vertrauenswürdige Eingaben zu erfahren, besuchen Sie unsere Plattform. Dieses Verhalten wurde ab Android 5.0 (Lollipop) geändert. Da aber derzeit noch mehr als 22 % der Android-Geräte mit einer niedrigeren Version von Android laufen, ist es wichtig, die Risiken des ursprünglichen Verhaltens in Ihrer App zu mindern. Prüfen Sie, ob die Berechtigung bereits beim ersten Start Ihrer App definiert wurde und ergreifen Sie in diesem Fall entsprechende Maßnahmen, um eventuelle Sicherheitsrisiken zu beheben.

Viel Glück beim Codieren und bis nächste Woche!

Durch die Definition von benutzerdefinierten Berechtigungen kann eine App ihre Ressourcen und Fähigkeiten mit anderen Apps teilen.

https://developer.android.com/guide/topics/permissions/defining.html

Wir bitten Sie um Ihre Erlaubnis, Ihnen Informationen über unsere Produkte und/oder verwandte Themen der sicheren Codierung zuzusenden. Wir werden Ihre persönlichen Daten immer mit äußerster Sorgfalt behandeln und sie niemals zu Marketingzwecken an andere Unternehmen verkaufen.

Senden
Um das Formular abzuschicken, aktivieren Sie bitte "Analytics"-Cookies. Sie können die Cookies wieder deaktivieren, sobald Sie fertig sind.