fix(wifi): ivars infra 0x4000 octets + canaux HW pre-remplis (audit des handlers InfraInterface)
Breakthroughs: audit statique des 66 handlers castant vers IO80211InfraInterface; seuls setGATEWAY_ADDRESS et getHW_SUPPORTED_CHANNELS (copie 0x12d8 depuis [ivars+0x2978]) lisent [iface+0x128]. Modifications: QualcommWifi.cpp (bloc ivars 0x4000, canaux a +0x2978); docs. Validation: build_wifi.sh + kmutil OK; kext copie sur EFI (config Enabled=False).
This commit is contained in:
1 parent
057793b847
commit
fb0e068b46
2 files changed
+4
-1
No files matched your search
@@ -413,8 +413,10 @@ static IO80211SkywalkInterface* createSkywalkInterface(void) {
|
|||||||
|
|
||||||
// IO80211InfraInterface (taille 0x130) lit un pointeur d'ivars infra a +0x128 (ex: setGATEWAY_ADDRESS
|
// IO80211InfraInterface (taille 0x130) lit un pointeur d'ivars infra a +0x128 (ex: setGATEWAY_ADDRESS
|
||||||
// ecrit [ivars+0x1a8/0x1ac]). Fournir un bloc zero pour eviter le #PF CR2:0x1ac (INC-29).
|
// ecrit [ivars+0x1a8/0x1ac]). Fournir un bloc zero pour eviter le #PF CR2:0x1ac (INC-29).
|
||||||
static uint8_t sInfraIvars[0x800];
|
// Taille >= 0x2978 + 0x12d8 : getHW_SUPPORTED_CHANNELS copie 0x12d8 octets depuis [ivars+0x2978].
|
||||||
|
static uint8_t sInfraIvars[0x4000];
|
||||||
bzero(sInfraIvars, sizeof(sInfraIvars));
|
bzero(sInfraIvars, sizeof(sInfraIvars));
|
||||||
|
qualcomm_getSUPPORTED_CHANNELS(nullptr, (apple80211_sup_channel_data *)(sInfraIvars + 0x2978));
|
||||||
*(void **)((uint8_t *)mem + 0x128) = sInfraIvars;
|
*(void **)((uint8_t *)mem + 0x128) = sInfraIvars;
|
||||||
|
|
||||||
installSkywalkCustomVtable((IO80211SkywalkInterface *)mem);
|
installSkywalkCustomVtable((IO80211SkywalkInterface *)mem);
|
||||||
|
|||||||
@@ -1297,3 +1297,4 @@ Ce document répertorie de manière exhaustive l'ensemble des anomalies, blocage
|
|||||||
* **Cause racine** : `safeMetaCast` réussissant désormais, les requêtes `apple80211` empruntent le chemin `IO80211InfraInterface` (taille `0x130`) qui lit `[iface + 0x128]` (ivars infra) puis écrit à `+0x1a8/+0x1ac`. Notre objet n'étant alloué qu'à `0x128` octets, ce champ valait NULL.
|
* **Cause racine** : `safeMetaCast` réussissant désormais, les requêtes `apple80211` empruntent le chemin `IO80211InfraInterface` (taille `0x130`) qui lit `[iface + 0x128]` (ivars infra) puis écrit à `+0x1a8/+0x1ac`. Notre objet n'étant alloué qu'à `0x128` octets, ce champ valait NULL.
|
||||||
* **Correctif** : allocation de `0x138` octets et pointeur `+0x128` vers un bloc d'ivars infra zéro de 0x800 octets.
|
* **Correctif** : allocation de `0x138` octets et pointeur `+0x128` vers un bloc d'ivars infra zéro de 0x800 octets.
|
||||||
* **Risque résiduel** : d'autres chemins infra (`[ivars+0x120]->+0x28->+0x18->+0x558`, etc.) peuvent encore déréférencer des champs non initialisés ; itérer sur les prochains rapports de panic.
|
* **Risque résiduel** : d'autres chemins infra (`[ivars+0x120]->+0x28->+0x18->+0x558`, etc.) peuvent encore déréférencer des champs non initialisés ; itérer sur les prochains rapports de panic.
|
||||||
|
* **Audit statique complémentaire (INC-29)** : 66 handlers de `IO80211Family` castent vers `IO80211InfraInterface`. Seuls `setGATEWAY_ADDRESS` (écrit `[ivars+0x1a8/0x1ac]`) et `getHW_SUPPORTED_CHANNELS` (copie `0x12d8` octets depuis `[ivars+0x2978]`) lisent `[iface+0x128]` ; les autres passent par `[iface+0x120]` (ivars Skywalk valides) ou testent NULL. Le bloc d'ivars infra est donc porté à `0x4000` octets et `+0x2978` pré-rempli avec la liste de canaux.
|
||||||
Reference in new issue
Block a user