GIỚI THIỆU
Malware là từ viết tắt của malicious software tức là các phần mềm độc hại, chúng thực hiện các hành vi bất hợp pháp trên các thiết bị của người khác vì các lợi ích về kinh tế cũng như chính trị. Đối tượng mà chúng hướng tới không giới hạn ở người dùng máy tính thông thường, thậm chí các công ty, chính phủ và ngay cả internet cũng bị ảnh hưởng nghiêm trọng. Một khi bị nhiễm bởi malware, một máy tính có thể bị chi phối theo các ràng buộc mà người tạo ra nó xây dựng lên, có thể làm lộ các thông tin cá nhân hoặc bị điều khiển để tham gia tấn công DDoS.
Phần mềm anti-virus của McAfee đã thống kê được hơn 20 triệu mẫu malware mới trong năm 2011. Việc phòng chống malware đỏi hỏi sự hiểu biết sâu rộng về cơ chế lây nhiễm của malware cũng như là kỹ thuật chiếm quyền kiểm soát máy tính (rootkit).
Để thu thập các mẫu malware để phân tích thì honeypot là một giải pháp. Honeypot thường giả dạng là các dịch vụ mạng hoặc hệ điều hành có nhiều lỗ hổng. Cách này được chứng minh là thành công trong việc thu hút malware để thu thập số lượng các mạng bị lây nhiễm, cách thức mà malware ẩn mình hay đơn giản là lỗ hổng mà malware khai thác. Mục đích là để các nhà nghiên cứu và các công ty phát triển phần mềm anti-virus phân tích các dạng malware mới để từ đó đưa ra các biện pháp đối phó bằng việc tạo ra các dấu hiệu nhận biết cho các malware chưa từng được biết tới. Có rất nhiều định nghĩa về honeypot nhưng tựu chung là chúng giải quyết vấn đề là làm thế nào để lừa các malware lây nhiễm vào máy của mình.
Một số malware được biết tới nhiều trong thời gian gần đây như Conficker, Stuxnet và Flame không chỉ sử dụng mạng là phương tiện truyền dẫn mà còn có thể nhân bản chính nó vào các thiết bị lưu trữ di động. Theo đó trong bản báo cáo về bảo mật của Microsoft (Microsoft`s Security Intelligence Report) thì hơn 1/4 số malware được phát hiện bởi Malicious Software Removal Tool trong nửa đầu năm 2011 có khả năng khai thác vào tính năng autorun của Window từ thiết bị USB.
HONEYPOT CHO MALWARE TRÊN CÁC THIẾT BỊ USB
Ý tưởng
Mục tiêu của bất kỳ honeypot là thu thập thông tin của các malware bao gồm thông tin về người viết malware hoặc cách thức lây nhiễm của chúng. Trong trường hợp của bài báo chỉ xét đến trường hợp thu thập mẫu malware ở máy tính bị lây nhiễm đầu tiên.
Có nhiều điểm khác nhau trong vòng đời của malware mà tại đó một honeypot có thể thu thập bản sao của file thực thi malware. Ở đây, “vòng đời” có thể hiểu là quá trình malware lây nhiễm sang máy tính, ẩn mình, thực thi các tác vụ như là gửi spam hoặc thu thập thông tin cá nhân và cuối cùng là lây nhiễm sang các máy tính khác.
Đặc biệt Stuxnet đã chỉ ra rằng cách lây lan qua các thiết bị lưu trữ di động là đặc điểm quan trọng của những malware gần đây. Các thiết bị như USB vừa rẻ lại dễ dàng sử dụng, chúng được sử dụng rộng rãi trong việc trao đổi dữ liệu và đây là môi trường lý tưởng của malware trong việc lây nhiễm vào hệ thống. Stuxnet có thể lây nhiễm vào máy tính thông qua các file được copy trước đó vào USB khi chúng được cắm vào máy tính đã bị lây nhiễm. Hình 1 mô tả quá trình lây nhiễm đó.
Hình 1: Quá trình lây nhiễm malware thông qua USB
Yêu cầu đặt ra là xây dựng một honeypot để khai thác các hành vi chung nhất trong quá trình lây nhiễm lên USB bằng cách xây dựng một thiết bị lưu trữ USB ảo mà có thể kết nối tới được các máy tính bị lây nhiễm. Tuy nhiên, cách tiếp cận này có hai nhược điểm:
1. Máy tính mục tiêu bị lây nhiễm trước khi có thể chụp (capture) lại được malware.
2. Các malware thông minh đã lây nhiễm lên máy tính có khả năng phát hiện và phá hủy các thiết bị giả dạng như vậy.
Chúng ta không mong chờ chụp lại được malware trước khi chúng đã phá hủy hệ thống, do đó mục đích của việc xây dựng này là biết được cách thức hoạt động cũng như cách lây nhiễm của chúng. Có thể nói đây là tuyến phòng thủ cuối cùng sau khi các giải pháp bảo vệ trước đó gặp thất bại.
Honeypot được xây dựng ở đây kết hợp các lý thuyết về ổ đĩa flash USB (USB flash driver) ảo hứa hẹn sẽ đem lại một số lợi ích:
1. Cung cấp định nghĩa mới về Host-based IDS ở mức thấp.
2. Nếu malware đã lây nhiễm lên các thiết bị ảo được xây dựng ở đây thì vô hình malware đã cung cấp cho chúng ta tất cả các file thực thi cũng như hành vi của malware.
Honeypot có thể hoạt động sai, hai kịch bản có thể đặt ra: hoặc là ứng dụng hợp lệ ghi dữ liệu lên các thiết bị USB kết nối tới chúng hoặc người dùng vô tình copy file lên các thiết bị ảo này, vì vậy các thiết bị USB ảo này phải được để ẩn đối với các user của hệ điều hành để ngăn ngừa tình huống ghi dữ liệu như vậy. Quá trình gắn (mount) các thiết bị này càng ngắn thì càng dễ dàng ẩn toàn bộ tiến trình đối với các user. Vì vậy việc thiết kế các honeypot này phải tính toán, thiết kế sao cho thời gian gắn là nhỏ nhất.
Đối với malware, thì các file được ghi vào USB với mục đích là lây nhiễm sang các máy tính khác, vì vậy cần kiểm tra các file thực thi trong toàn bộ quá trình. Thông thường xác suất chúng cung cấp tất cả các file là lớn, và nếu không như vậy thì chí it chúng ta cũng biết được nơi để tìm các dữ liệu còn lại. Về mặt lý thuyết, malware chỉ cần ghi một đoạn mang đặc tính của malware (loader) vào USB sau đó tải về các mailware ảo ở địa chỉ nào đó trên mạng. Nhưng cách tiếp cận này đỏi hỏi máy tính mục tiêu phải có kết nối mạng, các loại malware như vậy chưa được tìm thấy trong thực tế.
Thực hiện
Phần này sẽ thảo luận về cách hệ thống đã đề xuất ở phần trước có thể thực hiện được. Hệ thống mục tiêu được xây dựng trên hệ điều hành XP, việc lựa chọn này xuất phát từ các nguyên nhân: Là hệ điều hành vẫn được sử dụng phổ biến trên thế giới, có nhiều lỗ hổng và là mục tiêu ưu thích của malware. Tuy nhiên, phần code có thể được mở rộng để có thể hoạt động trên các phiên bản hệ điều hành Windows khác.
Những thách thức của việc thực hiện một USB ảo bao gồm hai phần: Thứ nhất, đó là một dạng lưu trữ ảo, ví dụ như là một thiết bị lưu trữ được mô phỏng để hỗ trợ các file ảnh (image file). Ứng dụng phải có khả năng đọc và ghi từ thiết bị ảo. Thứ hai, thiết bị ảo này phải giống một thiết bị lưu trữ di động (removable) để bất kỳ ứng dụng nào cũng có thể truy vấn thông tin về nó. Vấn đề là các giải pháp có sẵn không không có tính linh hoạt, ví dụ như công cụ FileDisk chỉ có thể mô phỏng được ổ cứng mà không mô phỏng được các thiết bị lưu trữ di động. Tất nhiên, hoạt động của honeypot phải đủ phức tạp để cung cấp đủ chức năng, nhưng với yêu cầu là không được phức tạp quá. Vì vậy, một cách tiếp cận khác được xem xét để đạt được hai yếu tố như trên: mô phỏng sự lưu trữ và làm cho nó trông giống như là di động được.
Microsoft cung cấp Device Simulation Framework, một khung phần mềm cái mà có thể dễ dàng mô phỏng các thiết bị như USB. Nó cho phép thực thi các đoạn code mô phỏng trong chế độ người dùng (user mode) và biên dịch đến chế độ nhân (kernel mode) bằng một trình điều khiển tùy chỉnh. Tuy nhiên, mục đích chính của Framework này là dùng để kiểm tra các trình điều khiển (driver). Ngoài ra, nó đòi hỏi việc thực hiện của các thiết bị mô phỏng ở mức rất thấp, điều này là không cần thiết cho các lý thuyết đã được trình bày ở phần trên.
Hình 2: Phát hiện thiết bị bằng cách sử dụng hàm WM_DEVICECHANCE
Hơn nữa, vấn đề cấp phép sẽ phải được xem xét nếu Device Simulation Framework là một phần của honeypot, đây có vẻ là một lựa chọn không có tính thực tế.
Đầu tiên, các malware phải có khả năng phát hiện các thiết bị USB mỗi khi USB được cắm vào. Cách phổ biến là dựa vào hàm WM_DEVICECHANGE. Hệ điều hành sẽ gọi hàm đó mỗi khi thiết bị mới cắm vào, chương trình nhận dựa vào các tham số đầu ra để kết luận đây có phải là các thiết bị lưu trữ di động hay không (Hình 2). Virus Conficker và Stuxnet sử dụng công nghệ này. Cách khác ít được sử dụng hơn đó là malware thường xuyên truy vấn tất cả tên ổ đĩa (thường từ C: đến Z:) để từ đó phát hiện một thiết bị mới cắm vào. Cách này có nhược điểm là truy vẫn ngay cả khi không có thiết bị mới cắm vào và do đó dễ bị phát hiện.
Trước khi tìm hiểu cách tạo ra một thiết bị ảo như vậy, chúng ta phải tìm hiểu cách thức xử lý các thiết bị của nhân Windows (Windows kernel). Mỗi thiết bị được biểu diễn là một đối tượng và mỗi đối tượng được quản lý bởi trình điều khiển của thiết bị đó. Mỗi khi có một kết nối của một thiết bị mới, Windows sẽ quyết định trình điều khiển nào được nạp vào dựa vào định danh thiết bị mới được kết nối đó. Các đối tượng và các trình điều khiển liên quan được sắp xếp dưới dạng ngăn xếp (Stack). Thông thường các thiết bị lưu trữ như USB và các hệ thống có liên quan bên trong được sắp xếp ở đáy ngăn xếp, còn đỉnh ngăn xếp là trình điểu khiển file hệ thống.
Mục tiêu là tạo ra được thiết bị được như có thể tháo rời khỏi hệ điều hành. Và tính năng “tháo rời” này trong Windows được thiết lập bởi trình điều khiển ổ đĩa (disk driver), nó xác định xem một thiết bị lưu trữ là di động hay không. Một thiết bị ảo phải hoạt động như một trình điều khiển Windows, hoạt động cùng lớp với trình điều khiển ổ đĩa và để cờ của thiết ảo này là “removable”: ghostdrive.sys. Hình 3 sẽ so sánh ngăn xếp các trình điều khiển của một thiết bị lưu trữ USB thật và của thiết bị ảo tạo ra. Trình điều khiển ghostdrive.sys sẽ thay thế trình điều khiển ổ đĩa cho các thiết bị USB ảo và phải đảm bảo rằng chúng được đảm nhận gửi các thông tin về các thiết bị lưu trữ di động lên trình điều khiển ở mức cao hơn.
Hình 3: Ngăn xếp trình điều khiển minh họa của honeypot Ghost
Trình điều khiển thứ hai trong Hình 3 đó là ghostbus.sys, trình điều khiển này liên quan đến liệt kê thiết bị (device enumeration) tức là một thiết bị mới phải khai báo với nhân Windows để nạp các trình điều khiển. Tiến trình này được gọi là device enumeration. Đối với các trình điều khiển phù hợp với Windows Driver Model thì sẽ có hai lựa chọn:
1. Một thiết bị có thể là root-enumerationed. Theo đó, thiết bị với một định danh xác định được mặc định là khởi động cùng hệ thống đồng thời nạp các trình điều khiển yêu cầu. Trình điều khiển bus PCI là một ví dụ cho trình điều khiển được nạp theo cách này.
2. Thiết bị có thể được liệt kê bởi các đối tượng thiết bị khác (bus enumeration). Nếu trình điều khiển của một thiết bị đang tồn tại tạo ra một một đối tượng thiết bị mới thì sau đó Windows sẽ nạp các trình điều khiển tương ứng. Rõ ràng, một chuỗi sự liệt kê phải xuất phát từ một nơi nào đó, và đó chính là root-enumeration.
Hình 4: Các thành phần cơ bản của honeypot Ghost
Các ổ đĩa USB ảo được thiết kế sao cho có khả năng mount theo nhu cầu vì vậy trình điều khiển của nó không nên được nạp vào khi máy tính khởi động. Đây chính là giải pháp của trình điều khiển thứ hai, ghostbus.sys: nó được nạp bởi root-enumeration và có thể báo cáo khi có một thiết bị USB mới cắm vào theo nhu cầu với chức năng của một bus ảo. Vì vậy, bất cứ khi nào muốn mount một thiết bị ảo nào thì phải cần ra lệnh để bus ảo này báo cáo về thiết bị mới đó với một định danh thiết bị mà sau đó Windows sẽ nạp trình điều khiển ghostdrive.sys. Hình 4 cho thấy cấu trúc tổng thể của việc thực hiện như đã mô tả.
Việc phát hiện sự lây nhiễm và chụp lại các mẫu malware hoạt động như sau: Trình điều khiển bus ảo được hướng dẫn để nạp các thiết bị lưu trữ ảo, sẽ báo cáo với hệ thống là có một thiết bị di động. Malware sau khi phát hiện một thiết bị USB cắm vào sẽ lây nhiễm sang thiết bị đó bằng ghi dữ liệu lên trên đó. Yêu cầu ghi dữ liệu của malware được chuyển xuống ngăn xếp trình điều khiển và cuối cùng chuyển qua trình điều khiển của bộ nhớ ảo, ghostdrive.sys. Tại đây đọc các yêu cầu malware và giải quyết chúng đồng thời ghi tất cả dữ liệu vào một file ảnh để phân tích sau đó.
Sẽ là tốt hơn nếu ta phân tích nội dung của các thiết bị ảo trực tiếp trên honeypot nhưng phải chú ý: trong trường hợp máy tính bị lây nhiễm, một số loại malware có khả năng cài đặt các rootkit để ẩn các tiến trình trong hệ thống, vì vậy việc sử dụng các API thông thường có thể đem lại kết quả không chính xác.
Đánh giá
Tất các các đánh giá được thực hiện trên Windows XP SP2. Các mẫu malware dành cho thử nghiệm yêu cầu là cách thức lây nhiễm lên cách thiết bị USB là đáng tin cậy và có thể kiểm tra được. Trong trường hợp này là Conficker, đây là loại malware phổ biến với hoạt động tinh vi.
Tham số đánh giá như phân tích ở trên là thời gian gắn thiết bị ảo, kết quả thử nghiệm được gọi là thành công nếu các file ghi vào thiết bị ảo được kiểm ta là trùng khớp với thiết bị USB thật.
Theo kết quả thử nghiệm ở thì thời gian gắn chậm nhất là 35s, thời gian trung bình là 7.9s. Trong một số trượng hợp, một số mẫu Conficker có thời gian gắn dưới 1s.
Bảng 1- Sự phân chia malware của các hãng
Hình 5: Thời gian nhỏ nhất để các mẫu malware lây nhiễm vào các thiết bị ảo
Thực tế chỉ ra:
1. Không có mẫu malware nào có khả năng phát hiện thiết bị ảo và thiết bị thật.
2. Thời gian gắn là đủ nhỏ để ẩn các tiến trình đối với người dùng, do đó tránh đường các trường hợp nghi không mong muốn lên các thiết bị ảo.
Từ những kết quả đánh giá có thể thấy honeypot Ghost là giải pháp phù hợp để phát hiện sự lây nhiễm trên máy tính và thu thập các mẫu malware. Đối với các tổ chức thì có thể dùng giải pháp này để tìm hiểu sự lây nhiễm lên máy tính của họ khi các tuyến phòng thủ trước đó gặp thất bại và do đó có thể coi đây là một hệ thống phát hiện xâm nhập (IDS) đáng tin cậy.