
Ryuk là một trong những lựa chọn ransomware nổi tiếng nhất trong vài năm qua. Kể từ khi xuất hiện lần đầu vào mùa hè năm 2018, nó đã thu thập được , đặc biệt là trong môi trường kinh doanh, vốn là mục tiêu chính của các cuộc tấn công của nó.
1. Thông tin chung
Tài liệu này chứa bản phân tích về biến thể ransomware Ryuk, cũng như trình tải chịu trách nhiệm tải phần mềm độc hại vào hệ thống.
Ransomware Ryuk xuất hiện lần đầu tiên vào mùa hè năm 2018. Một trong những điểm khác biệt giữa Ryuk và các ransomware khác là nó nhằm mục đích tấn công môi trường doanh nghiệp.
Vào giữa năm 2019, các nhóm tội phạm mạng đã tấn công một số lượng lớn các công ty Tây Ban Nha sử dụng phần mềm ransomware này.

Cơm. 1: Trích từ El Confidencial liên quan đến cuộc tấn công ransomware Ryuk [1]

Cơm. 2: Trích từ El País về một cuộc tấn công được thực hiện bằng cách sử dụng ransomware Ryuk [2]
Năm nay, Ryuk đã tấn công một số lượng lớn các công ty ở nhiều quốc gia khác nhau. Như bạn có thể thấy trong các hình bên dưới, Đức, Trung Quốc, Algeria và Ấn Độ là những nơi bị ảnh hưởng nặng nề nhất.
So sánh số lượng các cuộc tấn công mạng, chúng ta có thể thấy Ryuk đã ảnh hưởng đến hàng triệu người dùng và xâm phạm một lượng dữ liệu khổng lồ, dẫn đến thiệt hại kinh tế nghiêm trọng.

Cơm. 3: Minh họa hoạt động toàn cầu của Ryuk.

Cơm. 4: 16 quốc gia bị ảnh hưởng nặng nề nhất bởi Ryuk

Cơm. 5: Số người dùng bị tấn công bởi ransomware Ryuk (tính bằng triệu)
Theo nguyên tắc hoạt động thông thường của các mối đe dọa như vậy, phần mềm ransomware này, sau khi mã hóa hoàn tất, sẽ hiển thị cho nạn nhân một thông báo đòi tiền chuộc phải được trả bằng bitcoin đến địa chỉ được chỉ định để khôi phục quyền truy cập vào các tệp được mã hóa.
Phần mềm độc hại này đã thay đổi kể từ khi nó được giới thiệu lần đầu tiên.
Biến thể của mối đe dọa này được phân tích trong tài liệu này đã được phát hiện trong một nỗ lực tấn công vào tháng 2020 năm XNUMX.
Do tính phức tạp của nó, phần mềm độc hại này thường được cho là do các nhóm tội phạm mạng có tổ chức, còn được gọi là nhóm APT.
Một phần của mã Ryuk có sự tương đồng đáng chú ý với mã và cấu trúc của một ransomware nổi tiếng khác, Hermes, chúng có chung một số chức năng giống hệt nhau. Đây là lý do tại sao Ryuk ban đầu được liên kết với nhóm Lazarus của Triều Tiên, nhóm này vào thời điểm đó bị nghi ngờ đứng sau phần mềm ransomware Hermes.
Dịch vụ Falcon X của CrowdStrike sau đó đã lưu ý rằng Ryuk trên thực tế được tạo ra bởi nhóm WIZARD SPIDER [4].
Có một số bằng chứng ủng hộ giả định này. Đầu tiên, ransomware này được quảng cáo trên trang web khai thác.in, một thị trường phần mềm độc hại nổi tiếng của Nga và trước đây đã được liên kết với một số nhóm APT của Nga.
Thực tế này bác bỏ giả thuyết cho rằng Ryuk có thể được phát triển bởi nhóm Lazarus APT, bởi vì nó không phù hợp với cách hoạt động của nhóm.
Ngoài ra, Ryuk còn được quảng cáo là một ransomware sẽ không hoạt động trên các hệ thống của Nga, Ukraine và Belarus. Hành vi này được xác định bởi một tính năng có trong một số phiên bản của Ryuk, trong đó nó kiểm tra ngôn ngữ của hệ thống mà ransomware đang chạy và ngăn nó chạy nếu hệ thống có ngôn ngữ tiếng Nga, tiếng Ukraina hoặc tiếng Belarus. Cuối cùng, phân tích của chuyên gia về chiếc máy bị nhóm WIZARD SPIDER hack đã tiết lộ một số “hiện vật” được cho là đã được sử dụng để phát triển Ryuk như một biến thể của ransomware Hermes.
Mặt khác, các chuyên gia Gabriela Nicolao và Luciano Martins cho rằng ransomware có thể đã được phát triển bởi nhóm APT CryptoTech [5].
Điều này xuất phát từ thực tế là vài tháng trước khi Ryuk xuất hiện, nhóm này đã đăng thông tin trên diễn đàn của cùng trang web rằng họ đã phát triển một phiên bản mới của ransomware Hermes.
Một số người dùng diễn đàn đặt câu hỏi liệu CryptoTech có thực sự tạo ra Ryuk hay không. Sau đó, nhóm đã tự bào chữa và tuyên bố rằng họ có bằng chứng cho thấy họ đã phát triển 100% ransomware.
2. Đặc điểm
Chúng tôi bắt đầu với bộ nạp khởi động, công việc của nó là xác định hệ thống đang bật để có thể khởi chạy phiên bản “chính xác” của phần mềm ransomware Ryuk.
Băm bootloader như sau:
MD5 A73130B0E379A989CBA3D695A157A495
SHA256 EF231EE1A2481B7E627921468E79BB4369CCFAEB19A575748DD2B664ABC4F469
Một trong những tính năng của trình tải xuống này là nó không chứa bất kỳ siêu dữ liệu nào, tức là. Những người tạo ra phần mềm độc hại này chưa đưa bất kỳ thông tin nào vào đó.
Đôi khi chúng bao gồm dữ liệu sai để đánh lừa người dùng nghĩ rằng họ đang chạy một ứng dụng hợp pháp. Tuy nhiên, như chúng ta sẽ thấy sau, nếu việc lây nhiễm không liên quan đến sự tương tác của người dùng (như trường hợp của phần mềm ransomware này), thì những kẻ tấn công không cho rằng cần thiết phải sử dụng siêu dữ liệu.

Cơm. 6: Dữ liệu meta mẫu
Mẫu được biên dịch ở định dạng 32 bit để có thể chạy trên cả hệ thống 32 bit và 64 bit.
3. Vectơ thâm nhập
Mẫu tải xuống và chạy Ryuk đã xâm nhập vào hệ thống của chúng tôi thông qua kết nối từ xa và các tham số truy cập được lấy thông qua một cuộc tấn công RDP sơ bộ.

Cơm. 7: Đăng ký tấn công
Kẻ tấn công đã đăng nhập được vào hệ thống từ xa. Sau đó, anh ấy đã tạo một tệp thực thi bằng mẫu của chúng tôi.
Tệp thực thi này đã bị chặn bởi giải pháp chống vi-rút trước khi chạy.

Cơm. 8: Khóa mẫu


Cơm. 9: Khóa mẫu
Khi tệp độc hại bị chặn, kẻ tấn công đã cố tải xuống phiên bản được mã hóa của tệp thực thi, phiên bản này cũng bị chặn.

Cơm. 10: Tập hợp các mẫu mà kẻ tấn công đã cố chạy
Cuối cùng, anh ta cố tải xuống một tệp độc hại khác thông qua bảng điều khiển được mã hóa
PowerShell để vượt qua tính năng bảo vệ chống vi-rút. Nhưng anh cũng bị chặn.

Cơm. 11: PowerShell có nội dung độc hại bị chặn

Cơm. 12: PowerShell có nội dung độc hại bị chặn
4. Bộ nạp
Khi thực thi, nó ghi tệp ReadMe vào thư mục % Temp%, điển hình cho Ryuk. Tệp này là một thông báo đòi tiền chuộc chứa địa chỉ email trong miền protonmail, khá phổ biến trong họ phần mềm độc hại này: msifelabem1981@protonmail.com
![]()

Cơm. 13: Nhu cầu tiền chuộc
Trong khi bộ nạp khởi động đang chạy, bạn có thể thấy nó khởi chạy một số tệp thực thi có tên ngẫu nhiên. Chúng được lưu trữ trong một thư mục ẩn CÔNG CỘNG, nhưng nếu tùy chọn này không hoạt động trong hệ điều hành "Hiển thị các tệp và thư mục ẩn", thì chúng sẽ vẫn bị ẩn. Hơn nữa, các tệp này là 64-bit, không giống như tệp gốc là 32-bit.


Cơm. 14: Các tệp thực thi được khởi chạy bởi mẫu
Như bạn có thể thấy trong hình trên, Ryuk khởi chạy icacls.exe, ứng dụng này sẽ được sử dụng để sửa đổi tất cả ACL (Danh sách kiểm soát truy cập), do đó đảm bảo quyền truy cập và sửa đổi cờ.
Nó có toàn quyền truy cập đối với tất cả người dùng vào tất cả các tệp trên thiết bị (/T) bất kể lỗi (/C) và không hiển thị bất kỳ thông báo nào (/Q).
![]()
Cơm. 15: Tham số thực thi của icacls.exe do mẫu khởi chạy
Điều quan trọng cần lưu ý là Ryuk sẽ kiểm tra phiên bản Windows bạn đang chạy. Vì điều này anh ấy
thực hiện kiểm tra phiên bản bằng cách sử dụng GetPhiên bảnExW, trong đó nó kiểm tra giá trị của cờ lpPhiên bảnThông tincho biết phiên bản Windows hiện tại có mới hơn phiên bản hiện tại hay không Windows XP.


Tùy thuộc vào việc bạn có chạy phiên bản muộn hơn Windows XP hay không, bộ tải khởi động sẽ ghi vào thư mục người dùng cục bộ - trong trường hợp này là vào thư mục %Công cộng%.
![]()
Cơm. 17: Kiểm tra phiên bản hệ điều hành
Tập tin đang được viết là Ryuk. Sau đó nó chạy nó, chuyển địa chỉ của chính nó làm tham số.

Cơm. 18: Thực thi Ryuk thông qua ShellExecute
Việc đầu tiên Ryuk làm là nhận các thông số đầu vào. Lần này có hai tham số đầu vào (chính tệp thực thi và địa chỉ ống nhỏ giọt) được sử dụng để xóa dấu vết của chính nó.
![]()
![]()
Cơm. 19: Tạo một quy trình
Bạn cũng có thể thấy rằng sau khi chạy xong các tệp thực thi của mình, nó sẽ tự xóa, do đó không để lại dấu vết nào về sự hiện diện của chính nó trong thư mục nơi nó được thực thi.

Cơm. 20: Xóa một tập tin
5. RYUK
5.1 Sự hiện diện
Ryuk, giống như các phần mềm độc hại khác, cố gắng tồn tại trên hệ thống càng lâu càng tốt. Như đã trình bày ở trên, một cách để đạt được mục tiêu này là bí mật tạo và chạy các tệp thực thi. Để thực hiện việc này, cách phổ biến nhất là thay đổi khóa đăng ký Phiên bản hiện tạiChạy.
Trong trường hợp này, bạn có thể thấy rằng vì mục đích này, tệp đầu tiên sẽ được khởi chạy VWjRF.exe
(tên tệp được tạo ngẫu nhiên) khởi chạy cmd.exe.

![]()
Cơm. 21: Thực thi VWjRF.exe
Sau đó nhập lệnh CHẠY Với tên "svcho". Vì vậy, nếu bạn muốn kiểm tra khóa đăng ký bất kỳ lúc nào, bạn có thể dễ dàng bỏ lỡ thay đổi này, do tên này giống với svchost. Nhờ khóa này, Ryuk đảm bảo sự hiện diện của nó trong hệ thống. Nếu hệ thống không có chưa bị nhiễm virus thì khi bạn khởi động lại hệ thống, file thực thi sẽ thử lại.
![]()
Cơm. 22: Mẫu đảm bảo sự hiện diện trong khóa đăng ký
Chúng ta cũng có thể thấy rằng tệp thực thi này dừng hai dịch vụ:
"người xây dựng điểm âm thanh", đúng như tên gọi của nó, tương ứng với âm thanh hệ thống,
![]()
Cơm. 23: Mẫu dừng dịch vụ âm thanh hệ thống
и sàm sỡ, là một dịch vụ quản lý tài khoản. Việc dừng hai dịch vụ này là đặc điểm của Ryuk. Trong trường hợp này, nếu hệ thống được kết nối với hệ thống SIEM, phần mềm ransomware sẽ cố gắng ngừng gửi tới bất kỳ cảnh báo nào. Bằng cách này, anh ấy bảo vệ các bước tiếp theo của mình vì một số dịch vụ SAM sẽ không thể bắt đầu công việc chính xác sau khi thực thi Ryuk.
![]()
Cơm. 24: Mẫu dừng dịch vụ Samss
5.2 Đặc quyền
Nói chung, Ryuk bắt đầu bằng cách di chuyển ngang trong mạng hoặc nó được khởi chạy bởi một phần mềm độc hại khác như hoặc , trong trường hợp leo thang đặc quyền, sẽ chuyển các quyền nâng cao này cho ransomware.
Trước đó, mở đầu cho quá trình thực hiện, chúng tôi thấy anh thực hiện quy trình Mạo danhBản thân, điều đó có nghĩa là nội dung bảo mật của mã thông báo truy cập sẽ được chuyển đến luồng, nơi nó sẽ được truy xuất ngay lập tức bằng cách sử dụng Nhận chủ đề hiện tại.

Cơm. 25: Gọi ImpersonateSelf
Sau đó, chúng tôi thấy rằng nó sẽ liên kết mã thông báo truy cập với một chuỗi. Chúng ta cũng thấy rằng một trong những lá cờ là Truy cập mong muốn, có thể được sử dụng để kiểm soát quyền truy cập mà luồng sẽ có. Trong trường hợp này, giá trị mà edx sẽ nhận được là TOKEN_ALL_ACESS hay nói cách khác - TOKEN_WRITE.


Cơm. 26: Tạo mã thông báo luồng
Sau đó anh ta sẽ sử dụng SeDebugĐặc quyền và sẽ thực hiện cuộc gọi để có được quyền Gỡ lỗi trên luồng, dẫn đến PROCESS_ALL_ACCESS, anh ta sẽ có thể truy cập bất kỳ quy trình cần thiết nào. Bây giờ, do bộ mã hóa đã có sẵn luồng, tất cả những gì còn lại là chuyển sang giai đoạn cuối cùng.

Cơm. 27: Gọi hàm SeDebugPrivilege và nâng cao đặc quyền
Một mặt, chúng tôi có LookupPrivilegeValueW, cung cấp cho chúng tôi thông tin cần thiết về các đặc quyền mà chúng tôi muốn tăng.

Cơm. 28: Yêu cầu thông tin về đặc quyền để leo thang đặc quyền
Mặt khác, chúng tôi có Điều chỉnhTokenĐặc quyền, cho phép chúng tôi có được các quyền cần thiết đối với luồng của mình. Trong trường hợp này, điều quan trọng nhất là Bang mới, cờ của ai sẽ cấp đặc quyền.


Cơm. 29: Thiết lập quyền cho token
5.3 Thực hiện
Trong phần này, chúng tôi sẽ trình bày cách mẫu thực hiện quy trình triển khai được đề cập trước đó trong báo cáo này.
Mục tiêu chính của quá trình thực hiện cũng như sự leo thang là để có được quyền truy cập vào bản sao bóng tối. Để làm điều này, anh ta cần làm việc với một luồng có quyền cao hơn quyền của người dùng cục bộ. Sau khi có được các quyền nâng cao như vậy, nó sẽ xóa các bản sao và thực hiện các thay đổi đối với các quy trình khác để không thể quay lại điểm khôi phục trước đó trong hệ điều hành.
Điển hình với loại phần mềm độc hại này, nó sử dụng CreateToolHelp32Snapshotvì vậy nó chụp nhanh các tiến trình hiện đang chạy và cố gắng truy cập các tiến trình đó bằng cách sử dụng quy trình mở. Sau khi có được quyền truy cập vào quy trình, nó cũng sẽ mở mã thông báo chứa thông tin của mình để lấy các tham số quy trình.

Cơm. 30: Truy xuất các tiến trình từ máy tính
Chúng ta có thể tự động xem cách nó lấy danh sách các tiến trình đang chạy trong quy trình 140002D9C bằng cách sử dụng CreateToolhelp32Snapshot. Sau khi nhận được chúng, anh ấy xem qua danh sách, cố gắng mở từng tiến trình một bằng OpenProcess cho đến khi thành công. Trong trường hợp này, quy trình đầu tiên anh có thể mở là "taskhost.exe".

Cơm. 31: Thực thi động một quy trình để có được một quy trình
Chúng ta có thể thấy rằng sau đó nó đọc thông tin mã thông báo quy trình, vì vậy nó gọi OpenProcessToken với tham số "20008"

Cơm. 32: Đọc thông tin mã thông báo quy trình
Nó cũng kiểm tra xem tiến trình mà nó sẽ được đưa vào có phải không csrss.exe, explorer.exe, lsaas.exe hoặc rằng anh ta có một số quyền Cơ quan NT.

Cơm. 33: Các quy trình bị loại trừ
Chúng tôi có thể tự động xem cách nó thực hiện kiểm tra lần đầu tiên bằng cách sử dụng thông tin mã thông báo quy trình trong 140002D9C để tìm hiểu xem tài khoản có quyền đang được sử dụng để thực thi một quy trình có phải là tài khoản hay không QUYỀN NT.

Cơm. 34: NT QUYỀN kiểm tra
Và sau đó, ngoài thủ tục, anh ta kiểm tra xem đây không phải là csrss.exe, explorer.exe hoặc lsaas.exe.

Cơm. 35: NT QUYỀN kiểm tra
Sau khi anh ta chụp nhanh các quy trình, mở các quy trình và xác minh rằng không có quy trình nào bị loại trừ, anh ta sẵn sàng ghi vào bộ nhớ các quy trình sẽ được đưa vào.
Để làm điều này, trước tiên nó dành một vùng trong bộ nhớ (VirtualAllocEx), ghi vào đó (ViếtQuy trìnhbộ nhớ) và tạo một luồng (Tạo Chủ Đề Từ Xa). Để làm việc với các chức năng này, nó sử dụng PID của các quy trình đã chọn mà trước đó nó thu được bằng cách sử dụng CreateToolhelp32Snapshot.

Cơm. 36: Mã nhúng
Ở đây chúng ta có thể quan sát linh hoạt cách nó sử dụng tiến trình PID để gọi hàm VirtualAllocEx.

Cơm. 37: Gọi VirtualAllocEx
5.4 Mã hóa
Trong phần này, chúng ta sẽ xem xét phần mã hóa của mẫu này. Trong hình dưới đây bạn có thể thấy hai chương trình con được gọi là "TảiLibrary_EncodeString" và "Mã hóa_Func", chịu trách nhiệm thực hiện quy trình mã hóa.

Cơm. 38: Thủ tục mã hóa
Lúc đầu, chúng ta có thể thấy cách nó tải một chuỗi mà sau này sẽ được sử dụng để giải mã mọi thứ cần thiết: nhập, DLL, lệnh, tệp và CSP.

Cơm. 39: Mạch giải mã
Hình dưới đây cho thấy lần nhập đầu tiên được giải mã trong thanh ghi R4. tải thư viện. Điều này sẽ được sử dụng sau này để tải các tệp DLL cần thiết. Chúng ta cũng có thể thấy một dòng khác trong thanh ghi R12, được sử dụng cùng với dòng trước đó để thực hiện giải mã.

Cơm. 40: Giải mã động
Nó tiếp tục tải xuống các lệnh mà nó sẽ chạy sau để vô hiệu hóa các bản sao lưu, điểm khôi phục và chế độ khởi động an toàn.

Cơm. 41: Đang tải lệnh
Sau đó, nó tải vị trí nơi nó sẽ thả 3 tệp: Windows.bat, run.sct и bắt đầu.




Cơm. 42: Vị trí tệp
3 file này dùng để kiểm tra các đặc quyền mà mỗi vị trí có. Nếu không có các đặc quyền cần thiết, Ryuk sẽ ngừng thực thi.
Nó tiếp tục tải các dòng tương ứng với ba tập tin. Đầu tiên, DECRYPT_INFORMATION.html, chứa thông tin cần thiết để khôi phục tập tin. Thứ hai, CÔNG CỘNG, chứa khóa công khai RSA.

Cơm. 43: Dòng THÔNG TIN DECRYPT.html
Ngày thứ ba, UNIQUE_ID_DO_NOT_REMOVE, chứa khóa được mã hóa sẽ được sử dụng trong quy trình tiếp theo để thực hiện mã hóa.

Cơm. 44: Dòng ID ĐỘC ĐÁO KHÔNG BỎ
Cuối cùng, nó tải xuống các thư viện cần thiết cùng với các mục nhập và CSP cần thiết (RSA nâng cao của Microsoft и Nhà cung cấp mật mã AES).

Cơm. 45: Đang tải thư viện
Sau khi hoàn tất quá trình giải mã, nó sẽ tiến hành thực hiện các hành động cần thiết để mã hóa: liệt kê tất cả các ổ đĩa logic, thực thi những gì đã được tải trong quy trình trước đó, tăng cường sự hiện diện trong hệ thống, ném tệp RyukReadMe.html, mã hóa, liệt kê tất cả các ổ đĩa mạng , chuyển sang các thiết bị được phát hiện và mã hóa chúng.
Tất cả bắt đầu bằng việc tải"cmd.exe" và các bản ghi khóa công khai RSA.

Cơm. 46: Chuẩn bị mã hóa
Sau đó, nó nhận được tất cả các ổ đĩa logic bằng cách sử dụng Nhận ổ đĩa logic và vô hiệu hóa tất cả các bản sao lưu, điểm khôi phục và chế độ khởi động an toàn.

Cơm. 47: Vô hiệu hóa các công cụ khôi phục
Sau đó, nó tăng cường sự hiện diện của mình trong hệ thống, như chúng ta đã thấy ở trên và ghi tệp đầu tiên RyukReadMe.html в TEMP.

Cơm. 48: Xuất bản thông báo đòi tiền chuộc
Trong hình ảnh sau đây, bạn có thể thấy cách nó tạo một tệp, tải xuống nội dung và ghi nó:

Cơm. 49: Load và ghi nội dung file
Để có thể thực hiện các hành động tương tự trên tất cả các thiết bị, anh ấy sử dụng
"icacls.exe", như chúng tôi đã trình bày ở trên.

Cơm. 50: Sử dụng icalcls.exe
Và cuối cùng, nó bắt đầu mã hóa các tệp ngoại trừ các tệp “*.exe”, “*.dll”, tệp hệ thống và các vị trí khác được chỉ định dưới dạng danh sách trắng được mã hóa. Để làm điều này, nó sử dụng nhập khẩu: CryptAcquireContextW (trong đó việc sử dụng AES và RSA được chỉ định), CryptDeriveKey, CryptGenKey, Mật MãPhá HủyChính vân vân. Nó cũng cố gắng mở rộng phạm vi tiếp cận tới các thiết bị mạng được phát hiện bằng WNetEnumResourceW và sau đó mã hóa chúng.

Cơm. 51: Mã hóa tập tin hệ thống
6. Nhập khẩu và cờ tương ứng
Dưới đây là bảng liệt kê các mục nhập và cờ phù hợp nhất được mẫu sử dụng:

7. IOC

tài liệu tham khảo
- userPublicrun.sct
- Menu Bắt đầuChương trìnhStartupstart.bat AppDataRoamingMicrosoftWindowsStart
- MenuProgramsStartupstart.bat

Một báo cáo kỹ thuật về ransomware Ryuk được các chuyên gia từ phòng thí nghiệm chống vi-rút PandaLabs biên soạn.
8. Liên kết
1. “Everis y Prisa Radio sufren un Grave ciberataque que secuestra sus sistemas.”https://www. elconfidencial.com/tecnologia/2019-11-04/everis-la-ser-ciberataque-ransomware-15_2312019/, Publicada el 04/11/2019.
2. “Un virus de origen ruso ataca a importantes empresas españolas.” https: //elpais.com/tecnologia/2019/11/04/actualidad/1572897654_ 251312.html, Publicada el 04/11/2019.
3. “Bài viết VB2019: Sự trả thù của Shinigami: cái đuôi dài của phần mềm độc hại Ryuk.” https://securelist.com/story-of-the-year-2019-cities-under-ransomware-siege/95456/, Publicada el 11 /12/2019
4. “Săn lùng trò chơi lớn với Ryuk: Một phần mềm tống tiền có mục tiêu sinh lợi khác.”https://www. Crowstrike.com/blog/big-game-hunting-with-ryuk-another-lucrative-targeted-ransomware/, Công bố ngày 10/01/2019.
5. “Bài báo VB2019: Sự trả thù của Shinigami: cái đuôi dài của phần mềm độc hại Ryuk.” https://www. virusbulletin.com/virusbulletin/2019/10/ vb2019-paper-shinigamis-revenge-long-tail-r
Nguồn: www.habr.com
