검증된 문서입니다
클라우드 서버를 생성하여 이 문서의 명령을 처음부터 끝까지 그대로 실행하고 확인한 문서입니다.
- 운영체제
- Ubuntu 24.04.5 LTS · x86_64
- 설치 버전
- PHP 8.3.6 (8.3.6-0ubuntu0.24.04.11 → 8.3.6-0ubuntu0.24.04.13)
- 테스트 서버
- DigitalOcean · 1 vCPU / 1 GB RAM / 25 GB SSD (s-1vcpu-1gb, sgp1)
- 마지막 확인
- 2026-10-23
이 문서에는 제휴 링크가 포함되어 있습니다. 링크를 통해 가입하면 코드샌드가 일정 수수료를 받을 수 있으며, 문서 내용과 평가에는 영향을 주지 않습니다.
2026년 10월 21일 공개된 PHP 원격 코드 실행 취약점 두 건(CVE-2026-109618, CVE-2026-109619)이 내 Ubuntu 서버에 해당하는지 확인하고, 보안 업데이트를 설치해 막는 방법입니다.
1. 어떤 취약점인가요
php.net 공지에 따르면 두 취약점 모두 CVSS 9.2이고, 로그인하지 않은 사용자도 원격에서 서버 코드를 실행할 수 있습니다. PHP가 요청을 처리하다가 메모리 부족 같은 이유로 중간에 멈추면, 요청을 정리하는 단계에서 깨진 상태 값을 그대로 쓰게 되는 문제입니다.
공지는 Apache에 PHP를 모듈로 붙이는 mod_php 방식이 가장 영향을 크게 받는다고 적었습니다. 설정으로 위험을 줄이는 방법도 소개했지만, 완전한 해결은 업데이트뿐이라고 안내합니다.
PHP 버전별 수정 버전
php.net이 직접 배포하는 PHP 기준입니다. 지원 기간은 php.net의 지원 버전 표(2026년 10월 23일 확인)를 옮겼습니다.
| PHP 버전 | php.net 지원 상태 | 이번 취약점 수정 버전 |
|---|---|---|
| 8.5 | 지원 중 (보안 수정은 2029년 12월 31일까지) | 8.5.12 |
| 8.4 | 지원 중 (보안 수정은 2028년 12월 31일까지) | 8.4.27 |
| 8.3 | 보안 수정만 (2027년 12월 31일까지) | 8.3.36 |
| 8.2 | 보안 수정만 (2026년 12월 31일까지) | 8.2.35 |
| 8.1 | 지원 종료 (2025년 12월 31일) | 없음 |
| 8.0 | 지원 종료 (2023년 11월 26일) | 없음 |
| 7.4 | 지원 종료 (2022년 11월 28일) | 없음 |
Ubuntu 버전별 기본 PHP와 수정 패키지
Ubuntu 기본 저장소의 PHP는 버전 번호를 올리지 않고 수정 내용만 넣습니다. 그래서 수정한 뒤에도 php -v의 버전 번호는 바뀌지 않습니다. 수정 여부는 아래 표의 패키지 버전과 비교해 판단합니다. Ubuntu 보안 공지(USN-8948-1, USN-8948-2)와 CVE 페이지에 적힌 값이고, LTS 버전만 옮겼습니다.
| Ubuntu | 기본 PHP | 수정된 패키지 버전 |
|---|---|---|
| 26.04 LTS | 8.5 (php8.5) | 8.5.4-0ubuntu1.5 |
| 24.04 LTS | 8.3 (php8.3) | 8.3.6-0ubuntu0.24.04.13 |
| 22.04 LTS | 8.1 (php8.1) | 8.1.2-1ubuntu2.28 |
| 20.04 LTS | 7.4 (php7.4) | 7.4.3-4ubuntu2.29+esm5 (Ubuntu Pro 가입 필요) |
22.04의 PHP 8.1은 php.net 지원이 끝났지만 Ubuntu가 이번 수정을 넣었습니다. 20.04는 일반 지원이 끝나 Ubuntu Pro에 가입한 서버에서만 수정판을 받을 수 있습니다. 가입하지 않았다면 Ubuntu와 PHP를 함께 올려야 합니다.
2. 준비물
- Ubuntu 서버와 sudo 권한이 있는 계정
- Ubuntu 기본 저장소에서 설치한 PHP
이 문서의 모든 과정은 Droplet(1 vCPU · 1GB 메모리 · 25GB SSD · Ubuntu 24.04 · 싱가포르)으로 서버를 생성해 확인했습니다. 업데이트 전 상태를 만들기 위해 수정 전 패키지(8.3.6-0ubuntu0.24.04.11)로 Apache와 mod_php를 설치한 뒤 진행했습니다.
이 문서의 명령 출력은 모두 영어 환경(LANG=C.UTF-8)에서 실행하였습니다. 서버 언어가 다르면 메시지 문구만 다르게 표시될 수 있습니다.
3. PHP 버전과 실행 방식 확인
먼저 서버에 설치된 PHP 버전을 확인합니다. 이 문서의 서버는 8.3.6입니다.
php -vPHP 8.3.6 (cli) (built: Sep 2 2026 12:56:02) (NTS)
Copyright (c) The PHP Group
Zend Engine v4.3.6, Copyright (c) Zend Technologies
with Zend OpCache v8.3.6, Copyright (c), by Zend Technologies다음으로 웹 서버가 PHP를 어떤 방식으로 실행하는지 확인합니다. 업데이트 뒤에 재시작할 서비스가 실행 방식에 따라 다르기 때문입니다. Apache 모듈 목록에 php_module이 있으면 mod_php 방식입니다.
apache2ctl -M 2>/dev/null | grep -i php php_module (shared)PHP-FPM을 쓰는지도 확인합니다. 아무것도 나오지 않으면 PHP-FPM은 설치되어 있지 않습니다.
systemctl list-units --type=service --all | grep -i fpm4. 설치된 패키지 버전 확인
설치된 PHP 패키지와 버전을 확인합니다. 버전이 8.3.6-0ubuntu0.24.04.13보다 낮으면 이번 수정이 들어가지 않은 상태입니다.
dpkg -l | grep php8.3ii libapache2-mod-php8.3 8.3.6-0ubuntu0.24.04.11 amd64 server-side, HTML-embedded scripting language (Apache 2 module)
ii php8.3-cli 8.3.6-0ubuntu0.24.04.11 amd64 command-line interpreter for the PHP scripting language
ii php8.3-common 8.3.6-0ubuntu0.24.04.11 amd64 documentation, examples and common module for PHP
ii php8.3-opcache 8.3.6-0ubuntu0.24.04.11 amd64 Zend OpCache module for PHP
ii php8.3-readline 8.3.6-0ubuntu0.24.04.11 amd64 readline module for PHP5. 패키지 목록 새로 받기
설치할 수 있는 버전은 apt-cache policy의 Candidate 줄에 나옵니다. 아래는 패키지 목록을 새로 받기 전의 결과입니다. 수정판이 이미 나왔는데도 Candidate가 설치된 버전과 같은 .11로 나옵니다. 서버가 가진 패키지 목록이 수정판이 나오기 전 것이기 때문입니다.
apt-cache policy libapache2-mod-php8.3libapache2-mod-php8.3:
Installed: 8.3.6-0ubuntu0.24.04.11
Candidate: 8.3.6-0ubuntu0.24.04.11
Version table:
*** 8.3.6-0ubuntu0.24.04.11 500
500 http://mirrors.digitalocean.com/ubuntu noble-updates/main amd64 Packages
500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages
100 /var/lib/dpkg/status
8.3.6-0maysync1 500
500 http://mirrors.digitalocean.com/ubuntu noble/main amd64 Packages패키지 목록을 새로 받습니다.
sudo apt updateHit:1 http://mirrors.digitalocean.com/ubuntu noble InRelease
Get:2 http://mirrors.digitalocean.com/ubuntu noble-updates InRelease [126 kB]
Get:5 http://security.ubuntu.com/ubuntu noble-security InRelease [126 kB]
...
Fetched 12.1 MB in 3s (3551 kB/s)
Reading package lists...
Building dependency tree...
Reading state information...
79 packages can be upgraded. Run 'apt list --upgradable' to see them.다시 확인하면 Candidate가 수정판인 .13으로 바뀝니다.
apt-cache policy libapache2-mod-php8.3libapache2-mod-php8.3:
Installed: 8.3.6-0ubuntu0.24.04.11
Candidate: 8.3.6-0ubuntu0.24.04.13
Version table:
8.3.6-0ubuntu0.24.04.13 500
500 http://mirrors.digitalocean.com/ubuntu noble-updates/main amd64 Packages
500 http://security.ubuntu.com/ubuntu noble-security/main amd64 Packages
*** 8.3.6-0ubuntu0.24.04.11 100
100 /var/lib/dpkg/status
8.3.6-0maysync1 500
500 http://mirrors.digitalocean.com/ubuntu noble/main amd64 Packages업데이트할 PHP 패키지 목록을 확인합니다. 설치된 PHP 패키지가 모두 .13으로 나오는지 봅니다.
apt list --upgradable 2>/dev/null | grep phplibapache2-mod-php8.3/noble-updates,noble-security 8.3.6-0ubuntu0.24.04.13 amd64 [upgradable from: 8.3.6-0ubuntu0.24.04.11]
php8.3-cli/noble-updates,noble-security 8.3.6-0ubuntu0.24.04.13 amd64 [upgradable from: 8.3.6-0ubuntu0.24.04.11]
php8.3-common/noble-updates,noble-security 8.3.6-0ubuntu0.24.04.13 amd64 [upgradable from: 8.3.6-0ubuntu0.24.04.11]
php8.3-opcache/noble-updates,noble-security 8.3.6-0ubuntu0.24.04.13 amd64 [upgradable from: 8.3.6-0ubuntu0.24.04.11]
php8.3-readline/noble-updates,noble-security 8.3.6-0ubuntu0.24.04.13 amd64 [upgradable from: 8.3.6-0ubuntu0.24.04.11]6. 보안 업데이트 설치
설치된 PHP 8.3 패키지만 골라 업데이트합니다. --only-upgrade 옵션은 이미 설치된 패키지만 새 버전으로 바꾸고, 설치되지 않은 패키지는 새로 설치하지 않는다는 뜻입니다. 'php8.3*'는 이름이 php8.3으로 시작하는 패키지 전체를 뜻하고, -y는 설치할지 묻는 질문에 미리 예라고 답한다는 뜻입니다.
설치하지 않은 패키지마다 Skipping … it is not installed 줄이 나오는데, 정상입니다. 중요한 줄은 5 upgraded와 Setting up … (8.3.6-0ubuntu0.24.04.13)입니다. 아래 출력은 Skipping 줄을 일부만 남겼습니다.
sudo apt install -y --only-upgrade 'php8.3*' libapache2-mod-php8.3Reading package lists...
Building dependency tree...
Reading state information...
Skipping php8.3, it is not installed and only upgrades are requested.
Skipping php8.3-dev, it is not installed and only upgrades are requested.
...
The following packages will be upgraded:
libapache2-mod-php8.3 php8.3-cli php8.3-common php8.3-opcache
php8.3-readline
5 upgraded, 0 newly installed, 0 to remove and 74 not upgraded.
...
Setting up php8.3-common (8.3.6-0ubuntu0.24.04.13) ...
Setting up php8.3-readline (8.3.6-0ubuntu0.24.04.13) ...
Setting up php8.3-opcache (8.3.6-0ubuntu0.24.04.13) ...
Setting up php8.3-cli (8.3.6-0ubuntu0.24.04.13) ...
Setting up libapache2-mod-php8.3 (8.3.6-0ubuntu0.24.04.13) ...
libapache2-mod-php8.3: not switching MPM - already enabled
Processing triggers for man-db (2.12.0-4build2) ...
Processing triggers for php8.3-cli (8.3.6-0ubuntu0.24.04.13) ...
Processing triggers for libapache2-mod-php8.3 (8.3.6-0ubuntu0.24.04.13) ...
Running kernel seems to be up-to-date.
No services need to be restarted.7. 웹 서버가 새 PHP를 쓰는지 확인
mod_php는 Apache 프로세스 안에 PHP를 올려 두고 씁니다. 그래서 패키지를 바꿔도 Apache가 재시작되기 전까지는 예전 PHP가 계속 요청을 처리합니다.
Ubuntu의 libapache2-mod-php8.3 패키지는 업데이트할 때 Apache를 자동으로 재시작합니다. 위 출력의 Processing triggers for libapache2-mod-php8.3 줄이 그 단계입니다. 실제로 재시작됐는지는 Apache의 Active 시각으로 확인합니다. 이 시각이 업데이트한 시각과 같거나 그 뒤여야 합니다.
systemctl status apache2 --no-pager | head -3● apache2.service - The Apache HTTP Server
Loaded: loaded (/usr/lib/systemd/system/apache2.service; enabled; preset: enabled)
Active: active (running) since Fri 2026-10-23 09:40:26 UTC; 27s ago이 서버에서는 업데이트 전 Apache 시작 시각이 09:39:27이었고, 업데이트 뒤 09:40:26으로 바뀌었습니다.
PHP-FPM을 쓴다면 FPM 서비스도 재시작합니다. 3단계에서 FPM이 나오지 않았다면 이 명령은 건너뛰세요.
sudo systemctl restart php8.3-fpm && systemctl status php8.3-fpm --no-pager | head -3● php8.3-fpm.service - The PHP 8.3 FastCGI Process Manager
Loaded: loaded (/usr/lib/systemd/system/php8.3-fpm.service; enabled; preset: enabled)
Active: active (running) since Fri 2026-10-23 09:41:22 UTC; 20ms ago8. 수정이 들어갔는지 확인
패키지 버전이 모두 .13으로 바뀌었는지 확인합니다.
dpkg -l | grep php8.3ii libapache2-mod-php8.3 8.3.6-0ubuntu0.24.04.13 amd64 server-side, HTML-embedded scripting language (Apache 2 module)
ii php8.3-cli 8.3.6-0ubuntu0.24.04.13 amd64 command-line interpreter for the PHP scripting language
ii php8.3-common 8.3.6-0ubuntu0.24.04.13 amd64 documentation, examples and common module for PHP
ii php8.3-opcache 8.3.6-0ubuntu0.24.04.13 amd64 Zend OpCache module for PHP
ii php8.3-readline 8.3.6-0ubuntu0.24.04.13 amd64 readline module for PHP패키지에 들어 있는 변경 기록에서도 이번 수정을 확인할 수 있습니다. 맨 위 항목에 SECURITY UPDATE가 보이면 수정판이 설치된 것입니다.
zcat /usr/share/doc/libapache2-mod-php8.3/changelog.Debian.gz | head -3php8.3 (8.3.6-0ubuntu0.24.04.13) noble-security; urgency=medium
* SECURITY UPDATE: Remote RCE via state corruption issue두 CVE 번호로 바로 찾을 수도 있습니다. 아무것도 나오지 않으면 수정 전 버전입니다.
zgrep -m1 -o "CVE-2026-109618_109619" /usr/share/doc/libapache2-mod-php8.3/changelog.Debian.gzCVE-2026-109618_109619php -v의 버전은 그대로 8.3.6이지만 빌드 날짜가 바뀐 것을 볼 수 있습니다.
php -v | head -1PHP 8.3.6 (cli) (built: Oct 19 2026 15:16:58) (NTS)9. 자동 보안 업데이트 설정 확인
Ubuntu는 기본으로 하루에 한 번 패키지 목록을 받고 보안 업데이트를 자동으로 설치합니다. 아래 두 값이 "1"이면 켜져 있는 상태입니다.
cat /etc/apt/apt.conf.d/20auto-upgradesAPT::Periodic::Update-Package-Lists "1";
APT::Periodic::Unattended-Upgrade "1";자동 업데이트가 켜져 있어도 실행되기 전까지는 수정 전 버전이 남아 있습니다. 이번처럼 긴급한 공지가 나오면 기다리지 말고 4단계의 버전을 직접 확인하세요.
10. 문제 해결
Candidate: 8.3.6-0ubuntu0.24.04.11
수정판이 나왔는데도 apt-cache policy의 Candidate가 예전 버전이면, 서버의 패키지 목록이 수정판이 나오기 전 것입니다. sudo apt update를 먼저 실행한 뒤 다시 확인하세요.
Skipping php8.3-dev, it is not installed and only upgrades are requested.
오류가 아닙니다. 'php8.3*'에 해당하는 패키지 중 설치되지 않은 것을 건너뛴다는 안내입니다. --only-upgrade 옵션 때문에 새로 설치되지는 않습니다.
Changelog unavailable for php8.3=8.3.6-0ubuntu0.24.04.13 (404 Not Found)
apt changelog 명령은 변경 기록을 인터넷에서 받아 옵니다. 보안 수정이 나온 직후에는 그 서버에 기록이 아직 올라오지 않아 404가 날 수 있습니다. 이 문서에서도 그랬습니다. 8단계처럼 서버에 설치된 /usr/share/doc/libapache2-mod-php8.3/changelog.Debian.gz를 읽으면 됩니다.
Ubuntu 22.04에서 PHP 8.1을 쓰고 있습니다
PHP 8.1은 PHP 공식 지원이 끝났지만, Ubuntu 22.04의 php8.1 패키지에는 Ubuntu가 이번 수정을 넣었습니다. 수정 버전은 8.1.2-1ubuntu2.28입니다. 이 문서의 명령에서 php8.3을 php8.1로 바꿔 같은 순서로 확인하고 업데이트하세요. 22.04는 이 문서에서 직접 실행하지 않았고, 수정 버전은 Ubuntu 보안 공지와 22.04 보안 저장소에서 확인했습니다.
php -v가 8.3.6이 아닌 다른 버전으로 나옵니다
Ubuntu 기본 저장소가 아닌 곳(외부 PPA, 직접 빌드, Docker 공식 이미지 등)에서 설치한 PHP입니다. 이때는 패키지 끝자리가 아니라 PHP 버전 자체로 판단합니다. 8.5.12, 8.4.27, 8.3.36, 8.2.35 이상이면 이번 수정이 들어간 버전입니다. 설치한 곳의 업데이트 방법을 따르세요.
직접 해 보기
서버가 없다면 아래 업체에서 몇 분이면 Ubuntu 서버를 만들 수 있습니다. 이 문서는 DigitalOcean 에서 검증했습니다.
이 문서가 도움이 됐나요? 틀린 곳이나 바뀐 내용이 있으면 알려 주세요.
내용 정정 요청