2026년 10월 21일, 같은 날 두 개의 큰 수정 버전이 나왔습니다. PHP 프로젝트는 PHP2Shell로 불리는 원격 코드 실행 취약점(CVE-2026-109618, CVE-2026-109619)의 수정 버전을 공개했고, Node.js 프로젝트는 내장 Brotli 디코더의 범위 밖 쓰기 취약점(CVE-2026-111497)을 고친 22.23.4, 24.22.1, 26.12.1을 냈습니다. 뒤쪽은 보안 업체와 언론에서 Node2Shell이라는 별칭으로 부릅니다. Node.js 공식 공지에는 이 이름이 없고 제목이 "Node.js Brotli decoder out-of-bounds write permits remote code execution (CVE-2026-111497)"이므로, 이 글에서는 별칭을 함께 적습니다.
두 사건에는 눈에 덜 띄는 공통점이 있습니다. 수정은 지원 중인 버전 줄에만 나온다는 점입니다. 지원이 이미 끝난 줄을 쓰고 있다면 수정이 오지 않습니다. 이 글은 "지원 종료"가 실제로 무엇을 뜻하는지, 내 서버가 어디에 해당하는지 확인하는 법, 바로 올릴 수 없을 때의 선택지를 정리한 것입니다.
이번 두 사건을 한눈에
PHP2Shell (CVE-2026-109618, CVE-2026-109619)
- PHP 코어가 요청을 처리하는 과정의 메모리 결함으로, 캐나다 사이버보안센터는 두 건을 use-after-free(CWE-416)로 분류했습니다. 인증 없이 원격 코드 실행으로 이어질 수 있어 위험하다고 평가됩니다.
- 수정 버전은 8.5.12, 8.4.27, 8.3.36, 8.2.35입니다. 8.1 이하는 PHP 프로젝트가 더 이상 업데이트하지 않으므로 수정이 없고, 일부 배포판과 장기 지원 업체만 백포트를 제공할 수 있습니다.
- 이틀 뒤 보고된, 이 업데이트로도 해결되지 않는 후속 건(CVE-2026-115560)과 임시 방어 설정은 PHP2Shell 대응 가이드에 정리해 두었습니다.
Node2Shell (CVE-2026-111497)
- Node.js에 포함된 Brotli 디코더에서, 잘못된 입력이 내부 버퍼의 끝을 넘어 쓰게 만드는 결함입니다. 공식 공지는 "An attacker who can supply Brotli data that an application decompresses with node:zlib can corrupt process memory, which can lead to a crash, disclosure of process memory, or remote code execution."이라고 설명합니다. 애플리케이션이 node:zlib으로 푸는 Brotli 데이터를 공격자가 줄 수 있으면, 프로세스 메모리가 망가져 서비스가 죽거나 메모리가 노출되거나 원격 코드 실행까지 갈 수 있다는 뜻입니다. Node.js는 심각도를 High로 평가했습니다.
- 영향을 받는 줄은 26.x, 24.x, 22.x이고, 수정은 22.23.4, 24.22.1, 26.12.1(2026-10-21)에 들어갔습니다. 24.22.1 릴리스 노트에 "(CVE-2026-111497) deps: brotli: cherry-pick … – High" 항목이 있습니다.
- 공식 공지의 한 문장이 핵심입니다. "End-of-Life versions are always affected when a security release occurs." 지원이 끝난 버전은 보안 릴리스가 나올 때마다 영향을 받는 쪽에 들어가고, 고쳐지지는 않는다는 뜻입니다.
- 공식 공지에는 업그레이드가 어려운 사람을 위한 임시 방어책이 적혀 있지 않습니다. 결함이 런타임 안에 있으므로 앱 코드나 패키지를 고쳐서는 없어지지 않고, 런타임을 올려야 합니다.
"지원이 끝났다"가 실제로 뜻하는 것
지원 종료는 단순히 "새 기능이 없다"가 아닙니다. 새로 발견된 취약점이 고쳐지지 않는다는 뜻입니다. 각 프로젝트의 공식 문구가 같은 이야기를 합니다.
- PHP: "If you are using these releases, you are strongly urged to upgrade to a current version, as using older versions may expose you to security vulnerabilities and bugs that have been fixed in more recent versions of PHP." (종료된 버전 표 안내)
- Apache HTTP Server 2.2: "Apache httpd 2.2 is End-of-Life since December 2017 and should not be used." 이어서 이후에 생긴 문제는 2.2에도 영향이 있을 수 있지만 "will not be investigated or listed here"라고 합니다. 조사도, 목록에 올리는 일도 하지 않는다는 뜻이라, 오래된 2.2에 어떤 구멍이 있는지 공식 자료로는 알 수조차 없게 됩니다.
- Node.js: 위에서 본 대로 지원이 끝난 버전은 보안 릴리스 때마다 영향을 받는 쪽에 들어가며, 수정은 오지 않습니다.
- Microsoft IIS: IIS는 윈도우 서버에 들어 있는 웹 서버라서, 윈도우 서버 자체의 지원이 끝난 서버에서 돌고 있다면 새 보안 수정을 받지 못하는 환경입니다. Microsoft는 Windows 2000에 대해 2010년 7월 13일 이후에는 더 이상 수정이 나오지 않는다고 안내했습니다.
2026년 10월 29일 기준 지원 현황
PHP (php.net 기준)
- 보안 지원 중: 8.2(2026-12-31까지), 8.3(2027-12-31까지), 8.4(2028-12-31까지), 8.5(2029-12-31까지). 8.2와 8.3은 이미 활성 지원이 끝나 보안 수정만 받는 단계입니다. 8.2는 두 달 뒤 보안 지원도 끝납니다.
- 이미 종료: 8.1(2025-12-31), 8.0(2023-11-26), 7.4(2022-11-28), 7.0(2019-01-10), 5.6(2018-12-31), 5.3(2014-08-14), 5.2(2011-01-06). 7.4처럼 아직 쓰이는 곳이 있는 버전도 4년 가까이 보안 수정이 없습니다.
Node.js (nodejs/Release 일정 기준)
- 지원 중: 22(2027-04-30까지), 24(2028-04-30까지), 26(2029-04-30까지).
- 이미 종료: 20(2026-04-30), 18(2025-04-30). 이번 Node2Shell 수정은 이 두 줄에 오지 않습니다. Node.js는 Maintenance LTS 단계가 지난 버전을 위해 OpenJS Ecosystem Sustainability Program 협력사를 통한 상용 지원이 있다고 안내합니다.
웹 서버
- Apache HTTP Server: 2.2는 2017년 12월부터 지원 종료입니다. Apache 쪽도 현재 지원되는 버전으로 옮기라고 안내합니다.
- nginx: 이 글에서는 버전별 지원 기간을 확인하지 않았습니다. 사용하는 버전의 지원 여부는 nginx 공식 사이트에서 확인하세요.
내가 쓰는 버전 확인하기
- 서버에 접속할 수 있다면:
php -v,node -v,httpd -v(또는apache2 -v),nginx -v로 확인합니다. - PHP는 명령줄과 웹이 다를 수 있습니다.
php -v는 명령줄용 PHP입니다. 웹 요청은 PHP-FPM이나 Apache 모듈이 처리하고, 설치된 버전이 서로 다른 경우가 있습니다. 웹에서 실제로 쓰는 버전은php-fpm -v나phpinfo()로 확인합니다(phpinfo()파일은 확인 후 바로 지웁니다). - Node.js는 업데이트 뒤에 프로세스를 다시 시작해야 합니다. 새 버전을 설치해도 이미 떠 있는 프로세스는 옛 런타임으로 계속 돕니다. 올린 뒤에는 프로세스를 재시작하고 실행 중인 버전을 다시 확인하세요. 보안 업체 Contrast Security의 Node2Shell 대응 권고에도 같은 내용이 있습니다.
- 호스팅을 쓴다면 호스팅 관리 화면의 PHP·Node 버전 설정을 확인합니다. 선택할 수 있는 최신 지원 버전이 있는지도 함께 봅니다.
- 밖에서 보이는 정보: 서버는 응답 헤더(
Server,X-Powered-By)로 버전을 알려 주는 경우가 있습니다. 브라우저 개발자도구의 네트워크 탭에서 응답 헤더를 보거나curl -I 주소로 확인할 수 있습니다. 방문자 누구나 볼 수 있는 정보라는 뜻이기도 합니다.
버전 노출 줄이기 (업데이트를 대신하지는 못합니다)
- PHP:
expose_php는 기본값이 켜짐이고 php.ini에서만 바꿀 수 있습니다. 켜져 있으면X-Powered-By: PHP/버전으로 PHP 버전이 응답 헤더에 실립니다.expose_php = Off로 끕니다. - Apache:
ServerTokens의 기본값은Full이고Server: Apache/2.4.2 (Unix) PHP/4.2.2 MyMod/1.2처럼 버전과 운영체제, 모듈 정보까지 내보냅니다.ServerTokens Prod로 하면Server: Apache만 나갑니다. - nginx:
server_tokens의 기본값은on이고 오류 페이지와Server응답 헤더에 nginx 버전을 싣습니다.server_tokens off;로 끕니다.
다만 이것은 가림막일 뿐입니다. 헤더를 숨겨도 취약한 버전이 취약하지 않게 되지는 않습니다. 숨기는 일은 불필요한 정보를 덜 흘리기 위한 보조 조치이고, 지원 종료 버전의 해법은 여전히 업그레이드입니다.
바로 올릴 수 없을 때
- 백포트·장기 지원이 있는지 먼저 확인합니다. 리눅스 배포판이나 장기 지원 업체가 지원 종료 버전에 보안 수정을 따로 얹어 주는 경우가 있습니다. 서버 패키지 이름의 버전 숫자는 옛 것이어도 수정이 들어가 있을 수 있어서, 버전 숫자만 보고 판단하지 말고 배포판의 보안 공지를 확인합니다.
- 공식 임시 방어책이 있는 것만 씁니다. PHP의 후속 건에는
session.upload_progress.enabled = 0이 있습니다. Node2Shell은 공식 공지에 임시 방어책이 없으니, 우회책을 찾기보다 런타임 업그레이드를 계획하는 편이 안전합니다. - 그동안은 접촉면을 줄입니다. 관리자 화면 접근 범위를 줄이고, 쓰지 않는 서비스는 닫고, 로그를 평소보다 자주 봅니다. Node2Shell의 경우 Contrast Security는 10월 21일 이후의 Node.js 로그와 엔드포인트 기록에서 의심스러운 셸, 내려받기 도구, 예상치 못한 외부 접속이 있는지 보라고 권합니다. 이런 조치는 시간을 버는 수단이지 해결이 아닙니다.
- 업그레이드는 일정을 잡아서 합니다. 시험 환경에서 먼저 올려 보고, 특히 오래된 PHP 코드베이스는 새 버전에서 경고와 오류가 나오는 곳이 있으니 여유를 두고 확인합니다.
점검 체크리스트
- PHP, Node.js, 웹 서버의 버전을 확인합니다(PHP는 웹에서 쓰는 버전과 명령줄 버전을 구분합니다).
- 위 지원 현황과 대조해 이미 지원이 끝난 버전이 있는지 봅니다.
- PHP는 8.5.12, 8.4.27, 8.3.36, 8.2.35 이상인지, Node.js는 22.23.4, 24.22.1, 26.12.1 이상인지 확인합니다.
- Node.js는 올린 뒤 프로세스를 재시작하고 실행 중인 버전을 다시 확인합니다.
- 지원이 끝난 버전이면 업그레이드 일정을 잡습니다. 당장 어렵다면 배포판의 백포트나 장기 지원 여부를 확인합니다.
- 응답 헤더로 버전이 노출되는지 보고, 필요 없다면 줄입니다.
버전 점검이나 업그레이드가 부담스러우시면 아래 문의 양식으로 현재 상황을 알려 주세요. 사용 중인 서버 환경을 함께 확인하고 우선순위를 정리해 드리겠습니다.
참고 자료
- Node.js, October 2026 Security Releases (2026-10-21, CVE-2026-111497 포함)
- Node.js v24.22.1 (LTS) 릴리스 노트 (2026-10-21)
- nodejs/Release 릴리스 일정(schedule.json)
- Contrast Security, Node2Shell(CVE-2026-111497) 분석과 조치 (별칭, 조치 권고)
- PHP: Supported Versions · PHP: Unsupported Branches
- PHP 매뉴얼: php.ini 핵심 지시어(expose_php)
- Canadian Centre for Cyber Security, Alert AL26-026 (PHP2Shell)
- SANS Internet Storm Center, Critical PHP Vulnerability (CVE-2026-109618, CVE-2026-109619)
- Apache HTTP Server 2.2 vulnerabilities (2.2 지원 종료 안내) · ServerTokens 지시어
- nginx: server_tokens 지시어
- Microsoft, Windows 2000 Support ends on July 13, 2010
- 함께 보기: Node.js 10월 보안 릴리스와 Node 20 지원 종료: 지금 확인할 것