Mã độc sử dụng kỹ thuật DLL Side-Loading
TỔNG QUAN VỀ DLL
DLL là viết tắt của thư viện liên kết động (Dynamic Link Library). File DLL chứa những hướng dẫn mà các chương trình khác có thể gọi đến để làm một tác vụ nào đó. Về cơ bản, DLL cũng giống như file EXE, tuy nhiên các file này được đặt tên khác nhau trong quá trình liên kết [1].
DLL là một thư viện chứa mã và dữ liệu có thể được sử dụng bởi nhiều chương trình cùng một lúc. Nhiều chương trình khác nhau có thể chia sẻ cùng một file DLL. Bằng cách sử dụng DLL, một chương trình có thể được module hóa thành các thành phần riêng biệt. Ví dụ, một chương trình kế toán có thể được bán theo module. Mỗi module có thể được tải vào chương trình chính tại thời điểm chạy nếu module đó được cài đặt. Vì các module tách biệt nhau nên thời gian tải chương trình nhanh hơn. Và một module chỉ được tải khi chức năng đó được yêu cầu. Ngoài ra, các bản cập nhật dễ dàng áp dụng hơn cho từng module mà không ảnh hưởng đến các phần khác của chương trình.
DLL HIJACKING
DLL Hijacking là phương pháp tiêm mã độc vào ứng dụng hợp lệ bằng cách khai thác lỗ hổng trong việc nạp DLL của ứng dụng đó. Chỉ hệ điều hành của Microsoft mới dễ dàng bị tấn công DLL Hijacking [2]. Bằng cách thay thế tệp DLL có sẵn trong Windows bằng một phiên bản bị nhiễm mã độc và đặt nó trong các tham số tìm kiếm của ứng dụng, tệp bị nhiễm sẽ được gọi khi ứng dụng tải và kích hoạt các hoạt động độc hại của nó.
Để xâm nhập DLL thành công, nạn nhân cần tải tệp DLL bị nhiễm từ cùng thư mục với ứng dụng được nhắm mục tiêu. Nếu các ứng dụng được tải tự động khi khởi động đã bị xâm nhập với tệp DLL bị nhiễm mã độc, tin tặc sẽ giành được quyền truy cập vào máy tính bất cứ khi nào ứng dụng tải, hoặc mã độc có thêm cửa hậu để tin tặc có thể truy cập máy tính bất cứ khi nào.
DLL Hijacking là một kỹ thuật tấn công đã được biết đến từ lâu, được sử dụng trong giới tội phạm mạng từ khi Windows 2000 ra mắt. Để một cuộc tấn công DLL Hijacking thành công, tin tặc cần tìm cách cho một ứng dụng nạp tập tin DLL đã bị tiêm mã độc thay vi DLL hợp lệ. Bằng cách khai thác thứ tự tìm kiếm DLL công khai của các ứng dụng Microsoft, thủ thuật này tương đối đơn giản để thực hiện.
Các yếu tố sau ảnh hưởng đến việc hệ thống tìm kiếm một DLL:
- Nếu một DLL có cùng tên module đã được tải trong bộ nhớ, hệ thống chỉ kiểm tra chuyển hướng tới một tệp kê khai trước khi phân giải tới DLL đã tải, bất kể nó nằm trong thư mục nào; - Nếu DLL nằm trong danh sách các DLL đã biết cho phiên bản Windows mà ứng dụng đang chạy, hệ thống sử dụng bản sao của DLL đã biết thay vì tìm kiếm DLL. Để biết danh sách các DLL đã biết trên hệ thống hiện tại, có thể xem trên Key Registry theo đường dẫn sau: HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Control\SessionManager\KnownDLLs;
- Nếu một DLL có các phụ thuộc, hệ thống sẽ tìm kiếm các DLL phụ thuộc như thể chúng chỉ được tải bằng tên module của chúng. Điều này đúng ngay cả khi DLL đầu tiên được tải bằng cách chỉ định một đường dẫn đầy đủ.
Thứ tự tìm kiếm DLL tiêu chuẩn của các ứng dụng Microsoft phụ thuộc vào chế độ tìm kiếm DLL an toàn có được bật hay không. Khi bật chế độ tìm kiếm DLL an toàn, các ứng dụng sẽ tìm kiếm các tệp DLL cần thiết theo thứ tự sau [3]: Thư mục mà ứng dụng được tải từ đó; Thư mục hệ thống; Thư mục Windows; Thư mục hiện tại.
Khi chế độ tìm kiếm DLL an toàn bị tắt, thứ tự tìm kiếm như sau: Thư mục mà ứng dụng được tải từ đó; Thư mục hiện tại; Thư mục hệ thống; Thư mục Windows.
Sự khác biệt giữa hai chế độ tìm kiếm là thứ tự mà thư mục hiện tại của người dùng được tìm kiếm được nâng lên một chút trong phân cấp khi tính năng tìm kiếm an toàn bị tắt. Các ứng dụng Windows sẽ mặc định cho bất kỳ một trong các giao thức tìm kiếm DLL ở trên, nếu một ứng dụng không chỉ định đường dẫn đầy đủ của các tệp DLL được liên kết [4]. Đây là cách khai thác khiến cho việc DLL Hijacking có thể xảy ra. Ví dụ, nếu ứng dụng Windows yêu cầu tệp DLL nằm trong thư mục hệ thống C:\Windows\ System32 nhưng không có hướng dẫn trong mã của nó để tìm kiếm ở vị trí rõ ràng này, ứng dụng sẽ hoạt động thông qua lệnh tìm kiếm DLL để định vị tệp.
Bất kể có bật tìm kiếm an toàn hay không, thư mục mà từ đó ứng dụng được khởi chạy là vị trí đầu tiên được tìm kiếm. Nếu các tin tặc di chuyển tệp DLL bị nhiễm vào vị trí này, ứng dụng sẽ mở tệp đó thay vì tệp gốc vì vị trí của nó đã được tìm kiếm trước, trước thư mục hệ thống. Để khởi chạy xâm nhập DLL, tội phạm mạng chỉ cần gửi một tải DLL vào thư mục của một ứng dụng được nhắm mục tiêu. Nhiều vector tấn công có thể tạo điều kiện cho việc gửi tải DLL như vậy, bao gồm các cuộc tấn công kỹ thuật xã hội, lừa đảo và chuỗi cung ứng [5, 6].
DLL SIDE-LOADING
DLL Side-Loading là một trong những kỹ thuật của DLL Hijacking, với thủ thuật chiếm đoạt thứ tự tìm kiếm DLL của một ứng dụng hợp lệ. Kỹ thuật này đã trở nên phổ biến trong các chiến dịch tấn công bằng phần mềm độc hại APT và có hoạt động tương tự như kỹ thuật DLL Hijacking. Sự khác biệt giữa hai kỹ thuật này là kỹ thuật DLL Hijacking lợi dụng thứ tự tải của các DLL hợp lệ bằng cách thêm DLL độc hại ở vị trí tìm kiếm đầu tiên mà hệ thống tải lên khi bắt đầu chạy ứng dụng. Còn kỹ thuật DLL Side-loading lợi dụng các thư viện liên kết không chặt chẽ và thứ tự tìm kiếm mặc định của Windows bằng cách thêm tệp DLL độc hại thay cho một DLL hợp lệ trên một hệ thống, tệp DLL độc hại này sẽ được tải tự động bởi một chương trình chính thống.
CÁCH THỨC TẤN CÔNG DLL SIDELOADING VÀO MỘT ỨNG DỤNG HỢP LỆ
Để tiến hành tấn công DLL Side-Loading trên một ứng dụng hợp lệ, ở đây là ứng dụng Pain có chữ ký số của Microsoft, tin tặc sẽ thực hiện các bước tấn công như dưới đây.
Trước khi thực hiện tấn công, cần có một số công cụ và kiểm tra sau khi đã tấn công như: Autorun, Process Explorer 64 bit, Process Monitor,…
Trước tiên, sử dụng công cụ Process Monitor để có thể kiểm tra các DLL của ứng dụng Paint trong máy được gọi khi chương trình được chạy.
Hình 1. Tùy chọn bước một trên Process Monitor Filter
Đầu tiên, khởi động chương trình và chạy dưới chế độ Administrator. Trên thanh công cụ của chương trình chọn tab “Filter” hoặc bấm tổ hợp phím “Ctrl + L” để mở cửa sổ Process Monitor Filter. Trong cửa sổ Process Monitor Filter đặt các tùy chọn như Hình 1 và chọn “Apply” để nạp dữ liệu vào chương trình.
Sau khi click OK, tiếp tục mở cửa sổ Process Monitor Filter để lọc bớt các biến của ứng dụng mspaint.exe như Hình 2 và xác định các DLL được khởi chạy cùng chương trình.
Hình 2. Tùy chọn các bước tiếp theo trên bộ lọc của công cụ Process Monitor
Ở đây, chúng ta chỉ quan tâm đến các DLL có chứa các hàm DLLmain hoặc DLLexport. Những DLL có chứa hàm này sẽ dễ khai thác DLL Side-loading hơn những DLL có chứa những hàm khác.
Sau khi sử dụng công cụ Process Monitor và bằng các phương pháp khác, chúng ta có thể xác định được một DLL là MSFTEDIT.DLL có thể tiến hành khai thác DLLmain (Hình 3) [7].
Hình 3. Kết quả trả về của công cụ tìm kiếm DLL có thể khai thác DLL Side-loading
Có thể thấy rằng, mspaint.exe sẽ tải một DLL có tên là “MSFTEDIT.DLL” thông qua điểm nhập DLLMain, chính là cơ hội chuyển tải DLL đã xác định trước đây với APIMonitor.
Sau đó, tiến hành thêm MessageBoxA vào trong hàm DLL_PROCESS_ATTACH() của DLLmain như sau: MessageBoxA(NULL, "DllMain loaded thành công!", NULL, 0). Hộp thoại này sẽ cho biết payload đã tiêm vào trong DLL hợp lệ của phần mềm Paint đã được gọi mà không gặp bất kỳ khó khăn nào và phần mềm Paint vẫn chạy bình thường.
Như vậy, nếu thay hàm MessageBoxA bằng một hoặc nhiều payload độc hại, thì mã độc hoàn toàn có thể vượt qua được các phần mềm phòng chống mã độc và các công cụ bảo mật của Windows, vì ứng dụng Paint có chữ ký số của Windows. Tin tặc có thể lợi dụng phương pháp này để tiến hành tấn công vào các cơ quan, tổ chức để đánh cắp thông tin, dữ liệu quan trọng. Điển hình như nhóm tin tặc Mustang Panda đã sử dụng mã độc PlugX để tấn công vào Văn phòng Quốc hội Việt Nam bắt đầu từ tháng 9/2020 đến tháng 03/2021 nhằm thu thập dữ liệu quan trọng về hoạt động của Quốc hội trên các lĩnh vực an ninh, quốc phòng và kinh tế.
PHÁT HIỆN VÀ NGĂN CHẶN
Có một số phương pháp giảm thiểu lỗ hổng DLL Side-loading bị khai thác bằng cách sử dụng một số API nhất định, thay đổi cài đặt đăng ký, áp dụng các bản cập nhật,... Sau đây là một số phương pháp được Microsoft và các nhà phát triển phần mềm phòng chống mã độc sử dụng:
- Sử dụng API SetEnosystemVariable (TEXT (“PATH”), NULL) để xóa biến môi trường đường dẫn khỏi thứ tự tìm kiếm của nó;
- Thay đổi thư mục cài đặt mặc định thành C:\Program Files;
- Sử dụng đường dẫn đủ điều kiện khi tải các tệp DLL, tức là LoadLibrary (“C:\\program files\\MyApp\\mylibrary.dll”);
- Sử dụng API SetDllDirectory (“”) xóa thư mục làm việc hiện tại khỏi thứ tự tìm kiếm; Nếu đặc quyền HỆ THỐNG được yêu cầu thì hãy thay đổi ACL của thư mục;
- Xóa mục nhập đường dẫn khỏi biến đường dẫn HỆ THỐNG nếu không cần thiết.
KẾT LUẬN
Tấn công chiếm quyền điều khiển DLL Hijacking và DLL Side-Loading đang là các phương pháp tấn công phổ biến được các tin tặc sử dụng để có thể tấn công vào các hệ thống mạng của cơ quan, tổ chức trên thế giới. Việc nghiên cứu và phòng chống phương pháp tấn công này đang là mối ưu tiên hàng đầu của các tổ chức an ninh mạng, giúp người dùng có cái nhìn tổng quát và nắm rõ được cách thức hoạt động của kiểu tấn công này, qua đó có những biện pháp phòng chống phù hợp để bảo vệ hệ thống mạng của cơ quan, tổ chức.
TÀI LIỆU THAM KHẢO 1. Dynamic-Link Library Search Order. http://msdn.microsoft.com/en-us/library/ms682586(VS.85).aspx. 2. Swiat, “More information about the DLL preloading remote attack vector”, Technet, August 23rd 2010. 3. Microsoft Support, ”A new CWDIllegalInDllSearch registry entry is available to control the DLL search path algorithm”. 4. Palo Alto Networks. PlugX Uses Legitimate Samsung Application for DLL Side-Loading. https://unit42.paloaltonetworks.com/plugx-uses-legitimate-samsung-application-for-dll-side-loading/. |
Phạm Văn Tới, Phan Trọng Duy