CEO @CyStack
2 tuần trở lại đây, Việt Nam chứng kiến hàng loạt vụ tấn công mạng, trong đó phần nhiều được cho là có liên quan đến mã độc mã hoá dữ liệu và tống tiền, còn được gọi là ransomware. Những vụ tấn công này không chỉ làm ảnh hưởng đến nền kinh tế và sự ổn định của nhiều doanh nghiệp mà còn gây ra sự lo ngại trong xã hội.
Ransomware, như đã được giới thiệu trong một bài viết trước đó của CyStack, là một loại phần mềm độc hại được thiết kế để xâm nhập vào hệ thống máy tính của nạn nhân, mã hóa dữ liệu quan trọng, và yêu cầu một khoản tiền chuộc để giải mã.
Trong bài này, tôi sẽ chia sẻ góc nhìn của mình về ransomware dưới góc độ kỹ thuật, để các bạn có thể hiểu được cách ransomware hoạt động, tại sao nó nguy hiểm, và liệu chúng ta có thể khôi phục được dữ liệu hay không?
Lịch sử của Ransomware
Ý tưởng của ransomware khá đơn giản nhưng thực sự hiệu quả với tội phạm mạng. Bạn có thể hình dung ransomware như những tên trộm đột nhập vào ngôi nhà của bạn, gom hết tài sản giá trị trong nhà, nhưng không mang ra ngoài để tiêu thụ (vì có thể là những mặt hàng này cồng kềnh khó di chuyển, hoặc khó tìm người mua, hoặc chỉ là sợ bị tóm dễ dàng). Thay vì thế, chúng cho hết tài sản trên vào một chiến thùng đủ lớn và vẫn để trong nhà bạn, thứ duy nhất chúng mang đi trước khi rời khỏi nhà bạn là chiếc chìa khóa để mở cái thùng này.
Thực tế, bạn không mất tài sản. Chúng vẫn ở trong ngồi nhà của bạn, chỉ là bạn không thể sử dụng được chúng nữa. Bây giờ, những tên trộm yêu cầu bạn phải trả tiền chuộc để lấy được chìa khóa mở chiếc thùng kia. Bạn lúc này sẽ đứng trước mấy lựa chọn:
1. Tìm cách phá khóa để lấy đồ mà không cần thông qua bọn trộm. Thực tế thì điều này sẽ gần như không khả thi, tôi sẽ giải thích rõ hơn ở phần sau.
2. Thương lượng với bọn trộm, trả tiền chuộc để lấy lại chìa khóa. Điều này cũng không có gì đảm bảo được rằng bạn sẽ nhận được chìa khóa sau khi trả tiền.
Nếu chúng ta thay những tên trộm kia bằng mã độc, căn nhà là hệ thống máy tính, và tài sản trong căn nhà là các file dữ liệu thì đó chính xác là cách một cuộc tấn công mã hóa đòi tiền chuộc diễn ra.
Mặc dù có lịch sử lâu đời từ những năm 1980, nhưng, cho đến trước năm 2010, sự phổ biến của ransomware vẫn còn hạn chế do các khó khăn trong việc thanh toán truyền thống. Một bước đột phá quan trọng đến từ sự xuất hiện của tiền điện tử như Bitcoin, tạo ra cơ hội mới cho các tội phạm mạng. Công nghệ tiền điện tử cho phép các tên tội phạm thu tiền chuộc mà không lo bị truy tố, nhờ tính ẩn danh của giao dịch.
Từ những năm 2010 đến nay, ransomware không ngừng tiến hóa và trở nên ngày càng tinh vi. Từ các biến thể cơ bản đến hình thức phức tạp hơn như ransomware-as-a-service (RaaS), hàng loạt các mẫu biến thể ransomware nổi tiếng đã được biến đến như WannaCry, CryptoLocker, REvil.
Các phương pháp mã hóa mà ransomware thường sử dụng
Hãy nói về mã hóa, phần cốt lõi nhất của một mã độc ransomware. Khi mã độc đã vào được máy tính của nạn nhân, nó bắt đầu liệt kê các file dữ liệu có trong máy, và tiến hành mã hóa từng file này trở thành dạng dữ liệu không đọc được. Quá trình này sẽ cần có một thuật toán mã hóa, và 1 số chuỗi ký tự có độ dài đủ lớn được gọi là khóa mã hóa (hay gọi tắt là key). Tôi cũng đã có một bài viết khác về cách hoạt động của mã hóa tại đây, bạn đọc có thể tham khảo.
Các dòng ransomware khác nhau sẽ sử dụng những thuật toán mã hóa khác nhau, nhưng nhìn chung, chúng đều sẽ tuân theo một trong các phương pháp dưới đây:
1. Chỉ sử dụng thuật toán mã hóa đối xứng
Thuật toán mã hóa đối xứng sử dụng cùng 1 khóa cho quá trình sinh mã và giải mã, chẳng hạn như AES, 3DES, Salsa, Blowfish, Twofish. Với loại mã độc này thì chúng ta chỉ cần tìm ra khóa được lưu trên máy là có thể giải mã. Về phía mã độc, chúng có thể lựa chọn mấy hướng đi:
- Lưu khóa trong mã nguồn: Đây là cách mã hóa nhanh nhất nhưng cũng tệ nhất vì khi dịch ngược mã độc, chúng ta có thể thu hồi được khóa, vì thế hiện tại gần như không có ransomware nào lựa chọn cách này. Trước đó thì Jigsaw, Annabelle, Nemucod là những dòng đã dùng phương pháp này và đều được giải mã thành công
- Tạo khóa tại thời điểm mã hóa và gửi lên máy chủ để lưu: Cách này an toàn hơn hơn cách trước một chút vì khi dịch ngược sẽ không thấy cái khóa nào trong mã nguồn cả. Tuy nhiên, nhược điểm là nếu máy nạn nhân không có kết nối Internet thì sẽ kẻ tấn công sẽ không lấy được khóa, và đôi khi việc tạo và lưu khóa có thể có điểm yếu dẫn đến việc khôi phục được khóa như trường hợp của mã độc Petya. Vì vậy, đây cũng không phải là một cách tối ưu mà những hacker có kinh nghiệm viết mã độc sử dụng.
2. Chỉ sử dụng thuật toán mã hóa bất đối xứng
Thuật toán mã hóa bất đối xứng, hay còn gọi là thuật toán mã hóa công khai, sử dụng 2 khóa: 1 cho quá trình sinh mã và 1 cho quá trình giải mã. Khóa sinh mã là công khai, còn khóa giải mã là bí mật.
Với cách tiếp cận này, khóa công khai sẽ được lưu ngay trong mã độc và dùng để mã hóa các tệp tin dữ liệu. Kể cả khi chúng ta dịch ngược được mã độc và thu được khóa này thì cũng không có tác dụng giải mã. Tuy nhiên, phương pháp này gặp phải 2 vấn đề lớn:
- Tốc độ mã hóa chậm. Các thuật toán mã hóa công khai như RSA, ECC sẽ hoạt động rất chậm với các file dữ liệu và gây ra sụt giảm hiệu năng rõ rệt ở máy tính nạn nhân. Vì thế, sẽ rất dễ bị phát hiện.
- Dùng chung khóa. Nếu kẻ tấn công dùng chung một mã độc cho 2 cuộc tấn công trở lên, đồng nghĩa với việc cặp khóa công khai/bí mật cũng sẽ được tái sử dụng. Khi một khách hàng trả tiền chuộc để lấy được khóa bí mật này, nó có thể được phân phối lại cho những nạn nhân khác miễn phí. Và đương nhiên những kẻ tấn công sẽ không thích điều này. Giải pháp cho họ bây giờ là tạo ra nhiều file mã độc hơn nhưng như vậy thường khá cồng kềnh.
3. Kết hợp cả 2 phương pháp trên
Đây là phương pháp mà hầu hết các mã độc ransomware trên thị trường đang sử dụng
Ở máy chủ của kẻ tấn công, chúng tạo cặp khóa cho thuật toán công khai (giả định là thuật toán RSA): spriv.key (khóa bí mật) và spub.key (khóa công khai). spub.key được lưu ngay trong mã nguồn mã độc khi phân phối.
Khi mã độc được kích hoạt trên máy nạn nhân, nó sẽ tạo ra:
- Cặp khóa cpriv.key và cpub.key tương tự như ở máy chủ.
- Khóa mã hóa đối xứng aes.key (ví dụ thuật toán sử dụng là AES 256). Và với mỗi file cần mã hóa, mã độc sẽ tạo ra 1 aes.key khác nhau.
Để mã hóa 1 file dữ liệu data.txt, quá trình sẽ diễn ra như sau:
- Mã hóa file dữ liệu data.txt thành encrypted.data.txt bằng thuật toán AES với khóa aes.key
- Mã hóa aes.key thành encrypted.aes.key bằng thuật toán RSA với khóa cpub.key
- Mã hóa cpriv.key thành encrypted.cpriv.key bằng thuật toán RSA với khóa spub.key
Để nạn nhân lấy lại được tập tin của mình, cần có aes.key. Thật không may, nó được mã hóa bằng cpub.key, để giải mã thì cần có cpriv.key, nhưng một lần nữa, cpriv.key lại được mã hóa bằng spub.key. Và để có được khóa này, chúng ta cần có spriv.key đang nằm trong tay của kẻ tấn công.
Trong thực tế, để giải mã, nạn nhân cần cung cấp cho kẻ tấn công encrypted.cpriv.key và kẻ tấn công sẽ giải mã, gửi lại cpriv.key. Điều này giúp cho spriv.key không bao giờ bị lộ và không bị tái sử dụng cho các nạn nhân khác.
Chúng ta có thể tự giải mã dữ liệu mà không cần chìa khóa không?
Khi bạn đối mặt với các file dữ liệu đã bị mã hóa, câu hỏi đầu tiên hẳn là chúng ta có thể khôi phục dữ liệu mà không cần trả tiền chuộc cho kẻ tấn công không. Về cơ bản, thì điều này gần như không thể.
Như ở phần trên tôi đã đề cập, việc giải mã dữ liệu thường sẽ yêu cầu cpriv.key, đây là 1 khóa AES thường có độ dài 256 bits, tương đương với 32 ký tự. Nếu bạn nghĩ đến việc vét cạn hay brute force để tìm ra khóa này, hãy cân nhắc một chút: Số lượng khóa có thể tạo với 256 bits là 2256 khóa. Một siêu máy tính ngày nay có thể thực hiện được 1018 phép thử trên một giây. Có nghĩa là chúng ta cần đến 2256/1018 giây, xấp xỉ 3.66 * 1051 năm. Con số này thậm chí còn lớn hơn cả tuổi của vũ trụ (13.8 tỷ năm ~ 4.354 * 1017).
Ransomware có điểm yếu nào có thể khai thác không?
Có, nhưng ở thời điểm hiện tại tôi không nghĩ chúng ta có thể thực hiện được.
Các dòng ransomware trước đây được xem là đã có những lỗ hổng giúp cho các nhà nghiên cứu bảo mật có thể tận dụng để khai thác như thuật toán mã hóa yếu, lưu khóa trong mã nguồn, khóa được lưu trong thời gian dài… Tuy nhiên đây đều là những dòng ransomware ở thời kỳ sơ khai, và rất khó để hy vọng những kẻ tấn công tiếp tục mắc sai lầm.
Thỉnh thoảng, sẽ có một số phép màu xảy ra như cách Marcus Hutchins mua lại tên miền máy chủ điều khiển của WannaCry để làm nó dừng hoạt động hay Bitdefender đưa ra công cụ giải mã GandCrab trên một số phiên bản của dòng mã độc này. Nhưng nhìn chung, chúng ta không nên hy vọng quá nhiều vào những sự việc này.
Kết
Từ những chia sẻ kỹ thuật trong bài viết này, tôi hy vọng các bạn có thể hiểu những khó khăn trong việc khôi phục dữ liệu một khi đã bị tấn công mã hóa dữ liệu. Từ đó chúng ta thấy được tầm quan trọng của việc ngăn chặn trước khi sự cố xảy ra.
Trong các bài tiếp theo tôi sẽ chia sẻ thêm về cách mà các cá nhân và doanh nghiệp có thể chuẩn bị để đương đầu với dòng mã độc này.