สรุปสั้น
นักวิจัยจากบริษัท Sysdig เปิดเผยว่าเซิร์ฟเวอร์ Langflow เครื่องเดิมที่เคยถูกโจมตีไปแล้วครั้งหนึ่ง ถูกโจมตีซ้ำโดยผู้โจมตีรายเดียวกันที่บริษัทตั้งชื่อว่า JADEPUFFER ซึ่งเป็นปฏิบัติการที่ขับเคลื่อนด้วย AI Agent และเคยถูกบันทึกไว้เมื่อต้นเดือนกรกฎาคมนี้ ครั้งนี้ผู้โจมตีนำแรนซัมแวร์ตัวใหม่ชื่อ ENCFORGE เข้ามาใช้งาน เป็นไฟล์ที่คอมไพล์จากภาษา Go และถูกออกแบบมาเพื่อเข้ารหัสไฟล์ที่เป็นหัวใจของงาน AI โดยเฉพาะ ได้แก่ ค่าน้ำหนักโมเดล (Model Weights) ดัชนีเวกเตอร์ ชุดข้อมูลฝึกสอน และไฟล์โครงสร้างพื้นฐาน AI อื่น ๆ บนระบบไฟล์ทั้งเครื่อง
จุดเข้าไม่เปลี่ยนจากเดิม คือช่องโหว่ CVE-2025-3248 ใน Langflow เวอร์ชันก่อน 1.3.0 ที่เปิดปลายทาง /api/v1/validate/code ให้เข้าถึงได้โดยไม่ต้องยืนยันตัวตน ทำให้ผู้โจมตีจากระยะไกลรันโค้ด Python อะไรก็ได้บนเซิร์ฟเวอร์ ช่องโหว่นี้มีคะแนน CVSS 9.8 และอยู่ในบัญชี KEV ของ CISA มาตั้งแต่วันที่ 5 พฤษภาคม 2568 แล้ว สิ่งที่เปลี่ยนคือเพย์โหลด จากเดิมที่ใช้สคริปต์ Python เขียนสด ๆ กับฟังก์ชัน AES_ENCRYPT() ของ MySQL ทำลายข้อมูลใน Nacos และฐานข้อมูลที่ใช้งานจริง มาเป็นเครื่องมือที่คอมไพล์แล้วซึ่งเล็งไปที่คลังโมเดล ฐานข้อมูลเวกเตอร์ และไปป์ไลน์การฝึกสอนโดยตรง
สิ่งที่ทำให้เหตุการณ์นี้น่าสนใจไม่ใช่แค่ตัวมัลแวร์ แต่เป็นวิธีที่ผู้โจมตีปรับตัว เมื่อความพยายามดึงไฟล์ ENCFORGE จากเซิร์ฟเวอร์สั่งการล้มเหลว ผู้โจมตีไม่ได้ล้มเลิก แต่ใช้เวลา 5 นาที 24 วินาที เขียนและแก้สคริปต์ Python ถึง 6 เวอร์ชันผ่านช่องทาง RCE เดิม จนหาทางแหกออกจากคอนเทนเนอร์ไปยังเครื่องโฮสต์ได้สำเร็จผ่าน Docker socket ที่เปิดทิ้งไว้
รายละเอียดข่าว
เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 21 กรกฎาคม 2569 ว่านักวิจัยจากบริษัท Sysdig ได้เชื่อมโยงการโจมตีครั้งที่สองบนเซิร์ฟเวอร์ Langflow เครื่องเดิมเข้ากับ JADEPUFFER ซึ่งเป็นผู้โจมตีที่ขับเคลื่อนด้วย AI Agent ที่บริษัทเคยบันทึกไว้ก่อนหน้านี้ในเดือนเดียวกัน โดยหลักฐานที่หนักแน่นที่สุดในการเชื่อมโยงสองปฏิบัติการเข้าด้วยกันคือที่อยู่อีเมลสำหรับติดต่อเรียกค่าไถ่ซึ่งฝังอยู่ในโน้ตเรียกค่าไถ่ คือ e78393397@proton.me ซึ่งเป็นที่อยู่เดียวกับที่ใช้ในแคมเปญก่อนหน้า
นักวิจัยดึงไฟล์ไบนารีมาจากเซิร์ฟเวอร์สั่งการของผู้โจมตี ซึ่งซ่อนไว้ในชื่อ /.lockd โดยหากร้องขอไปที่ /lockd ตรง ๆ จะได้รับ 404 กลับมา ส่วนจุดนำหน้าชื่อไฟล์ทำให้ไฟล์ไม่ปรากฏในการแสดงรายการไดเรกทอรีแบบธรรมดา ตัวไฟล์เป็น ELF แบบ static ที่สร้างด้วย Go 1.22.12 และบีบอัดด้วย UPX 5.20 ที่น่ากังวลคือ ณ เวลาที่ Sysdig วิเคราะห์ แพลตฟอร์มข่าวกรองภัยคุกคามยังไม่มีการตรวจจับค่าแฮชทั้งเวอร์ชันที่บีบอัดและเวอร์ชันที่คลายแล้วเลยแม้แต่รายเดียว
ชื่อโปรเจกต์ภายในของไบนารีคือ encfile และข้อความแจ้งข้อผิดพลาดในไบนารีอ้างถึงเครื่องมือคู่กันชื่อ keyforge ทั้งสองสตริงนี้จะยังคงอยู่แม้ผู้โจมตีจะคอมไพล์โค้ดชุดเดิมใหม่ จึงถูกใช้เป็นจุดยึดสำหรับการตรวจจับที่ค่อนข้างเสถียร ทั้งนี้นักวิจัยเปิดเผยเซสชันการโจมตีที่สังเกตได้เพียงเซสชันเดียว ไม่ได้ระบุชื่อองค์กรที่ตกเป็นเหยื่อ และไม่ได้ให้จำนวนเหยื่อหรือหลักฐานว่ามีการนำ ENCFORGE ไปใช้ที่อื่นอีก
อีกประเด็นที่ต้องระบุให้ชัดคือ ไบนารี ENCFORGE ที่กู้คืนมาได้ ไม่มีความสามารถในการขโมยข้อมูลออกไปเลย มันไม่มีโค้ดเครือข่าย ไม่มีไคลเอนต์สำหรับคลาวด์สตอเรจ และไม่มีกลไกพักข้อมูลก่อนส่งออก อีกทั้งนักวิจัยไม่พบหลักฐานการขโมยข้อมูล ไม่พบเว็บไซต์ปล่อยข้อมูล และไม่พบพอร์ทัลจ่ายค่าไถ่บน Tor ในเซสชันที่สังเกต อำนาจต่อรองเพียงอย่างเดียวของผู้โจมตีจึงคือตัวข้อมูลที่ถูกเข้ารหัสไว้เท่านั้น ซึ่งต่างจากแรนซัมแวร์ยุคปัจจุบันส่วนใหญ่ที่ใช้การขู่ปล่อยข้อมูลเป็นแรงกดดันหลัก
วิธีการโจมตี
ในส่วนของการเข้ารหัส ENCFORGE ใช้ AES-256-CTR กับข้อมูลไฟล์ โดยกุญแจสมมาตรที่สุ่มขึ้นในแต่ละรอบการทำงานจะถูกห่อด้วยกุญแจสาธารณะ RSA-2048 ที่ฝังมากับไบนารีรุ่นนี้ และแทนที่จะเข้ารหัสทั้งไฟล์ มันเลือกเข้ารหัสเฉพาะบางช่วงของไฟล์ ซึ่งเป็นเทคนิคเร่งความเร็วแบบเดียวกับที่แรนซัมแวร์ระดับ LockBit และ BlackCat ใช้กัน ไฟล์ที่ถูกประมวลผลแล้วจะถูกเปลี่ยนนามสกุลเป็น .locked นอกจากนี้ตัวมัลแวร์ยังฆ่าโปรเซสที่เปิดไฟล์ค้างไว้ก่อนเข้ารหัส รองรับการทำงานต่อหลังรีสตาร์ตโดยไม่เข้ารหัสไฟล์เดิมซ้ำ วางโน้ตเรียกค่าไถ่ชื่อ README, HOW_TO_DECRYPT และ README_DECRYPT แล้วลบตัวเองทิ้งหลังทำงานเสร็จ
รายการนามสกุลไฟล์เริ่มต้นของมันบ่งบอกเจตนาชัดเจน ครอบคลุมทั้ง checkpoint ของ PyTorch และ TensorFlow, SafeTensors ของ Hugging Face, รูปแบบแลกเปลี่ยน ONNX, GGUF ซึ่งเป็นมาตรฐานปัจจุบันสำหรับ LLM ที่รันบนเครื่องตัวเอง และ GGML รุ่นก่อนหน้า, ดัชนีเวกเตอร์ FAISS, ชุดข้อมูลฝึกสอนแบบ Parquet และ Arrow, อาร์เรย์ของ NumPy รวมถึงไฟล์ TensorFlow records โดยรายการเต็มมีราว 180 นามสกุล และยังมีแฟล็ก --include ให้ผู้โจมตีเพิ่มรูปแบบไฟล์เองได้ ซึ่งข้อความช่วยเหลือในตัวโปรแกรมยกตัวอย่างเป็นอะแดปเตอร์ LoRA สำหรับ fine-tuning และค่าน้ำหนักแบบ GGML รุ่นเก่า นักวิจัยชี้ว่าแรนซัมแวร์ที่เข้ารหัสไฟล์ทั่วไปย่อมไม่มีเหตุผลจะระบุชื่ออะแดปเตอร์ LoRA เอาไว้ นี่จึงเป็นการเล็งเป้าอย่างจงใจ ไม่ใช่ความบังเอิญ
ส่วนที่น่าจับตาที่สุดคือขั้นตอนแหกออกจากคอนเทนเนอร์ หลังยืนยันว่ารันโค้ดได้แล้ว JADEPUFFER กวาดหาข้อมูลรับรองในคอนเทนเนอร์และพบ Docker socket ที่ /var/run/docker.sock เมื่อความพยายามดึง ENCFORGE จากเซิร์ฟเวอร์สั่งการบน GCP ล้มเหลว ผู้โจมตีจึงปรับแผน โดยใช้เวลารวม 5 นาที 24 วินาที สร้างและแก้ไขสคริปต์ Python ถึง 6 ชุดผ่านช่องทาง RCE เดิม สคริปต์ชุดแรกถูกสร้างทีละบรรทัด เพื่อให้แต่ละคำขอที่ส่งไปดูไม่มีพิษภัยในสายตาระบบตรวจสอบที่อิงลายเซ็น ตั้งแต่ชุดที่สองเป็นต้นไป ผู้โจมตีเข้ารหัสสคริปต์ทั้งชุดด้วย Base64 แล้วถอดรหัสภายในคำสั่ง exec() เพื่อเลี่ยงการค้นหาคำสั่งอย่าง base64 -d ในระดับเชลล์
สคริปต์เวอร์ชันสุดท้ายใช้ Docker API สร้างคอนเทนเนอร์แบบ privileged ที่ใช้ PID namespace ของโฮสต์และเมานต์ระบบไฟล์รากของโฮสต์เข้ามา จากนั้นค้นหาโปรเซสเป้าหมาย คัดลอก ENCFORGE ผ่าน /proc/<pid>/root แล้วสั่งรันบนโฮสต์ด้วย nsenter ตลอดทุกรอบการทดลอง คอนเทนเนอร์ถูกสร้างด้วยค่า Privileged: true, PidMode: host, NetworkMode: host และเมานต์ระบบไฟล์รากแบบอ่านเขียนได้ ซึ่งเท่ากับได้สิทธิ์ root บนเครื่องโฮสต์เต็ม ๆ ก่อนรันจริงผู้โจมตียังสั่ง --try-run เพื่อสแกนระบบไฟล์ก่อน แล้วจึงสั่ง --lock เพื่อเข้ารหัสจริง โดยแฟล็ก --task-id gcp_h1 ที่ Sysdig พบถูกประเมินว่าเป็นหลักฐานว่าผู้โจมตีกำลังไล่จัดการเป้าหมายบน GCP เป็นชุดในแคมเปญที่ใหญ่กว่านี้ อย่างไรก็ตามนักวิจัยไม่ได้เผยแพร่จำนวนไฟล์ที่ถูกเข้ารหัสสำเร็จ หลักฐานที่เปิดเผยยืนยันได้เพียงว่ามีความพยายามเข้ารหัสจริงเกิดขึ้น
ผลกระทบต่อไทย
องค์กรและสตาร์ตอัปในประเทศไทยที่กำลังพัฒนาระบบ AI ของตัวเองจำนวนมากใช้ Langflow เป็นเครื่องมือสร้างเวิร์กโฟลว์แบบลากวาง และมักติดตั้งบนคลาวด์แบบเปิดให้ทีมเข้าถึงได้ง่ายโดยยังไม่ได้ตั้งค่าการยืนยันตัวตนอย่างรัดกุม เมื่อช่องโหว่ CVE-2025-3248 เป็นแบบไม่ต้องล็อกอินและมี PoC เผยแพร่มานานแล้ว ระบบที่ยังไม่อัปเกรดจึงถูกสแกนเจอได้ภายในเวลาไม่นาน
ประเด็นที่หนักกว่าคือมูลค่าความเสียหาย นักวิจัยประเมินว่าการสร้างโมเดล AI ที่ใช้งานจริงขึ้นมาใหม่หลังถูกเข้ารหัส อาจมีต้นทุนระหว่าง 75,000 ถึง 500,000 ดอลลาร์สหรัฐต่อหนึ่งโมเดล เมื่อคิดเป็นค่าประมวลผล GPU บนคลาวด์และเวลาของทีมวิศวกร ยิ่งไปกว่านั้น สภาพแวดล้อมที่ใช้งานจริงมักรันโมเดลหลายรุ่นย่อยบนพื้นที่จัดเก็บร่วมกัน การรัน ENCFORGE เพียงครั้งเดียวจึงอาจเข้ารหัสโมเดลหลายรุ่นพร้อมกัน และหากชุดข้อมูลฝึกสอนวางอยู่บนเครื่องเดียวกันด้วย องค์กรจะต้องสร้างชุดข้อมูลขึ้นมาใหม่ก่อนจึงจะเริ่มฝึกโมเดลใหม่ได้เลย
บทเรียนสำคัญสำหรับองค์กรไทยคือ ไฟล์โมเดล ดัชนีเวกเตอร์ และสถานะการฝึกสอน ต้องถูกจัดให้อยู่ในระดับชั้นเดียวกับซอร์สโค้ดและฐานข้อมูลที่ใช้งานจริงในแผนกู้คืนระบบ องค์กรที่สร้างแอปพลิเคชันขึ้นมาใหม่ได้แต่กู้ค่าน้ำหนักโมเดลและดัชนีกลับมาไม่ได้ จะไม่มีทางกลับสู่สภาพเดิมได้อย่างสะอาดเลย ซึ่งเป็นจุดที่แผนสำรองข้อมูลของหลายองค์กรยังมองข้ามอยู่
คำแนะนำ
อัปเกรด Langflow เป็นเวอร์ชัน 1.9.1 หรือเวอร์ชันที่ยังได้รับการสนับสนุนในปัจจุบัน แม้เวอร์ชัน 1.3.0 จะปิดช่องโหว่ CVE-2025-3248 ซึ่งเป็นทางเข้าของแคมเปญนี้แล้ว แต่หลังจากนั้น CISA ได้เพิ่มช่องโหว่ของ Langflow เข้าบัญชี KEV อีกสองรายการ ได้แก่ CVE-2026-33017 ซึ่งเป็น RCE แบบไม่ต้องยืนยันตัวตน แก้ไขในเวอร์ชัน 1.9.0 และถูกเพิ่มเข้า KEV เมื่อวันที่ 25 มีนาคม 2569 กับ CVE-2026-55255 ซึ่งเป็นการข้ามการตรวจสอบสิทธิ์ข้ามผู้ใช้ แก้ไขในเวอร์ชัน 1.9.1 และถูกเพิ่มเข้า KEV เมื่อวันที่ 7 กรกฎาคม 2569
หมุนเวียนกุญแจของผู้ให้บริการ AI ข้อมูลรับรองคลาวด์ ความลับของฐานข้อมูล และโทเคนอื่น ๆ ทั้งหมดที่โปรเซส Langflow เข้าถึงได้ เพราะการติดตั้งแพตช์ไม่ได้เพิกถอนข้อมูลรับรองที่ถูกเก็บเกี่ยวไปแล้วผ่านอินสแตนซ์ที่มีช่องโหว่
ถอด /var/run/docker.sock ออกจากคอนเทนเนอร์ทุกตัวที่ไม่จำเป็นต้องใช้ หากเลี่ยงการเข้าถึง socket ไม่ได้ ให้จำกัดขอบเขตผ่านพร็อกซีที่ตั้งค่าไว้อย่างแคบ โดยการติดตั้ง Langflow ตามมาตรฐานทั่วไปไม่มีความจำเป็นต้องสร้างคอนเทนเนอร์เลย และการเปิดให้เข้าถึง Docker socket ได้อย่างไม่จำกัดควรถือเป็นการตั้งค่าที่ผิดพลาด
ตั้งการแจ้งเตือนเมื่อโปรเซสของแอปพลิเคชันเรียก Docker API เพื่อสร้างคอนเทนเนอร์ เมื่อมีคอนเทนเนอร์ถูกสร้างด้วย Privileged: true หรือ PidMode: host เมื่อมีการเมานต์ระบบไฟล์รากของโฮสต์ และเมื่อมีการเรียกใช้ nsenter จากภายในคอนเทนเนอร์ สุดท้ายให้เก็บค่าน้ำหนักโมเดล ดัชนีเวกเตอร์ และชุดข้อมูลฝึกสอนไว้ในสแนปช็อตแบบออฟไลน์หรือแบบแก้ไขไม่ได้ (Immutable) พร้อมเฝ้าระวังการสร้างไฟล์นามสกุล .locked จำนวนมากในไดเรกทอรีเหล่านั้น
Indicators of Compromise (IoCs)
| Indicator | ประเภท | คำอธิบาย |
|---|---|---|
8cb0c223b018cecef1d990ec81c67b826eb3c30d54f06193cf69969e9a8baea2 | SHA-256 | ไบนารี ENCFORGE เวอร์ชันที่บีบอัดด้วย UPX |
ea7822eac6cecef7746c606b862b4d3034856caf754c4cf69533662637905328 | SHA-256 | ไบนารี ENCFORGE เวอร์ชันที่คลายการบีบอัดแล้ว |
e78393397@proton.me | อีเมล | ที่อยู่ติดต่อเรียกค่าไถ่ในโน้ต ใช้ซ้ำจากแคมเปญก่อนหน้าของ JADEPUFFER |
/.lockd | เส้นทางไฟล์ | ชื่อไฟล์ที่ ENCFORGE ถูกซ่อนไว้บนเซิร์ฟเวอร์สั่งการ |
encfile / keyforge | สตริงในไบนารี | ชื่อโปรเจกต์ภายในและเครื่องมือสร้างกุญแจคู่กัน ใช้เป็นจุดยึดการตรวจจับ |
README, HOW_TO_DECRYPT, README_DECRYPT | ชื่อไฟล์ | โน้ตเรียกค่าไถ่ที่ถูกวางไว้หลังเข้ารหัส |
.locked | นามสกุลไฟล์ | นามสกุลที่ถูกเติมให้ไฟล์ที่ถูกเข้ารหัสแล้ว |
หมายเหตุ: บริษัท Sysdig ได้เผยแพร่ที่อยู่เซิร์ฟเวอร์ต้นทางและเซิร์ฟเวอร์สั่งการ ลายนิ้วมือของกุญแจ RSA-2048 ที่ฝังในไบนารี รวมถึงกฎ YARA ไว้ในรายงานฉบับเต็ม
