Skip to main content

Command Palette

Search for a command to run...

Sản phẩm Ivanti Connect Secure VPN bị tấn công bởi lỗ hổng Zero-Day mới

Updated
12 min read
Sản phẩm Ivanti Connect Secure VPN bị tấn công bởi lỗ hổng Zero-Day mới

Vào thứ tư, ngày 8 tháng 1 năm 2025, Ivanti đã thông báo tới khách hàng về hai lỗ hổng bảo mật là CVE-2025-0282 và CVE-2025-0283 đã được vá trong các thiết bị VPN Connect Secure (ICS) của công ty này.

Thông tin về CVE-2025-0282

  • Định danh lỗ hổng: CVE-2025-0282

  • Mức độ nghiêm trọng: Critical

  • Điểm CVSSv3: 9.0

  • Mô tả chung: Lỗ hổng tràn bộ đệm ngăn xếp cho phép kẻ tấn công thực thi mã tùy ý từ xa mà không cần xác thực.

  • Phiên bản bị ảnh hưởng:

    • Ivanti Connect Secure phiên bản trước 22.7R2.5

    • Ivanti Policy Secure phiên bản trước 22.7R1.2

    • Ivanti Neurons cho ZTA gateways phiên bản trước 22.7R2.3

Chiến dịch tấn công liên quan tới CVE-2025-0282

Mandiant, đơn vị điều tra cuộc tấn công này, đã tiết lộ rằng việc khai thác có liên quan đến các tác nhân đe dọa tới từ Trung Quốc. Mandiant cho rằng việc khai thác CVE-2025-0282 bắt đầu từ giữa tháng 12 năm 2024. Những kẻ tấn công đã triển khai một mã độc cùng họ với mã độc Spawn, được cho là sử dụng bởi một nhóm gián điệp có liên quan đến Trung Quốc được theo dõi có tên là UNC5337.

Họ mã độc Spawn bao gồm trình SpawnAnt installer, SpawnMole tunneler và một SSH backdoor có tên là SpawnSnail.

Ngoài ra, trong các cuộc tấn công liên quan đến việc khai thác CVE-2025-0282, các chuyên gia bảo mật cũng thấy các họ mã độc chưa từng biết đến trước đây, được đặt tên là DryHookPhaseJam. Các phần mềm độc hại này vẫn chưa được liên kết với một nhóm đe dọa đã biết nào.

Cách thức khai thác

Quá trình khai thác CVE-2025-0282 thường được thực hiện qua các bước sau:

  1. Vô hiệu hóa SELinux

  2. Ngăn chặn việc gửi syslog ra ngoài

  3. Remount ổ đĩa dưới quyền read-write

  4. Tạo script

  5. Thực thi script

  6. Triển khai một hoặc nhiều web shell

  7. Sử dụng lệnh sed để xóa các log cụ thể khỏi debug log và application log

  8. Bật lại SELinux

  9. Remount ổ đĩa

Vô hiệu hoá hệ thống phòng thủ

Ngay sau khi khai thác thành công, kẻ tấn công sẽ vô hiệu hóa SELinux, đồng thời sử dụng iptables để chặn hành vi gửi syslog và remount phân vùng gốc để cho phép ghi phần mềm độc hại vào thiết bị.

Hình 1. Câu lệnh dùng để vô hiệu hoá hệ thống phòng thủ

Chuẩn bị mã độc

Kẻ tấn công sử dụng lệnh echo để ghi một script được mã hoá base64 vào /tmp/.t, sau đó thiết lập quyền thực thi trên tệp này.

Hình 2. Nội dung file /tmp/.t

Tiếp theo, kẻ tấn công ghi một tệp nhị phân ELF được mã hóa base-64 vào /tmp/svb. Tệp nhị phân ELF đầu tiên sử dụng lệnh setuid để đặt owner của tiến trình thành root. Sau đó, nó thực thi /tmp/s (PHASEJAM), tiến trình này sẽ kế thừa đặc quyền root của tiến trình cha. Sau đó, kẻ tấn công sử dụng lệnh dd để ghi đè tệp svb bằng số 0 và xóa /tmp/.t.

Hình 3. Các câu lệnh để tạo script độc hại trên hệ thống

Mã độc PHASEJAM

PHASEJAM là một dropper được viết dưới dạng một bash shell script độc hại có chức năng sửa đổi các thành phần của thiết bị Ivanti Connect Secure. Các chức năng chính của PHASEJAM là chèn một web shell vào các tệp getComponent.cgirestAuth.cgi, chặn các bản nâng cấp hệ thống bằng cách sửa đổi tệp DSUpgrade.pm và ghi đè lên tệp thực thi remotedebug để có thể thực thi các lệnh tùy ý.

Tính năng Webshell

PHASEJAM chèn web shell vào các tệp hợp lệ getComponent.cgirestAuth.cgi dưới dạng hàm có tên AccessAllow(). Web shell được viết dựa trên nền Perl và cung cấp cho kẻ tấn công khả năng truy cập từ xa và thực thi mã trên máy chủ ICS bị xâm phạm. Nó sử dụng mô-đun MIME::Base64 để mã hóa, giải mã lệnh và dữ liệu.

Tính năng chặn cập nhật bản vá

Để chặn việc cập nhật các bản vá lỗ hổng, PHASEJAM đưa hàm processUpgradeDisplay() độc hại vào tệp /home/perl/DSUpgrade.pm. Chức năng này nhằm mục đích giả mạo quá trình nâng cấp bao gồm 13 bước. Khi quản trị viên nâng cấp, hàm này sẽ hiển thị một giao diện update trực quan, hiển thị từng bước cùng với để mô phỏng một quá trình update đang chạy.

Tính năng remotedebug Hooking

PHASEJAM đổi tên tệp /home/bin/remotedebug thành remotedebug.bak. PHASEJAM viết một shell script/home/bin/remotedebug mới để hook call đến remotedebug. Shell script này sẽ chỉ nhận tham số -c để nhận lệnh thực thi mã từ xa, các tham số khác được chuyển về remotebebug.bak.

Kỹ thuật Anti-forensics

Sau khi khai thác, kẻ tấn công đã thực hiện xóa bằng chứng khỏi thiết bị nhằm che giấu dấu vết:

  1. Xóa kernel messages bằng lệnh dmesg và xóa debug logs được tạo ra trong quá trình khai thác

  2. Xóa các troubleshoot information packages (bản sao lưu trạng thái) và bất kỳ core dump nào được tạo từ việc tiến trình bị crash

  3. Xóa các application event log liên quan đến lỗi syslog, lỗi ICT nội bộ, crash và lỗi xử lý certificate

  4. Xóa lịch sử các command đã thực hiện khỏi SELinux audit log

Hình 4. Các câu lệnh trong script độc hại để xoá log cụ thể trên hệ thống

Kỹ thuật Persistence của mã độc khi nâng cấp hệ thống

Các chuyên gia bảo mật đã xác định được hai kỹ thuật mà kẻ tấn công sử dụng để duy trì hoạt động qua các bản nâng cấp hệ thống trên các thiết bị Ivanti Connect Secure bị xâm phạm.

Fake System Upgrades

Kỹ thuật đầu tiên, được sử dụng bởi mã độc PHASEJAM, ngăn chặn hành động nâng cấp hệ thống ICS của quản trị viên thông qua việc hiển thị thanh tiến trình nâng cấp giả trong khi âm thầm chặn quá trình nâng cấp hợp pháp. Do việc nâng cấp trên thực tế đã bị chặn, nên kỹ thuật này sẽ khiến cho backdoor và công cụ của kẻ tấn công vẫn tồn tại trên hệ thống.

Persistence trong quá trình upgrade

SPAWNANT là một mã độc có thể tồn tại trong suốt quá trình nâng cấp hệ thống. Nó chiếm đoạt luồng thực thi của dspkginstall, một tệp nhị phân được sử dụng trong quá trình nâng cấp hệ thống, bằng cách export một hàm snprintf độc hại có chứa cơ chế persistence.

Không giống như phương pháp bên trên, SPAWNANT không chặn quá trình nâng cấp. Nó tồn tại trong quá trình nâng cấp bằng cách đảm bảo bản thân và các thành phần của nó được di chuyển đến phân vùng nâng cấp mới (được mount trên /tmp/data/ trong quá trình nâng cấp hệ thống hợp lệ).

Các hành vi của mã độc sau khi khai thác thành công

Thiết lập Tunnel để giao tiếp với C2 server

Sau khi khai thác thành công một thiết bị, kẻ tấn công sử dụng nhiều tunnel khác nhau, nhằm mục đích tạo các kênh liên lạc giữa thiết bị bị xâm phạm và C2 server. Các tunnel này cho phép kẻ tấn công bỏ qua các biện pháp bảo mật mạng và lateral movement xa hơn vào hệ thống của nạn nhân.

Một trong những tunnel mà có trong chiến dịch này là SPAWNMOLE, một tunneler được đưa vào trong tiến trình web. Nó chiếm đoạt chức năng accept trong tiến trình web để giám sát lưu lượng truy cập và lọc ra lưu lượng truy cập độc hại có nguồn gốc từ kẻ tấn công để truyền đến máy chủ cụ thể do kẻ tấn công kiểm soát. Còn các lưu lượng truy cập bình thường sẽ được truyền máy chủ web hợp lệ.

Rà quét mạng nội bộ

Hacker đã sử dụng một số công cụ để thực hiện rà quét mạng nội bộ. Chúng sử dụng các công cụ được tích hợp sẵn trong thiết bị ICS như nmapdig. Chúng cũng sử dụng tài khoản dịch vụ LDAP, nếu đã được cấu hình, để thực hiện các truy vấn LDAP. Tài khoản dịch vụ LDAP cũng được cho rằng đươc sử dụng để lateral movement trong mạng, bao gồm cả máy chủ Active Directory, thông qua SMB hoặc RDP.

Đánh cắp database cache của thiết bị

Kẻ tấn công lưu trữ dữ liệu database cache của thiết bị bị xâm phạm và đẩy nó lên một thư mục trên web public để có thể truyền dữ liệu ra ngoài. Database cache có thể chứa thông tin liên quan đến các VPN sessions, session cookies, API keys, certificates và tài liệu thông tin xác thực.

Thu thập thông tin xác thực

Các chuyên gia bảo mật nhận thấy kẻ tấn công triển khai một Python script, có tên là DRYHOOK, để đánh cắp thông tin đăng nhập. Phần mềm độc hại được thiết kế để sửa đổi một thành phần hệ thống có tên DSAuth.pm thuộc về Ivanti Connect Secure để thu thập thông tin về các lần xác thực thành công.

Danh sách IOCs liên quan tới chiến dịch

Họ mã độcTên fileMô tả
DRYHOOKn/aCredential Theft Tool
PHASEJAM/tmp/sWeb Shell dropper
PHASEJAM Webshell/home/webserver/htdocs/dana-na/jam/getComponent.cgiWeb Shell
PHASEJAM Webshell/home/webserver/htdocs/dana-na/auth/restAuth.cgiWeb Shell
SPAWNSNAIL/root/home/lib/libsshd.soSSH backdoor
SPAWNMOLE/root/home/lib/libsocks5.soTunneler
SPAWNANT/root/lib/libupgrade.soInstaller
SPAWNSLOTH/tmp/.liblogblock.soLog tampering utility

Yara rule

rule M_APT_Installer_SPAWNSNAIL_1
{ 
    meta: 
        author = "Mandiant" 
        description = "Detects SPAWNSNAIL. SPAWNSNAIL is an SSH 
backdoor targeting Ivanti devices. It has an ability to inject a specified 
binary to other process, running local SSH backdoor when injected to 
dsmdm process, as well as injecting additional malware to dslogserver" 
        md5 = "e7d24813535f74187db31d4114f607a1"

    strings: 
        $priv = "PRIVATE KEY-----" ascii fullword

        $key1 = "%d/id_ed25519" ascii fullword
        $key2 = "%d/id_ecdsa" ascii fullword
        $key3 = "%d/id_rsa" ascii fullword

        $sl1 = "[selinux] enforce" ascii fullword
        $sl2 = "DSVersion::getReleaseStr()" ascii fullword

        $ssh1 = "ssh_set_server_callbacks" ascii fullword
        $ssh2 = "ssh_handle_key_exchange" ascii fullword
        $ssh3 = "ssh_add_set_channel_callbacks" ascii fullword
        $ssh4 = "ssh_channel_close" ascii fullword

    condition: 
        uint32(0) == 0x464c457f and $priv and any of ($key*) 
and any of ($sl*) and any of ($ssh*)
}
rule M_APT_Installer_SPAWNANT_1
{ 
    meta: 
        author = "Mandiant" 
        description = "Detects SPAWNANT. SPAWNANT is an 
Installer targeting Ivanti devices. Its purpose is to persistently 
install other malware from the SPAWN family (SPAWNSNAIL, 
SPAWNMOLE) as well as drop additional webshells on the box." 

    strings: 
        $s1 = "dspkginstall" ascii fullword
        $s2 = "vsnprintf" ascii fullword
        $s3 = "bom_files" ascii fullword
        $s4 = "do-install" ascii
        $s5 = "ld.so.preload" ascii
        $s6 = "LD_PRELOAD" ascii
        $s7 = "scanner.py" ascii

    condition: 
        uint32(0) == 0x464c457f and 5 of ($s*)
}
rule M_Tunneler_SPAWNMOLE_3
{
    meta:
        author = "Mandiant"
        description = "Hunting rule looking for strings and code 
identified in SPAWNMOLE samples"
        md5 = "a638fd203ddb540d0484d8e00490df06"
    strings:
        $str1 = "/proc/self/exe"
        $str2 = "/proc/%d/maps"
        $str3 = "=> encrypt buf"
        $str4 = "=> decrypt buf"
        $str5 = "%s    <malformed>"
        $comparison1 = { 3C 16 74 [1] 0F B6 [2] 3C 03 74 [1] 0F B6 [2] 3C 01 0F 85 }
        $comparison2 = { 81 [2] E2 E3 49 FB 0F 85 [4] 81 [2] 61 83 C3 1B 0F 85}
        $code1 = { 8D 55 B8 8B 45 F0 01 D0 0F B6 10 8B 4D F0 8B 45 0C 01 C8 0F 
B6 00 31 C2 8D 4D B8 8B 45 F0 01 C8 88 10 83 45 F0 01 83 7D F0 2F 7E D4 }
        $code2 = { 81 7D E8 E2 E3 49 FB 0F 85 CD 00 00 00 81 7D E4 61 83 C3 1B }
    condition:
        uint32(0) == 0x464c457f and
        (all of ($s*)) and
        (1 of ($comparison*)) and
        (1 of ($code*))
}
rule M_Dropper_PHASEJAM_1 {
    meta:
        author = "Mandiant"
        description = "Hunting rule looking for strings identified in the 
PHASEJAM dropper"
        md5 = "d18e5425ecd9608ecb992606b974e15d"
    strings:

        $str1 = "AccessAllow()"
        $str2 = "/jam/getComponent.cgi"
        $str3 = "jam/getComponent.cgi.bak"
        $str4 = "sh=$(echo CnN1Y"
        $str5 = "up=$(echo CnN1Y"
        $str6 = "grep -q 'sub AccessAllow()'"
        $str7 = "cp -f /home/bin/remotedebug /home/bin/remotedebug.bak"
        $str8 = "chmod 777 /home/bin/remotedebug.bak"
        $str9 = "cp -f /home/perl/DSUpgrade.pm /home/perl/DSUpgrade.pm.bak"
        $str10 = "pkill cgi-server"
    condition:
        8 of them and filesize < 20KB

}
rule M_Credtheft_DRYHOOK_1 {
    meta:
        author = "Mandiant"
        description = "Hunting rule looking for strings identified in 
the DRYHOOK credential stealer"
        md5 = "61bb586dc4e047ab081ef6ca65684e48"
    strings:

        $str1 = "/home/perl/DSAuth.pm"
        $str2 = "replace_content"
        $str3 = "replace1_content"
        $str4 = "replace2_content"
        $str5 = "pkill cgi-server"
        $str6 = "setPrompt ="
        $str7 = "runSignin = \\*DSAuthc::RealmSignin_runSignin"
        $str8 = "/bin/mount -o remount,rw / > /dev/null 2>&1"
        $str9 = {64 61 74 61 20 3d 20 72 65 2e 73 75 62 28 62 22 
5c 2a 72 75 6e 53 69 67 6e 69 6e 45 42 53 4c 20 3d 2e 2a 3b 22 2c 
62 61 73 65 36 34 2e 62 36 34 64 65 63 6f 64 65 28 72 65 70 6c 61 
63 65 32 5f 63 6f 6e 74 65 6e 74 2e 65 6e 63 6f 64 65 28 29 29 2e 64 
65 63 6f 64 65 28 29 2e 65 6e 63 6f 64 65 28 22 75 6e 69 63 6f 64 65 
5f 65 73 63 61 70 65 22 29 2c 64 61 74 61 29}
    condition:
        8 of them and filesize < 20KB

}

Khuyến nghị

Phía FPT Threat Intelligence khuyến nghị tổ chức và cá nhân một số cách để phòng chống chiến dịch này:

  • Cập nhật bản vá: Cập nhật bản vá mới nhất từ Ivanti.

  • Sử dụng công cụ kiểm tra tính toàn vẹn (ICT): Sử dụng cả công cụ kiểm tra tính toàn vẹn bên trong và bên ngoài của Ivanti.

  • Thiết lập lại thiết bị nếu có dấu hiệu bị khai thác thành công: Khôi phục cài đặt gốc để loại bỏ mã độc và đảm bảo thiết bị hoạt động với phiên bản phần mềm 22.7R2.5.

Tham khảo

Newsletters

Part 1 of 50

More from this blog

F

FPT IS Security

721 posts

Dedicated to providing insightful articles on cybersecurity threat intelligence, aimed at empowering individuals and organizations to navigate the digital landscape safely.