
Aplikasi Mac Anda Memberi Akses Mikrofon — Kemudian Melupakannya Setiap Kali Dibuka
GeekBye meminta kebenaran mikrofon, anda memberikannya, dan ia berfungsi. Pada pembukaan seterusnya: hilang. Dan aplikasi itu langsung tidak muncul dalam Tetapan Sistem → Mikrofon. Punca sebenarnya ialah ciri keselamatan macOS yang secara senyap menjalankan aplikasi dari satu laluan yang lenyap — inilah diagnosisnya dan penyelesaian satu-gesaan.
Inilah pepijat yang membuatkan anda meragui mata anda sendiri. Anda memasang GeekBye, ia meminta akses mikrofon, anda mengklik Benarkan, dan transkripsi berfungsi. Bagus. Anda keluar, membukanya semula keesokan paginya — dan ia meminta akses mikrofon sekali lagi. Anda pergi menyemak Tetapan Sistem → Privasi & Keselamatan → Mikrofon untuk membetulkannya secara manual, dan GeekBye langsung tiada dalam senarai. Tidak dinafikan. Tidak dibenarkan. Cuma tiada, seolah-olah ia tidak pernah meminta.
Setiap bahagian individu kelihatan betul. Gesaan itu nyata. Kebenaran itu berfungsi pada masa itu. Aplikasi ditandatangani dan dinotarikan dengan betul beserta rentetan penggunaan yang tepat. Namun begitu, pemberian kebenaran itu lenyap setiap kali dibuka. GeekBye v2.0.6 membetulkannya — dan punca asasnya ialah salah satu perkara paling licik yang dilakukan macOS untuk melindungi anda.
Ciri yang menyembunyikan aplikasi daripada dirinya sendiri
Punca sebenarnya ialah macOS App Translocation, satu ciri keselamatan Gatekeeper. Apabila anda memuat turun aplikasi dan menjalankannya terus daripada DMG atau daripada folder ~/Downloads anda — di mana-mana sahaja ia masih "dikuarantin" — macOS sebenarnya tidak menjalankannya dari tempat yang anda lihat. Ia menyalinnya secara telus ke laluan rawak yang baca-sahaja jauh di bawah /private/var/folders/.../AppTranslocation/… dan menjalankan salinan itu. Ia satu pertahanan yang baik: ia menghalang muat turun berniat jahat daripada mengganggu fail di sebelahnya.
Tetapi di sinilah pertembungannya. Sistem kebenaran macOS (TCC — perkara yang menjejaki siapa yang boleh menggunakan mikrofon, kamera, skrin anda) mengenal pasti aplikasi berdasarkan laluan dan identiti kodnya. Apabila aplikasi ditranslokasi, laluan itu rawak dan sementara. Jadi apabila anda memberikan akses mikrofon, macOS dengan patuh merekodkan pemberian itu — terhadap satu laluan yang tidak akan wujud pada pembukaan seterusnya. Buka semula aplikasi itu, macOS mentranslokasikannya ke laluan rawak yang berbeza, melihat aplikasi yang tiada rekodnya, dan meminta lagi. Dan kerana laluan hantu itu tidak pernah menjadi lokasi yang stabil, aplikasi tidak pernah memperoleh baris kekal dalam Tetapan Sistem → Mikrofon.
Aplikasi itu memberikan kebenaran kepada hantu.
Inilah juga sebabnya hanya sesetengah orang mengalaminya. Jika salinan GeekBye anda sudah berada dalam /Applications — kerana anda menyeretnya ke sana, atau kerana ia sampai ke sana melalui kemas kini automatik — tiada kuarantin, tiada translokasi, laluan yang stabil, dan segala-galanya kekal dengan sempurna. Pepijat itu tidak kelihatan kepada kami dan kepada sesiapa yang sudah melepasi pemasangan pertama mereka, tepat jenis pepijat yang bertahan paling lama.
Pembetulannya: beri aplikasi rumah yang sebenar
Memandangkan seluruh masalahnya ialah laluan yang tidak stabil, pembetulannya ialah membawa aplikasi ke laluan yang stabil. v2.0.6 mengesan apabila GeekBye berjalan secara tertranslokasi (atau sekadar berjalan di luar /Applications) dan menawarkan satu klik "Move to Applications" — menggunakan panggilan pemindahan macOS yang menyalin himpunan itu ke /Applications dan melancarkannya semula dari sana. Sejak saat itu aplikasi mempunyai identiti tetap: pemberian mikrofon melekat, rakaman skrin melekat, dan GeekBye akhirnya muncul dalam Tetapan Sistem di tempat yang anda jangkakan.
Gesaan itu bersopan tentangnya. Ia menawarkan Move to Applications, Not Now, dan Don't Ask Again — dan ia mengingati pilihan terakhir, supaya aplikasi tidak pernah merengek kepada seseorang yang mempunyai sebab yang sengaja untuk menjalankannya dari tempat lain. Keputusan sama ada untuk memaparkan gesaan itu langsung diasingkan ke dalam fungsi-fungsi kecil dan tulen (adakah binaan ini tertranslokasi? adakah ia di luar /Applications? adakah pengguna menyekatnya?) supaya logiknya diuji unit tanpa perlu melancarkan binaan yang benar-benar dinotarikan pada volum kuarantin yang sebenar.
Keluaran yang sama juga memudahkan pengalaman kebenaran itu sendiri. GeekBye dahulunya memaparkan tetingkap kebenaran dalam-aplikasi yang tersendiri dan tersuai — beberapa ratus baris antara muka yang cuba menghasilkan semula sesuatu yang OS sudah lakukan dengan baik. v2.0.6 memadamkannya dan bersandar pada gesaan kebenaran macOS asli, disokong oleh sepanduk yang tenang dan tidak menyekat yang muncul hanya apabila satu kebenaran yang diperlukan benar-benar hilang. Kurang kod, dan tingkah laku yang sudah dikenali pengguna kerana setiap aplikasi Mac lain berfungsi dengan cara yang sama.
Bahagian yang paling saya banggakan: kami membuktikannya sebelum mempercayainya
Ia mudah untuk meneka translokasi dan mengeluarkan pembetulan. Sebaliknya, keluaran itu menyediakan diagnostik permulaan terlebih dahulu: semasa dilancarkan, GeekBye kini melaporkan laluan fail boleh lakunya sendiri dan sama ada ia tertranslokasi, sama ada ia berada dalam /Applications, dan status kebenaran mikrofon dan skrin semasa. Telemetri itu menukar teori yang munasabah menjadi teori yang disahkan — data pengeluaran menunjukkan bahawa sesi yang terjejas memang berjalan dari laluan tertranslokasi di luar /Applications, tepat seperti yang diramalkan.
Susunan itu penting. "Gesaan muncul tetapi kebenaran tidak melekat" mempunyai beberapa penjelasan yang mungkin — masalah penandatanganan, rentetan penggunaan yang hilang, isu entitlement, keanehan pangkalan data TCC. Kami menyingkirkan punca-punca peringkat API (laluan permintaan terbukti betul), kemudian membiarkan data dunia sebenar menuding ke lapisan identiti/laluan dan bukannya mengeluarkan pembetulan yang penuh harapan lalu berharap tiket sokongan berhenti.
Tiga perkara yang diajar oleh pepijat ini
- Kebenaran yang menggesa tetapi tidak kekal ialah masalah identiti, bukan masalah API. Jika kod permintaannya betul dan pemberian itu masih lenyap, berhentilah menulis semula permintaan itu. Tanyalah laluan dan identiti kod apa yang OS ikat pada pemberian itu — dan sama ada identiti itu stabil merentas pembukaan.
- Keluarkan diagnostik bersama (atau sebelum) pembetulan. Beberapa medan — dari mana saya berjalan, apa status kebenaran saya — menukar tekaan yang berpengetahuan menjadi punca asas yang disahkan dan memberitahu kami dengan tepat pengguna mana yang terjejas. Pasang instrumen pada sempadan yang anda syaki sebelum menampalnya.
- Pepijat yang bersembunyi daripada pembangun ialah yang berjalan dalam persekitaran "yang salah". Milik kami tinggal dalam
/Applicationspada setiap mesin pembangun, jadi pepijat itu secara struktur tidak kelihatan kepada kami sementara menimpa pengguna kali pertama. Apabila satu laporan tidak dapat dihasilkan semula, soalan pertamanya ialah apa yang berbeza tentang tempat ia berjalan, bukan adakah pengguna tersilap.
GeekBye v2.0.6 mengeluarkan gesaan pemindahan dan diagnostik itu bersama-sama. Untuk lengkung kebolehpercayaan yang lebih luas tempat ini berada, lihat apa yang sebenarnya diperlukan oleh sebuah versi 2 (v2.0.0) dan mengapa rakaman skrin menangkap monitor yang salah (v2.0.10) — satu lagi pepijat yang hanya timbul dalam persekitaran tertentu. Untuk keluaran perincian-kecil di sebelahnya, perisian yang tenang: pembetulan kelipan dan cip mod-jawapan (v2.0.3 + v2.0.5).