วิธีอ่านเลขเวอร์ชัน PHP ของ Ubuntu อย่าง 8.3.6-0ubuntu0.24.04.13

PHP ที่ลงจาก Ubuntu ใช้เลขของ php.net ตัวเดิมไปตลอดอายุของรุ่น แล้วนับการแพตช์ที่เลขท้ายแทน 8.3.6 บน Ubuntu 24.04 จึงอาจแพตช์ล่าสุดแล้ว ต้องเทียบเลขเต็มกับประกาศของ Ubuntu ไม่ใช่กับ php.net

เผยแพร่
เวลาอ่าน
5 นาที
ในโพสต์นี้ 6 หัวข้อ
  1. Ubuntu ไม่ขยับเลข PHP ตาม php.net
  2. อ่านเลข 8.3.6-0ubuntu0.24.04.13 ทีละส่วน
  3. บน Ubuntu 24.04 php -v บอกแค่ 8.3.6
  4. เทียบเลขเต็มกับประกาศของ Ubuntu
  5. PHP ชุดนี้ได้แพตช์ตามรอบของ Ubuntu
  6. กรณีที่อาจเจอเมื่อใช้งานจริง

Ubuntu ไม่ขยับเลข PHP ตาม php.net

ถ้าลง PHP บน Ubuntu ด้วย apt install php ตรง ๆ โดยไม่เพิ่ม PPA อะไร เราจะได้ PHP เวอร์ชันเดียวกับวันที่ Ubuntu รุ่นนั้นออก Ubuntu 24.04 ออกเดือนเมษายน 2567 พร้อม PHP 8.3.6 และจะอยู่ที่ 8.3.6 ไปตลอดอายุของรุ่น ทั้งที่ php.net ออก 8.3.x ต่อมาจนถึง 8.3.36 แล้ว

ดูผ่าน ๆ ก็เหมือนเครื่องค้างอยู่ที่ PHP เก่ากว่า 30 รุ่น แต่ Ubuntu เอาแพตช์ความปลอดภัยจาก php.net มาใส่ใน 8.3.6 เอง ที่เรียกว่า backport FAQ ด้านความปลอดภัยของ Debian ซึ่ง Ubuntu ทำแบบเดียวกัน อธิบายว่าทำแบบนี้เพื่อให้เปลี่ยนน้อยที่สุด อัปเดตแล้วโปรแกรมจะได้ไม่ทำงานต่างไปจากเดิมหรือพังกลางทาง ถ้าขยับไปเลขใหม่ทั้งชุด ก็จะได้บั๊กฟิกซ์และพฤติกรรมใหม่ที่เราไม่ได้ขอติดมาด้วย

เลขที่บอกว่าแพตช์ไปถึงไหนแล้วจึงอยู่ในส่วนที่ต่อท้ายเลขของ php.net

อ่านเลข 8.3.6-0ubuntu0.24.04.13 ทีละส่วน

ส่วนต่าง ๆ ของเลขเวอร์ชัน PHP บน Ubuntu 24.04

เลขหน้าขีดมาจาก php.net ส่วนหลังขีดเป็นของ Ubuntu

เลขเวอร์ชันของ package บน Debian และ Ubuntu มีรูปแบบเดียวกันคือ "เลขของต้นทาง-เลขของคนทำ package" ตามข้อกำหนดของ Debian ส่วนท้ายเป็นของ Ubuntu มีกติกาเขียนไว้ในคู่มือเรื่องเลขเวอร์ชันของ Ubuntu อ่านทีละส่วนได้แบบนี้

ส่วน ความหมาย
8.3.6 เวอร์ชันจาก php.net ที่ Ubuntu เลือกไว้ตอนออกรุ่น ไม่เปลี่ยนอีก
-0 revision ของ Debian เป็น 0 แปลว่าแพ็กเกจนี้ไม่ได้ต่อจากแพ็กเกจเวอร์ชันไหนของ Debian
ubuntu0 Ubuntu เป็นคนทำ ตัวเลข 0 บอกว่ายังไม่มีการแก้จากฝั่ง Ubuntu ก่อนอัปเดตครั้งแรก
.24.04 ใส่ชื่อรุ่นไว้ เพราะแพตช์เดียวกันลงหลายรุ่นพร้อมกัน แต่ละรุ่นต้องมีเลขไม่ซ้ำกัน
.13 อัปเดตครั้งที่ 13 ของ PHP ชุดนี้บน 24.04 เพิ่มขึ้นทุกครั้งที่ปล่อยแพตช์

Ubuntu 22.04 ใช้รูปแบบที่ต่างไปนิดหน่อย PHP ของ 22.04 คือ 8.1.2-1ubuntu2.28 ส่วนนี้ต่อจากแพ็กเกจ revision 1 ของ Debian (-1) Ubuntu แก้เพิ่มสองครั้งก่อนออกรุ่น (ubuntu2) และอัปเดตหลังออกรุ่นมาแล้ว 28 ครั้ง (.28) อ่านเหมือนกันคือเลขท้ายสุดยิ่งมากก็ยิ่งใหม่

ส่วน PHP ที่ลงจาก PPA ของ Ondřej Surý มีหน้าตาอีกแบบ เช่น 8.3.27-1+ubuntu24.04.1+deb.sury.org+1 สังเกตได้จาก deb.sury.org ต่อท้าย ช่องทางนี้ขยับเลขหน้าตาม php.net จึงเทียบกับ php.net ตรง ๆ ได้

บน Ubuntu 24.04 php -v บอกแค่ 8.3.6

เลขเต็มชุดนี้ไม่ได้โผล่ทุกที่ ตั้งแต่ php8.3 เวอร์ชัน 8.3.4-1 คนทำแพ็กเกจ PHP ของ Debian เลิกใส่ revision ลงในเลขเวอร์ชันของ PHP เอง (changelog ของ php8.3 เขียนว่า "Just don't set PHP extra version at all") ผลคือบน Ubuntu 24.04 และ 26.04 ทั้ง php -v, phpinfo() และ header X-Powered-By จะบอกแค่ 8.3.6 หรือ 8.5.4 ไม่ว่าจะแพตช์ไปกี่ครั้งแล้ว

ส่วน Ubuntu 22.04 ที่ใช้แพ็กเกจรุ่นก่อนหน้า php -v ยังขึ้นเลขเต็มอย่าง PHP 8.1.2-1ubuntu2.28 (cli)

บน 24.04 จึงต้องดูเลขเต็มจาก apt แทน

apt list --installed 'php8.3*'
php8.3-cli/noble-updates,noble-security,now 8.3.6-0ubuntu0.24.04.13 amd64 [installed]
php8.3-fpm/noble-updates,noble-security,now 8.3.6-0ubuntu0.24.04.13 amd64 [installed]

ดูให้ครบทุกตัวที่รัน PHP จริง ทั้ง php8.3-fpm ที่ nginx ส่ง request ไปหา และ libapache2-mod-php8.3 ถ้าใช้ Apache แบบ mod_php เพราะ php -v บอกแค่ตัว CLI

เทียบเลขเต็มกับประกาศของ Ubuntu

พอได้เลขเต็มมาแล้ว อย่าเอาไปเทียบกับ php.net ให้เทียบกับประกาศความปลอดภัยของ Ubuntu (Ubuntu Security Notice หรือ USN) ที่บอกว่าแต่ละรุ่นต้องได้ package เลขไหนถึงจะปลอดภัย เช่น USN-8948-1 ที่แก้ PHP2Shell เมื่อ 21 ต.ค. 2569

Ubuntu package เลขที่แก้ PHP2Shell แล้ว
26.04 php8.5 8.5.4-0ubuntu1.5
24.04 php8.3 8.3.6-0ubuntu0.24.04.13
22.04 php8.1 8.1.2-1ubuntu2.28

ถ้าเลขท้ายของเราเท่ากับหรือมากกว่าเลขในประกาศ ก็ได้แพตช์นั้นแล้ว ถ้ามีเลข CVE อยู่ในมือ หน้าของ CVE นั้นใน Ubuntu CVE tracker ก็บอกเลขที่แก้แยกตามรุ่นให้เหมือนกัน หรือจะดูจากเครื่องเลยด้วย apt changelog php8.3-fpm ก็ได้ ทุกครั้งที่ Ubuntu backport แพตช์ ใน changelog จะมีเลข CVE ที่แก้ในรอบนั้นอยู่ด้วย

อัปเดตแล้วอย่าลืม restart PHP-FPM หรือ Apache เพราะ process ที่รันอยู่ยังใช้ PHP ตัวเก่าที่โหลดไว้ใน memory วิธีเช็คว่าทุก process ใช้ตัวใหม่แล้วอยู่ในโพสต์ PHP2Shell

PHP ชุดนี้ได้แพตช์ตามรอบของ Ubuntu

PHP อยู่ใน repository main ของ Ubuntu Canonical จึงดูแลแพตช์ความปลอดภัยให้ตลอด standard support 5 ปีของรุ่น ไม่ได้หยุดตามวันของ php.net อย่าง 8.3 ที่ php.net จะหยุดแพตช์วันที่ 31 ธ.ค. 2570 แต่บน Ubuntu 24.04 ยังได้แพตช์ต่อถึงพฤษภาคม 2572 และถ้าเปิด Ubuntu Pro ก็ได้ต่อถึงปี 2577 Ubuntu Pro ใช้ส่วนตัวได้ไม่เกิน 5 เครื่องโดยไม่เสียเงิน

ที่ได้มีแค่แพตช์ความปลอดภัยที่ Canonical เลือกแก้ บั๊กทั่วไปที่ทีม PHP แก้ใน 8.3.x ช่วงหลังจะไม่ตามมาด้วย ช่วงอายุของ PHP แต่ละเวอร์ชันฝั่ง php.net อธิบายไว้ในโพสต์ support ของ PHP

กรณีที่อาจเจอเมื่อใช้งานจริง

  • รายงานสแกนช่องโหว่บอกว่า PHP 8.3.6 มีช่องโหว่หลายสิบตัว เครื่องมือที่อ่านแค่เลข 8.3.6 จาก header แล้วเทียบกับรายการ CVE ของ php.net จะเห็นแบบนั้น ทั้งที่เครื่องอาจแพตช์ครบแล้ว ให้ดูเลขเต็มจาก apt แล้วเทียบกับ CVE tracker ของ Ubuntu ทีละตัวก่อนตกใจ
  • เครื่อง Ubuntu 24.04 ที่เปิด auto update ไว้ unattended-upgrades จะลง security update ของ Ubuntu ให้เอง เลขท้ายจะขยับไปเรื่อย ๆ แต่ php -v ก็ยังขึ้น 8.3.6 เหมือนเดิม เช็คเลขเต็มจาก apt สักครั้งหลังมีประกาศ ว่าลงครบและ restart แล้ว
  • เครื่องที่ลง PHP ทั้งจาก Ubuntu และจาก PPA ใช้คนละเลข คนละรอบอัปเดต ต้องเช็คแยกกัน ตัวที่ลงจาก PPA เทียบกับ php.net ส่วนตัวของ Ubuntu เทียบกับ USN
  • บน shared hosting เราดูเลข package เองไม่ได้ ถ้า phpinfo() บอกเลขที่ดูเก่า ให้ถามผู้ให้บริการตรง ๆ ว่าแพตช์ CVE ที่เป็นข่าวแล้วหรือยัง

ถ้าอยากรู้ว่า PHP ที่ใช้อยู่เก่าแค่ไหนและยังได้อัปเดตไหม วางผลของ php -v ลงในเครื่องมือ PHP ที่ใช้อยู่เก่าแค่ไหน ได้ ถ้าเป็นเลขของ Ubuntu หน้าเครื่องมือจะบอกรอบแพตช์ของ Ubuntu รุ่นนั้นให้ด้วย

อ่านต่อ

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

ล่าสุด

ดูทั้งหมด →