Ada yang salah dengan TIDAK menandatangani rakitan .NET?

94

Salah satu kolega saya sangat tertarik untuk menandatangani majelis. Dia benar-benar mencoba untuk menandatangani apapun. Bahkan ketika kita menggunakan rakitan dari Microsoft yang tidak ditandatangani, dia akan mengambil kode sumbernya, menandatanganinya dan kemudian meminta pengembang lain untuk menggunakan salinannya.

Saya dapat memahami ide dasar di balik penandatanganan rakitan: untuk memastikan rakitan tertentu tidak dikompromikan oleh beberapa peretas yang cerdik. Jadi jika kita adalah perusahaan pengembang perangkat lunak, kita harus menandatangani perakitan kita sebelum merilis beberapa pustaka .NET kepada pelanggan kita.

Namun, kami terutama mengembangkan aplikasi web untuk penggunaan kami sendiri di sini, dan saya tidak dapat melihat pentingnya menandatangani setiap rakitan yang kami gunakan.

Apakah saya melewatkan sesuatu di sini?

oscarkuo
sumber
1
Perlu dicatat beberapa kebingungan di sini, "tanda tangan digital" (yang memiliki tujuan keamanan) dan "rakitan yang diberi nama kuat" yang merupakan perbaikan untuk dll neraka dan membantu GAC untuk menautkan ke perpustakaan. Menggunakan satu atau lainnya serupa dan keduanya dapat dibicarakan dalam hal menandatangani majelis. Sepertinya beberapa poster memikirkan satu dan yang lain memikirkan yang lain atau keduanya.
menggabungkan

Jawaban:

49

Majelis penandatanganan yang digunakan dalam lingkungan tepercaya kedengarannya berlebihan bagi saya.

Hal yang menarik pada rakitan yang ditandatangani adalah bahwa mereka sedikit lebih lambat untuk memuat daripada rakitan yang tidak bertanda tangan, karena harus diverifikasi secara kriptografik.

Untuk menandatangani suatu majelis, setiap majelis yang bergantung padanya juga harus ditandatangani. Dugaan saya adalah bahwa ini berkontribusi pada keinginan kolega Anda untuk menandatangani semuanya - kompilator menuntutnya.


EDIT Sejak menulis jawaban ini Anda dapat melihat baik kubu pro dan kontra memiliki dukungan yang kira-kira setara. Jelas tidak ada jawaban yang benar di sini.

Hal yang mendorong pengeditan ini adalah bahwa saat ini kami mengambil begitu banyak pustaka sumber terbuka dari NuGet, dan banyak di antaranya tidak ditandatangani sama sekali. Jika Anda ingin menandatangani perakitan Anda, Anda harus memiliki dependensi yang ditandatangani juga. Banyak pustaka sumber terbuka yang ditandatangani memiliki kunci privat yang digunakan untuk penandatanganan tersedia untuk umum di repositori sumbernya.

Seperti semua hal, ada trade-off yang harus dilakukan. Dalam pengalaman saya bekerja di lingkungan pribadi, manfaat penandatanganan sebagian besar bersifat teoretis (atau akademis, seperti yang disebutkan @ user289100 ), kecuali jika Anda khawatir tentang lembaga pemerintah yang memodifikasi kode Anda dalam hal ini Anda perlu paranoid tentang begitu banyak level infrastruktur Anda yang ditandatangani akan tampak seperti sedikit usaha. Jika tidak, jumlah tantangan yang timbul karena harus menandatangani semuanya sepertinya tidak sepadan. Namun lingkungan Anda mungkin memiliki persyaratan yang berbeda, atau Anda mungkin seorang masokis!

Lihat juga jawaban Teun D untuk informasi tentang tantangan yang terkait dengan rakitan versi saat menggunakan nama yang kuat.

Drew Noakes
sumber
17
Setuju, sekarang dia seperti kecanduan crack
Janie
3
Satu hal lagi yang perlu diperhatikan adalah jika Anda ingin membagikan rakitan ini ke seluruh aplikasi yang berbeda maka penandatanganan adalah suatu keharusan (yaitu GAC).
rajesh pillai
60

Saya telah memanfaatkan majelis tanpa tanda tangan untuk mengatasi masalah sebelum dan dalam lingkungan akademis menunjukkan kepada orang-orang mengapa itu penting. Saya mengganti file DLL yang tidak ditandatangani (sekali lagi dalam pengaturan akademis) dengan yang saya buat dengan nama yang sama, tanda tangan yang sama, dan menggunakan .NET Reflector untuk menyalin dan menempelkan kode asli, tetapi di milik saya saya mengirim email nama pengguna dan kata sandi itu sedang diteruskan sebelum memanggil kode 'nyata'.

Jika ditandatangani, Anda bisa membuat tanda tangan cocok, tapi tidak mengganti. Berlawanan dengan apa yang dikatakan Zippy, akan ada kesalahan penyesuaian waktu proses.

Majelis penandatanganan tidak pernah berlebihan. Ini membutuhkan waktu 30 detik. Ini seperti mengatakan mengunci pintu Anda berlebihan jika Anda tinggal di pedesaan. Jika Anda ingin berjudi dengan harta benda Anda, silakan biarkan terbuka. Hanya perlu satu pelanggaran keamanan untuk dipecat. Hanya perlu 30 detik untuk menandatangani rapat dan tidak ada kasus bisnis untuk tidak melakukannya. Dampak kinerja dapat diabaikan.

pengguna289100
sumber
11
Jika seorang hacker dapat mengubah dll dia juga dapat mengubah aplikasi yang memanggil dll tersebut.
ZippyV
12
Itu benar Zippy, tetapi tanpa memiliki kunci untuk menandatangani aplikasi maka mereka akan kesulitan menjalankan aplikasi di lingkungan di mana hanya versi yang ditandatangani dari aplikasi asli yang diizinkan untuk berjalan, yang akan menjadi kasus di beberapa lingkungan tempat saya bekerja. Kehilangan hutan untuk pepohonan: Tidak menandatangani pertemuan berarti mengambil risiko keamanan yang tidak diperlukan yang membutuhkan waktu 30 detik untuk dihindari dan tidak ada kasus bisnis atau kasus dunia nyata yang pernah saya lihat untuk tidak menandatangani majelis.
pengguna289100
39

Satu poin tambahan: menandatangani rakitan Anda merusak kompatibilitas mundur atas versi. Referensi Anda semua mulai menyertakan nomor versi dan versi dengan nomor versi lain dianggap tidak kompatibel. Ini menghalangi peningkatan ke versi rakitan terdistribusi yang lebih baru.

Menurut pendapat saya, Anda sebaiknya hanya memberi tanda kode jika Anda melihat beberapa keuntungan konkret darinya:

  • jika Anda menerapkan ke lingkungan di mana orang yang tidak dipercaya mungkin menyentuh majelis Anda
  • dalam model plug-in tertentu, di mana Anda ingin menggunakan sertifikat sebagai bukti untuk meningkatkan kepercayaan
  • jika kode Anda harus dapat dipanggil dari kode bertanda tangan lain (proyek seperti, katakanlah log4net, dengan benar menandatangani kode mereka agar dapat digunakan secara luas; mereka sangat mengacaukan kompatibilitas dengan kehilangan kunci rahasia mereka beberapa tahun yang lalu, risiko lain penandatanganan kode) .
  • jika Anda ingin menerapkan ke GAC
Teun D
sumber
9

Apakah kolega Anda memberikan indikasi mengapa dia suka menandatangani majelis? Satu keuntungan dari penandatanganan yang belum dibahas di sini adalah bahwa hanya majelis yang ditandatangani yang dapat dimasukkan ke dalam GAC (yaitu, dibagikan ke seluruh proses yang dikelola), tetapi sisi negatifnya tampaknya lebih besar daripada keuntungan dari perspektif saya (yang memang tidak berpengalaman).

Anekdot Anda tentang penandatanganan sendiri kode Microsoft tampaknya sangat mencurigakan bagi saya. Jika MS tidak menandatangani kodenya, mungkin ada alasannya, bukan? Dan dengan menandatanganinya, Anda mengambil tanggung jawab ketika Anda tidak menulisnya - kesempatan lain untuk masa depan menggigit Anda.

Dan Davies Brackett
sumber
2
sebenarnya saya tidak yakin mengapa tetapi Microsoft jelas tidak menandatangani Enterprise Library 3.1
oscarkuo
1
Mengapa berbagi perakitan antar proses membutuhkan perakitan berada di GAC?
Dirk Vollmar
4
Bukan karena Anda tidak dapat berbagi referensi runtime ke .dll yang sama, tetapi hanya rakitan dengan nama yang kuat (yaitu yang bertanda tangan) yang dapat masuk ke GAC - dan rakitan dimasukkan ke dalam GAC sehingga dapat dibagikan.
Dan Davies Brackett
4

Hal lain tentang menandatangani sebuah majelis adalah, bahwa seseorang tidak dapat menyuntikkan yang salah di tempat Anda (juga - diri Anda secara tidak sengaja). Misalnya, jika Anda membuat program yang merujuk ke rakitan Foo.dll, versi 1.0, seseorang dapat membuat rakitan, dengan versi yang sama, dan mengganti milik Anda, saat Anda menandatangani pustaka, itu tidak akan mungkin (di setidaknya saya tidak berpikir itu mudah mungkin).

Marcin Deptuła
sumber
4

Tanda tangan hanya diperlukan jika rakitan ditempatkan di GAC, tidak ada yang lain. Majelis yang ditandatangani tidak menghalangi seseorang untuk mengacaukannya. Seorang peretas masih bisa menghapus tanda tangan dan kode lain yang memeriksa tanda tangan.

ZippyV
sumber
2
Untuk aplikasi web, peretas juga harus memodifikasi web.config.
Tangurena
3
Jika seorang hacker dapat menghapus signature dari sebuah assembly, web.config tidak akan menghentikannya juga.
ZippyV
4
Downvoters disarankan untuk membaca ianpicknell.blogspot.com/2010/02/… dan artikel serupa yang ditautkan dari artikel tersebut.
Constantin
1
Saat ini: ya dan tidak. Saya mencoba, dan default Windows adalah TIDAK memeriksa tanda tangan ("nama kuat"). Mungkin Ramah Pengguna :-) Tautan yang direferensikan menunjukkan apa yang harus ditambahkan ke App.config untuk memaksakan pemeriksaan tanda tangan. Dan kemudian, bertentangan dengan artikel tersebut, pemeriksaan tanda tangan benar-benar berfungsi dan mendeteksi adanya gangguan, baik dengan versi nr, atau konten.
Roland
3

Saya setuju sepertinya sedikit sia-sia. Ini benar-benar diperlukan untuk memastikan file tersebut sesuai dengan yang Anda pikirkan (dan belum dirusak). Tetapi jika Anda mempercayai batasan keamanan jaringan dan server web Anda sendiri, maka menandatangani rakitan web Anda tampaknya seperti langkah yang mubazir.

Tapi mungkin itulah pengalaman bisnis kecil saya yang berbicara. Jika Anda berbicara tentang situs web perbankan online yang sangat penting, masuklah.

Steve Wortham
sumber
2

Pikirkan untuk melakukannya jika Anda akan mengirimkan sesuatu dan / atau benar-benar memiliki alasan untuk melakukannya. Dalam setiap kasus lainnya, itu hanya merepotkan. Saya akan bertanya kepada rekan kerja Anda apa yang sebenarnya dia dapatkan dari melakukan ini.

Saya telah menemukan assembly-itis yang ditandatangani sebelumnya dan itu menyakitkan di posterior, terutama ketika Anda mempertimbangkan jumlah orang yang memiliki sedikit atau tidak ada pengetahuan tentang menandatangani majelis, untuk apa dan bagaimana melakukannya. Ini hanyalah hal lain yang tidak perlu Anda khawatirkan kecuali benar-benar diperlukan.

Mark Simpson
sumber
1

Anda perlu menandatangani rakitan Anda ketika digunakan dalam penyebaran-dari-web ClickOnce XBAP .

Selain itu, semua majelis yang direferensikan perlu ditandatangani juga.

goodguys_activate
sumber
1

Kami menandatangani rakitan kami karena ada kalanya kami mendapatkan kesalahan seperti berikut (yang ini dari pengujian, tetapi dapat terjadi saat menjalankan aplikasi):

System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

TearDown : System.IO.FileLoadException : Could not load file or assembly 'Latitude.Platform.Core, Version=1.0.5871.22518, Culture=neutral, PublicKeyToken=7926214d13e12325' or one of its dependencies. The located assembly's manifest definition does not match the assembly reference. (Exception from HRESULT: 0x80131040)

Kami menemukan bahwa Visual Studio terkadang salah dan menjalankan kode lama .

Jika Anda menginginkan kesalahan jika Anda menjalankan kode lama, maka tanda tangani majelis Anda.

Jika Anda menulis paket nuget , silakan tanda tangani majelis Anda . Majelis tak bertanda tangan membuat canggung bagi kami yang ingin memastikan bahwa kami menjalankan versi terbaru kode kami. Saya tidak dapat memperbaiki Visual Studio . Yang bisa saya lakukan adalah mendeteksi bahwa Visual Studio salah. Jadi tolong, tandatangani majelis nuget Anda .

Clay Lenhart
sumber
Pembaruan: Gelombang penggunaan unsigned assemblies menang;) Kami memecahkan masalah di atas secara berbeda: membangun & menguji pada CI server mulai dari direktori kosong atau "bersih" ed. Mungkin kami memiliki skenario secara lokal di mesin dev kami, tetapi jarang terjadi atau tidak memiliki banyak dampak praktis.
Clay Lenhart