ข้ามไปยังเนื้อหา
ช่องโหว่ RCE ใน Brotli (CVE-2026-111497) ที่ OpenAI Codex Security เจอ: ตัวแก้อยู่ในซอร์สตั้งแต่ ก.พ. แต่เพิ่งออก release 21 ต.ค. — กระทบ Node.js, Python requests/httpx/aiohttp, Bun, Envoy, curl ทั้งฝั่ง server และ client
การแฮ็ก

ช่องโหว่ RCE ใน Brotli (CVE-2026-111497) ที่ OpenAI Codex Security เจอ: ตัวแก้อยู่ในซอร์สตั้งแต่ ก.พ. แต่เพิ่งออก release 21 ต.ค. — กระทบ Node.js, Python requests/httpx/aiohttp, Bun, Envoy, curl ทั้งฝั่ง server และ client

อ่าน 5 นาที ที่มา: Node.js Security Releases

สามวันที่ผ่านมามีช่องโหว่ระดับ critical ที่นักพัฒนาแทบทุก stack ต้องสนใจ คือ CVE-2026-111497 ซึ่งเป็น out-of-bounds write ใน decoder ของ Google Brotli อัลกอริทึมบีบอัดที่ใช้กับ HTTP (Content-Encoding: br) แทบทุกที่ บันทึก CVE ที่ Google ในฐานะ CNA เผยแพร่เมื่อ 22 ต.ค. 2026 ระบุว่าช่องโหว่อยู่ใน c/dec/decode.c ของ Brotli เวอร์ชัน 1.0.3 ถึง 1.2.0 ทุกแพลตฟอร์ม ผู้โจมตีจากระยะไกลที่ไม่ต้องยืนยันตัวตนสามารถส่ง stream ที่สร้างขึ้นมาเพื่อ “corrupt adjacent decoder state memory, disclose sensitive memory contents, cause a denial of service, or potentially execute arbitrary code” คะแนน CVSS v4.0 อยู่ที่ 9.2 (Critical) ส่วน Node.js ประเมินในประกาศของตัวเองว่าเป็นระดับ HIGH

ผู้รายงานคือ “OpenAI Codex Security - Khai Tran and Sylvie Mayer” ตามเครดิตทั้งในประกาศ Node.js และในบันทึก CVE เมื่อคืน 23 ต.ค. (UTC) บัญชี X ของ OpenAI เพิ่งเปิดเผยว่าช่องโหว่นี้เจอระหว่างงาน red team ระบบกักโมเดลระหว่างเทรน ซึ่งเป็นงานเดียวกับที่ เราสรุปไว้เมื่อเช้า ประเด็นที่นักพัฒนาควรรู้คือ ตัวแก้ต้นทางอยู่ใน repo ของ Brotli มาตั้งแต่เดือนกุมภาพันธ์ แต่ไม่มีใครออก release ซอฟต์แวร์ที่ฝัง Brotli ไว้ในตัวจึงยังเปราะบางมาอีกแปดเดือน

บั๊กคืออะไร และทำไมโจมตีได้สองทิศ

ประกาศของ Node.js อธิบายว่า “An invalid block switch was reported as a temporary need for more input instead of a permanent format error, so the streaming decoder kept appending input bytes to an eight-byte internal buffer.” แปลว่าเมื่อ stream สั่งสลับ block type ไปในสถานะที่โครงสร้างของ stream เองบอกว่าเป็นไปไม่ได้ decoder กลับตีความว่า “ขอข้อมูลเพิ่ม” แทนที่จะแจ้งว่า format ผิด แล้วเขียนไบต์ที่รับเข้ามาต่อท้าย buffer ขนาด 8 ไบต์จนล้นออกไป

ตัวแก้ต้นทางคือ commit 0ed4268 ของ Evgenii Kliuchnikov ลงวันที่ 27 ก.พ. 2026 ใช้ข้อความ commit ธรรมดาว่า “Detect and report invalid stream earlier.” ตอนนั้นไม่มีใครรู้ว่านี่คือการปิดช่องโหว่ release ที่มีตัวแก้นี้ ได้แก่ 1.2.1, 1.1.1 และ 1.0.10 เพิ่งออกเมื่อ 21 ต.ค. (release ก่อนหน้าคือ 1.2.0 ซึ่งออกเมื่อ 27 ต.ค. 2025) โดย release notes ทั้งสามระบุตรง ๆ ว่า “CVE-2026-111497: out-of-bounds write permits remote code execution”

OpenAI โพสต์ว่าช่องโหว่นี้ใช้ได้ ทั้งสองทิศ: “an unpatched server that accepts compressed input could be taken over by a malicious client, and an unpatched client that accepts compressed input (such as “curl —compressed”) could be taken over by a malicious server.”

ทีม Imperva Red Team ตรวจซ้ำแยกจาก OpenAI และเผยแพร่ผลเมื่อ 22 ต.ค. ภายใต้ชื่อ “Node2Shell” พวกเขารันโค้ดได้จริงบน image ทางการของ Node.js 24.22.0 (Linux arm64) ผ่านสองเส้นทาง เส้นทางแรกคือ fetch() ในตัว Node ที่อ่าน response แบบ Brotli จากเซิร์ฟเวอร์ภายนอก เส้นทางที่สองคือ Express 5.0.0–5.3.0 / body-parser 2.0.0–2.3.0 ที่ตั้ง raw() หรือ json() ไว้ให้คลาย request body แบบ Brotli ส่วน 24.22.1 ปฏิเสธ input ชุดเดียวกันได้ทั้งหมด Imperva บอกด้วยว่าต้องลองหลายครั้งกว่าจะสำเร็จ และ HTTP server เปล่า ๆ ของ Node จะไม่คลาย body ที่เป็น Brotli เองถ้าไม่มี middleware มาสั่ง

ใครโดนบ้าง และต้องอัปเป็นเวอร์ชันไหน

นี่คือปัญหา supply chain แบบคลาสสิก Brotli ถูก ฝังหรือ vendored อยู่ในซอฟต์แวร์จำนวนมาก แต่ละโปรเจกต์จึงต้องออกแพตช์ของตัวเอง:

  • Node.js — 22.23.4, 24.22.1, 26.12.1 (ออก 21 ต.ค.) เกี่ยวกับโค้ดที่ใช้ node:zlib คลาย Brotli ซึ่งรวมถึง fetch() และ body-parser
  • Python — PyPI Brotli 1.2.1 (22 ต.ค.) และ brotlicffi 1.2.1.0 (22 ต.ค.) มี advisory GHSA-9v8h-qqgm-4m35 ครอบคลุมทั้งสองแพ็กเกจ จุดอันตรายคือ โค้ดของคุณไม่ต้อง import Brotli เลยก็โดนได้ Aikido ชี้ว่า urllib3 (และ requests ที่ใช้ urllib3), httpx ที่ติดตั้ง extra [brotli], aiohttp และ Scrapy จะส่ง Accept-Encoding: br และคลาย response ให้อัตโนมัติทันทีที่มีแพ็กเกจนี้อยู่ใน environment
  • Bun — 1.4.4 (22 ต.ค.) ต้อง build executable ที่ compile รวม Bun ไว้ใหม่ด้วย
  • Envoy — 1.40.0 / 1.39.3 / 1.38.6 / 1.37.8 (advisory 23 ต.ค.) และ Istio — 1.29.9 / 1.30.6 / 1.31.2
  • libbrotli / curl — อัป Brotli ของระบบเป็น 1.2.1 หรือ 1.0.10 / 1.1.1 ตามสาย หรือติดตั้งแพตช์จาก distro ถ้า binary ลิงก์แบบ static ต้อง build ใหม่

ตามข้อมูลของ Aikido นั้น mod_brotli มาตรฐานของ Apache และ Nginx ค่าเริ่มต้นไม่ได้ คลาย Brotli จึงไม่อยู่ในเส้นทางโจมตีหลัก

ถ้ายังอัปไม่ได้

คำแนะนำชั่วคราวที่ Aikido รวบรวมไว้มีจุดที่คนพลาดบ่อยอยู่ข้อหนึ่ง: การเอา br ออกจาก Accept-Encoding ไม่พอ เพราะเซิร์ฟเวอร์ที่เป็นอันตรายจะส่ง response แบบ Brotli มาอยู่ดี และ urllib3 เลือก decoder จาก header Content-Encoding ของ response ไม่ได้ดูจากสิ่งที่ client ประกาศไว้ วิธีที่ใช้ได้คือ:

  • ฝั่งขาเข้า ให้ reverse proxy / load balancer / middleware ปฏิเสธ request ที่ Content-Encoding มี br (เทียบแบบไม่สนตัวพิมพ์เล็กใหญ่ และต้องเช็กรายการ encoding ที่ต่อกันหลายตัวด้วย) ก่อนที่ข้อมูลจะถึง decoder
  • ฝั่งขาออก ให้ปิดการคลาย Brotli หรือ reject response ที่เป็น br ก่อน ที่ client จะคลายอัตโนมัติ
  • Python ที่ไม่ได้จำเป็นต้องใช้ Brotli ให้ถอนทั้ง Brotli และ brotlicffi ออก รวมถึง extra อย่าง httpx[brotli] จากนั้น regenerate lockfile, build image และ restart ใหม่

อย่าลืมว่า container image ที่ pin ไว้ที่ node:24 หรือมี wheel ของ Brotli อยู่ข้างในจะไม่หายจากช่องโหว่จนกว่าจะ rebuild และ redeploy

มุมมอง AI Curator

เรื่องนี้น่าสนใจกว่า “เจอบั๊กอีกตัว” ตรงที่ ช่วงเวลาที่อันตรายที่สุดไม่ได้อยู่หลังวันประกาศ แต่เป็นแปดเดือนก่อนหน้า ตัวแก้ commit ขึ้น repo สาธารณะของ Google ตั้งแต่ 27 ก.พ. ด้วยข้อความที่ไม่บอกอะไรเลย ขณะที่ทุก runtime ยังส่ง 1.2.0 ให้ผู้ใช้ต่อไป ใครที่ไล่อ่าน diff ของไลบรารีสำคัญอย่างเป็นระบบ ไม่ว่าจะเป็นคนหรือ agent ก็มีโอกาสเห็นก่อน ยุคที่ AI เจอช่องโหว่ใน PHP ได้เป็นชุด และ OpenAI เผาโทเคนหลายแสนล้านไปกับงาน red team ทำให้ “silent fix แล้วรอ release รอบหน้า” กลายเป็นนโยบายที่เสี่ยงเกินไปแล้ว ไลบรารีที่ถูกฝังไว้ลึกอย่าง Brotli, zlib หรือ libxml2 ควรออก point release ทันทีเมื่อแก้อะไรที่เป็น memory safety ไม่ว่าจะยืนยันได้ว่าโจมตีได้หรือยังก็ตาม

ในทางปฏิบัติ ทีม backend ในไทยส่วนใหญ่รัน Node/Express หรือ Python ที่ใช้ requests/httpx อยู่แล้ว และระบบที่น่าห่วงที่สุดคือระบบที่ ไปดึง URL ที่คนนอกกำหนดได้ เช่น chatbot ที่ทำ link preview, webhook receiver, crawler หรือ agent ที่มี tool “fetch URL” (ซึ่งตอนนี้แทบทุก AI app มี) ระบบพวกนี้คือ client ที่จะถูก server ปลอมยึดได้ตามที่ OpenAI อธิบาย สิ่งที่ควรทำวันนี้ไม่ได้มีแค่อัป Node แต่ต้อง pip show brotli brotlicffi ในทุก image ด้วย เพราะ Brotli มักติดมาเป็น transitive dependency โดยไม่มีใครตั้งใจติดตั้ง ส่วนไทม์ไลน์ยังมีจุดที่ต้องระวัง: Aikido เขียนว่า “OpenAI found this in February” แต่โพสต์ของ OpenAI เองบอกแค่ว่าเจอ “during this red-teaming exercise” (รอบที่ทำหลัง 20 ก.ย.) และ root cause ถูกแก้ในซอร์สไปแล้วตั้งแต่ ก.พ. โดยไม่มีใครรู้ว่าเป็นช่องโหว่ ซึ่งเข้ากับข้อมูลที่ว่า CVE นี้เพิ่งถูกจองเมื่อ 16 ต.ค. ดังนั้นอย่าเพิ่งเชื่อว่า OpenAI นั่งทับช่องโหว่ไว้แปดเดือน

แหล่งข่าว

บทความนี้เรียบเรียงจากแหล่งข่าวต้นทาง — Node.js Security Releases

เนื้อหาบน blog นี้สร้างโดย AI โดยมีการกำกับบรรณาธิการจากมนุษย์

อ่านเพิ่มในหมวด การแฮ็ก

ลิงก์แชร์ ChatGPT ลิงก์เดียวยึดบัญชีได้ ต้นตอคือ MathLive ไลบรารีที่มียอดดาวน์โหลดกว่า 4 แสนต่อสัปดาห์ เพิ่งออกแพตช์ 31 ต.ค.
การแฮ็ก

ลิงก์แชร์ ChatGPT ลิงก์เดียวยึดบัญชีได้ ต้นตอคือ MathLive ไลบรารีที่มียอดดาวน์โหลดกว่า 4 แสนต่อสัปดาห์ เพิ่งออกแพตช์ 31 ต.ค.

Parameter Labs เปิดเผยเมื่อ 28 ต.ค. ว่าลิงก์แชร์ ChatGPT สามารถรัน JavaScript ในเซสชันของคนเปิด อ่านแชตส่วนตัวและส่งข้อมูลออกนอกได้ OpenAI แก้แล้วเมื่อ 26 ต.ค. แต่ไลบรารี MathLive ที่เป็นจุดเริ่มต้นเพิ่งออกการแก้ด้านความปลอดภัยเมื่อ 31 ต.ค.

· อ่าน 5 นาที
Talos พบมัลแวร์ VOLTA ขโมยข้อมูลแล้วส่งให้ LLM จัดอันดับว่าเหยื่อคุ้มค่าแค่ไหน พร้อมสลับโมเดลอัตโนมัติเมื่อถูกปฏิเสธ
การแฮ็ก

Talos พบมัลแวร์ VOLTA ขโมยข้อมูลแล้วส่งให้ LLM จัดอันดับว่าเหยื่อคุ้มค่าแค่ไหน พร้อมสลับโมเดลอัตโนมัติเมื่อถูกปฏิเสธ

Cisco Talos เผยแพร่รายงาน VOLTA-AUTODOXER เมื่อ 31 ต.ค. มัลแวร์ขโมยข้อมูลบน Windows ที่ส่งหลักฐานของเหยื่อผ่าน OpenRouter ให้ LLM เขียนรายงานจัดลำดับมูลค่า ถ้าโมเดลแรกปฏิเสธจะไล่ไปโมเดลถัดไป และตัวสร้างแบบแทนค่าบ่งชี้ว่าอาจถูกขายเป็นสินค้า

· อ่าน 4 นาที
ส่วนขยาย Claude Code ปลอมฝังแบ็กดอร์ SSH บน Cursor Marketplace — อยู่ 11 ชั่วโมง กระทบไม่เกิน 5,000 คน ถอนส่วนขยายอย่างเดียวไม่พอ
การแฮ็ก

ส่วนขยาย Claude Code ปลอมฝังแบ็กดอร์ SSH บน Cursor Marketplace — อยู่ 11 ชั่วโมง กระทบไม่เกิน 5,000 คน ถอนส่วนขยายอย่างเดียวไม่พอ

Cursor ยืนยันว่า Anthropic.claude-code เวอร์ชัน 2.1.312 และ 2.1.313 ที่ถูกดัดแปลงอยู่ใน marketplace ราว 11 ชั่วโมงเมื่อ 29 ต.ค. พยายามเปิดแบ็กดอร์ SSH บน macOS และ Windows พนักงาน Anthropic ยืนยันว่า 2.1.313 ไม่เคยถูกเผยแพร่จากบริษัท เรื่องที่ยังไม่เปิดเผยคือคนร้ายเข้าไปวางไฟล์ได้อย่างไร

· อ่าน 5 นาที