2011-12-19 29 views
21

Cố gắng thu hút đầu óc của tôi xung quanh ký mã xác thực và đặt tên mạnh. Tôi có nghĩ rằng nếu tôi ký mã lệnh exe tham chiếu một vài dll (không có tên mạnh) thì người dùng độc hại có thể thay thế các tệp DLL của tôi và phân phối ứng dụng theo cách xuất hiện như thể nó được ký bởi tôi , nhưng đang chạy mã của họ? Giả sử đó là sự thật, có vẻ như bạn sẽ không thực sự muốn ký một ứng dụng .NET mà không đặt tên toàn bộ một cách mạnh mẽ, nếu không bạn sẽ 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 ?Việc ký mã mà không đặt tên mạnh sẽ khiến ứng dụng của bạn mở để lạm dụng?

Lý do tôi không chắc chắn là không có bài viết nào tôi tìm thấy trực tuyến (bao gồm tài liệu MSDN về cách sử dụng SN + Authenticode) dường như đề cập đến điều này, và có vẻ như một điểm khá quan trọng cần hiểu (nếu tôi ' đã hiểu chính xác)?

Trả lời

15

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:

  1. Xác thực. Xác minh ai là tác giả của phần mềm.
  2. 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:

  1. Nội dung của dll/exe có một hash ký để nó không thể giả mạo.
  2. Mỗi tham chiếu phải được đặt tên mạnh và được xác minh khi tải phụ thuộc.
  3. 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.
  4. 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ó.

+0

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? –

+0

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. –

+0

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ã?) –

1

Khi ai đó có thể thay thế mã của dll hoặc chạy trên máy của bạn, bạn sẽ thấy rất nhiều biện pháp bảo vệ còn lại cho bạn. Trong trường hợp của tôi tất cả các Dll là mã ký riêng. Mã của tôi từ chối tải xuống Dll không được ký như là một phần của bản cập nhật tự. Tuy nhiên bất kỳ ứng dụng nào chạy ở mức toàn vẹn của tôi hoặc cao hơn trên hệ thống của tôi (Trong trường hợp> = Vista Windows) vẫn có thể tiêm một dll vào exe của tôi với một cái gì đó như CreateRemoteThread vv (http://www.codeguru.com/Cpp/WP /dll/article.php/c105) Nhưng một lần nữa giả sử ai đó có thể lấy mã nước ngoài vào hệ thống là phần khó. Phần còn lại rất dễ.

0

bạn cũng phải nhớ rằng Mã ký thường giới thiệu rất nhiều nỗi đau khi nâng cấp dll mà không triển khai các phần khác của ứng dụng.

Đây là lý do tại sao nhiều thư viện phổ biến không mạnh mẽ đặt tên cho dll's

0

Sau khi tìm kiếm và đọc nhiều nội dung. Cuối cùng tôi có thể nói với câu hỏi của bạn, CÓ, tên mạnh mẽ cho các phụ thuộc là phải nếu bạn định ký điện tử cho ứng dụng của mình.

Giả sử điều này, nếu phụ thuộc của bạn không có tên mạnh. Và họ được thay thế. Ứng dụng của bạn sẽ tải chúng mà không có bất kỳ vấn đề gì. Và người dùng sẽ thấy hộp thoại "Nhà xuất bản đã xác minh: Tên của bạn". Trong khi thực thi đã bị ảnh hưởng nhưng phụ thuộc đã bị thay đổi.

Vấn đề không phải là người dùng đó nhưng phân phối gói đó với phụ thuộc thay đổi trong khi mọi người sẽ thấy tên của bạn trên đó.

Các vấn đề liên quan