2016-01-27 22 views
11

Một số API Windows trả về mã thông báo chính và một số trả lại mã thông báo mạo danh là gì. Một số API yêu cầu mã thông báo chính trong khi các API khác yêu cầu mã thông báo mạo danh.Sự khác nhau giữa Mã thông báo chính và Mã thông báo mạo danh

Ví dụ, LogonUser thường trả về một mã thông báo ban đầu, trừ khi sử dụng LOGON32_LOGON_NETWORK như kiểu đăng nhập (dwLogonType):

Trong hầu hết các trường hợp, xử lý trở lại là một dấu hiệu chính mà bạn có thể sử dụng trong các cuộc gọi đến Hàm CreateProcessAsUser. Tuy nhiên, nếu bạn chỉ định cờ LOGON32_LOGON_NETWORK, LogonUser trả về một mã thông báo mạo danh mà bạn không thể sử dụng trong CreateProcessAsUser trừ khi bạn gọi DuplicateTokenEx để chuyển đổi nó thành một mã thông báo chính.

SetThreadToken yêu cầu mã thông báo mạo danh trong khi ImpersonateLoggedOnUser có vẻ giống như một điều tương tự.

CreateProcessAsUserCreateProcessWithTokenW cả yêu cầu mã tiểu học và cả hai lưu ý một thẻ chính có thể được mua lại từ một thẻ mạo danh bằng cách gọi DuplicateTokenEx, nhưng điều gì làm các loại thẻ nghĩa?

Các thuật ngữ nói như sau:

access token

mã thông báo truy cập có chứa các thông tin bảo mật cho một phiên đăng nhập. Hệ thống tạo mã thông báo truy cập khi người dùng đăng nhập và mọi quá trình được thực hiện thay mặt cho người dùng đều có bản sao mã thông báo. Mã thông báo xác định người dùng, nhóm của người dùng và đặc quyền của người dùng. Hệ thống sử dụng mã thông báo để kiểm soát quyền truy cập vào các đối tượng bảo mật và để kiểm soát khả năng của người dùng thực hiện các hoạt động liên quan đến hệ thống khác nhau trên máy tính cục bộ. Có hai loại mã thông báo truy cập, chính và mạo danh.

primary token

mã thông báo truy cập mà thường được tạo ra chỉ bằng hạt nhân Windows. Nó có thể được gán cho một quá trình để biểu diễn thông tin bảo mật mặc định cho quá trình đó.

impersonation token

mã thông báo truy cập đã được tạo ra để nắm bắt những thông tin bảo mật của một quá trình khách hàng, cho phép một máy chủ để "mạo danh" quá trình khách hàng trong các hoạt động an ninh.

Nhưng điều đó không hoàn toàn hữu ích. Có vẻ như ai đó muốn sử dụng các từ lớn như "hạt nhân" nhưng điều này chỉ nhằm tăng thêm các câu hỏi như những gì khác (ngoài việc được gán cho một quy trình) có thể sử dụng mã thông báo chính và ai khác ngoài hạt nhân mã thông báo?

(Chúng có nghĩa là ý nghĩa của Microsoft trong đó hạt nhân chỉ là một phần của những gì chạy trong chế độ hạt nhân và cũng có điều hành, vv hoặc có nghĩa là mã chế độ người dùng cũng có thể tạo mã thông báo? nếu mã chế độ người dùng có thể tạo mã thông báo, nó sẽ phải thực hiện thông qua một cuộc gọi hệ thống, như với bất kỳ đối tượng Trình quản lý đối tượng nào, vì vậy mã thông báo sẽ thực sự được tạo trong chế độ hạt nhân.)

Dù sao, điều này không ' t trả lời câu hỏi cơ bản: Sự khác nhau giữa các loại mã thông báo là gì?Không những gì họ có thể được sử dụng hoặc cách chúng là thường được tạo.

Trả lời

12

Một người bạn gọi tôi là Programming Windows Security bởi Keith Brown, câu trả lời chính xác cho câu hỏi này.

Mã thông báo chính có thể và nên được gọi là mã thông báo quá trình và mã thông báo mạo danh có thể và nên được gọi là mã thông báo chuỗi. Mã thông báo chính chỉ có thể được đính kèm với các mã thông báo quá trình và mạo danh chỉ có thể được đính kèm vào chủ đề. Đó là tất cả. Họ thực sự có thể được tự do chuyển đổi bằng cách sử dụng DuplicateTokenEx (giả sử bạn có quyền truy cập cần thiết để xử lý bạn muốn chuyển đổi, rõ ràng).

Từ trang 115 trong cuốn sách:

BOOL DuplicateTokenEx( HANDLE ExistingToken, // in DWORD DesiredAccess, // in LPSECURITY_ATTRIBUTES Attributes, // in, optional SECURITY_IMPERSONATION_LEVEL ImpLevel, // in TOKEN_TYPE Type, // in PHANDLE NewToken); // out

...

Tham số Type là yếu tố lịch sử. Nếu bạn nhìn vào định nghĩa của số đếm TOKEN_TYPE, bạn sẽ thấy rằng mã thông báo đã được phân loại thành hai loại: mạo danh so với mã thông báo chính. Đừng bị treo trên danh pháp này; ý nghĩa thực sự đơn giản hơn nhiều so với âm thanh. Mã thông báo mạo danh chỉ có thể được đính kèm với chủ đề và mã thông báo chính chỉ có thể được đính kèm với quy trình. Đó là tất cả nó có nghĩa là. Mã thông báo quá trình thu được trước đó thông qua OpenProcessToken do đó là một mã thông báo chính.

Trong phiên bản Windows NT (3.x) rất sớm, có nhiều hạn chế nghiêm trọng hơn đối với những gì bạn có thể thực hiện với mã thông báo, tùy thuộc vào nơi bạn nhận được mã thông báo, và do đó loại mã thông báo được giới thiệu mục đích sử dụng của mã thông báo. Vì văn bản này giả sử bạn đang sử dụng Windows NT 4.0 trở lên, chỉ cần nghĩ đến mã thông báo mạo danh là "mã thông báo chuỗi" và mã thông báo chính là "mã thông báo quy trình" và sử dụng DuplicateTokenEx để chuyển đổi giữa hai mã này bất cứ khi nào cần thiết. Windows NT 4.0 xé ranh giới giữa hai bằng cách giới thiệu DuplicateTokenEx; phiên bản Windows NT 3.x của hàm này, DuplicateToken, đã được mã hóa cứng để chỉ tạo ra các mã thông báo mạo danh. Trong thực tế, bây giờ bạn sẽ có thể thấy lỗi ngớ ngẩn gây ra cuộc gọi đầu tiên đến SetThreadToken không thành công: mã đang cố gắng đính kèm mã thông báo chính (mã nhận được từ quá trình) vào chuỗi (yêu cầu mã thông báo mạo danh) . Đó là một không-không. Để khắc phục cả hai vấn đề hợp lý và các vấn đề lịch sử ngớ ngẩn, đây là các mã điều chỉnh:

thứ khác mà không phải là đúng một câu trả lời cho câu hỏi nhưng đã được đề cập trong câu hỏi:

  • Rõ ràng ImpersonateLoggedOnUser đi thêm dặm và chuyển đổi mã thông báo chính thành mã thông báo mạo danh trong khi SetThreadToken không làm phiền. Tại sao? ai biết? Có lẽ vì lý do tương tự một số API cho phép đặc quyền trong suốt thời gian của cuộc gọi trong khi những người khác yêu cầu người gọi để cho phép các đặc quyền của riêng họ.
  • LogonUser (và LsaLogonUser) có thể trả lại mã thông báo mạo danh cho đăng nhập mạng vì giả định người thường thực hiện đăng nhập mạng (tr. 83 trở đi, ví dụ).
  • Bạn có thể tạo mã thông báo từ chế độ người dùng bằng chức năng NTDLL không có giấy tờ ZwCreateToken yêu cầu các đặc quyền khá bất thường (cụ thể là SE_CREATE_TOKEN_NAME). Có lẽ bạn không nên ...
+0

Bạn cũng có thể tạo mã thông báo từ chế độ người dùng với các chức năng CreateToken và CreateTokenEx đã được tạo tài liệu, nhưng bạn cần rất nhiều cơ sở hạ tầng để làm như vậy, vì những chức năng này chỉ có thể được gọi từ SSP/AP. gói "). –

+0

Điểm tốt. Lưu ý rằng không chỉ yêu cầu bạn triển khai tất cả giao diện SSP/AP (có chức năng 'SpLsaModeInitialize' sẽ trả về trong bảng chức năng, v.v.), không giống như SSPs, SSP/AP chạy như một phần của LSASS, vì vậy chúng chạy dưới tài khoản 'NT AUTHORITY \ SYSTEM' và có' SeCreateTokenPrivilege', 'SeTcbPrivilege', v.v. Vì vậy, bảo mật khôn ngoan họ có yêu cầu tương tự (thậm chí bạn có thể nói rằng 'ZwCreateToken' là ít đòi hỏi), mặc dù bạn đang chính xác trong lưu ý rằng họ được ghi nhận đó là một cộng. – conio

+0

Điều gì sẽ xảy ra với chủ đề khi mã thông báo mạo danh được xử lý? – Dolev

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