Copy Fail – CVE-2026-31431
(copy.fail)- ช่องโหว่ยกระดับสิทธิ์แบบหลบหนีคอนเทนเนอร์ที่สามารถ ยึดสิทธิ์ root ได้บนลินุกซ์ดิสทริบิวชันทั้งหมด นับตั้งแต่ปี 2017
- อาศัย ข้อบกพร่องเชิงตรรกะที่เรียบง่าย ในโมดูลเข้ารหัสของลินุกซ์เคอร์เนล (
authencesn) และสามารถรันได้ด้วย สคริปต์ Python ขนาด 732 ไบต์เพียงไฟล์เดียว โดยไม่ต้องอาศัยการจับจังหวะซับซ้อน (race condition) หรือการปรับแต่งตามเวอร์ชันเคอร์เนล - หลักการสำคัญคือการ แก้ไขแคชในหน่วยความจำ (page cache) ที่ลินุกซ์ใช้อ้างอิงเมื่อรันไฟล์ โดยเชื่อม
AF_ALG(kernel crypto socket) กับsplice()(data-copy system call) เพื่อ เขียนทับ 4 ไบต์ลงในสำเนาแคชของ setuid binary- ไฟล์บนดิสก์จริงจะไม่ถูกเปลี่ยนแปลง จึงเป็น การโจมตีแบบลอบเร้นที่ไม่ทิ้งร่องรอยไว้ใน forensic disk image
- เมื่อรีบูตหรือหน่วยความจำถูกคืน แคชจะกลับเป็นต้นฉบับ ทำให้การตรวจจับย้อนหลังด้วยการตรวจสอบความสมบูรณ์ของไฟล์แบบดั้งเดิมทำได้ยาก
- เนื่องจาก page cache ถูกแชร์ทั้งโฮสต์ ในสภาพแวดล้อม Kubernetes หากพ็อดหนึ่งใช้ช่องโหว่นี้ ก็สามารถยึดโฮสต์โหนดและ หลบหนีคอนเทนเนอร์ไปยังคอนเทนเนอร์ของผู้เช่ารายอื่น ได้
- มีการยืนยันโดยตรงบน Ubuntu 24.04, Amazon Linux 2023, RHEL 10.1 และ SUSE 16 และหากมีเพียงบัญชีผู้ใช้ภายในเครื่องที่ไม่มีสิทธิ์พิเศษก็สามารถทำงานได้ทันที โดยไม่ต้องเข้าถึงเครือข่ายหรือใช้ฟังก์ชันดีบักเคอร์เนล
- ช่องโหว่ยกระดับสิทธิ์บนลินุกซ์ (LPE) ที่มีอยู่เดิมมักมีอัตราสำเร็จต่อครั้งเพียง 30~80% และใช้ได้เฉพาะกับเคอร์เนลบางช่วง แต่ Copy Fail มี อัตราสำเร็จ 100% ในการลองครั้งเดียว ครอบคลุมทุกดิสทริบิวชันตลอด 9 ปี (2017~2026)
- ต่างจากช่องโหว่ตระกูลแก้ไข page cache แบบเดียวกันอย่าง Dirty Pipe (อาศัย pipe buffer flag) และ Dirty Cow (ต้องมี race condition) ตรงที่ไม่มี race condition, ไม่มี offset เฉพาะดิสทริบิวชัน และไม่ต้องคอมไพล์ใหม่ จึงทั้งเรียบง่ายและทรงพลังกว่ามาก
- กลุ่มที่เร่งด่วนที่สุด: ลินุกซ์โฮสต์แบบ multi-tenant, คลัสเตอร์ Kubernetes/คอนเทนเนอร์, CI runner (GitHub Actions แบบ self-hosted, GitLab runner เป็นต้น), cloud SaaS ที่รันโค้ดของผู้ใช้ — ทุกสภาพแวดล้อมที่โค้ดไม่น่าเชื่อถือทำงานอยู่บนเคอร์เนลที่ใช้ร่วมกัน
- มาตรการที่สำคัญที่สุดคือแพตช์เคอร์เนล (mainline commit
a664bf3d603d) — ย้อนการเพิ่มประสิทธิภาพแบบ in-place ของโมดูลเข้ารหัสที่ถูกนำเข้าในปี 2017 เพื่อไม่ให้ page cache page ถูกรวมเป็นเป้าหมายการเขียนของการทำงานเข้ารหัส - มาตรการชั่วคราวก่อนแพตช์คือปิดใช้งานโมดูล
algif_aeadได้ และจะ ไม่กระทบ ต่อความสามารถเข้ารหัสทั่วไปอย่าง dm-crypt/LUKS, kTLS, IPsec และ SSH - สำหรับสภาพแวดล้อมเวิร์กโหลดที่ไม่น่าเชื่อถือ เช่น คอนเทนเนอร์, แซนด์บ็อกซ์, CI runner แนะนำให้ บล็อกการสร้าง socket แบบ
AF_ALGด้วย seccomp ไม่ว่าจะติดตั้งแพตช์แล้วหรือไม่ก็ตาม - Taeyang Lee แห่ง Xint ได้ข้อสังเกตตั้งต้นว่า “โครงสร้างที่
splice()ส่ง page cache page ไปยังระบบย่อยการเข้ารหัสเป็นคลาสบั๊กที่ยังไม่ถูกสำรวจ” และ Xint Code ก็ใช้การสแกนอัตโนมัติกับเคอร์เนลซับซิสเต็มcrypto/จนค้นพบได้ภายในราว 1 ชั่วโมง เป็นกรณีตัวอย่างของ การตรวจหาช่องโหว่แบบมี AI ช่วย
5 ความคิดเห็น
ดูเหมือนว่า Rocky Linux ยังไม่มีแพตช์ออกมานะครับ
RHEL
AlmaLinux
Rocky Linux
กำลังใช้งาน Rocky Linux อยู่ และถ้ารีบูตไม่ได้ การบล็อกด้วย
bpftoolจาก https://github.com/wgnet/wg.copyfail.patch ก็ยังใช้ได้ผลครับhttps://kb.ciq.com/article/rocky-linux/rl-cve-2026-31431-mitigation
มีแพตช์ก็จริง แต่ให้เฉพาะในคลังแพ็กเกจของบริการสมัครสมาชิกเท่านั้น เวอร์ชัน CE ยังไม่ได้รับแพตช์ (ตรวจสอบแล้วใน 9.7, 10.1)
มีแพตช์ออกมาแล้วเมื่อ 2026-05-05
มีตัวเลือกด้านความปลอดภัยใหม่เมื่อ 2026-05-10
https://forums.rockylinux.org/t/…
sudo dnf --enablerepo=security update
หากเพิ่มคลังแพ็กเกจความปลอดภัย ดูเหมือนว่าจะสามารถดำเนินมาตรการด้านความปลอดภัยได้แยกต่างหากจากการสะท้อนซอร์สของ RHEL
สำหรับผู้ที่ใช้งาน Ubuntu น่าจะมีคู่มือวิธีรับมือออกมาแล้ว ลองอ้างอิงกันได้ครับ
https://discourse.ubuntu.com/t/…
ความเห็นจาก Hacker News
ในมุมของคนที่ทำงานกับโค้ด crypto ของเคอร์เนล Linux ช่องโหว่ AF_ALG exploit ที่โผล่มาเป็นระยะนี่ชวนหงุดหงิดมาก
AF_ALG ถูกใส่เข้ามาในเคอร์เนลตั้งนานแล้วโดยแทบไม่ได้รับการรีวิวมากพอ โครงสร้างก็ซับซ้อนเกินไป แถมยังเปิดพื้นผิวการโจมตีขนาดใหญ่ให้กับโปรแกรม userspace ที่ไม่มีสิทธิพิเศษ
ยิ่งไปกว่านั้นมันแทบไม่จำเป็นเลย เพราะฝั่ง userspace ก็มีโค้ดเข้ารหัสของตัวเองอยู่แล้ว และโค้ด crypto ในเคอร์เนลเดิมทีก็มีไว้สำหรับการใช้งานภายในเคอร์เนลอย่าง dm-crypt
แม้แต่ authencesn ใน exploit ครั้งนี้เอง ก็เป็นรายละเอียดการติดตั้งใช้งานภายในของ IPsec เป็นหลัก การเอาสิ่งนี้มาเปิดเป็น API เข้ารหัส/ถอดรหัสทั่วไปสำหรับ userspace ตั้งแต่แรกจึงดูเป็นการตัดสินใจที่ผิด
ถ้าคุณเป็นคนดูแลการตั้งค่าเคอร์เนล Linux ขอแนะนำอย่างยิ่งให้ปิดทุกตัวเลือก CONFIG_CRYPTO_USER_API_*
ถ้าทำแค่นั้น ไม่ใช่แค่บั๊กครั้งนี้ แต่บั๊ก AF_ALG จำนวนมากทั้งในอดีตและอนาคตก็คงถูกนำไปใช้โจมตีไม่ได้
ถ้ามีโปรแกรม userspace พัง ก็ควรช่วยย้ายมันไปใช้โค้ด crypto ฝั่ง userspace แทน ซึ่งในความเป็นจริงหลายตัวก็เปลี่ยนไปแบบนั้นแล้ว
ตั้งแต่แรก AF_ALG ก็แทบไม่มีประโยชน์ใช้นอกจากเป็นช่องให้ exploit
เมื่อก่อน API สำหรับ userspace แบบนี้อาจพอทนรับได้ แต่ในยุคที่มี syzbot และ การตรวจจับบั๊กด้วย LLM แบบตอนนี้ มันคงอยู่ต่อได้ยากแล้ว
เหตุผลที่ยกมาคือ ช่วยให้ userspace ใช้ ตัวเร่งฮาร์ดแวร์ ที่เข้าถึงได้เฉพาะในโหมดเคอร์เนลได้, ส่งคีย์เข้าเคอร์เนลโดยไม่ต้องปล่อยให้ค้างอยู่ในหน่วยความจำของแอปนาน ๆ, และลด footprint ได้เมื่อเทียบกับไลบรารี crypto ฝั่ง userspace ในสภาพแวดล้อมที่หน่วยความจำจำกัดอย่างระบบ embedded
จะถือว่าเป็นเหตุผลที่ดีพอหรือไม่ฉันยังตัดสินไม่ได้ แต่อย่างน้อยก็พอมีเหตุผลรองรับอยู่
ปกติ Linus ขึ้นชื่อว่าเข้มมากเรื่องจะรับอะไรเข้าเคอร์เนล เรื่องเบื้องหลังของ API แบบนี้น่าจะน่าสนใจทีเดียว
ทำให้จัดการ hash และการเข้ารหัสผ่านการเรียก
read(2)/write(2)แบบทั่วไปได้ดูเหมือนว่าระหว่างกระบวนการเปิดเผยข้อมูลจะมี ความสับสน อยู่พอสมควร
ผู้ขายหลายรายดูจะไม่ได้ให้ความสำคัญกับช่องโหว่นี้มากนัก และเพราะแบบนั้นหลายดิสโทรจึงยังคงอยู่ในสถานะที่ยังไม่แพตช์
https://access.redhat.com/security/cve/cve-2026-31431 ระบุว่า "Moderate severity", "Fix deferred" และหน้าติดตามของ Debian, Ubuntu, SUSE ก็ดูคล้ายกัน
แต่ฝั่ง upstream ไม่ได้สื่อสารอย่างชัดเจนว่านี่คือ ช่องโหว่ และ Linus กับ Greg เองก็ไม่ได้ให้ความสำคัญเชิงแนวคิดกับการจัดหมวดแบบนั้นมากนัก
ถึงอย่างนั้น เมื่อมันยกระดับสิทธิ์เป็น root ได้จากภายในเครื่อง โดยทั่วไปก็ควรถือว่าเป็นเรื่องที่มีลำดับความสำคัญสูง
https://ubuntu.com/security/cves/about#priority
น่าเสียดายที่ในบทความไม่ได้บอกตรง ๆ ว่า เคอร์เนลเวอร์ชัน ไหนได้รับผลกระทบ และเวอร์ชันไหนแพตช์แล้ว
ยิ่งแย่ไปอีกเพราะอันนี้เป็นโมดูลแบบ builtin จึงเอาออกง่าย ๆ ด้วย
rmmodไม่ได้ตอนตามหาว่า kernel 6.19.14 ของ Fedora 44 เปราะบางหรือไม่ ฉันไปเจอโพสต์ในเมลลิงลิสต์ linux-cve-announce https://lore.kernel.org/linux-cve-announce/2026042214-CVE-2026-31431-3d65@gregkh/T/#u
ข้างในระบุว่าได้แก้ผ่านคอมมิตนั้นใน 6.18.22, 6.19.12, และ 7.0 ตามลำดับ จึงพอใช้อ้างอิงได้
ถ้าคุณอยากตรวจสอบว่าได้ใช้มาตรการบรรเทาที่แนะนำด้วยการบล็อกเคอร์เนลโมดูล
algif_aeadผ่านการตั้งค่า modprobe แล้วหรือยัง ก็ไม่จำเป็นต้องรันเชลล์โค้ดที่ทำให้อ่านยากทั้งก้อนใช้ Python ไม่กี่บรรทัดด้านล่างเพื่อตรวจแบบอ่านง่าย ๆ ว่าโมดูลถูกโหลดจริงหรือไม่ก็ได้
python3 -c 'import socket; s = socket.socket(socket.AF_ALG, socket.SOCK_SEQPACKET, 0); s.bind(("aead","authencesn(hmac(sha256),cbc(aes))")); print("algif_aead probably successfully loaded, mitigation not effective; remove again with: rmmod algif_aead")'ถ้ามาตรการบรรเทาทำงานถูกต้อง
modprobe algif_aeadก็ควรล้มเหลวพร้อม error เช่นกันคงไม่มีใครรัน AI agent อัตโนมัติเต็มรูปแบบ ด้วยสิทธิ์ผู้ใช้ทั่วไปบนระบบปฏิบัติการที่ได้รับผลกระทบหรอกใช่ไหม
ถ้าจับคู่กับ zero-day prompt injection มันอาจกลายเป็นหายนะได้เลย
curl | shกลายเป็นมาตรฐานอุตสาหกรรมLPE ย่อมาจาก local privilege escalation
วงการความปลอดภัยมีตัวย่อเยอะเกินไป แม้จะเดาจากบริบทได้ แต่ก็คงดีถ้าเขียนเต็มให้ตั้งแต่แรก
แต่ถ้าเป็นบทความที่เขียนให้ผู้อ่านวงกว้าง ก็เห็นด้วยว่าควรนิยามให้ชัดเจน
ยิ่งไปกว่านั้น บทความทั้งชิ้นยังดูเหมือน งานที่สร้างโดย AI ด้วย
อันนี้ค่อนข้างขำ
หน้าเว็บเขียนว่าทำงานบน RHEL 14.3 ได้ แต่เวอร์ชันแบบนั้นไม่มีอยู่จริง
ตอนนี้ RHEL อยู่ที่ 10.x เลยเหมือนหลุดเข้า TARDIS ไปยังไงไม่รู้
บางครั้งจะแสดงเป็น
gcc (GCC) 14.3.1 20250617 (Red Hat 14.3.1-2)และในตัวอย่างด้านล่างก็เห็นร่องรอยคล้ายกันhttps://github.com/anthropics/claude-code/issues/40741
https://docs.oracle.com/en/database/oracle/tuxedo/22/otxig/software-requirements-red-hat-enterprise-linux-10-64-bit.html
6.12.0-124.45.1.el10_1อยู่ด้วย ซึ่งชัดเจนว่าเป็นเคอร์เนลของ RHEL 10ความผิดพลาดแนวนี้กลับเป็นสิ่งที่คนมักพลาดกันเอง
เลขยาว ๆ ที่คัดลอกมามักถูกต้อง แต่เลขง่าย ๆ กลับพิมพ์มือแล้วผิด
ตอนนั้นมีการเร่งรวบรวมข้อมูลเพื่ออธิบายประเด็นนี้ และก็จริง มันมีมุมทางการตลาดอยู่ด้วย
เลยมีข้อผิดพลาดเล็ก ๆ หลุดเข้ามาบ้าง ขอบคุณที่ช่วยชี้ให้เห็น
https://access.redhat.com/articles/red-hat-enterprise-linux-release-dates
พอเลื่อนลงไปเห็น "Talk to our security experts" ที่ท้ายหน้า ก็เริ่มรู้สึกว่า expert คนนั้นจะชื่อ Claude หรือเปล่า
บน RHEL 9/10 นั้น algif_aead ไม่ได้เป็นโมดูล แต่เป็น builtin จึง unload ไม่ได้
ดังนั้นเราจึงหาวิธีรองลงมาคือ บล็อก AF_ALG ผ่าน systemd และต้องมี drop-in แยกตามแต่ละ service ที่เปิดให้ใช้งาน
ยังมี Ansible playbook สำหรับจัดการตัวหลักอย่าง
sshdและuser@ด้วยhttps://gist.github.com/m3nu/c19269ef4fd6fa53b03eb388f77464da
initcall_blacklist=algif_aead_initในตัวเลือกบูตของเคอร์เนลแล้วรีบูตได้ด้วยทำแบบนั้นแล้ว exploit ใช้งานไม่ได้อีกต่อไป
ยังน่ากังวลว่าจะมีเส้นทางรันอื่นอย่าง
cronjob,slurmjobหรือเปล่า และถ้าพอมีวิธีทำให้ systemd ส่งต่อข้อจำกัดนี้ไปยังทุกโปรเซสทั้งระบบแทนการตั้งราย service ได้ก็คงดีกว่าดูเหมือน exploit นี้จะใช้วิธีสลับแทนที่ SUID binary เพื่อให้รันด้วย PID 0
แต่ตัวเว็บไซต์กลับอ้างว่าสามารถหนีจาก Kubernetes / container clusters, CI runners & build farms ได้ ทั้งที่ยังไม่เห็นคำอธิบายที่รองรับเรื่องการหนีออกจากคอนเทนเนอร์ หรือโดยเฉพาะ user namespace escape เลย
ฉันทดสอบบน rootless Podman แล้วก็เป็นไปตามคาด คือยังหนีออกจากคอนเทนเนอร์ไม่ได้
อีกทั้งยังอ้างว่า "ทำให้ทุก Linux distribution ที่ออกหลังปี 2017 กลายเป็น root ได้" แต่การทดสอบจริงมีแค่สี่ตัว และบน Alpine ก็ใช้ไม่ได้
มีการเกริ่นไว้ว่า
"Next: "From Pod to Host," how Copy Fail escapes every major cloud Kubernetes platform."https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=72548b093ee3
แต่ความสามารถในการนำไปใช้โจมตีจริงย่อมต่างกันไปตามว่าเป็นเมเจอร์รีลีสล่าสุด หรือเป็นเคอร์เนลสายบำรุงรักษาของสาขาเก่า
ถึงอย่างนั้น เมื่อฉันลองรัน PoC บนอินสแตนซ์ 24.04 เอง ช่องโหว่นี้ก็ดูเป็นของจริงและใหญ่พอตัว
เพียงแต่จำนวนดิสโทรที่ได้รับผลกระทบดูน้อยกว่าที่อ้างไว้มาก และห่างไกลจากคำว่า ทุกดิสโทรหลังปี 2017
ตัวอย่างเช่น ถ้าฉันตีความไม่ผิด Ubuntu แม้แต่ 16.04 EOL ก็ยังโดนเล็กน้อย และผลกระทบหลักจริง ๆ น่าจะอยู่ที่ vendor kernel ที่เพิ่งเริ่มแจกจ่ายไม่นานอย่าง
linux-gcp,linux-oracle-6.7ซึ่งอยู่ในสาย 6.17 มากกว่าเพียงแต่ต้องมีขั้นตอนเพิ่มเติม และกรณีของ Alpine ก็อาจแค่ต้องปรับสคริปต์ ไม่ได้แปลว่าไม่มีช่องโหว่พื้นฐาน
สุดท้ายแล้วนี่ไม่ใช่ exploit อเนกประสงค์ที่สมบูรณ์ แต่เป็น PoC
ตัวหน้าเว็บเองดู vibecoded หน่อย ๆ และมีกลิ่นโฆษณา แต่ช่องโหว่นั้นเป็นของจริงและระดับความเสี่ยงก็ดูสูง
อย่างน้อยมันก็อธิบายได้ว่าทำไมวันนี้ถึงมีอัปเดตความปลอดภัยก้อนใหญ่เข้ามา ดังนั้นคงต้องยกระดับความสำคัญของการอัปเดตแล้ว
พวกเขาหาบั๊กจริง แพตช์จริง และสร้าง คุณูปการที่มีความหมายต่อ ecosystem ของ OSS ไปพร้อมกับขายเครื่องมือความปลอดภัยของตัวเอง
แต่ก็อดคิดไม่ได้ว่าเดี๋ยวนี้ใครจะมานั่งทำหน้าเว็บด้วยมือตัวเองทีละหน้า โดยเฉพาะถ้าเป็น นักพัฒนาเคอร์เนล ก็ยิ่งน่าเป็นไปได้