De îndată ce obținem o îmbunătățire precum aplicațiile universale, care rulează nativ fără probleme atât pe computerele Intel, cât și pe cele Apple Silicon Mac, utilizatorii vor să elimine codul executabil din ele și să le transforme numai în Intel sau ARM. Acest articol analizează ceea ce este implicat în eliminarea unei aplicații universale, astfel încât să ruleze doar pe o singură arhitectură și dacă acest lucru este fezabil sau le rupe semnătura.

pierderea

Ultima tranziție a procesorului Apple a început în 2006, când au devenit disponibile Mac-urile Intel. Anul următor, în Mac OS X 10.5, a fost introdusă semnarea codului și a fost verificată pentru prima dată de Gatekeeper până în 2012, în Mac OS X 10.8. Deci, întreaga ultimă tranziție, cu binarele sale universale, a fost finalizată înainte ca semnarea codului să devină predominantă sau aplicată. Cu Catalina și Big Sur, securitatea s-a schimbat dincolo de orice recunoaștere: deși pot rula în continuare cod nesemnat, aceasta este acum excepția de la regula conform căreia tot codul executabil trebuie semnat și, de asemenea, notarizat.

În timpul ultimei tranziții, mulți utilizatori și-au eliminat binarele universale, fie din codul PowerPC, fie din codul Intel, conform arhitecturii Mac-urilor lor din acel moment. Deoarece codul executabil este adesea doar o mică parte din dimensiunea totală a aplicației, spațiul de stocare pe care l-au câștigat adesea pur și simplu nu a meritat efortul. La acea vreme, am criticat această dezbrăcare, dar utilizatorii au făcut-o la fel.

Este fezabil cu aplicațiile universale de astăzi și cu protecția modernă de securitate? Modificarea binarelor universale va sparge semnăturile de cod și notarizarea și va provoca haos?

Dezactivarea unei aplicații universale

Sunt sigur că cineva construiește deja un utilitar pentru a face acest lucru, dar pentru moment voi folosi instrumentul de comandă lipo, care este conceput pentru acest lucru și sarcini conexe cu fișiere Mach-O. Ca test, am ales una dintre aplicațiile mele universale, Mints, care are o structură simplă. Se compune dintr-un binar executabil Mach-O care se află în folderul său standard Conținut/MacOS/Mints din aplicație. Aplicațiile mai complexe vor conține binare Mach-O în alte locații, cum ar fi aplicațiile de ajutor. Aplicațiile conțin aproape invariabil și dylibs, în/Contents/Frameworks, care pot fi și binare universale, dar aici le voi ignora.

Înainte de a elimina binarele universale, confirmați ce arhitecți acceptă fișierul Mach-O folosind o comandă de genul

lipo -archs Mints.app/Contents/MacOS/Mints

În acest caz, doar două sunt acceptate, așa cum se arată în răspuns
x86_64 arm64

Să eliminăm codul arm64 și să salvăm executabilul dezbrăcat într-un fișier nou, cu
lipo -remove arm64 Mints.app/Contents/MacOS/Mints -output Mints.app/Contents/MacOS/Mints2
Dacă doriți să eliminați executabilul Intel, utilizați x86_64 în loc de arm64 în comanda respectivă.

Apoi verificați din nou arhitecții suportați:
lipo -archs Mints.app/Contents/MacOS/Mints2
ceea ce confirmă ceea ce ne-am dorit cu singurul răspuns
x86_64

Tot ce trebuie să faceți este să eliminați Universal Mints.app/Contents/MacOS/Mints și să redenumiți Mints2 în Mints. Aceasta micșorează executabilul Mach-O de la 442 KB la 214 KB și economisirea totală de 228 KB.

Testarea aplicației dezbrăcate

Lansarea versiunii dezbrăcate de Mints este un test bun aici, deoarece aplicația, ca aproape toată a mea, își verifică propria semnătură de fiecare dată când este deschisă. Spre surprinderea mea, acest lucru a funcționat bine, iar Mints nu a fost cu atât mai rău cu cât a scos o parte din interior. Examinând-o cu ArchiChect-ul meu gratuit, a confirmat că nu mai este o aplicație universală și că acceptă doar Mac-urile Intel. Există un detaliu interesant în verificarea codului de cod, unde se raportează că formatul său este „app bundle with Mach-O universal (x86_64)”. Aceasta înseamnă că executabilul Mach-O are încă structura unui binar universal cu anteturile sale, dar conține doar un singur executabil.

În cele din urmă, am adăugat un semnal de carantină folosind xattred și am mutat aplicația dezbrăcată la un volum diferit, pentru a declanșa verificări complete Gatekeeper.

Aplicația Mints dezbrăcată a apărut cu brio: nu doar că a fost semnată corect, dar legalizarea sa este încă bună.

În interiorul binarului universal Mach-O

Pentru a explica modul în care aplicația dezbrăcată avea încă semnăturile sale de cod intacte, consultați înapoi la prima mea privire asupra formatului binar universal Mach-O. Aceasta se referă la fiecare dintre executabilele incluse care conțin propriile certificate încorporate. Când macOS verifică bine semnăturile, se asigură că fiecare executabil furnizat (și alte conținuturi semnate) este semnat și, deoarece Binarul Universal a fost dezbrăcat în mod corespunzător folosind lipo, acesta rămâne cazul. Doar că executabilul pentru o altă arhitectură a fost eliminat, ceea ce în mod clar nu duce la o eroare de semnare a codului.

Concluzie

Dacă doriți cu adevărat și cu condiția să utilizați lipo pentru a face treaba în mod corespunzător, în marea majoritate a aplicațiilor care elimină binarele universale pentru a sprijini mai puțini arhitecți ar trebui să fie perfect sigure. Vor exista întotdeauna unele aplicații în care pachetul rezultat nu va funcționa corect, bănuiesc, și nu doriți să faceți acest lucru pentru singura dvs. copie a oricărei aplicații. Dar trebuie să vă întrebați dacă mutilarea aplicațiilor în acest mod merită efortul: în cazul Mints, a economisit doar 228 KB dintr-o dimensiune totală a aplicației de 17,2 MB. Este doar 1,3%. Chiar și aplicat într-un dosar mare de aplicații, acest lucru pare destul de inutil.