Bien que la question soit ancienne, elle continue d'apparaître au-dessus des questions sans réponse (mes balises) . Je pense donc que je devrais répondre à cette question :)
SOUTIEN DE L'AOSP AUX CAPACITÉS:
La question concerne spécifiquement les appareils Google, je n'ai jamais utilisé d'appareil Google. Cependant, ce que je peux dire avec certitude, c'est que les capacités Linux (processus) doivent avoir été activées sur la plupart des appareils (sinon tous) fonctionnant aussi bas que Android 1.6. La référence se trouve dans init
et system_server
, les deux composants très principaux de l'AOSP. Dans Android 4.2, par exemple, installd
- un autre composant de base - a été conçu pour fonctionner avec des capacités abandonnées.
Les capacités du système de fichiers ont été l'une des principales améliorations de la sécurité d'Android 4.3 qui ont supprimé set-uid
/ set-gid
des fichiers binaires comme run-as
, en définissant des capacités de fichier sur eux. Cela a provoqué des changements révolutionnaires dans le parcours d'enracinement d'Android.
La prise en charge des capacités ambiantes a été ajoutée dans Android 8, ce qui décourage l'utilisation des capacités de fichiers:
Les capacités de fichiers, à leur tour, présentent un risque pour la sécurité, car tout processus exécutant un fichier avec des capacités de fichiers pourra gagner ces capacités.
De nombreux init
services en dépendent, par exemple storaged
, le mien sshd
et mes dnscrypt-proxy
services.
LE SOUTIEN DE KERNEL AUX CAPACITÉS:
En ce qui concerne la partie noyau, la construction du noyau sans capacités n'est pas facultative:
Du noyau 2.5.27 au noyau 2.6.26, les capacités étaient un composant facultatif du noyau, et pouvaient être activées / désactivées via l' option de configuration du noyau CONFIG_SECURITY_CAPABILITIES .
Et:
Dans les noyaux avant Linux 2.6.33, les capacités des fichiers étaient une fonctionnalité facultative configurable via l' option CONFIG_SECURITY_FILE_CAPABILITIES . Depuis Linux 2.6.33, l'option de configuration a été supprimée et les capacités des fichiers font toujours partie du noyau.
La version la plus ancienne du noyau commun sur les référentiels Android est 2.6.39 qui inclut également la prise en charge des capacités de fichier.
La prise en charge des capacités du système de fichiers côté noyau a dû être retardée par certains OEM, mais ils ont dû changer, car sinon les fonctionnalités se briseraient. Par exemple surfaceflinger
(le composeur de surface d'Android ) ne fonctionnera pas sans capacités de fichier depuis Android 7.1.
Le noyau Linux principal 4.3 a été corrigé en septembre 2015 pour les capacités ambiantes (processus), rétroporté vers les noyaux Android 3.18 et 4.1 en 2016. Ils font donc nécessairement partie du noyau.
CONCLUSION:
Sur les distributions Linux, très peu de programmes utilisent les capacités de Linux. Bien qu'il y ait pam_cap
, pour la plupart (ou tous?) Distros utilisent encore set-uid
sur su
, sudo
, ping
, mount
, passwd
et ainsi de suite. Mais sur Android, les capacités sont profondément intégrées dans le cadre et les services de base. Pour les supprimer, il faudrait éditer des centaines ou des milliers de lignes dans AOSP et la source du noyau. Cela n'a aucun sens qu'un OEM (en particulier Google, qui a développé AOSP et modifié le noyau Linux pour Android) n'utilise pas cette fonctionnalité de sécurité gratuite lorsqu'elle est facilement disponible dans le noyau Android. Il s'agit d'une fonctionnalité purement liée au système d'exploitation, qui ne nécessite aucun support matériel supplémentaire. Ainsi, tout téléphone de n'importe quel fabricant doit avoir des capacités prises en charge.
DES QUESTIONS:
serais-je capable de définir des capacités sur les exécutables sans changer le binaire du noyau d'origine?
Oui, tu dois l'être.
Les choses nécessaires sont des outils pour fixer les plafonds ...
J'utilise capsh
, getcap
, setcap
, à getpcaps
partir libcap
et netcap
, à pscap
partir libcap-ng
sans aucun problème. Mais je préfère les capacités ambiantes, celles-ci sont faciles à configurer et ne dépendent d'aucune fonctionnalité du système de fichiers comme les attributs étendus comme dans le cas des capacités de fichier. Vous pouvez également utiliser listxattr
, getxattr
, setxattr
et des removexattr
outils de xattr_syscall_wrapper
manipuler security.capability
ou de toute autre xattr directement.
De votre commentaire:
Je viens de remarquer que la /system/bin/ping
commande n'est pas setuid
sur mon vrai appareil Samsung, suggérantCAP_NET_RAW
Le ping d'Android n'a set-uid
ni CAP_NET_RAW
. Il crée un socket spécial non-RAWIPPROTO_ICMP
qui - contrairement à IPPROTO_RAW
- ne nécessite aucun privilège.
AUTRES RÉFÉRENCES:
En plus de plus de 10 références données ci-dessus, voici quelques autres parties du code AOSP prenant en charge et utilisant les capacités Linux:
- Les composantes de base: Bionic
libc
, init
, trusty
(OS)
- Composants externes:
libcap
,libcap-ng
- Daemons / services:
zygote
(applications fourchues et system_server
), hostapd
, wpa_supplicant
, dnsmasq
, logd
, netd
( NetLink
gestionnaire, DNS privé), debuggerd
(test), sdcard
démon, performanced
, incidentd
, mtpd
, traced_probes
(perfetto), racoon
(IPSec), wificond
un certain nombre de daemons HAL y compris rild
.
- Exécutables:
reboot
(init), dumpstate
, tcpdump
, strace
, iputils
( ping
, traceroute
etc.)
- Minijail: un outil de sandboxing dédié et une bibliothèque qui tourne autour des capacités.
adbd
utilise cette bibliothèque pour supprimer les privilèges.
- SELinux utilise la
capability
classe pour accorder / refuser des capacités aux domaines.
Il conclut qu'Android dépend fortement des capacités de Linux, ce n'est pas une fonctionnalité peu utilisée .
EN RELATION: