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.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 รุ่นนั้นให้ด้วย






