Am tôi ngay trong suy nghĩ rằng nếu tôi mã ký exe tham chiếu đến một vài dlls (không mạnh tên) mà người dùng độc hại có thể thay thế các file DLL của tôi và phân phối các ứng dụng trong một cách mà xuất hiện như thể nó được ký bởi tôi, nhưng đang chạy mã của họ?
Có nếu phần còn lại của các tệp DLL chỉ được ký và không được đặt tên mạnh, chúng có thể được thay thế mà không cần .NET. Bạn có thể, bên trong exe, xác minh các DLL được ký bởi cùng một khóa như exe. Không có cách nào trong số các phương pháp này ngăn người khác thay thế các tệp DLL của bạn hoặc EXE.
Giả sử đó là sự thật, nó có vẻ như bạn sẽ không thực sự muốn ký vào một ứng dụng .NET mà không mạnh mẽ đặt tên toàn bộ điều, nếu không bạn đang đem lại cho mọi người khả năng để thực thi mã dưới vỏ bọc của một ứng dụng bạn đã viết?
Nói chung tôi cho rằng đó là 'thực hành tốt nhất', nhưng một lần nữa bạn đã không ngăn cản bất cứ điều gì. Khi người dùng có quyền thay đổi tệp trên hệ thống cục bộ, bạn không thể làm gì để ngăn chặn chúng khỏi hoạt động độc hại.
Có một số công nghệ obfuscation xây dựng các dự án .NET hoàn chỉnh thành một exe đơn lẻ, điều này có thể làm cho phương pháp 'an toàn nhất' nhưng vẫn có thể giả mạo.
Câu hỏi thực sự là bạn đang cố gắng ngăn họ làm gì? Tôi có nghĩa là để nói, tại sao một người nào đó sẽ quan tâm đến việc thay thế dll của bạn? Họ hy vọng sẽ đạt được điều gì, mục tiêu của họ là gì? Nếu bạn đang cố gắng để ngăn chặn một người nào đó đọc thông tin nhạy cảm từ quá trình bạn ở trong một con đường dài của sự thất vọng. Giả sử một bên độc hại có quyền truy cập đầy đủ vào mã nguồn của bạn và mọi thông tin được sử dụng bởi quy trình của bạn, bởi vì họ thực hiện. Giả sử họ có thể thay thế tất cả hoặc một phần mã của bạn theo ý muốn, bởi vì họ có thể.
Updated chuyển hướng
Vì vậy, ràng buộc sẽ chỉ làm việc với assembly tên mạnh với cùng khóa, và do đó không bảo vệ bạn khỏi DLL được thay đổi?
Chính xác, với ngoại lệ đã lưu ý rằng việc tiêm mã vẫn có thể được thực hiện theo nhiều cách.
... và quay lại câu hỏi ban đầu, ký mã mà không đặt tên mạnh làm suy yếu điểm ký mã?
Không thực sự. Ký mã (không đặt tên mạnh) có hai mục đích riêng biệt:
- Xác thực. Xác minh ai là tác giả của phần mềm.
- Tính toàn vẹn. Xác minh rằng phần mềm đã không bị giả mạo vì nó đã được ký.
Thông thường, điều này chỉ được xác thực và xác thực trong khi cài đặt. Đây là lý do tại sao chúng tôi ký setup.exe của chúng tôi, để đảm bảo rằng khách hàng đã nhận được trình cài đặt chưa sửa đổi từ chúng tôi. Chúng được nhắc với "Bạn có tin cậy Công ty XXXX" và do đó cấp quyền cho trình cài đặt được xác thực/đã ký. Sau khi cài đặt tuy nhiên có rất ít được xây dựng trong sử dụng mã ký bởi hệ điều hành (trừ các trình điều khiển và một số trường hợp tối nghĩa khác).
Đặt tên mạnh mẽ với nhau có mục đích hoàn toàn khác cho sự tồn tại của nó. Nó hoàn toàn tập trung vào 'tính toàn vẹn' của ứng dụng. Không có chứng chỉ, không có thẩm quyền ký (CA) để xác minh nó, không có thông tin người dùng hiển thị cho họ để xác nhận, và không có gì hệ điều hành có thể xác minh về thực thi nó sẽ chạy.
Khung NET sử dụng tên mạnh mẽ đối với nhiều thứ, tất cả chúng tôi lỏng lẻo phân loại như vẹn ứng dụng:
- Nội dung của dll/exe có một hash ký để nó không thể giả mạo.
- Mỗi tham chiếu phải được đặt tên mạnh và được xác minh khi tải phụ thuộc.
- Các hội đồng có thể được đăng ký trong chính sách GAC và nhà xuất bản có thể được sử dụng.
- Hình ảnh gốc có thể được tạo ra để tạo ra một hình ảnh được biên dịch về IL của hội đồng.
Tôi chắc chắn có những thứ khác tôi thiếu ở đây, nhưng đây là những công dụng chính mà tôi biết.
Thực hành tốt nhất cho ký kết và mạnh mẽ đặt tên
- Sử dụng một trình cài đặt đã ký
- Sử dụng một mã ký thực thi
- Sử dụng một thực thi
- tên Mạnh tên mạnh toàn phụ thuộc và các tham chiếu đến chúng
- Các phụ thuộc ký mã thường không được yêu cầu *
- Cân nhắc việc đăng ký hội đồng GAC tại thời điểm cài đặt
* Lưu ý: Ký hiệu mã có thể hữu ích trong một số trường hợp cho một DLL, ví dụ như đối tượng COM được ký tên và được đặt tên mạnh là nếu nó là một tập tin thực thi. Việc ký mã cũng có thể hữu ích trong việc xác minh các phụ thuộc bên ngoài mà không cần nạp assembly hoặc phản ánh các thuộc tính của nó.
Tôi không có ví dụ tôi đang cố gắng bảo vệ, tôi chỉ đang cố hiểu đầy đủ mã ký/SN :-) Bạn đề xuất SN có thể bị bỏ qua với các ràng buộc chuyển hướng ... Không phải điều đó là thất bại điểm của SN hoàn toàn? –
Bạn chính xác, chuyển hướng ràng buộc không thể thay đổi khóa ký. Tôi cố gắng kiểm tra sự thật của mình sau khi đăng nhưng bị phân tâm. –
Vì vậy, chuyển hướng ràng buộc sẽ chỉ làm việc với các hội đồng được đặt tên mạnh với cùng một khóa, và do đó * không * bảo vệ bạn khỏi các tệp DLL bị thay đổi? (và quay trở lại câu hỏi ban đầu, không ký mã mà không có tên mạnh mẽ làm suy yếu điểm ký mã?) –