
Laravel이 PHP·Node.js 보안 업데이트에 대응하는 과정에서 드러난 운영상 문제를 공개했다. 4일(현지시간) 공식 블로그에 게시한 사후 보고서에 따르면 Laravel Cloud는 고객의 재배포 없이 실행 환경에 패치를 적용했지만, Forge에서는 업데이트 작업이 몰리면서 배포 약 4800건이 대기 시간 초과로 취소됐다.
이번 보고서는 지난 10월 21일 공개된 보안 업데이트에 대한 대응을 정리한 것이다. Laravel은 당시 취약점으로 고객이 공격받았다는 증거는 발견하지 못했다고 밝혔다. 이는 회사가 확인한 범위에 관한 설명으로, 취약점 악용 가능성 자체가 없었다는 뜻은 아니다.
Cloud는 평소 기본 이미지를 갱신한 뒤 고객에게 재배포를 안내하는 방식을 사용했다. 그러나 전체 애플리케이션을 다시 빌드하는 데 시간이 걸리고, 고객별 배포 명령에 데이터베이스 변경 등이 포함될 수 있어 이번에는 다른 방법을 택했다.
Laravel은 쿠버네티스의 애플리케이션 관리 연산자에 패치한 PHP 실행 파일을 넣는 기능을 추가했다. 고객 이미지를 다시 빌드하지 않고 실행 환경을 재시작해 변경을 적용하는 방식이다. 회사는 플랫폼이 재시작을 처리해 애플리케이션 중단 없이 적용할 수 있었다고 설명했다.
적용 범위는 소규모 지역에서 먼저 검증한 뒤 단계적으로 넓혔다. 보고서상 10월 21일 오후 2시 31분부터 오후 6시 5분까지(UTC) 모든 Cloud 지역에 패치가 반영됐다. 다만 작업 중 신규 배포는 약 3시간 30분 동안 일시 중단됐다. 실행 중인 서비스의 가용성과 새 배포 가능 여부가 서로 달랐던 셈이다.
Forge에서는 평소의 약 10배에 달하는 업데이트 작업이 발생했다. 불안정한 외부 패키지 저장소와 오래된 패키지 공급원 때문에 실패한 작업이 재시도됐고, 같은 대기열을 쓰던 배포 작업이 밀렸다. Laravel은 대기열이 해소됐다고 고객에게 너무 일찍 알렸으며, 이후 약 4800건의 배포가 취소돼 고객이 다시 배포해야 했다고 인정했다.
제품별 복구 방식도 달랐다. Envoyer는 서버 업그레이드를 위해 서비스를 일시 중단했고, Vapor는 새 런타임과 이미지를 제공한 뒤 고객에게 직접 재배포하도록 안내했다. Laravel은 초기 Vapor 안내에서 자사가 재배포하겠다고 했다가 이를 바꾼 점도 문제로 짚었다.
재발 방지책에는 Forge 배포 전용 대기열 분리, 실행 환경 버전의 정확한 추적, 지원이 끝난 소프트웨어 제거가 포함됐다. 복구 안내 전 일정 시간 상태를 관찰하고, 심각도 1·2단계 장애 대응 회의의 기록을 남기는 절차도 도입하기로 했다.
이용자가 직접 조치해야 하는 범위는 서비스마다 다르다. Forge 공식 보안 문서는 자동 보안 업데이트만으로 PHP가 패치되지 않으므로 서버별 업데이트가 필요하다고 명시한다. 패키지를 갱신한 뒤에도 대기열 워커 등 장기 실행 PHP 프로세스를 재시작하고 실제 적용 버전을 확인해야 한다.
Node.js 프로젝트의 공식 권고에서도 당시 26.x·24.x·22.x 계열을 대상으로 보안 릴리스를 제공한 사실을 확인할 수 있다. 해당 권고는 잘못된 Brotli 압축 데이터를 처리할 때 메모리가 손상돼 원격 코드 실행으로 이어질 수 있는 문제 등을 설명한다.
출처: Laravel 공식 블로그, https://laravel.com/blog/php-nodejs-vulnerabilities-post-mortem / Laravel Forge 공식 보안 문서, https://laravel.com/forge/docs/knowledge-base/php-security-release-october-2026 / Node.js 공식 보안 권고, https://nodejs.org/en/blog/vulnerability/october-2026-security-releases