PHP 8.2 đến 8.5 vừa ra bản vá cho hai lỗ hổng cho phép chạy mã từ xa không cần đăng nhập, chỉ bằng một request gửi tới trang PHP. Lỗi xảy ra ở đâu, ai bị ảnh hưởng và nên làm gì ngay.
Tối nay (21/10, khoảng 21 giờ giờ Việt Nam) PHP phát hành bốn bản vá cùng lúc: 8.5.12, 8.4.27, 8.3.36 và 8.2.35. Đây là đợt vá mà nhóm bảo mật PHP đã báo trước, vì có hai lỗ hổng đều được chấm 9,2/10 theo CVSS v4, mức nghiêm trọng.
Cả hai đều dẫn tới cùng một hậu quả: kẻ tấn công không cần tài khoản, chỉ cần gửi request HTTP tới một trang PHP là có thể chạy lệnh trên máy chủ dưới quyền của tiến trình web.
Nếu bạn có VPS chạy PHP, một site WordPress, Laravel, hay một app mà AI viết giúp bằng PHP, bài này dành cho bạn.
Lỗi thứ nhất: hết bộ nhớ giữa chừng (CVE-2026-109618)
Mỗi request PHP có giới hạn bộ nhớ (memory_limit). Khi chạm giới hạn, PHP “nhảy” thẳng ra ngoài để hủy request, không đi hết các bước bình thường.
Vấn đề là có những lúc PHP vừa cấp phát một vùng nhớ nhưng chưa khởi tạo xong thì bị nhảy ra như vậy. Đến bước dọn dẹp cuối request, PHP lại đọc vùng nhớ dở dang đó và làm theo nó. Kẻ tấn công sắp xếp được nội dung vùng nhớ thì điều khiển được chương trình.
Còn làm sao để ép PHP hết bộ nhớ đúng lúc? Bằng một request upload kiểu multipart/form-data được chế sẵn:
không khai báo độ dài nội dung, nên lọt qua bước kiểm tra post_max_size
mỗi phần của form nhét thật nhiều header, nhỏ trên đường truyền nhưng tốn bộ nhớ gấp nhiều lần khi PHP đọc vào
rất nhiều ô chọn file để trống với tên lồng nhau, không bị tính vào giới hạn số file nhưng vẫn sinh ra mảng dữ liệu
Điều đáng sợ: với Apache mod_php, tất cả xảy ra trước khi code của bạn chạy dòng nào. App viết kỹ đến đâu cũng không cứu được. Nhóm nghiên cứu đã chạy được mã từ xa trọn vẹn trên mod_php với cấu hình mặc định.
Với PHP-FPM (kiểu phổ biến khi dùng nginx), phân tích mã nguồn cho thấy cũng bị, nhưng chưa ai dựng được bản khai thác hoàn chỉnh. FrankenPHP được đánh giá là nhiều khả năng bị giống mod_php.
Lỗi thứ hai: đồ cũ của request trước (CVE-2026-109619)
Một tiến trình PHP phục vụ hết request này tới request khác. Nó giữ một số thông tin dùng chung, như thông tin lỗi, phiên đăng nhập (session), trỏ vào bộ nhớ của request đang chạy. Khi request kết thúc, những con trỏ này phải được xóa trước khi bộ nhớ được giải phóng.
Nếu request bị chết giữa chừng (lỗi nghiêm trọng, hết bộ nhớ, quá thời gian chạy), bước xóa có thể bị bỏ qua. Request kế tiếp trên cùng tiến trình lại đụng vào con trỏ cũ trước khi kịp khởi tạo, tức là dùng vùng nhớ đã bị giải phóng. Sắp xếp khéo thì cũng thành chạy mã từ xa.
Hai đường đã được xác nhận khai thác được:
Theo dõi tiến độ upload của session (session.upload_progress), bật sẵn theo mặc định, kể cả khi app không hề gọi session_start()
Trên PHP 8.5, tùy chọn fatal_error_backtraces khi bật
Lưu ý: tắt hiển thị lỗi, tắt ghi log hay dùng @ để giấu lỗi không giúp gì, vì PHP đụng vào vùng nhớ cũ trước khi quyết định có in lỗi ra hay không.
Ai bị ảnh hưởng
Mọi bản PHP thấp hơn 8.5.12, 8.4.27, 8.3.36, 8.2.35. PHP 8.1 trở xuống đã hết hỗ trợ nên sẽ không có bản vá, nếu còn chạy thì đây là lúc phải nâng cấp.
Bạn dùng hosting quản lý sẵn thì thường nhà cung cấp sẽ tự cập nhật, nhưng nên kiểm tra lại. Còn VPS tự cài thì không ai cập nhật hộ bạn cả.
Nên làm gì ngay
Kiểm tra phiên bản. Chạy php -v trên máy chủ, hoặc xem trong trang quản trị hosting. Nhớ rằng PHP chạy dòng lệnh và PHP chạy web có thể là hai bản khác nhau.
Cập nhật và khởi động lại. Cập nhật qua trình quản lý gói hoặc kéo image Docker mới, rồi khởi động lại toàn bộ PHP-FPM hoặc Apache. Cập nhật xong mà tiến trình cũ còn chạy thì vẫn là bản lỗi. Gói của Ubuntu, Debian, các kho PPA có thể chậm vài ngày so với php.net, nên kiểm tra số phiên bản thật chứ đừng chỉ tin vào lệnh update chạy thành công.
Tắt theo dõi tiến độ upload nếu không dùng. Đặt session.upload_progress.enabled=0 trong php.ini. Chính nhóm PHP khuyên giữ cài đặt này kể cả sau khi đã vá, vì đây là tính năng ít người dùng và ít được kiểm thử.
Nếu chưa vá được ngay, khuyến cáo chính thức có một số cách giảm rủi ro tạm thời:
PHP 8.5: đặt fatal_error_backtraces=0
Chặn request multipart/form-data ở nginx hoặc Cloudflare nếu app không có chức năng upload
Giữ post_max_size nhỏ và giới hạn kích thước request ngay từ tầng phía trước PHP
Các cách này chỉ bịt bớt đường, không thay được bản vá. Khuyến cáo còn nhắc không dùng RLIMIT_AS hay RLIMIT_DATA để giới hạn bộ nhớ, vì chính chúng lại kích hoạt đường lỗi.
Máy chủ của bạn đang chạy PHP bản nào? Đã cập nhật chưa, hay đang chờ gói của distro? Chia sẻ trong cộng đồng Vibe Code & Bảo Mật nhé.
PHPlỗ hổngmáy chủ/anh/web/php-oom-rce-480.webpPHP · lỗ hổng · máy chủ
PHP va hai lo hong chiem may chu tu xa, diem 9,2 PHP 8.2 den 8.5 vua ra ban va cho hai lo hong cho phep chay ma tu xa khong can dang nhap, chi bang mot request gui toi trang PHP. Loi xay ra o dau, ai bi anh huong va nen lam gi ngay. PHP lo hong may chu Toi nay (21/10, khoang 21 gio gio Viet Nam) PHP phat hanh bon ban va cung luc: **8.5.12, 8.4.27, 8.3.36 va 8.2.35**. Day la dot va ma nhom bao mat PHP da bao truoc, vi co hai lo hong deu duoc cham **9,2/10 theo CVSS v4**, muc nghiem trong.
Ca hai deu dan toi cung mot hau qua: ke tan cong **khong can tai khoan**, chi can gui request HTTP toi mot trang PHP la co the chay lenh tren may chu duoi quyen cua tien trinh web.
Neu ban co VPS chay PHP, mot site WordPress, Laravel, hay mot app ma AI viet giup bang PHP, bai nay danh cho ban.

## Loi thu nhat: het bo nho giua chung (CVE-2026-109618)
Moi request PHP co gioi han bo nho (`memory_limit`). Khi cham gioi han, PHP "nhay" thang ra ngoai de huy request, khong di het cac buoc binh thuong.
Van de la co nhung luc PHP vua cap phat mot vung nho nhung **chua khoi tao xong** thi bi nhay ra nhu vay. Den buoc don dep cuoi request, PHP lai doc vung nho do dang do va lam theo no. Ke tan cong sap xep duoc noi dung vung nho thi dieu khien duoc chuong trinh.
Con lam sao de ep PHP het bo nho dung luc? Bang mot request upload kieu `multipart/form-data` duoc che san:
- khong khai bao do dai noi dung, nen lot qua buoc kiem tra `post_max_size`
- moi phan cua form nhet that nhieu header, nho tren duong truyen nhung ton bo nho gap nhieu lan khi PHP doc vao
- rat nhieu o chon file de trong voi ten long nhau, khong bi tinh vao gioi han so file nhung van sinh ra mang du lieu
Dieu dang so: voi **Apache mod_php**, tat ca xay ra **truoc khi code cua ban chay dong nao**. App viet ky den dau cung khong cuu duoc. Nhom nghien cuu da chay duoc ma tu xa tron ven tren mod_php voi cau hinh mac dinh.
Voi **PHP-FPM** (kieu pho bien khi dung nginx), phan tich ma nguon cho thay cung bi, nhung chua ai dung duoc ban khai thac hoan chinh. FrankenPHP duoc danh gia la nhieu kha nang bi giong mod_php.
## Loi thu hai: do cu cua request truoc (CVE-2026-109619)
Mot tien trinh PHP phuc vu het request nay toi request khac. No giu mot so thong tin dung chung, nhu thong tin loi, phien dang nhap (session), tro vao bo nho cua request dang chay. Khi request ket thuc, nhung con tro nay phai duoc xoa truoc khi bo nho duoc giai phong.
Neu request bi chet giua chung (loi nghiem trong, het bo nho, qua thoi gian chay), buoc xoa co the bi bo qua. Request ke tiep tren cung tien trinh lai dung vao con tro cu truoc khi kip khoi tao, tuc la dung vung nho da bi giai phong. Sap xep kheo thi cung thanh chay ma tu xa.
Hai duong da duoc xac nhan khai thac duoc:
- **Theo doi tien do upload cua session** (`session.upload_progress`), bat san theo mac dinh, ke ca khi app khong he goi `session_start()`
- Tren **PHP 8.5**, tuy chon `fatal_error_backtraces` khi bat
Luu y: tat hien thi loi, tat ghi log hay dung `@` de giau loi **khong** giup gi, vi PHP dung vao vung nho cu truoc khi quyet dinh co in loi ra hay khong.
## Ai bi anh huong
Moi ban PHP **thap hon** 8.5.12, 8.4.27, 8.3.36, 8.2.35. PHP 8.1 tro xuong da het ho tro nen se khong co ban va, neu con chay thi day la luc phai nang cap.
Ban dung hosting quan ly san thi thuong nha cung cap se tu cap nhat, nhung nen kiem tra lai. Con VPS tu cai thi khong ai cap nhat ho ban ca.
## Nen lam gi ngay
**Kiem tra phien ban.** Chay `php -v` tren may chu, hoac xem trong trang quan tri hosting. Nho rang PHP chay dong lenh va PHP chay web co the la hai ban khac nhau.
**Cap nhat va khoi dong lai.** Cap nhat qua trinh quan ly goi hoac keo image Docker moi, roi **khoi dong lai toan bo** PHP-FPM hoac Apache. Cap nhat xong ma tien trinh cu con chay thi van la ban loi. Goi cua Ubuntu, Debian, cac kho PPA co the cham vai ngay so voi php.net, nen kiem tra so phien ban that chu dung chi tin vao lenh update chay thanh cong.
**Tat theo doi tien do upload neu khong dung.** Dat `session.upload_progress.enabled=0` trong `php.ini`. Chinh nhom PHP khuyen giu cai dat nay ke ca sau khi da va, vi day la tinh nang it nguoi dung va it duoc kiem thu.
**Neu chua va duoc ngay**, khuyen cao chinh thuc co mot so cach giam rui ro tam thoi:
- PHP 8.5: dat `fatal_error_backtraces=0`
- Chan request `multipart/form-data` o nginx hoac Cloudflare neu app khong co chuc nang upload
- Giu `post_max_size` nho va gioi han kich thuoc request ngay tu tang phia truoc PHP
Cac cach nay chi bit bot duong, khong thay duoc ban va. Khuyen cao con nhac **khong** dung `RLIMIT_AS` hay `RLIMIT_DATA` de gioi han bo nho, vi chinh chung lai kich hoat duong loi.
---
May chu cua ban dang chay PHP ban nao? Da cap nhat chua, hay dang cho goi cua distro? Chia se trong [cong dong Vibe Code & Bao Mat](https://www.facebook.com/groups/1867387324580254) nhe.
## Nguon
- [PHP 8.5.12 released](https://www.php.net/releases/8_5_12.php), php.net, kem 8.4.27, 8.3.36 va 8.2.35
- [RCE via OOM corruption (CVE-2026-109618)](https://github.com/php/php-src/security/advisories/GHSA-w8hw-w9fx-j79w), khuyen cao bao mat cua PHP tren GitHub
- [RCE via stale global state (CVE-2026-109619)](https://github.com/php/php-src/security/advisories/GHSA-6wmf-4rv5-p3rp), khuyen cao bao mat cua PHP tren GitHub
- [Thong bao truoc dot va](https://x.com/ThePHPF/status/2112633155631108544), The PHP Foundation
- [A critical PHP security release is coming today](https://www.helpnetsecurity.com/2026/10/21/php-security-release-announcement-october-2026/), Help Net Security