LinkPro Linux Rootkit
การบุกรุกสภาพแวดล้อมของ Amazon Web Services (AWS) เมื่อเร็ว ๆ นี้เผยให้เห็นรูทคิท GNU/Linux ที่ไม่เคยมีการบันทึกมาก่อน ซึ่งติดตามในชื่อ LinkPro แบ็คดอร์นี้โดดเด่นด้วยการใช้โมดูล eBPF สองแบบ: แบบหนึ่งใช้สำหรับซ่อนอาร์ทิแฟกต์ และอีกแบบหนึ่งทำหน้าที่เป็นทริกเกอร์แบบซ่อนเร้น ซึ่งเป็น 'น็อค' ที่จะเปิดใช้งานฟังก์ชันคำสั่งระยะไกลหลังจากพบแพ็กเก็ต TCP ที่สร้างขึ้นเป็นพิเศษเท่านั้น ห่วงโซ่การโจมตีและกลไกของรูทคิทแสดงให้เห็นถึงผู้ปฏิบัติการที่ชาญฉลาดซึ่งผสมผสานการใช้คอนเทนเนอร์ในทางที่ผิด การปกปิดระดับเคอร์เนล และการเปิดใช้งานเครือข่ายที่ยืดหยุ่น เพื่อขัดขวางการตรวจจับและความสัมพันธ์ทางนิติวิทยาศาสตร์
สารบัญ
เวกเตอร์การติดเชื้อและการแพร่กระจายเบื้องต้น
การบุกรุกเริ่มต้นขึ้นจากการโจมตีอินสแตนซ์ Jenkins ที่ถูกเปิดเผย ซึ่งมีช่องโหว่ CVE‑2024‑23897 (CVSS 9.8) จากจุดนั้น ผู้โจมตีได้ส่งอิมเมจ Docker ที่เป็นอันตราย (kvlnt/vv ซึ่งปัจจุบันถูกลบออกจาก Docker Hub แล้ว) ไปยังคลัสเตอร์ Kubernetes หลายคลัสเตอร์ อิมเมจดังกล่าวใช้ฐาน Kali Linux และมีโฟลเดอร์แอปพลิเคชันขนาดเล็กที่ออกแบบมาเพื่อสร้างการคงอยู่ การเข้าถึงระยะไกล และการดาวน์โหลดแบ็คดอร์แบบเป็นขั้นตอน
ภายในภาพ Docker ที่เป็นอันตราย
โฟลเดอร์แอปของรูปภาพประกอบด้วยไฟล์หลักสามไฟล์ที่มีบทบาทที่แตกต่างกัน:
start.sh — สคริปต์เชลล์ที่เปิดใช้งานบริการ SSH และดำเนินการส่วนประกอบอีกสองส่วน
ลิงก์ — โปรแกรมโอเพนซอร์ส (VNT) ที่คอมไพล์/แพ็กเกจเพื่อทำหน้าที่เป็นไคลเอนต์ VPN/พร็อกซี เชื่อมต่อขาออกไปยัง vnt.wherewego[.]top:29872 ซึ่งทำให้ผู้โจมตีสามารถเข้าถึงโฮสต์ที่ถูกบุกรุกได้จากทุกที่ และเปลี่ยนเส้นทางไปยังเป้าหมายอื่นๆ ผ่านโฮสต์นั้น
แอป — โปรแกรมดาวน์โหลดที่ใช้ Rust (เรียกว่า vGet) ที่ดึงข้อมูล vShell ที่เข้ารหัสจากบัคเก็ต S3 จากนั้นสร้างลิงก์ WebSocket ไปยังเซิร์ฟเวอร์คำสั่งและควบคุม (C2) ที่ 56.155.98[.]37
เพย์โหลดเพิ่มเติมที่ส่งมอบให้กับโหนด Kubernetes
นอกจากอิมเมจที่เป็นอันตรายแล้ว ผู้ปฏิบัติการยังได้วางส่วนประกอบอื่นอีกสองส่วนลงบนโหนด ได้แก่ ดรอปเปอร์ที่ติดตั้งแบ็กดอร์ vShell อีกตัว และ LinkPro ซึ่งเป็นรูทคิทที่เขียนโดย Golang LinkPro ได้รับการออกแบบให้ทำงานในหนึ่งในสองโหมด คือ แบบพาสซีฟ (ย้อนกลับ) หรือแบบแอคทีฟ (ไปข้างหน้า) ขึ้นอยู่กับการกำหนดค่า ในโหมดพาสซีฟ มันจะรอให้แพ็กเก็ตเครือข่ายพิเศษเปิดใช้งาน และในโหมดแอคทีฟ มันจะเริ่มต้นการติดต่อกับ C2 เอง โหมดส่งต่อรองรับโปรโตคอลการขนส่งห้าแบบ (HTTP, WebSocket, UDP, TCP, DNS) ในขณะที่โหมดย้อนกลับจะจำกัดการสื่อสารไว้ที่ HTTP
LinkPro ยังคงดำรงอยู่ได้อย่างไร
การดำเนินการโดยรวมและพฤติกรรมการคงอยู่ของมัลแวร์มีลำดับที่ชัดเจน:
- ติดตั้งโมดูล Hide eBPF โมดูลนี้ประกอบด้วยโปรแกรม Tracepoint และ Kretprobe eBPF ที่ใช้ปกปิดกระบวนการและกิจกรรมเครือข่ายของ LinkPro
- หากการติดตั้งโมดูล Hide eBPF ล้มเหลว — หรือถูกปิดการใช้งาน — ให้ติดตั้งไลบรารีที่แชร์ได้ที่ /etc/libld.so และเพิ่มเส้นทางนั้นไปที่ /etc/ld.so.preload เป็นกลไกการซ่อนสำรอง
- สำหรับการทำงานแบบย้อนกลับ (แบบพาสซีฟ) ให้ติดตั้งโมดูล Knock eBPF Knock ประกอบด้วยโปรแกรม XDP และโปรแกรม TC ดังนั้นช่อง C2 จึงจะทำงานได้ก็ต่อเมื่อได้รับ 'แพ็กเก็ตวิเศษ' ที่กำหนดเท่านั้น
- สร้างความคงอยู่โดยการสร้างบริการ systemd
- ดำเนินการคำสั่งที่ได้รับจาก C2
- เมื่อปิดระบบหรือเมื่อมีสัญญาณ (SIGHUP, SIGINT, SIGTERM) ให้ถอนการติดตั้งโมดูล eBPF และลบ/คืนค่าการแก้ไขล่วงหน้า /etc/libld.so เพื่อให้ระบบกลับไปสู่สถานะก่อนหน้า
แพ็กเก็ตวิเศษและกลไกการเปิดใช้งานการเคาะ
การเปิดใช้งานแบบพาสซีฟของ LinkPro ขึ้นอยู่กับแพ็กเก็ต TCP ที่แม่นยำ: แพ็กเก็ต TCP ใดๆ ที่มีขนาดหน้าต่างเท่ากับ 54321 จะถูกถือว่าเป็น 'แพ็กเก็ตวิเศษ' เมื่อ Knock ตรวจพบแพ็กเก็ตนั้น มันจะเก็บ IP ต้นทางและติดแท็กด้วยระยะเวลาหมดอายุหนึ่งชั่วโมง แพ็กเก็ต TCP ที่ตามมาจากแหล่งนั้นจะถูกตรวจสอบ และเมื่อเหมาะสม Knock จะเขียนเฮดเดอร์ใหม่เพื่อให้ทราฟฟิกของผู้ให้บริการเปลี่ยนเส้นทางไปยังพอร์ตที่รอรับข้อมูลของ LinkPro (2333) แพ็กเก็ตขาออกจะถูกปรับเพื่อนำพอร์ตเดิมกลับมายังเครือข่าย (พอร์ตต้นทางถูกเขียนใหม่เป็น 2233) จุดประสงค์นั้นตรงไปตรงมาแต่มีประสิทธิภาพ นั่นคือ อนุญาตให้ผู้โจมตีเข้าถึง LinkPro ผ่านพอร์ตใดก็ได้ที่ไฟร์วอลล์ส่วนหน้าอนุญาต ขณะเดียวกันก็ทำให้ยากต่อการเชื่อมโยงบันทึกไฟร์วอลล์ภายนอกกับกิจกรรมเครือข่ายภายในของโฮสต์
LinkPro ซ่อนตัวเองอย่างไร
LinkPro ใช้กลยุทธ์การปกปิดสองชั้น:
การซ่อนเคอร์เนล/eBPF : โมดูล Hide eBPF จะติดตั้งโปรแกรม Tracepoint และ Kretprobe ที่ดักจับการเรียกใช้งานระบบ เช่น getdents (เพื่อซ่อนไฟล์/ไดเรกทอรี) และ sys_bpf (เพื่อซ่อนโปรแกรม BPF ของตัวเอง) วิธีนี้ต้องใช้เคอร์เนลที่สร้างขึ้นโดยเปิดใช้งาน CONFIG_BPF_KPROBE_OVERRIDE
LD_PRELOAD สำรองในพื้นที่ผู้ใช้ : หากไม่มีความสามารถของเคอร์เนล LinkPro จะเขียนไลบรารีที่ใช้ร่วมกัน (libld.so) และวางพาธไว้ใน /etc/ld.so.preload เนื่องจาก /etc/ld.so.preload ทำให้ไลบรารีที่ระบุถูกโหลดเข้าสู่ทุกกระบวนการที่เชื่อมโยงแบบไดนามิก (กระบวนการที่ใช้ /lib/ld-linux.so และ glibc) libld.so ที่ฝังไว้จึงเชื่อมโยงฟังก์ชัน libc ไว้ตั้งแต่เนิ่นๆ (ก่อนที่ glibc จะทำงาน) และเปลี่ยนแปลงค่าที่ส่งกลับจากการเรียกใช้ libc เพื่อซ่อนอาร์ติแฟกต์ที่อาจเปิดเผยการมีอยู่ของมัน
ความสามารถของรูทคิทและชุดคำสั่ง
LinkPro รองรับทั้งการดำเนินการระยะไกลแบบโต้ตอบและแบบอัตโนมัติ คุณสมบัติที่นำมาใช้ประกอบด้วย:
- การเริ่มใช้ /bin/bash pseudo‑terminal และการรันเซสชันเชลล์แบบโต้ตอบ
- การดำเนินการคำสั่งเชลล์ตามต้องการ
- การนับไฟล์และไดเรกทอรีและดำเนินการกับไฟล์
- การดาวน์โหลดและการเขียนไฟล์ลงดิสก์
- การจัดตั้งอุโมงค์พร็อกซี SOCKS5 สำหรับการเปลี่ยนแกนและการใช้ชีวิตนอกพื้นที่
การสนับสนุนโปรโตคอลเครือข่ายและพฤติกรรม C2
ในโหมดแอคทีฟ (ส่งต่อ) LinkPro มีความยืดหยุ่น: สามารถสื่อสารโดยใช้ HTTP, WebSocket, UDP, TCP หรือ DNS transports ในโหมดพาสซีฟ (ย้อนกลับ) การสื่อสารจะถูกจำกัดไว้ที่ HTTP แต่ได้รับประโยชน์จากการซ่อนตัว เพราะจะดักฟังเฉพาะหลังจากที่แพ็กเก็ตเวทมนตร์ Knock เปิดหน้าต่างคำสั่งชั่วคราวหนึ่งชั่วโมงแล้วเท่านั้น
พฤติกรรมการล้างข้อมูลและถอนการติดตั้ง
หากกระบวนการได้รับสัญญาณการยุติ LinkPro มีเป้าหมายที่จะลบร่องรอย: มันจะถอนการติดตั้งโมดูล eBPF ที่ติดตั้งไว้ และลบหรือคืนค่าไฟล์ /etc/libld โดยจัดกลุ่มไฟล์กลับเป็นสถานะก่อนหน้าเพื่อให้ระบบไม่เปลี่ยนแปลง รูทีนการทำความสะอาดที่จงใจนี้บ่งชี้ว่าผู้ปฏิบัติงานกังวลเกี่ยวกับการหลีกเลี่ยงและลดรอยเท้าทางนิติวิทยาศาสตร์ในระยะยาว
บริบทการดำเนินงานและการระบุแหล่งที่มา
แคมเปญนี้ใช้ช่องโหว่ Jenkins ที่มีความรุนแรงสูง อิมเมจคอนเทนเนอร์ที่เป็นอันตราย แบ็กดอร์หลายรูปแบบ และการซ่อนตัวในระดับเคอร์เนล ซึ่งเป็นการผสมผสานที่ชี้ให้เห็นถึงผู้ปฏิบัติการที่มีแรงจูงใจและความสามารถ ยังไม่มีการเปิดเผยแหล่งที่มาที่ชัดเจนต่อสาธารณะ อย่างไรก็ตาม ชุดเครื่องมือและการใช้ช่องโหว่นี้อย่างชัดเจนสำหรับการใช้พร็อกซีและการเข้าถึงระยะไกลแบบต่อเนื่อง ชี้ให้เห็นอย่างชัดเจนถึงกิจกรรมที่มีแรงจูงใจทางการเงิน (เช่น การเปลี่ยนผ่าน การใช้งานพร็อกซีสำหรับการบุกรุกเพิ่มเติม หรือการขายสิทธิ์การเข้าถึงต่อ)
การพึ่งพาเคอร์เนลและพฤติกรรมสำรอง
เนื่องจาก LinkPro อาศัยคุณสมบัติการแทนที่ kprobe ของ BPF สำหรับการสกัดกั้นเคอร์เนลอย่างลับๆ จึงใช้เทคนิคการซ่อนระดับเคอร์เนลเฉพาะเมื่อเคอร์เนลโฮสต์เปิดเผย CONFIG_BPF_KPROBE_OVERRIDE เท่านั้น ในกรณีที่เคอร์เนลโฮสต์ขาดคุณสมบัตินี้ LinkPro จะจงใจกลับไปใช้วิธีไลบรารีที่ใช้ร่วมกัน LD_PRELOAD เพื่อซ่อนตัวเองในพื้นที่ผู้ใช้ เพื่อให้แน่ใจว่าสามารถซ่อนตัวได้ในสภาพแวดล้อมที่หลากหลาย
หมายเหตุปิดท้าย
LinkPro สาธิตให้เห็นว่าการบุกรุกสมัยใหม่สามารถผสมผสานการบุกรุกคอนเทนเนอร์, การโหลดแบบแบ่งขั้นตอน, การใช้งานเคอร์เนล (eBPF) และกลวิธีเครือข่ายอันชาญฉลาด (การเปิดใช้งานแพ็กเก็ตวิเศษและการเขียนพอร์ตใหม่) เพื่อรักษาความลับและความยืดหยุ่น การตรวจจับและการแก้ไขจำเป็นต้องตรวจสอบโปรแกรม eBPF ที่ไม่ได้รับอนุญาตอย่างละเอียดถี่ถ้วน, รายการที่ไม่คาดคิดใน /etc/ld.so.preload, บริการ systemd ที่ผิดปกติ และการเชื่อมต่อเครือข่ายไปยังโครงสร้างพื้นฐานที่ระบุ (ตัวบ่งชี้ทางนิติวิทยาศาสตร์ประกอบด้วย IP 56.155.98[.]37, พอร์ต 29872, 2333, 2233 และชื่ออิมเมจ Docker ที่ถูกลบออก kvlnt/vv)