メインコンテンツへスキップ
記事一覧へ戻る

Grav 2.2.13 แก้ CVE-2026-116019 ช่องข้าม allowlist ใน Flex form

Grav แก้ช่องโหว่ Flex form ที่ให้ผู้มีสิทธิ์แก้หน้าเว็บย้ายคำสั่งผ่าน blueprint merge จนข้าม allowlist และเรียกวิธีจัดการไฟล์เกินสิทธิ์

Grav 2.2.13 แก้ CVE-2026-116019 ช่องข้าม allowlist ใน Flex form

Grav ออกรุ่น 2.2.13 เพื่อแก้ CVE-2026-116019 ช่องโหว่ที่ทำให้ผู้มีสิทธิ์แก้หน้าเว็บหลบกฎจำกัดคำสั่งใน Flex form ได้ ผลที่เป็นไปได้ตามประกาศของโครงการคือเรียก public static method บนเซิร์ฟเวอร์เกินสิทธิ์ที่บทบาทนั้นควรมี เช่น การย้าย คัดลอก หรือลบไดเรกทอรี และการอ่านไฟล์นอกพื้นที่ของหน้าเว็บ เรื่องนี้จึงเกี่ยวกับการแยกความเชื่อถือระหว่างแบบฟอร์มที่ผู้ดูแลกำหนดกับข้อมูลแบบฟอร์มที่ผู้แก้หน้าใส่เอง ไม่ใช่ช่องโหว่ที่ผู้เยี่ยมชมทั่วไปเรียกได้โดยไม่ล็อกอิน

ข้อมูลระเบียน CVE ระบุวันเปิดเผยต่อสาธารณะครั้งแรกเป็น 23 ตุลาคม 2026 เวลา 17:40 UTC โครงการเผยแพร่ Grav 2.2.13 วันที่ 23 ตุลาคม เวลา 23:52 UTC และเผยแพร่ ประกาศความปลอดภัย GHSA-47gg-mh38-9rr7 วันที่ 24 ตุลาคม เวลา 04:18 UTC ระเบียน CVE-2026-116019 ถูกเผยแพร่วันที่ 24 ตุลาคม เวลา 11:40 UTC วันที่ของแพตช์ ประกาศรายละเอียด และระเบียน CVE จึงไม่ใช่เหตุการณ์เดียวกัน

เส้นแบ่งความเชื่อถือที่ผิดพลาด

Grav ใช้ blueprint อธิบายโครงสร้างและพฤติกรรมของฟอร์ม ในกรณีนี้ Flex form สามารถขยาย blueprint ที่อยู่ในไฟล์ด้วยข้อมูลฟอร์มจาก frontmatter ของหน้าได้ กติกาปกติให้คำสั่งที่มาจาก blueprint ในไฟล์ได้รับความเชื่อถือมากกว่า ส่วนคำสั่งในข้อมูลที่ผู้แก้หน้าเขียนต้องผ่านรายการวิธีเรียกที่อนุญาต หรือ allowlist ก่อนจะนำไปใช้

ประกาศของโครงการอธิบายว่าระบบตรวจตำแหน่งของฟิลด์จากฟอร์มที่ผู้ใช้ส่งมา ก่อน รวมเข้ากับ blueprint หลัก แต่ระหว่างการรวม ฟิลด์บางชนิดถูกย้ายตำแหน่งหรือเปลี่ยนหมายเลขคีย์ได้ คำสั่งที่ติดมากับฟิลด์นั้นจึงไปปรากฏในตำแหน่งใหม่โดยไม่ถูกจดจำว่าเป็นข้อมูลที่ไม่เชื่อถือ เมื่อขั้นตอนถัดไปสร้างฟอร์ม มันอาจมองคำสั่งนั้นเสมือนมาจาก blueprint ในไฟล์และข้าม allowlist ไป

นี่เป็นการแก้ไม่ครบของปัญหาเดิมที่โครงการแก้ใน Grav 2.2.2 รุ่นนั้นปิดรูปแบบการย้ายฟิลด์แบบหนึ่งแล้ว แต่รูปแบบอื่นยังให้ผลคล้ายกัน ประกาศล่าสุดจึงไม่ได้อ้างว่าการมี allowlist ไร้ประโยชน์ทั้งหมด ปัญหาเฉพาะคือข้อมูลที่ควรอยู่ฝั่งไม่เชื่อถือหลุดไปอยู่ในฝั่งที่ได้รับความเชื่อถือหลังขั้นตอน merge

เงื่อนไขและผลกระทบ

ผู้โจมตีต้องมีสิทธิ์แก้หน้า เช่น api.pages.write หรือ admin.pages ตามระบบ admin แบบเดิม และต้องอยู่ในเส้นทางที่สร้าง Flex form จากฟอร์มในหน้า การเรียกคำสั่งเกิดเมื่อฟอร์มถูกสร้าง เช่น เมื่อผู้ดูแลเปิดหน้าที่เกี่ยวข้อง ดังนั้นการมีบัญชีแก้เนื้อหาเพียงอย่างเดียวไม่ได้แปลว่าทุกคำขอจะทำให้เกิดผลทันที แต่ก็ไม่ควรลดความเสี่ยงเพียงเพราะผู้โจมตีไม่มีสิทธิ์ระดับ super-admin

ตัวอย่างวิธีที่ประกาศยกคือการจัดการไฟล์หรือไดเรกทอรีและการอ่านไฟล์นอกต้นไม้หน้าเว็บ สิ่งนี้อาจกระทบเนื้อหา ไฟล์สำรอง หรือข้อมูลที่โปรเซสเว็บอ่านได้ ขอบเขตจริงขึ้นอยู่กับสิทธิ์ของโปรเซส Grav, ปลั๊กอิน และโครงสร้างไฟล์ของเครื่อง โครงการไม่ได้ระบุว่าช่องโหว่นี้เป็นการรันคำสั่งระบบปฏิบัติการแบบไม่ต้องมีบัญชี จึงไม่ควรสรุปเช่นนั้นจากเพียงชื่อวิธีเรียกในตัวอย่าง

ประกาศความปลอดภัย ระบุ Grav 2.0.15 ถึง 2.2.12 เป็นช่วงที่ได้รับผลกระทบ และ 2.2.13 เป็นรุ่นแก้ ส่วนสาย 1.7 ไม่ได้รับผลกระทบ จากกลไกนี้ ผู้ดูแลที่ใช้ Grav 2.x ควรตรวจเวอร์ชันของโค้ดที่รันจริง รวมถึง image หรือแพ็กเกจที่ deploy ไม่อาศัยเพียงการเห็น tag ใหม่ใน repository

ตรวจและรับมือในระบบจริง

ให้อัปเดตเป็น 2.2.13 หลังสำรองข้อมูลและทดสอบกับ staging โดยเฉพาะเว็บที่ใช้ Flex form และมีผู้แก้หน้าเว็บหลายคน รุ่นแก้ลบรูปแบบการย้ายฟิลด์ที่อันตรายจากข้อมูลไม่เชื่อถือ และหลัง merge จะเปรียบเทียบคำสั่งกับ blueprint เดิมอีกครั้ง คำสั่งที่เพิ่มหรือเปลี่ยนจากข้อมูลผู้ใช้จะยังถูกจัดเป็นข้อมูลไม่เชื่อถือไม่ว่าจะถูกย้ายไปอยู่ตำแหน่งใด

ระหว่างรออัปเดต ให้จำกัดสิทธิ์แก้หน้าเฉพาะบัญชีที่จำเป็นและตรวจหน้า Flex form ที่ถูกแก้ไขล่าสุด โดยมองหาการเปลี่ยนแปลง frontmatter หรือฟิลด์ที่ไม่สอดคล้องกับงานปกติ จากนั้นตรวจ log การเข้าถึงหน้าและกิจกรรมไฟล์ที่สัมพันธ์กัน หากพบข้อมูลผิดปกติ ควรเก็บหลักฐานก่อนแก้ไขและประเมินผลกระทบตามสิทธิ์ของโปรเซสเว็บ การลดสิทธิ์แก้หน้าเป็นมาตรการชั่วคราว ไม่ใช่ตัวแทนของแพตช์

หลังอัปเดตควรทดสอบสองด้าน: ฟอร์มที่ถูกต้องยังใช้งานได้ และบัญชีผู้แก้หน้าที่มีสิทธิ์จำกัดไม่สามารถทำให้ฟอร์มเรียกวิธีที่อยู่นอก allowlist ได้ การทดสอบนี้มีประโยชน์มากกว่าตรวจเพียงหน้า admin ว่าปุ่มบางปุ่มหายไป เพราะรากปัญหาอยู่ที่การประมวลผลข้อมูลฝั่งเซิร์ฟเวอร์

แหล่งข้อมูลต้นทาง: ประกาศความปลอดภัยของ Grav, บันทึกรุ่น 2.2.13, ระเบียน CVE-2026-116019