คะแนน CVSS คืออะไร และวิธีอ่านระดับความร้ายแรงของช่องโหว่

CVE คือเลขประจำตัวของช่องโหว่ ส่วนคะแนน 0.0 ถึง 10.0 ที่ติดมาด้วยคือ CVSS โพสต์นี้อธิบายห้าระดับความร้ายแรง ค่า 11 ตัวใน vector ที่ใช้คิดคะแนน และเหตุผลที่ PHP2Shell ได้ 9.2 แทน 10.0 ตามที่ข่าวหลุดบอก

เผยแพร่
เวลาอ่าน
6 นาที
แท็ก
#PHP#Security

ตอนที่เลข CVE ของ PHP2Shell หลุดออกมาในฟอรัมเมื่อค่ำวันที่ 20 ต.ค. 2569 มีคะแนน 10.0 ติดมาด้วย พอ PHP ออกประกาศจริง คะแนนกลับเป็น 9.2 ทั้งสองตัว ถ้าไม่เคยดูคะแนนแบบนี้มาก่อน ก็คงสงสัยว่าตัวเลขพวกนี้มาจากไหน และต่างกันแค่ 0.8 สำคัญแค่ไหน

CVE คือเลขของช่องโหว่ ส่วน CVSS คือคะแนน

สองคำนี้มักมาคู่กันจนดูเหมือนเป็นเรื่องเดียวกัน

  • CVE (Common Vulnerabilities and Exposures) คือเลขประจำตัวของช่องโหว่ เช่น CVE-2026-109618 ให้ทุกคนพูดถึงช่องโหว่ตัวเดียวกันได้ตรงกัน โครงการ CVE เป็นคนดูแลระบบเลข และให้องค์กรที่ได้รับสิทธิ์ (เรียกว่า CNA) เป็นคนออกเลข
  • CVSS คือวิธีให้คะแนนความร้ายแรงของช่องโหว่ตั้งแต่ 0.0 ถึง 10.0 ดูแลโดย FIRST เวอร์ชันล่าสุดคือ CVSS v4.0 ที่ออกเมื่อปลายปี 2566 แต่ advisory หลายที่ยังใช้ v3.1 อยู่

ตัวเลข 10.0 ที่หลุดมาจึงไม่ใช่ "คะแนน CVE" แต่เป็นคะแนน CVSS ของ CVE ตัวนั้น เวลาอ่าน advisory ให้ดูด้วยว่าใช้ CVSS เวอร์ชันไหน เพราะ v3.1 กับ v4.0 คิดคะแนนคนละวิธี

คะแนนแบ่งเป็นห้าระดับ

FIRST กำหนดระดับความร้ายแรงไว้ตามช่วงคะแนน

ระดับ คะแนน
None 0.0
Low 0.1 ถึง 3.9
Medium 4.0 ถึง 6.9
High 7.0 ถึง 8.9
Critical 9.0 ถึง 10.0

PHP2Shell ได้ 9.2 จึงอยู่ในระดับ Critical ระดับเดียวกับ 10.0 ที่ข่าวหลุดบอก ตัวเลขที่ผิดไป 0.8 จึงไม่ได้เปลี่ยนว่าต้องรีบแค่ไหน ส่วนตัวอย่างของช่องโหว่ที่ได้ 10.0 เต็มก็มีให้เห็น อย่าง Log4Shell ใน Log4j เมื่อปี 2564 ที่ได้ 10.0 ตาม CVSS v3.1

คะแนนคิดจากค่า 11 ตัวใน vector

คะแนนไม่ได้มาจากความรู้สึกของคนเขียน advisory แต่มาจากคำตอบของคำถามชุดเดียวกันทุกครั้ง คำตอบทั้งหมดเขียนรวมเป็นบรรทัดเดียวเรียกว่า vector อย่าง PHP2Shell ทั้งสองตัวมี vector แบบนี้

CVSS:4.0/AV:N/AC:H/AT:P/PR:N/UI:N/VC:H/VI:H/VA:H/SC:N/SI:N/SA:N

แยกเป็นสามกลุ่มได้แบบนี้ ห้าค่าแรกบอกว่ายิงได้ง่ายแค่ไหน สามค่าถัดมาบอกว่าตัวระบบที่มีช่องโหว่เสียหายแค่ไหน และสามค่าสุดท้ายบอกว่าระบบอื่นเสียหายตามไปด้วยไหม

vector ของ PHP2Shell แยกตามกลุ่ม

vector ของ PHP2Shell แยกตามกลุ่ม สีเหลืองคือค่าที่ทำให้คะแนนสูง

แต่ละค่าถามคำถามเดียวกันกับทุกช่องโหว่ และตอบได้จากตัวเลือกที่กำหนดไว้เท่านั้น ตัวอักษรหลัง : คือตัวเลือกที่ advisory เลือก ตารางนี้เรียงตัวเลือกของแต่ละค่าจากแย่ที่สุดไปหาเบาที่สุด และตัวหนาคือตัวเลือกของ PHP2Shell

ห้าค่าแรก บอกว่ายิงได้ง่ายแค่ไหน

ค่า ตัวเลือก ความหมาย
AV (Attack Vector) ยิงจากไหนได้ N Network ยิงผ่าน network หรือ internet ได้
A Adjacent ต้องอยู่วง network เดียวกัน
L Local ต้องเข้ามาอยู่บนเครื่องก่อน
P Physical ต้องจับตัวเครื่องได้
AC (Attack Complexity) ต้องผ่านกลไกป้องกันไหม L Low ไม่ต้อง
H High ต้องหาทางผ่านก่อน เช่น ASLR
AT (Attack Requirements) ต้องมีเงื่อนไขของระบบไหม N None ไม่ต้อง
P Present ต้องมี เช่น config บางแบบ หรือจังหวะที่พอดี
PR (Privileges Required) ต้องมีสิทธิ์อะไรก่อนไหม N None ไม่ต้องล็อกอิน
L Low สิทธิ์ผู้ใช้ทั่วไป
H High สิทธิ์ระดับ admin
UI (User Interaction) ต้องให้ผู้ใช้ทำอะไรไหม N None ไม่ต้อง
P Passive แค่ผู้ใช้เปิดดูหน้าที่มีของแฝงอยู่
A Active ผู้ใช้ต้องลงมือ เช่น กดลิงก์หรือเปิดไฟล์

หกค่าหลัง บอกว่าเสียหายแค่ไหน

ตัวอักษรตัวแรกบอกว่าดูที่ระบบไหน V คือ Vulnerable System ระบบที่มีช่องโหว่เอง ส่วน S คือ Subsequent System ระบบอื่นที่ต่อกันอยู่ ตัวอักษรตัวที่สองบอกว่าเสียหายด้านไหน C คือ Confidentiality ข้อมูลรั่ว I คือ Integrity ข้อมูลโดนแก้ และ A คือ Availability ระบบล่มหรือใช้งานไม่ได้ ทั้งหกค่าใช้ตัวเลือกชุดเดียวกัน

ตัวเลือก ความหมาย PHP2Shell
H High เสียหายได้ทั้งหมด เช่น อ่านข้อมูลได้ทุกอย่าง หรือทำให้ระบบล่มได้ VC, VI, VA
L Low เสียหายได้บางส่วน
N None ไม่เสียหาย SC, SI, SA

ตัวอักษรเดียวกันแปลต่างกันได้ตามค่า N ใน AV คือ Network ซึ่งเป็นตัวเลือกที่แย่ที่สุด แต่ N ใน PR หรือ UI คือ None ซึ่งก็แย่ที่สุดเหมือนกัน เพราะแปลว่าไม่ต้องมีสิทธิ์และไม่ต้องรอใคร ส่วน N ในหกค่าหลังคือ None ที่แปลว่าไม่เสียหาย P ก็เป็นได้ทั้ง Physical, Present และ Passive จึงต้องอ่านคู่กับชื่อค่าเสมอ

PHP2Shell ได้ 9.2 เพราะต้องมีเงื่อนไขบางอย่างก่อนยิง

คะแนน 10.0 เต็มคือทุกค่าอยู่ในฝั่งที่แย่ที่สุด ยิงผ่าน network ได้ ยิงง่าย ไม่ต้องรอเงื่อนไข ไม่ต้องล็อกอิน ไม่ต้องให้ใครคลิก และเสียหายเต็มที่ทั้งตัวระบบเองและระบบอื่นที่ต่อกันอยู่

vector ของ PHP2Shell ต่างจากนั้นสามจุด

  • AC:H ตามสเปกแปลว่าคนโจมตีต้องหาทางผ่านกลไกป้องกันบางอย่างของระบบก่อน เช่น การสุ่มตำแหน่งหน่วยความจำ (ASLR)
  • AT:P การโจมตีต้องอาศัยสภาพของระบบบางแบบ ซึ่งสอดคล้องกับที่ php.net บอกว่า mod_php เสี่ยงที่สุด ส่วน PHP-FPM ต้องอาศัยโค้ดบางแบบในแอป
  • SC, SI, SA เป็น N advisory ให้ความเสียหายอยู่ที่ตัว PHP เองเท่านั้น

ที่เหลือคือฝั่งที่แย่ที่สุดหมด ยิงจาก internet ได้โดยไม่ต้องล็อกอินและไม่ต้องให้ใครคลิก และถ้าทำสำเร็จก็คุมเครื่องได้เต็มที่ คะแนนจึงยังอยู่ในระดับ Critical

CVSS v4.0 ไม่ได้คิดคะแนนด้วยสูตรเดียว แต่จับกลุ่ม vector ที่ร้ายแรงพอ ๆ กันเข้าด้วยกัน แล้วเปิดตารางที่ FIRST กำหนดไว้ อยากลองเปลี่ยนค่าแล้วดูว่าคะแนนขยับไปเท่าไร ลองใส่ในเครื่องคิดเลข CVSS v4.0 ของ FIRST ได้ครับ

คะแนนบอกความร้ายแรงของช่องโหว่ ส่วนความเสี่ยงของระบบเราต้องดูเพิ่ม

คะแนนที่เห็นใน advisory ส่วนใหญ่เป็นคะแนน Base คือดูแค่ตัวช่องโหว่ CVSS v4.0 ยังมีค่าอีกสามกลุ่มที่เติมได้ทีหลัง

  • Threat บอกว่าตอนนี้มี exploit ที่ใช้ได้จริงออกมาแล้วหรือยัง
  • Environmental ให้แต่ละองค์กรปรับตามระบบของตัวเอง เช่น เครื่องที่ไม่ได้เปิดออก internet หรือข้อมูลที่สำคัญมาก
  • Supplemental ข้อมูลเสริมที่ไม่ได้เอามาคิดคะแนน เช่น ยิงแบบอัตโนมัติได้ไหม

v4.0 จึงให้เขียนกำกับไว้ด้วยว่าใช้ค่ากลุ่มไหนมาคิด CVSS-B คือ Base อย่างเดียว ถ้าเติม Threat เป็น CVSS-BT เติม Environmental เป็น CVSS-BE และครบทั้งสามกลุ่มเป็น CVSS-BTE คะแนน 9.2 ของ PHP2Shell เป็น CVSS-B

สเปกของ FIRST เองก็บอกว่าเรื่องอย่างข้อกำหนดทางกฎหมายหรือผลต่อชื่อเสียงอยู่นอกขอบเขตของ CVSS เวลาตัดสินใจว่าจะรีบแค่ไหน จึงมีอีกสองแหล่งที่ช่วยได้

  • EPSS ของ FIRST เหมือนกัน ประเมินโอกาสที่ช่องโหว่จะโดนใช้โจมตีจริงในช่วง 30 วันข้างหน้า
  • Known Exploited Vulnerabilities ของ CISA รวมช่องโหว่ที่มีหลักฐานว่าโดนใช้โจมตีจริงแล้ว

อ่านคะแนนให้ใช้ได้จริงกับงานของเรา

สำหรับคนที่ดูแลเว็บ Laravel เอง ตัวเลขอย่างเดียวยังไม่พอให้ตัดสินใจ ลองดูทีละขั้นแบบนี้

  • ดูระดับก่อน Critical กับ High ควรวางแผนอัปเดตทันที ส่วน Medium กับ Low รอรอบอัปเดตปกติได้ ถ้าส่วนอื่นไม่ได้น่ากังวล
  • ดูสามค่าแรกของ vector ถ้าเป็น AV:N, PR:N และ UI:N พร้อมกัน แปลว่าใครก็ยิงจาก internet ได้โดยไม่ต้องล็อกอิน ต่อให้คะแนนไม่ถึง 9 ก็ควรรีบ
  • ดูว่าระบบของเราใช้ส่วนที่มีช่องโหว่จริงไหม บางช่องโหว่อยู่ในฟีเจอร์ที่แอปของเราไม่ได้เปิดใช้ แต่บางตัวอย่าง PHP2Shell อยู่ใน engine ที่ทุก request ต้องผ่าน
  • ดูว่ามีการโจมตีจริงแล้วหรือยัง จาก EPSS, KEV หรือประกาศของผู้ดูแล

ฝั่ง package ใน Laravel composer audit จะเทียบ package ใน composer.lock กับฐานข้อมูล advisory แล้วบอกระดับความร้ายแรงของแต่ละตัวให้เลย ใช้คู่กับ Dependabot บน GitHub ก็จะรู้ตัวได้เร็วขึ้นเวลามีช่องโหว่ใหม่ ส่วนตัว PHP เองไม่ได้อยู่ใน composer.lock จึงต้องตามจากประกาศของ php.net และ distro เหมือนตอน PHP2Shell

อ่านต่อ

ถูกอ้างถึงใน

ล่าสุด

ดูทั้งหมด →