Hỗ trợ cho Windows Vista gói dịch vụ 1 (SP1) kết thúc vào ngày 12 tháng 7, 2011. Để tiếp tục nhận các bản Cập Nhật bảo mật cho Windows, hãy đảm bảo rằng bạn đang chạy Windows Vista với gói dịch vụ 2 (SP2). Để biết thêm thông tin, hãy tham khảo trang web Microsoft này: hỗ trợ sẽ kết thúc đối với một số phiên bản Windows.
Khi ứng dụng tự động tải một thư viện nối kết động (DLL) mà không cần chỉ định một đường dẫn đủ điều kiện, Windows sẽ cố gắng định vị DLL bằng cách tìm kiếm một bộ thư mục được xác định tốt. Nếu kẻ tấn công có quyền kiểm soát một trong các thư mục, họ có thể ép buộc ứng dụng tải một bản sao độc hại của DLL thay vì DLL mà nó mong muốn. Những cuộc tấn công này được gọi là "DLL tải trước các cuộc tấn công" và đều phổ biến cho tất cả các hệ điều hành có hỗ trợ tự động tải các thư viện DLL chia sẻ. Hiệu ứng của các cuộc tấn công đó có thể là kẻ tấn công có thể thực thi mã trong ngữ cảnh của người dùng đang chạy ứng dụng. Khi ứng dụng đang được chạy với tư cách là người quản trị, điều này có thể dẫn đến một vị trí đặc quyền cục bộ. Chúng tôi biết về lãi suất gia hạn trong các cuộc tấn công này. Để giới hạn hiệu ứng mà vấn đề này có trên khách hàng lẫn nhau của chúng tôi, chúng tôi đang phát hành tài liệu này cho cộng đồng người phát triển để đảm bảo rằng họ biết về sự cố này và có các công cụ cần thiết để giải quyết vấn đề trong các ứng dụng của họ.
Tóm tắt
Mô tả về các cuộc tấn công trước khi tải về DLL
Các cuộc tấn công dựa trên LoadLibrary
Khi ứng dụng tự động tải DLL mà không xác định đường dẫn đủ điều kiện, Windows sẽ cố gắng định vị DLL này bằng cách linearly tìm kiếm thông qua một tập hợp các thư mục được xác định tốt, được gọi là thứ tự tìm kiếm DLL. Nếu Windows đặt DLL trong trình tự tìm kiếm DLL, nó sẽ tải DLL đó. Tuy nhiên, nếu Windows không tìm thấy DLL trong bất kỳ thư mục nào trong trình tự tìm kiếm DLL, nó sẽ trả về lỗi cho thao tác tải DLL. Sau đây là thứ tự tìm kiếm DLL cho LoadLibraryvà Loadlibraryexcác hàm, được dùng để tự động tải DLLs:
-
Thư mục mà ứng dụng đã được tải
-
Danh bạ hệ thống
-
Thư mục hệ thống 16-bit
-
Thư mục Windows
-
Danh bạ làm việc hiện tại (các)
-
Các thư mục được liệt kê trong biến môi trường PATH
Cân nhắc kịch bản sau đây:
-
Một ứng dụng tải DLL mà không xác định đường dẫn đầy đủ điều kiện mà dự kiến sẽ tìm trong các phần của ứng dụng.
-
Ứng dụng được chuẩn bị đầy đủ để xử lý vụ việc khi nó không tìm thấy DLL.
-
Kẻ tấn công biết thông tin về ứng dụng này và điều khiển các ID.
-
Kẻ tấn công bản sao phiên bản đặc biệt của riêng crafted của DLL trong các CPC. Điều này giả định rằng kẻ tấn công có quyền thực hiện điều này.
-
Tìm kiếm trong Windows thông qua các thư mục trong trình tự tìm kiếm DLL và tìm DLL trong CPC của ứng dụng.
Trong trường hợp này, DLL đặc biệt crafted sẽ chạy trong ứng dụng và thu lợi đặc quyền của người dùng hiện tại.LoadLibraryđầy đủ điều kiện. Chúng tôi cũng biết rằng một số nhà phát triển sử dụng LoadLibrary để xác thực liệu một DLL cụ thể có hiện diện để xác định phiên bản Windows nào đang được người dùng điều hành. Bạn nên biết rằng điều này có thể làm cho ứng dụng dễ bị tổn thương. Nếu thư viện bị ảnh hưởng thực sự không tồn tại trên bản phát hành Windows mà ứng dụng đó được thực hiện, kẻ tấn công có thể giới thiệu một thư viện với tên đó thành CPC. Chúng tôi khuyên bạn nên sử dụng kỹ thuật này. Thay vào đó, hãy dùng các kỹ thuật được đề xuất được mô tả trong bài viết MSDN "nhận phiên bản hệ thống" . Một ứng dụng tải bổ trợ của bên thứ ba và không thể ép buộc bổ trợ sử dụng đường dẫn đủ điều kiện cho các cuộc gọi LoadLibrary của nó nên gọi Settlldirectory ("") để loại bỏ CPC và sau đó gọi Settlldirectory ("vị trí cài đặt plugin") để thêm thư mục cài đặt bổ trợ vào đường dẫn tìm kiếm DLL.
Đề xuất để ngăn chặn cuộc tấn công này, ứng dụng có thể loại bỏ thư mục làm việc hiện tại (CPC) từ đường dẫn tìm kiếm dll bằng cách gọi API Settlldirectory bằng cách dùng một chuỗi trống (""). Nếu một ứng dụng phụ thuộc vào việc tải một DLL từ thư mục hiện tại, vui lòng nhận được thư mục làm việc hiện tại và sử dụng để vượt qua đường dẫn củaTìm kiếm các cuộc tấn công dựa trên đường dẫn
Một cuộc tấn công tương tự tồn tại khi một ứng dụng sử dụng API SearchPath để định vị DLL và tự động tải đường dẫn được trả về bằng cách tìm kiếm. Sau đây là thứ tự tìm kiếm mặc định cho API SearchPath:
-
Thư mục mà ứng dụng đã được tải
-
Danh bạ làm việc hiện tại (các)
-
Danh bạ hệ thống
-
Thư mục hệ thống 16-bit
-
Thư mục Windows
-
Các thư mục được liệt kê trong biến môi trường PATH
Chúng tôi không đề xuất mẫu này vì nó không được bảo mật. Chúng tôi không đề xuất hàm SearchPath như một phương pháp để định vị tệp. dll nếu việc dùng dự kiến của đầu ra đang thực hiện cuộc gọi đến hàm LoadLibrary. Điều này có thể dẫn đến việc định vị tệp sai. dll vì thứ tự tìm kiếm của hàm SearchPath khác với thứ tự tìm kiếm được sử dụng bởi hàm LoadLibrary. Nếu bạn phải xác định vị trí và tải tệp. dll, hãy dùng hàm LoadLibrary.
ShellExecute và CreateProcess
Shellexecutevà CreateProcessđể tải các bảng thực thi bên ngoài. Chúng tôi khuyên bạn nên cẩn thận với những nhà phát triển khi tải các nhị phân và xác định đường dẫn đầy đủ điều kiện. Điều này sẽ đưa ra ít phức tạp hơn khi bạn tải một nhị phân thay vì thư viện.
Các biến thể của các sự cố này cũng có thể tồn tại khi nhà phát triển gọi các hàm tương tự nhưCác bước được đề xuất cho nhà phát triển phần mềm
Chúng tôi khuyên bạn nên thực hiện các nhà phát triển như sau:
-
Xác thực các ứng dụng của họ cho các trường hợp không tải thư viện không an toàn (ví dụ về từng phần sau trong bài viết này). Những điều này bao gồm các thao tác sau:
-
Sử dụng đường dẫn hướng để xác định vị trí của thư viện hoặc thành phần.
-
Việc sử dụng LoadLibrary để xác định phiên bản của hệ điều hành.
-
-
Sử dụng đường dẫn đủ điều kiện cho tất cả các cuộc gọi đến LoadLibrary, CreateProcess và ShellExecute, nơi bạn có thể.
-
Thực hiện các cuộc gọi đến Setnlldirectory với một chuỗi trống ("") để loại bỏ thư mục làm việc hiện tại từ trình tự tìm kiếm DLL mặc định mà nó được yêu cầu. Lưu ý rằng Setilldirectory ảnh hưởng đến toàn bộ quy trình. Do đó, bạn nên thực hiện một thời gian sớm trong quá trình khởi tạo, không phải trước và sau khi gọi đến LoadLibrary. Vì Setqulldirectory ảnh hưởng đến toàn bộ quy trình, hãy gọi nhiều chủ đề với các giá trị khác nhau có thể gây ra hành vi không xác định. Ngoài ra, nếu quy trình được thiết kế để tải các DLL của bên thứ ba, thử nghiệm sẽ cần thiết để xác định có nên thiết đặt toàn bộ quy trình sẽ gây ra không tương thích. Một vấn đề đã biết là khi một ứng dụng phụ thuộc vào Visual Basic for Applications, một thiết đặt toàn tiến trình có thể gây ra không tương thích.
-
Sử dụng hàm Setsearchpathmodeđể cho phép chế độ tìm kiếm quy trình an toàn cho quy trình. Thao tác này sẽ di chuyển thư mục làm việc hiện tại đến vị trí cuối cùng trong danh sách tìm kiếm SearchPath cho tuổi thọ của quy trình.
-
Tránh sử dụng SearchPath để kiểm tra sự tồn tại của DLL mà không cần phải xác định đường dẫn đầy đủ điều kiện, ngay cả khi chế độ tìm kiếm an toàn được bật, vì điều này vẫn có thể dẫn đến các cuộc tấn công tải trước DLL.
Hướng dẫn xác định tải thư viện không an toàn
Trong mã nguồn, sau đây là các ví dụ về tải thư viện không an toàn:
-
Trong ví dụ mã sau đây, ứng dụng sẽ tìm kiếm "schannel.dll" bằng cách sử dụng đường dẫn tìm kiếm ít nhất là bảo mật. Nếu một kẻ tấn công có thể đặt schannel.dll trong CPC, nó sẽ được tải ngay cả trước khi ứng dụng tìm kiếm các thư mục Windows cho thư viện thích hợp.
DWORD retval = SearchPath(NULL, "schannel", ".dll", err, result, NULL);
HMODULE handle = LoadLibrary(result); -
Trong ví dụ mã sau đây, ứng dụng sẽ cố gắng tải thư viện từ ứng dụng khác nhau và các vị trí hệ điều hành được mô tả ở đầu tài liệu này cho cuộc gọi của LoadLibrary (). Nếu có bất kỳ rủi ro nào mà tệp không hiện diện, ứng dụng có thể tìm cách tải tệp từ thư mục làm việc hiện tại. Tình huống này hơi kém nguy hiểm so với ví dụ trước đó. Tuy nhiên, vẫn cho biết người dùng ứng dụng cần có nguy cơ nếu môi trường không phải là hoàn toàn dự đoán.
HMODULE handle = LoadLibrary("schannel.dll");
Sau đây là các ví dụ về tải thư viện an toàn hơn, nhiều hơn nữa:
-
Trong ví dụ mã sau đây, thư viện được tải trực tiếp bằng cách sử dụng đường dẫn đầy đủ điều kiện. Không có nguy cơ bị kẻ tấn công giới thiệu mã độc hại trừ khi ông ấy đã có quyền ghi vào thư mục đích của ứng dụng.
HMODULE handle = LoadLibrary("c:\\windows\\system32\\schannel.dll");
http://msdn.microsoft.com/en-us/library/ms724373%28VS.85%29.aspxSHGetKnownFolderPath
http://msdn.microsoft.com/en-us/library/bb762188%28v=VS.85%29.aspx
-
Trong ví dụ mã sau đây, thư mục làm việc hiện tại được loại bỏ khỏi đường dẫn tìm kiếm trước khi gọi LoadLibrary. Điều này sẽ làm giảm rủi ro đáng kể, khi kẻ tấn công phải điều khiển thư mục ứng dụng, thư mục Windows hoặc bất kỳ thư mục nào được xác định trong đường dẫn của người dùng để sử dụng bộ dữ liệu tải trước.
SetDllDirectory ("");
HMODULE handle = LoadLibrary("schannel.dll"); -
Trên tất cả các hệ thống đã cài đặt bản Cập Nhật bảo mật 963027 (được mô tả trong MS09-014), mã sau đây sẽ di chuyển vĩnh viễn đến vị trí cuối cùng trong thứ tự tìm kiếm. Mọi cuộc gọi sau này với hàm SetSearchPathMode từ bên trong quy trình cố gắng thay đổi chế độ tìm kiếm sẽ không thành công.
SetDllDirectory ("");
HMODULE handle = LoadLibrary("schannel.dll"); -
Trong ví dụ mã sau đây, thư mục làm việc hiện tại được loại bỏ khỏi đường dẫn tìm kiếm trước khi gọi LoadLibrary. Điều này sẽ làm giảm rủi ro đáng kể, khi kẻ tấn công phải điều khiển thư mục ứng dụng, thư mục Windows hoặc bất kỳ thư mục nào được xác định trong đường dẫn của người dùng để sử dụng bộ dữ liệu tải trước.
SetSearchPathMode (BASE_SEARCH_PATH_ENABLE_SAFE_SEARCHMODE | BASE_SEARCH_PATH_PERMANENT );
HMODULE handle = LoadLibrary("schannel.dll");
Sử dụng màn hình quy trình để tự động phát hiện tải không an toàn
Microsoft phát hành một công cụ được đặt tên là màn hình quy trình. Công cụ này cho phép các nhà phát triển và người quản trị theo dõi chặt chẽ hành vi của quá trình đang chạy. Màn hình quy trình có thể được dùng để tự động phát hiện liệu một trong các ứng dụng của bạn có thể dễ bị tổn thương đối với kiểu vấn đề này hay không.
-
Để tải xuống màn hình quy trình, hãy truy cập trang web Microsoft sau đây:
http://technet.microsoft.com/en-us/sysinternals/bb896645.aspx
-
Cố gắng khởi động ứng dụng của bạn bằng cách sử dụng bộ điều hướng đến một thư mục cụ thể. Ví dụ, bấm đúp vào tệp có phần mở rộng có bộ xử lý tệp được gán cho ứng dụng của bạn.
-
Màn hình thiết lập quy trình với các bộ lọc sau đây:
-
Nếu một đường dẫn dễ bị tổn thương, bạn sẽ thấy điều gì đó tương tự như sau:
cuộc gọi đến chia sẻ tệp từ xa để tải một dll cho biết đây là một chương trình dễ bị tổn thương.
Thông tin Bổ sung
Để biết thêm thông tin, hãy truy cập các trang web Microsoft sau:
yêu cầu tìm kiếm liên kết độnghttp://MSDN.Microsoft.com/en-US/Library/ms682586 (VS. 85). aspxTài liệu MSDN trên hàm SearchPath
http://MSDN.Microsoft.com/en-US/Library/aa365527 (VS. 85). aspxTài liệu MSDN trên hàm LoadLibrary
http://MSDN.Microsoft.com/en-US/Library/ms684175 (VS. 85). aspxTài liệu MSDN trên hàm Setilldirectory
http://MSDN.Microsoft.com/en-US/Library/ms686203 (VS. 85). aspxTài liệu MSDN trên hàm SetSearchPathMode
http://MSDN.Microsoft.com/en-US/Library/dd266735 (VS. 85). aspxBài đăng blog bởi David LeBlanc, kỹ sư bảo mật chính với Microsoft Office
http://blogs.msdn.com/b/david_leblanc/archive/2008/02/20/dll-preloading-attacks.aspxBài đăng blog bởi Andrew Roths, nhóm kỹ thuật MSRC trên các cuộc tấn công tải trước DLL