
Jūsų „Mac" programa gauna prieigą prie mikrofono — ir kaskart paleidus ją pamiršta
„GeekBye" paprašė leidimo naudoti mikrofoną, jį suteikėte, ir viskas veikė. Kitą kartą paleidus: dingo. O programa apskritai nepasirodė Sistemos nuostatose → Mikrofonas. Kaltininku buvo „macOS" saugumo funkcija, tyliai paleidžianti programą iš kelio, kuris pranyksta — štai diagnozė ir pataisa vienu paspaudimu.
Štai klaida, dėl kurios imi abejoti savo akimis. Įsidiegiate „GeekBye", jis paprašo prieigos prie mikrofono, spustelite Leisti, ir transkripcija veikia. Puiku. Uždarote, kitą rytą atidarote — o jis prašo prieigos prie mikrofono vėl. Einate patikrinti Sistemos nuostatų → Privatumas ir saugumas → Mikrofonas, kad pataisytumėte rankomis, o „GeekBye" sąraše apskritai nėra. Ne uždrausta. Ne leista. Tiesiog nėra, tarsi jis niekada ir neprašė.
Kiekvienas atskiras dalykas atrodė teisingas. Užklausa buvo tikra. Leidimas tą akimirką veikė. Programa buvo tinkamai pasirašyta ir notarizuota su teisingomis naudojimo eilutėmis. Ir vis dėlto suteiktas leidimas kaskart paleidus išgaruodavo. „GeekBye" v2.0.6 tai pataisė — o pirminė priežastis yra vienas gudriausių dalykų, kuriuos „macOS" daro, kad jus apsaugotų.
Funkcija, kuri slėpė programą nuo jos pačios
Kaltininkas yra „macOS App Translocation", „Gatekeeper" saugumo funkcija. Kai atsisiunčiate programą ir paleidžiate ją tiesiai iš DMG arba iš ~/Downloads aplanko — bet kur, kur ji tebėra „karantine" — „macOS" iš tikrųjų paleidžia ją ne ten, kur ją matote. Jis skaidriai nukopijuoja ją į atsitiktinį tik skaitymui skirtą kelią giliai po /private/var/folders/.../AppTranslocation/… ir paleidžia tą kopiją. Tai gera apsauga: ji neleidžia kenksmingam atsisiuntimui klastoti šalia esančių failų.
Bet štai susidūrimas. „macOS" leidimų sistema (TCC — tai, kas seka, kas gali naudoti jūsų mikrofoną, kamerą, ekraną) atpažįsta programą pagal jos kelią ir kodo tapatumą. Kai programa yra translokuota, tas kelias yra atsitiktinis ir laikinas. Taigi kai suteikiate prieigą prie mikrofono, „macOS" stropiai užfiksuoja suteikimą — keliui, kurio kitą kartą paleidus nebus. Atidarote programą vėl, „macOS" translokuoja ją į kitą atsitiktinį kelią, mato programą, apie kurią neturi jokio įrašo, ir klausia iš naujo. O kadangi tas fantominis kelias niekada nėra stabili vieta, programa niekada neįgyja nuolatinės eilutės Sistemos nuostatose → Mikrofonas.
Programa suteikdavo leidimą vaiduokliui.
Būtent todėl su tuo susidūrė tik kai kurie žmonės. Jei jūsų „GeekBye" kopija jau gyveno /Applications — nes nutempėte ją ten arba nes ji ten atsidūrė per automatinį atnaujinimą — nėra karantino, nėra translokacijos, kelias stabilus, ir viskas išlieka tobulai. Klaida buvo nematoma mums ir kiekvienam po pirmojo įdiegimo, o tai kaip tik toks klaidos tipas, kuris išgyvena ilgiausiai.
Pataisa: suteikite programai tikrus namus
Kadangi visa problema — nestabilus kelias, pataisa yra perkelti programą į stabilų. v2.0.6 aptinka, kai „GeekBye" veikia translokuotas (arba tiesiog veikia už /Applications ribų), ir siūlo vienu paspaudimu „Move to Applications" — naudodamas „macOS" perkėlimo iškvietimą, kuris nukopijuoja paketą į /Applications ir iš ten jį paleidžia iš naujo. Nuo tos akimirkos programa turi pastovų tapatumą: mikrofono suteikimas laikosi, ekrano įrašymas laikosi, o „GeekBye" pagaliau pasirodo Sistemos nuostatose ten, kur to tikitės.
Užklausa dėl to yra mandagi. Ji siūlo Move to Applications, Not Now ir Don't Ask Again — ir įsimena paskutinį pasirinkimą, tad programa niekada neįkyri tam, kuris turi sąmoningą priežastį paleisti ją iš kitur. Sprendimas, ar apskritai rodyti užklausą, izoliuotas į mažas, grynas funkcijas (ar ši versija translokuota? ar ji už /Applications ribų? ar naudotojas ją nutildė?), tad logika padengta vienetiniais testais be poreikio paleisti tikrą notarizuotą versiją tikrame karantino tome.
Tas pats leidimas supaprastino ir pačią leidimų patirtį. „GeekBye" anksčiau iššokdavo su pritaikytu, savadarbiu vidiniu leidimų langu — keliais šimtais sąsajos eilučių, mėginančių atkartoti tai, ką OS ir taip daro gerai. v2.0.6 jį ištrynė ir atsirėmė į savąją „macOS" leidimų užklausą, paremtą tyliu, neblokuojančiu skydeliu, kuris pasirodo tik tada, kai reikalingo leidimo iš tikrųjų trūksta. Mažiau kodo ir elgsena, kurią naudotojai jau atpažįsta, nes visos kitos „Mac" programos veikia taip pat.
Dalis, kuria labiausiai didžiuojuosi: įrodėme tai anksčiau, nei patikėjome
Būtų buvę lengva translokaciją atspėti ir išleisti pataisą. Vietoj to leidimas pirmiausia išleido paleisties diagnostiką: paleidus „GeekBye" dabar praneša savo paties vykdomojo failo kelią ir tai, ar jis translokuotas, ar yra /Applications viduje, bei esamą mikrofono ir ekrano leidimų būseną. Ši telemetrija tikėtiną teoriją pavertė patvirtinta — gamybos duomenys parodė, kad paveikti seansai iš tikrųjų veikė iš translokuotų kelių už /Applications ribų, būtent kaip ir buvo numatyta.
Ši tvarka svarbi. „Užklausa pasirodo, bet leidimas nesilaiko" turi kelis galimus paaiškinimus — parašo problema, trūkstama naudojimo eilutė, teisių (entitlement) klausimas, TCC duomenų bazės keistenybė. API lygmens priežastis atmetėme (užklausos kelias buvo akivaizdžiai teisingas), o paskui leidome realaus pasaulio duomenims nurodyti į tapatumo/kelio sluoksnį, užuot išleidę pataisą su viltimi ir tikėdamiesi, kad pagalbos užklausos nustos ateiti.
Trys dalykai, kurių moko ši klaida
- Leidimas, kuris klausia, bet nesilaiko, yra tapatumo, o ne API problema. Jei užklausos kodas teisingas, o suteikimas vis tiek dingsta, liaukitės perrašinėję užklausą. Paklauskite, prie kokio kelio ir kodo tapatumo OS sieja suteikimą — ir ar tas tapatumas stabilus tarp paleidimų.
- Išleiskite diagnostiką kartu su (arba prieš) pataisą. Keli laukai — iš kur veikiu, kokia mano leidimų būsena — pavertė pagrįstą spėjimą patvirtinta pirmine priežastimi ir tiksliai pasakė, kurie naudotojai buvo paveikti. Aprūpinkite prietaisais ribą, kurią įtariate, prieš ją lopdami.
- Klaidos, kurios slepiasi nuo kūrėjų, yra tos, kurios veikia „netinkamoje" aplinkoje. Mūsiškė gyveno
/Applicationskiekvienoje kūrėjo mašinoje, tad buvo struktūriškai nematoma mums, tuo pat metu paliesdama pirmakart besinaudojančius. Kai pranešimas neatsikartoja, pirmasis klausimas yra kuo skiriasi vieta, kur tai veikia, o ne ar naudotojas klysta.
„GeekBye" v2.0.6 išleido perkėlimo užklausą ir diagnostiką kartu. Dėl platesnio patikimumo lanko, į kurį tai įsirašo, žr. kiek iš tikrųjų kainuoja 2 versija (v2.0.0) ir kodėl ekrano įrašymas fiksuoja ne tą monitorių (v2.0.10) — dar viena klaida, iškilusi tik konkrečioje aplinkoje. Dėl gretimo smulkių detalių leidimo, ramus programinis įrankis: mirgėjimo pataisa ir atsakymo režimo žetonas (v2.0.3 + v2.0.5).