Apple-ovo najnovije ažuriranje za iOS 18.4 uvelo je značajnu grešku koja utiče na dinamičku rezoluciju simbola na uređajima koji podržavaju kod za potvrdu identiteta (PAC).
Ovaj problem, koji je prvi uočio Fabien Perigaud, istaknuti stručnjak za obrnuti inženjering, ima implikacije na aplikacije koje se oslanjaju na dinamičko učitavanje biblioteke i rezoluciju simbola.
Greška se manifestuje kada aplikacije pokušavaju riješiti simbole koristeći dinamičku dlsym()
funkciju, posebno na uređajima opremljenim A15 SoC-om, kao što je iPhone SE 3. generacije.
Problem nastaje zbog previda u implementaciji dlsym()
unutar dinamičkog povezivača ( dyld
) na iOS 18.4, gdje su određeni simboli, posebno strcmp
, pogrešno potpisani ili nepotpisani, što dovodi do pada aplikacije[1].
Bug u detaljima
Kada aplikacija koristi dlsym()
za rješavanje simbola kao što je strcmp
, koji se ponovo izvoze libsystem_platform.dylib
sa posebnom zastavicom ( EXPORT_SYMBOL_FLAGS_STUB_AND_RESOLVER
), vraćeni pokazivač funkcije bi trebao biti lišen svog PAC potpisa prije nego što se konvertuje u pomak.
Međutim, u iOS-u 18.4, ovo uklanjanje se ne događa, što rezultuje dvaput potpisivanjem pokazivača. Ovo dvostruko potpisivanje dovodi ili do nevažećeg potpisa ili do nepotpisanog pokazivača, što uzrokuje pad aplikacije zbog greške u zaštiti kernela.

Perigaudova istraga iz Synacktiv-a otkrila je da problem proizlazi iz XPACI
instrukcije koja nedostaje u dyld
kodu, koja je odgovorna za uklanjanje PAC potpisa iz pokazivača koji vraća funkcija razrješavanja.
Ova instrukcija je bila prisutna u prethodnoj verziji, iOS 18.3.2, ali njeno odsustvo u iOS-u 18.4 dovodi do uočenog ponašanja.
Dalji eksperimenti su potvrdili da je pokazivač bio tretiran kao pokazivač kernela tokom druge operacije potpisivanja, suprotno specifikacijama arhitekture ARMv8.6-A.
Ovo pogrešno tumačenje dovodi do toga da je pokazivač potpisan sa svim gornjim bitovima postavljenim na 1, što, kada se XOR izvrši sa originalnim pokazivačem, poništava prvi potpis ili proizvodi netačan.
Ova greška ima značajne implikacije za programere, posebno one koji rade na aplikacijama koje dinamički učitavaju biblioteke ili koriste sistemske funkcije putem dlsym()
.
Iako se sve aplikacije ne ruše zbog ovog problema, one koje se suočavaju sa kritičnim problemima stabilnosti. Programeri su pronašli privremena rješenja tako što su ručno uklonili i ponovno potpisali pokazivače, ali to nije održivo rješenje.
Izvor: CyberSecurityNews