업스트림 PHP 빌드라면 사용 중인 버전을 수정이 포함된 릴리스와 비교하십시오. 배포판 패키지는 패치가 적용되어도 버전 번호가 오래되어 보일 수 있으므로, 패키지 변경 로그나 벤더의 CVE 추적 페이지에서 해당 CVE ID를 확인하십시오.
핵심 문제: 버전 번호는 오해를 부를 수 있습니다
PHP가 서버에 설치되는 경로는 두 가지이며, 각각 다른 확인 방법이 필요합니다.
| 출처 | 버전 문자열 예시 | 수정이 전달되는 방식 |
|---|---|---|
| 업스트림 빌드(php.net 소스, 공식 Docker 이미지, 다수의 호스팅 패널) | 8.3.36 |
새로운 업스트림 패치 릴리스 |
| 배포판 패키지(Debian, Ubuntu, RHEL 및 파생 배포판) | 8.1.2-1ubuntu2.x |
기존 버전에 수정을 백포트하고 패키지 리비전을 올림 |
업스트림 빌드에서는 버전 번호가 믿을 만한 신호입니다. 반면 배포판 패키지에서는 버전의 업스트림 부분(위 예의 8.1.2)이 수년간 그대로 유지되면서도 내부적으로 보안 수정이 적용될 수 있습니다. 이러한 방식을 **백포트(backporting)**라고 합니다. 배포판이 새로운 릴리스의 수정 사항을 가져와 자신이 제공하는 이전 코드베이스에 적용함으로써, 다른 변경을 들이지 않고 보안 업데이트를 제공하는 것입니다.
두 가지 실수가 모두 흔합니다. 이미 패치된 패키지를 버전이 오래되어 보인다는 이유로 취약하다고 판단하는 실수, 그리고 해당 릴리스에 수정이 공개된 적이 없는데도 시스템을 “최근에 업데이트했다”는 이유로 패치되었다고 판단하는 실수입니다.
1단계: PHP의 출처 확인
php -v
버전 문자열을 살펴보십시오. 업스트림 빌드는 PHP 8.4.27처럼 단순한 버전을 표시합니다. 배포판 패키지는 항상 그런 것은 아니지만 PHP 8.1.2-1ubuntu2.x (cli)처럼 버전 뒤에 추가 문자열이 붙는 경우가 많습니다.
그런 다음 패키지 관리자에게 확인합니다.
# Debian / Ubuntu
dpkg -l | grep -E '^ii\s+php'
# RHEL, AlmaLinux, Rocky, Fedora
rpm -qa | grep -i '^php'
패키지 관리자에 PHP 패키지가 표시된다면 저장소에서 설치된 것입니다. 저장소도 함께 확인하십시오. 서드파티 저장소(PPA, Remi, 호스팅 업체의 저장소)에서 설치한 패키지는 배포판 보안 팀이 아니라 해당 유지 관리자의 정책을 따릅니다.
apt-cache policy php8.3-fpm # Debian / Ubuntu
dnf info php # RHEL family
CLI와 웹 서버가 서로 다른 PHP 빌드를 실행할 수 있다는 점을 기억하십시오. PHP 버전 확인 방법에서 설명한 대로 실제로 사이트를 서비스하는 바이너리를 확인하십시오.
2단계: 문제를 수정한 릴리스 찾기
관심 있는 보안 권고문이나 CVE에서 시작합니다. 다음을 기록하십시오.
- CVE ID
- 브랜치별 업스트림 수정 버전
예를 들어 특정 코드 페이지를 사용하는 Windows 환경의 PHP-CGI 인자 주입(argument injection) 문제인 CVE-2024-4577은 업스트림에서 8.1.29, 8.2.20, 8.3.8로 수정되었습니다. 보다 최근에는 CVE-2026-109618과 CVE-2026-109619가 2026-10-21에 릴리스된 8.5.12, 8.4.27, 8.3.36, 8.2.35에서 수정되었습니다.
CVE 검사기와 취약점 목록에서 공개된 PHP CVE의 영향 범위와 수정 버전을 확인할 수 있습니다.
3a단계: 업스트림 빌드 확인
업스트림 빌드라면 사용 중인 버전을 같은 브랜치의 수정 버전과 비교합니다.
| 사용 중인 버전 | 해당 브랜치의 수정 버전 | 패치 여부 |
|---|---|---|
| 8.3.36 | 8.3.36 | 예 |
| 8.3.35 | 8.3.36 | 아니요 |
| 8.4.27 | 8.4.27 | 예 |
| 8.1.34 | 수정 없음(브랜치 EOL) | 아니요 |
PHP 자체로 비교를 자동화할 수 있습니다.
php -r 'var_dump(version_compare(PHP_VERSION, "8.3.36", ">="));'
이 비교는 같은 브랜치 안에서만 의미가 있습니다. 8.4.0을 사용한다고 해서 8.3.36에 포함된 수정이 적용되어 있다는 뜻은 아닙니다. 8.4의 수정 버전을 확인하십시오.
업그레이드 후에는 PHP-FPM 또는 웹 서버를 재시작하십시오. 새 바이너리가 디스크에 있더라도, 오래 실행 중인 프로세스는 재시작하기 전까지 이전 바이너리를 계속 사용합니다.
sudo systemctl restart php8.3-fpm
3b단계: 배포판 패키지 확인
패키지로 설치한 PHP라면 배포판이 해당 CVE를 수정했다고 명시하는지 확인합니다.
Debian 및 Ubuntu: 패키지 변경 로그
보안 수정은 보통 CVE ID와 함께 변경 로그(changelog)에 기록됩니다.
# Changelog of the installed package
zcat /usr/share/doc/php8.3-common/changelog.Debian.gz | grep -i 'CVE-2024-4577'
# Changelog of the candidate version from the repository
apt changelog php8.3-common | grep -i 'CVE-'
패키지 이름은 사용 중인 것으로 바꾸십시오. 설치된 버전의 변경 로그에 해당 CVE가 수정되었다고 나와 있다면, 그 패키지에는 패치가 적용되어 있습니다.
RHEL 및 파생 배포판: rpm 변경 로그
rpm -q --changelog php-common | grep -i 'CVE-2024-4577'
RHEL 계열 시스템에서는 업데이트 권고(advisory)를 조회할 수도 있습니다.
dnf updateinfo list --cve CVE-2024-4577
벤더 CVE 추적 페이지
추적 페이지에서는 릴리스와 패키지별로 CVE 상태를 보여 주며, “not affected”, “needed”, “deferred”, 또는 버전 번호와 함께 “fixed” 등으로 표시됩니다.
CVE ID로 검색해 사용 중인 릴리스(예: Ubuntu 22.04 또는 Debian 12)를 찾은 다음, 수정된 패키지 버전을 dpkg -l 또는 rpm -q가 보고하는 버전과 비교하십시오. 설치된 버전이 수정된 패키지 버전과 같거나 더 새롭다면 수정이 적용된 것입니다.
일부 벤더는 취약한 코드가 빌드되지 않았거나 해당 구성에서 도달할 수 없다는 이유로 CVE를 “not affected”로 표시합니다. CVE-2024-4577은 상황에 따라 달라지는 문제의 예입니다. Windows의 PHP-CGI에 관한 문제였기 때문에 Linux 패키지는 일반적으로 같은 방식으로 노출되지 않았습니다. 표시만 믿지 말고 벤더의 설명을 읽어 보십시오.
추적 페이지에 수정이 없는 경우
벤더가 사용 중인 릴리스에 대한 수정을 공개하지 않았다면, 마지막 업데이트 날짜와 관계없이 패치되지 않은 상태입니다. 이는 EOL 배포판 릴리스, 보안 지원이 없는 커뮤니티 저장소의 패키지, 아직 처리 중인 취약점에서 발생합니다. 선택지는 완화 조치를 적용한 채 수정을 기다리거나, 지원되는 저장소로 전환하거나, 더 새로운 PHP 브랜치로 업그레이드하는 것입니다.
4단계: 실행 중인 프로세스 확인
패키지를 설치해도 이미 실행 중인 프로세스는 바뀌지 않습니다.
# When did the FPM master process start?
ps -o pid,lstart,cmd -C php-fpm8.3
# Has the package been updated since then?
ls -l --time-style=long-iso /usr/sbin/php-fpm8.3
바이너리가 프로세스보다 새롭다면 서비스를 재시작하십시오. Debian과 Ubuntu에서는 needrestart로 오래된 라이브러리를 여전히 사용하는 서비스 목록을 확인할 수 있습니다.
공유 호스팅
공유 호스팅에서는 대개 이러한 명령을 실행할 수 없습니다. 패널의 PHP 버전 선택 기능이나 잠시만 두는 phpinfo() 페이지로 버전을 확인한 뒤, 해당 페이지를 삭제하십시오. 호스팅 업체가 업스트림에서 PHP를 빌드한다면 3a단계처럼 버전을 비교합니다. 확신이 서지 않으면 호스팅 업체에 “제 계정을 서비스하는 PHP 8.3 빌드에 CVE-2026-109618이 수정되어 있습니까?“라고 직접 물어보십시오. 구체적으로 질문할수록 구체적인 답변을 받기 쉽습니다.
PatchScope와의 관계
PHP 버전 검사기는 입력한 버전을 업스트림 영향 범위와 비교합니다. 업스트림 빌드라면 그 결과가 곧 답입니다. 배포판 패키지의 경우 “취약” 결과는 “이 패키지 문자열의 업스트림 버전이 영향 범위에 포함된다”는 의미이므로, 위 단계를 따라 벤더가 수정을 백포트했는지 확인하십시오. 이 한계는 방법론 페이지에서 더 자세히 설명합니다.