Apa saja batasan penandatanganan kode ad-hoc?

14

Dimungkinkan untuk menandatangani kode atau aplikasi "ad-hoc" menggunakan codesign. Halaman manual memberi tahu kami hal berikut tentang penandatanganan kode ad-hoc:

Jika identitas adalah huruf tunggal "-" (tanda hubung), penandatanganan ad-hoc dilakukan. Penandatanganan ad-hoc sama sekali tidak menggunakan identitas, dan mengidentifikasi persis satu contoh kode. Pembatasan signifikan berlaku untuk penggunaan kode bertanda ad-hoc; lihat dokumentasi sebelum menggunakan ini.

(Penekanan ditambahkan oleh saya)

Saya ingin tahu lebih banyak dan mencoba menemukan dokumentasi tersebut, tetapi saya tidak dapat menemukan detailnya. Saya telah menemukan catatan teknis yang disebut "macOS Code Signing In Depth" , tetapi tidak menyebutkan penandatanganan ad-hoc sama sekali.

Apa "batasan signifikan" ini dan di mana mereka didokumentasikan?

not2savvy
sumber

Jawaban:

9

Pada dasarnya penandatanganan ad-hoc dalam konteks ini berarti biner ditandatangani tanpa bukti kriptografi sama sekali.

Pada dasarnya, biasanya binari ditandatangani dengan menambahkan apa yang disebut CMS (pesan kriptografi) di mana hash dari CodeDirectory adalah pesan yang ditandatangani oleh identitas penandatanganan. Ini berarti bahwa orang luar dapat memverifikasi bahwa kode itu memang ditandatangani oleh seseorang yang memegang kunci pribadi untuk identitas itu.

Saat menjalankan program, sistem macOS dapat memverifikasi bahwa tanda tangan ini valid, dan mempercayai identitas penandatanganan - dan jika benar, jalankan program. Ini adalah dasar-dasar fungsionalitas GateKeeper.

Binari yang ditandatangani ad-hoc sangat berbeda karena tidak mengandung CMS seperti itu. Sebaliknya ia hanya memegang nilai hash SHA-1 dari CodeDirectory tanpa bukti kriptografi validitasnya, dan tidak ada jalur sertifikat / identitas untuk memverifikasi.

CodeDirectory adalah objek yang menggambarkan contoh kode statis tertentu dengan memiliki nilai hash untuk berbagai bagian kode tempat aplikasi dibuat. Dengan memastikan bahwa CodeDirectory tidak terampas dengan memverifikasi tanda tangan kriptografi, dan bahwa berbagai bit kode aplikasi cocok dengan nilai hash yang disimpan dalam direktori, Anda dapat memastikan bahwa kode tersebut tidak dirusak.

Tanpa bukti kriptografis, pemeriksaan "tidak terampas" ini tidak dapat dilakukan dengan cara normal.

Alih-alih biner yang ditandatangani ad-hoc diperiksa dengan membandingkan nilai hash SHA-1 dengan daftar nilai hash "dikenal baik" yang disimpan dalam cache trust statis di dalam kernel.

Intinya ini berarti bahwa "batasan signifikan" yang ditempatkan pada aplikasi apa pun yang Anda ad-hoc tandatangani sendiri adalah tidak akan melewati segala jenis verifikasi di mana pun. Pada dasarnya sama dengan biner yang tidak ditandatangani.

Namun, jika Anda Apple, Anda dapat membuat aplikasi yang tidak ditandai kode dengan cara biasa, dan sebaliknya dipercaya secara eksplisit oleh kernel. Yaitu jika misalnya Apple ingin memastikan bahwa suatu aplikasi tidak terhapus ketika dijalankan pada tahap awal dalam startup sistem di mana verifikasi identitas penandatanganan lengkap tidak berjalan dan (atau tidak tersedia) mereka dapat menggunakan penandatanganan ad-hoc. Aplikasi ini selalu dapat diverifikasi oleh cache trust statis, tidak peduli apakah repositori sertifikat Anda disembunyikan atau hal-hal seperti itu.

Dalam praktiknya membuat binari yang ditandatangani ad-hoc hanya bernilai praktis bagi pengembang Apple.

Anda dapat menemukan dokumentasi kecil tentang penandatanganan ad-hoc di bagian pengembang Apple. Sebagai contoh:

https://developer.apple.com/documentation/security/seccodesignatureflags/kseccodesignatureadhoc

Tetapi Anda juga dapat menemukan potongan dokumen dalam kode sumber untuk utilitas codesign itu sendiri, dan dalam kode sumber untuk libsecurity.

jksoegaard
sumber
Apakah "hanya nilai praktis untuk pengembang Apple" di sini berarti, "hanya untuk pengembang yang bekerja di Apple", atau "hanya untuk pengembang yang bekerja pada platform Apple"? Benar-benar ingin tahu, ketika kami mulai mendapatkan beberapa masalah baru di mana gantungan kunci tidak dapat menemukan kunci bahkan ketika nama itu benar, dan kami sedang mempertimbangkan untuk beralih ke tanda hubung untuk pembuatan yang tidak dirilis.
Trejkaz
1
Berarti hanya untuk pengembang yang bekerja di Apple.
jksoegaard
Perhatikan bahwa simulator iOS juga menggunakan penandatanganan adhoc. Penandatanganan Adhoc mungkin bermanfaat bagi pengembang di luar Apple untuk memungkinkan aplikasi untuk meminta hak, yang saya tidak yakin mungkin tanpa tanda tangan kode (semua dokumen yang saya lihat tidak ada). Pada Mac ini biasanya bukan masalah tetapi pada iOS banyak fitur yang terjaga keamanannya, jadi pengujian bahwa ini berfungsi dengan benar diinginkan untuk pengembang iOS.
milch
@milch Anda mencampurkan dua konsep yang tidak terkait - "penandatanganan adhoc" (yang merupakan pertanyaan tentang ini), dan "distribusi adhoc" (yang sering digunakan pengembang iOS dan terkait dengan pemberian hak, dll.)
jksoegaard
Saya cukup yakin build simulator telah ditandatangani adhoc (tidak didistribusikan). Anda dapat memeriksa dengan memeriksa aplikasi iOS yang dibuat untuk simulator codesign -dv --verbose=4 /path/to/the.app. Anda akan mendapatkan kembali kalimat Signature=adhocyang menunjukkan tanda tangan adhoc. Terutama yang tidak ada adalah kunci lain yang biasanya hadir dalam aplikasi iOS yang ditandatangani secara reguler, seperti AuthoritydanTeamIdentifier
milch