데일리 · 기사 01 · 19 분 읽기 · 연재 2 화
- 보안
- 오픈소스
PHP, 치명적 취약점 2건의 긴급 보안 패치 공개
10월 21일 공식 수정 공개 · 22일 앱 적용·Cloudways 배포 완료 확인
요약·개요
PHP 개발팀이 10월 21일 8.5.12·8.4.27·8.3.36·8.2.35를 내놓고 원격 코드 실행 취약점 2건을 고쳤습니다. 지원이 끝난 7.4·8.0·8.1에는 최소 소스 백포트만 따로 나왔고, WordPress 운영자는 서버의 웹 PHP에 수정이 들어갔는지 호스팅 업체에 물어야 합니다.
PHP 긴급 패치가 공개됐습니다. 질문도 “언제 나오나”에서 “어떤 수정이 실제로 내 서버에 들어갔나”로 바뀌었습니다. 두 결함이 생긴 이유와 실제 코드의 수정 방향을 따라가고, WordPress와 오래된 PHP를 운영할 때 챙길 일을 정리합니다.
10월 24일 후속: Cloudways는 23일 21:38 JST에 기존 사건을 종료했습니다. PHP의 별도 추가 권고와 앱 설정 확인 사항은 3편에 정리했습니다. 아래 앱 버전 관측은 22일 14:03 JST의 기록입니다.
핵심 팩트
PHP 개발팀은 8.5.12·8.4.27·8.3.36·8.2.35에서 원격 코드 실행 취약점 두 건을 고쳤다고 발표했습니다. PHP로 웹 요청을 처리하는 운영자는 쓰고 있는 계열의 수정판이나, 공급자가 내놓은 해당 수정 패키지로 업데이트해야 합니다. PHP 공식 발표 · 변경 기록
| 먼저 볼 사실 | 내용 |
|---|---|
| 두 결함 | CVE-2026-109618: 메모리 부족 처리 중 내부 정보가 불완전해질 수 있는 문제 / CVE-2026-109619: 해제된 요청의 정보가 다음 요청에 남을 수 있는 문제 |
| 점검 대상 | PHP-FPM·mod_php·php-cgi·FrankenPHP·LiteSpeed처럼 웹 요청을 받아 PHP를 실행하는 방식 전부 |
| 7.4·8.0·8.1 | 지원이 끝난 계열이라 정상 지원 재개 대신 최소 소스 백포트만 특별 제공. 공급자 패키지에 들어갔는지, 적용됐는지는 공급자에게 물어야 함 |
| Cloudways 사례 | 제가 쓰는 호스팅 업체(서버 환경을 제공·관리하는 회사) Cloudways의 운영 앱에서 웹 PHP 8.4.27을 10월 22일 14:03 JST에 직접 조회. Cloudways는 19:11 JST 모든 활성 서버의 배포 완료를 발표했고, 일부 고객 환경은 추가 지원 중이라고 안내 |
아래 해설은 PHP 8.5.12에 포함된 실제 수정 커밋과, 따로 공개된 7.4 최소 소스 수정을 읽고 쓴 것입니다. 공격을 직접 실행하거나 특정 WordPress 사이트의 침해를 조사하지는 않았습니다. 8.5 수정 코드 · 8.5.12 이력 · 7.4 최소 소스 수정
| 현재 계열 | 공식 영향 범위 · 같은 계열 | 공식 수정판 |
|---|---|---|
| 8.2 | 8.2.34 이하 | 8.2.35 |
| 8.3 | 8.3.35 이하 | 8.3.36 |
| 8.4 | 8.4.26 이하 | 8.4.27 |
| 8.5 | 8.5.11 이하 | 8.5.12 |

1. PHP의 작업대와 작업자
브라우저가 페이지를 요청하면 PHP는 필요한 정보를 메모리에 올려 처리합니다. 메모리는 작업하는 동안 잠시 펼쳐 놓는 책상이고, 워커는 그 일을 처리하는 작업자라고 생각하면 됩니다. 한 작업자가 요청 A를 처리한 뒤 요청 B를 맡기도 하므로, 요청이 끝나면 A의 임시 정보는 치워야 합니다.
여기서 다루는 것은 저장된 글 파일이 아니라, PHP가 실행하는 동안 쓰는 임시 정보와 그 정보를 가리키는 참조, 즉 “어디를 읽을지 알려 주는 주소표”입니다. 주소표만 남고 그 자리가 이미 비워졌다면, 다음 작업은 잘못된 정보를 읽을 수 있습니다. 공식 원인 설명
- 1. 페이지를 엽니다“오늘의 운세 페이지를 보여줘”라는 요청을 보냅니다.
- 2. 서버가 페이지를 만듭니다PHP로 필요한 처리를 하고 HTML 문서를 만듭니다.
- 3. 브라우저가 보여 줍니다돌려받은 HTML을 읽어 화면에 표시합니다.
입력창이나 등록 버튼은 필요하지 않습니다. 저장된 완성 페이지를 보내는 캐시 응답에서는 PHP를 새로 실행하지 않을 수도 있습니다.
고양이와 풀어보기 Q&A
- 고양이 연구원
폼에 아무것도 입력하지 않아도 PHP가 일해?
포켓 노트페이지를 열기만 해도 서버로 요청이 가니까 일할 수 있어. 캐시가 완성된 페이지를 대신 보낼 때도 있지만, 읽기 전용 WordPress라서 PHP 점검에서 빠지지는 않아.
- 고양이 연구원
작업자가 다음 요청을 맡을 때, 이전 정보는 언제 치워?
포켓 노트원래는 요청이 끝날 때 치워야 해. 이번 두 문제는 처리가 실패할 때와 다음 요청이 초기화를 마치기 전에도 정보가 올바른 상태로 남아 있어야 하는 지점에서 생겼어.
2. 메모리가 부족할 때 멈추는 방식
사이트가 요청을 처리하려면 임시 작업 공간인 메모리가 필요합니다. PHP에는 한 요청이 메모리를 너무 많이 쓰지 않도록 한도가 있고, 한도에 이르러 일을 멈추는 것 자체는 보호 기능입니다. 그런데 멈추는 순간 내부 자료가 반쯤 만들어진 상태라면 어떻게 될까요?
첫 결함인 CVE-2026-109618에서는 메모리 부족으로 처리 중간에 갑자기 빠져나온 뒤, 종료 과정이 덜 만들어진 자료를 정상 자료처럼 다룰 수 있었습니다. 다 쓰지 않은 주문서를 완성본으로 알고 다음 담당자에게 넘기는 상황에 가깝습니다. 사이트가 조금 느려지는 문제와 달리, 프로그램이 잘못된 메모리를 다루면서 실행 흐름까지 영향을 받을 수 있습니다. PHP의 원인 설명
수정은 “멈춰야 한다”는 사실을 기록해 두고, 안전하게 멈출 수 있는 실행 지점에서 중단하도록 바꾼 것입니다. 그 전에 더 높은 최종 한도까지 넘으면 해당 작업 프로세스를 즉시 끝내는 비상 경로도 따로 있습니다. 아래 그림은 8.5 수정의 흐름을 단순화한 것으로, 메모리 제한을 없애거나 컴퓨터 전체를 끄는 수정은 아닙니다.
수정 전
- 요청 처리 중 메모리 한도 도달
- 처리 도중 갑자기 탈출
- 덜 완성된 정보를 정리 과정이 참조할 수 있음
수정 후
- 메모리 한도 도달을 기록
- 안전한 지점에서 실행을 중단·정리
- 별도 비상 경로더 높은 최종 한도 초과 시 작업 프로세스 즉시 종료
고양이와 풀어보기 Q&A
- 고양이 연구원
메모리가 부족한 게 문제면, 용량만 늘리면 되지 않아?
포켓 노트용량을 늘려도 잘못 멈추는 경로는 그대로 남을 수 있어. 문제는 부족해졌을 때 멈추는 방식이라서, 수정된 PHP를 적용해야 해결돼.
- 고양이 연구원
작업 프로세스를 끝내면 내 사이트에는 무슨 일이 생겨?
포켓 노트한 작업자가 맡은 요청이 실패하거나, 그 작업자가 교체될 수 있어. 서버 컴퓨터의 전원을 끄는 일과는 달라. 실제 서비스 영향과 작업자 재시작은 쓰고 있는 호스팅 환경을 기준으로 봐야 해.
3. 버린 자료를 가리키는 메모
두 번째 결함인 CVE-2026-109619는 ‘자료’와 ‘자료의 위치를 적은 메모’의 수명이 어긋나는 문제입니다. PHP의 한 작업자가 방문자 A의 요청을 끝내고 임시 메모리를 비웠는데, 그 안의 자료를 가리키는 상태 일부가 남을 수 있었습니다. 같은 작업자가 다음 요청 B를 맡을 때, 새 초기화가 끝나기 전에 그 오래된 상태를 건드리는 경로가 있었습니다. 공식 설명
서류를 폐기했는데 ‘그 서류는 3번 칸에 있다’는 메모만 남아 있다고 생각해 보세요. 다음에 3번 칸을 열어도 같은 서류가 있다는 보장은 없습니다. 이 비유가 보여 주는 것은 이미 무효가 된 위치 정보를 계속 믿는다는 점입니다. 실제로는 PHP 내부 메모리의 결함이고, 이전 방문자의 글이 화면에 그대로 남는 식의 현상을 말하는 것은 아닙니다.
수정은 이전 요청이 끝날 때 남은 참조와 상태를 비우고, 종료 중에 다시 생기는 정보와 다음 초기화 전의 접근 경로도 함께 다룹니다. ‘다음 손님이 오면 알아서 치우겠지’에 맡기지 않고, 이번 일을 끝낼 때 다음 일이 잘못된 정보를 집어 들지 않게 하는 것이 핵심입니다.
수정 전
- 요청 A의 임시 메모리 해제
- 공유 상태에 예전 참조가 남음
- 같은 작업자가 요청 B에서 오래된 정보를 사용할 수 있음
수정 후
- 요청 종료 시 임시 정보 정리
- 참조·상태 값을 비우거나 초기화
- 다음 요청이 해제된 정보를 유효한 것으로 쓰지 않도록 수정
고양이와 풀어보기 Q&A
- 고양이 연구원
자료는 지웠는데 위치 메모가 남아 있는 문제, 따로 부르는 이름이 있어?
포켓 노트use-after-free, 즉 해제한 메모리를 다시 사용하는 문제라고 해. 위치를 안다고 해서 그 안의 자료가 아직 유효하다는 보장은 없어. - 고양이 연구원
방문자 A 다음에 B가 오면, 어떤 조건에서 공격으로 이어져?
포켓 노트같은 작업자가 두 요청을 처리하고, 특정 상태가 남고, 초기화 전에 그것을 쓰는 경로까지 맞아야 해. 공식 권고도 버전·설정·앱 동작에 따라 조건이 달라진다고 설명해.
4. PHP 7.4.33을 쓰고 있다면
PHP 7.4는 PHP 프로젝트의 일반 지원이 끝난 계열입니다. 이번에는 심각성을 고려해 오래된 계열에 옮겨 쓸 최소 수정 코드가 특별히 제공됐는데, 이를 백포트라고 합니다. 코드가 공개된 뒤에도 호스팅 업체가 그 코드를 패키지로 묶어 배포하고 내 서버에 적용하기까지는 단계가 더 남아 있습니다. PHP 공식 안내 · 지원 종료 기록
7.4 수정은 8.5와 따로 만든 최소 대응입니다. 위험한 메모리 오류가 나면 작업자를 끝내고, 해제된 위치 정보를 비우고, 확인된 세션 업로드 진행 처리 경로를 막습니다. 일반 파일 업로드 기능 전체를 막는 수정은 아닙니다. 실제 차이는 뒤의 코드 부록에 있습니다.
| 상황 | 물어볼 것 |
|---|---|
| PHP 8.3.35를 그대로 사용 | 같은 계열의 8.3.36 또는 두 CVE를 고친 공급자 패키지가 적용됐는지 |
| PHP 7.4.33 표시가 유지됨 | 공급자가 두 CVE를 백포트한 패키지인지, 실제 웹 PHP에 반영됐는지 |
| PHP 8.3이라고만 표시됨 | 세 번째 숫자나 패키지 수정 이력. 큰 계열 번호만으로는 판정하지 않음 |
아래는 가상의 ‘호스팅 A’ 예시입니다. 업체명과 상황은 설명용이고, PHP 수정 버전은 실제 공개된 번호입니다. 호스팅 A의 화면에 PHP 8.3.35가 보인다면 “8.3 계열이니까 괜찮다”로 끝내지 말고, 8.3.36이나 두 수정이 백포트된 패키지가 제공·적용됐는지 묻습니다. 7.4.33이라면 새 공식 7.4 버전 번호를 기다리기보다, 해당 업체의 연장 지원 수정 여부와 지원 중인 계열로 옮기는 경로를 묻습니다.
고양이와 풀어보기 Q&A
- 고양이 연구원
버전 숫자가 그대로인데도 공급자가 고쳐 놨을 수 있어?
포켓 노트있어. 그래서 버전 표시와 공급자의 패키지 수정 이력을 같이 봐. ‘7.4.33’이라는 숫자나 ‘업체가 대응 중’이라는 안내보다, 수정 이력에서 적용 여부가 드러나.
5. WordPress가 최신이면 PHP도 괜찮을까
WordPress는 PHP 위에서 동작하는 앱입니다. WordPress 본체·플러그인을 업데이트하는 일과 서버가 실행하는 PHP를 고치는 일은 서로 다른 층의 작업입니다. 공식 PHP 발표는 웹 요청을 처리하는 모든 PHP 환경에 업데이트를 권하면서, 그중 mod_php의 위험이 가장 높다고 봅니다. 앱 코드가 실행되기도 전에 비인증 요청으로 공격이 일어나는 사례를 입증했다는 이유입니다. PHP 발표 · WordPress의 PHP 업데이트 안내
mod_php는 Apache 웹서버 안에서 PHP를 실행하는 방식이고, PHP-FPM은 PHP 작업자들이 따로 요청을 받아 처리하는 방식입니다. 첫 번째 권고에 FPM의 특정 시작 단계 경로가 제한된다는 내용이 있어도, FPM 전체가 안전하다는 뜻으로 읽을 수는 없습니다. 두 번째 권고에는 조건을 만족한 FPM 경로도 검증됐다고 기록돼 있습니다. 첫 결함의 조건 · 두 번째 결함의 조건
| 보이는 상황 | 그것만으로는 알 수 없는 것 |
|---|---|
| WordPress·플러그인이 최신 | PHP 두 결함의 패치 적용 여부 |
| 로그인·업로드 폼이 없음 | 서버가 직접 받은 요청으로부터의 안전 여부 |
| PHP-FPM 사용 | 모든 관련 공격 경로가 차단됐는지 |
| 홈페이지가 정상 작동 | 보안 수정 적용 또는 침해가 없다는 사실 |
고양이와 풀어보기 Q&A
- 고양이 연구원
그럼 WordPress 사이트들이 이미 해킹당하고 있다는 소식이야?
포켓 노트지금 입증된 건 공격이 가능한 경로야. 실제 사이트에서 악용됐는지, 특정 사이트가 침해됐는지는 이 기사에서 다루지 않았어. 그래도 운영자가 PHP 수정 적용을 챙길 근거로는 충분해.
6. Cloudways에서 PHP를 직접 바꾼 기록
10월 22일 아침, 제가 개인 WordPress 운영에 쓰는 Cloudways에서 운영 중인 앱 한 개의 PHP를 실제로 바꿨습니다. 별도 스테이징 복제본 없이 본 운영 앱에서 진행한 기록입니다. 사이트명·주소·계정·서버 식별자는 공개하지 않습니다.
먼저 파일·데이터베이스의 복원 지점을 10월 22일 06:57:52 JST로 확보했습니다. 이 앱의 Application Settings → PHP Settings에서 고를 수 있는 가장 새 계열은 8.4였습니다. 앱별 PHP 선택 기능을 썼으므로, 이 변경은 해당 앱 단위이고 서버 전체의 모든 PHP 환경을 바꾼 것은 아닙니다. Cloudways 앱별 변경 안내

고양이와 풀어보기 Q&A
- 고양이 연구원
여기서 8.4.27 같은 정확한 버전은 못 골라?
포켓 노트못 골라. 이 화면의 선택 단위는 계열이고, 그 계열에 어떤 패치 패키지를 넣을지는 호스팅 업체가 관리해. 버튼을 누른 뒤에는 WordPress가 실제로 쓰는 정확한 버전을 다시 봐야 해.
7. 성공 알림 다음에 본 실제 버전
Cloudways는 PHP 변경 성공 알림을 띄웠습니다. 이어 WordPress의 도구 → 사이트 건강 → 정보 → 서버를 새로 불러오니, 실제 웹 PHP는 7.4.33에서 8.4.26으로 바뀌어 있었고 실행 방식은 fpm-fcgi, 즉 PHP-FPM이었습니다. 아래는 같은 작업의 실제 화면이며, 제품 화면을 AI로 다시 그린 이미지가 아닙니다.


Cloudways는 10월 22일 07:19 JST에 PHP 공식 권고의 임시 설정 조치를 전체 서버에 적용했고 정식 패치는 순차 배포 중이라고 발표했습니다. 이어 10:02 JST 공지에서는 Autonomous의 모든 고객 앱에 패치를 적용했으며, Flexible은 계속 배포 중이라고 밝혔습니다. Autonomous와 Flexible은 Cloudways의 서로 다른 호스팅 상품이고, 이번에 작업한 앱은 Flexible입니다. Cloudways 공식 사건 공지

10월 22일 14:03 JST에 같은 앱의 WordPress 서버 정보를 새로 불러오자 웹 PHP는 8.4.27, 실행 방식은 fpm-fcgi로 표시됐습니다. PHP 공식 변경 기록의 8.4.27에는 이번 두 보안 권고에 대한 수정이 실려 있습니다. 따라서 이 앱에서 실제 웹 요청을 처리하는 PHP가 공식 수정 버전으로 바뀐 것을 확인했습니다. 이번 재조회에서는 버전 변경이나 설정 저장을 하지 않았으며, 패키지가 교체된 정확한 시각은 알 수 없습니다. 8.4.27 공식 변경 기록

Cloudways는 10월 22일 19:11 JST에 PHP 보안 패치 배포가 완료됐고 모든 활성 서버가 업데이트됐다고 발표했습니다. 19:20 JST에도 같은 내용을 게시했으며, 추가 지원이 필요한 일부 고객에게는 지원팀이 개별 연락 중이라고 덧붙였습니다. 19:22 JST에는 후속 문제를 계속 관찰한다고 알렸고, 당시 사건 상태는 monitoring이었습니다. Cloudways 배포 완료 공지

이 앱에 대한 마지막 직접 관측은 14:03 JST의 웹 PHP 8.4.27 / fpm-fcgi입니다. 저녁에는 인증된 앱 세션에 접근하지 못해 추가 재조회는 하지 못했습니다. 공급자의 전체 배포 완료 발표와 오후에 직접 본 앱 상태를 각각의 시점으로 기록하며, CLI·예약 작업이나 모든 플러그인 기능까지 점검한 결과로 확대하지 않습니다.
고양이와 풀어보기 Q&A
- 고양이 연구원
내 사이트가 수정 버전으로 바뀌었다는 건 어디서 알 수 있어?
포켓 노트새로 불러온 WordPress의 서버 정보에서 8.4.27을 봤어. 이건 사이트를 실제로 실행하는 웹 PHP의 버전이고, PHP 공식 변경 기록에 이번 수정이 들어 있는 버전이야. 다른 앱이나 CLI·예약 작업까지 같은 상태라고 확인한 것은 아니야.
- 고양이 연구원
배포가 끝났다는 공지가 나오면 모든 고객의 문제도 해결된 거야?
포켓 노트Cloudways는 배포 완료와 함께 추가 지원이 필요한 일부 고객이 있다고 밝혔어. 이 운영 사례에서는 오후에 웹 PHP 수정 버전을 직접 봤지만, 공지만으로 모든 환경의 작동이나 침해 여부까지 확인할 수는 없어.
8. 아침 설정 기록과 오후 재조회
| 아침 07:08 JST 관측 항목 | 당시 결과와 의미 |
|---|---|
| 웹 PHP | 7.4.33 → 8.4.26. 계열 전환은 실제 응답으로 확인 |
| 읽기 기능 | 사이트 홈·기존 글 열람·관리자 글 목록·서버 정보 조회가 열림 |
| 입력 항목 수 | max_input_vars는 10000 → 1000으로 표시. 한 번에 받는 입력 항목 수의 한도 |
| 요청 전체 크기 | post_max_size는 100M → 10M. 업로드 한도 100M보다 작아 WordPress가 불일치를 경고. 임시 보안 조치와의 관계를 확인하기 전에는 이전 값으로 상향 복원하지 않음 |
| 그대로 관측한 설정 | 메모리 256M·업로드 100M·실행 시간 300초 |
위 표와 아래 경고 사진은 아침 07:08 JST의 기록입니다. 14:03 JST 재조회에서는 max_input_vars 10000, post_max_size 100M, 업로드 한도 30M, 메모리 한도 -1, 실행 시간 300초로 표시됐습니다. -1은 PHP의 해당 메모리 한도가 없는 설정을 뜻하며, 이번 점검에서 이 값들을 변경하지 않았습니다. 누가 언제 어떤 이유로 바꿨는지는 이 화면으로 알 수 없으므로, 당시의 10M 경고나 공급자의 임시 조치가 현재도 같은 상태라고 단정하지 않습니다.
버전을 바꾸면 설정도 함께 달라질 수 있고, 이번에도 입력 관련 한도 두 가지가 바뀌어 보였습니다. 입력 한도가 달라졌다고 곧바로 사이트가 고장 났다고 볼 수는 없지만, 항목이 많은 설정·메뉴를 저장하는 기능은 시험해 볼 대상입니다. 이번에 본 것은 위의 조회 기능까지이고, 모든 플러그인 기능·글 저장·파일 업로드·예약 작업은 아직 시험하지 않았습니다.

아침 점검에서는 이 경고만 보고 요청 크기를 예전 100M으로 되돌리지 않았습니다. PHP 공식 권고에는 요청 크기를 낮춰 일부 공격 경로의 노출을 줄이는 임시 조치도 있습니다. 아침의 10M과 입력 항목 한도가 그 조치에서 온 것인지는 미확인이었고, 오후에 달라진 값의 변경 이유도 확인되지 않았습니다. 이 기록을 한도를 높이거나 메모리 제한을 해제하는 권장 설정으로 사용해서는 안 됩니다. 이 추가 점검에서는 설정을 저장하지 않았습니다. PHP 공식 임시 조치와 한계
고양이와 풀어보기 Q&A
- 고양이 연구원
업로드 경고가 뜨면 그냥 한도를 높이면 되는 거 아니야?
포켓 노트먼저 낮아진 이유부터 봐야 해. 이번에는 공급자가 임시 보안 설정을 적용했다고 했으니, 그 조치인지 확인하기 전에 한도를 올리면 보호를 줄일 수 있어. 사이트 작동 점검과 최종 보안 패치 확인을 함께 진행하는 게 순서야.
9. 지원 중인 계열로 옮길 때
7.4를 당장 어떻게 다루든, 지원 중인 계열로 옮길 계획은 따로 세워야 합니다. Cloudways의 현재 Flexible 안내는 My Applications → 해당 앱 → Application Settings → PHP Settings → PHP Version에서 버전을 고르도록 설명합니다. 계정·운영체제·화면에 따라 경로와 제공 범위가 다를 수 있고, 예를 들어 공식 문서는 8.4에 Debian 11 또는 12가 필요하다고 안내합니다. Cloudways 버전 변경 안내
- 먼저 파일과 데이터베이스의 최신 백업과 복원 방법을 마련합니다.
- WordPress·테마·플러그인이 대상 PHP와 호환되는지 알아보고, 복제한 시험 환경에서 먼저 바꿔 봅니다.
- 해당 계열의 최종 수정 패키지가 제공되는지 공급자에게 물은 뒤 운영 환경에 적용합니다. 같은 서버의 다른 앱에 미치는 범위도 살핍니다.
- 적용 뒤에는 글 열람·관리자 로그인·검색·문의·예약·결제처럼 실제로 쓰는 기능을 점검합니다. WordPress의
도구 → 사이트 건강 → 정보 → 서버에서 웹 PHP 버전을 다시 보고, 백포트라면 공급자의 수정 이력과 함께 기록해 둡니다.
공식 안내에는 일부 설정으로 노출을 줄이는 임시 조치도 있지만, 완전한 해결은 업데이트뿐이라고 적혀 있습니다. 메모리 한도를 무작정 해제하는 식의 설정은 초보 운영자가 그대로 따라 할 해결책으로 권하지 않습니다. PHP 공식 조치와 한계 · WordPress 사이트 건강 안내
고양이와 풀어보기 Q&A
- 고양이 연구원
그럼 지금 할 일을 순서대로 하면 어떻게 돼?
포켓 노트최종 수정이 들어간 패키지 확인 → 호환성·백업 준비 → 적용 → 실제 작동 점검 순서야. 당장 7.4를 유지해야 한다면 두 CVE의 ELTS 수정이 적용됐는지부터 묻고, 이전 계획도 같이 잡아.
마무리
공개된 수정에서, 내 서버의 적용으로
1편에서 기다리던 수정판과 상세가 공개됐습니다. 이번 코드 수정의 핵심은 중단할 때 내부 정보를 안전하게 다루는 것, 그리고 요청 사이에 무효한 정보를 남기지 않는 것입니다. 이제 운영자의 질문은 “패치가 나왔나?”에서 “내 웹 PHP에는 두 수정이 언제, 어떤 패키지로 들어갔나?”로 바뀝니다.
일본의 보안 전문 기관 IPA는 수정판 공개 전인 10월 21일 사전 준비 안내에서 PHP 사용 현황을 파악하고, 수정이 나오면 바로 적용할 수 있게 준비하라고 권했습니다. 수정판이 나온 지금은 그 준비를 실제 적용과 작동 점검으로 옮길 차례입니다. 패치 전 상황과 기본 개념은 1편: PHP 경고와 WordPress 확인 방법에 있습니다.
IPA는 10월 22일 수정판 공개 후 안내에서 네 계열의 수정 버전을 제시하고 적용을 권했습니다. 지원이 끝난 환경에서 수정이나 이전이 어렵다면 임시 대책과 함께 유지보수 인력·예산·이행 계획을 조직 차원에서 검토하라고 안내합니다. 임시 대책을 적용하기 어려운 경우에는 서비스의 외부 접근 차단이나 일시 중단 필요성도 판단해야 한다는 권고입니다.
부록 · 실제 수정 코드
코드로 보는 두 수정
여기부터는 골라 읽는 기술 부록이고, 대응을 판단하는 데 코드를 읽을 필요는 없습니다. 읽은 범위는 8.5.12에 포함된 커밋과 7.4 최소 수정의 일부 경로이며, 아래 발췌는 전체 수정의 일부입니다. 전체 소스 감사나 공격 재현은 하지 않았습니다.
1. 8.5에서 달라진 중단·정리 경로
실제 Zend/zend_alloc.c 수정은 기존 zend_bailout() 경로를 바꾸고, 메모리 부족을 기록해 두었다가 처리하는 지연 처리와 별도의 최종 한도 검사를 더합니다. 실행 쪽 Zend/zend_execute_API.c도 ZEND_HAS_OOM()을 보고 지연된 오류를 처리합니다. 다음 안전한 실행 지점에서 멈추도록 바꾸되, 더 높은 하드 한도마저 넘으면 _exit(137)로 작업 프로세스를 즉시 끝냅니다. 실제 수정 커밋: 메모리 관리·실행 처리
- 고양이 연구원
즉시 끝내는 _exit와 안전한 지점에서 멈추는 건 왜 둘 다 있어?
포켓 노트닿는 한도가 달라서야. 일반 한도에 닿으면 종료 과정이 불완전한 자료를 다루지 않게 안전한 지점까지 이어 가고, 더 높은 최종 한도에 닿으면 그 작업자를 즉시 끝내. 정상 경로 뒤에 매번 비상 종료가 따라오는 구조는 아니야.
2. 오래된 참조를 실제로 비우는 코드
실제 Zend/zend_execute_API.c에는 요청 종료 때 오류 처리기와 예외 처리기를 ZVAL_UNDEF(...)로 비우고, 오류 배열을 NULL, 오류 수를 0으로 바꾸는 코드가 추가됐습니다. 코드 주석도 다음 초기화 전에 쓰일 가능성을 설명합니다. “나중에 새 요청이 초기화하겠지”에 맡기지 않고, 이전 요청을 끝낼 때 남은 참조와 상태를 정리하는 수정입니다. 실제 수정 커밋: 실행기 상태 초기화
EG(num_errors) = 0;
EG(errors) = NULL;
EG(error_handling) = EH_NORMAL;이 발췌는 8.5 수정 커밋에 추가된 실제 행입니다. EG(errors)는 내부 오류 정보의 위치, EG(num_errors)는 개수입니다. NULL은 가리킬 대상이 없다는 값이고, 0은 남은 오류 개수를 비우는 값입니다. Commit 31c0ea7
- 고양이 연구원
NULL로 바꾸면 무엇이 달라져?
포켓 노트지금 유효하게 가리키는 자료가 없다고 표시돼. 없어진 자료를 있는 것처럼 믿고 쓰지 않게 막는 부분이지.
3. 7.4의 별도 최소 수정
7.4용 실제 커밋 712e60f…는 메시지에서부터 “EOL 버전의 최소 완화”라고 밝힙니다. EOL은 지원 종료를 뜻합니다. Zend/zend_alloc.c의 오류 경로를 _exit(1)로 끝내도록 바꾸고, main/SAPI.c에서는 해제한 인증 관련 참조 등을 NULL로 지웁니다. ext/session/session.c에서는 업로드 진행 처리 콜백의 해당 경로를 끕니다. 8.5의 지연 OOM 처리와 7.4의 최소 대응은 서로 다른 구현입니다. 7.4 실제 수정 전체
- 고양이 연구원
이 코드는 운영자가 어디에 넣는 거야?
포켓 노트운영자가 직접 넣는 코드가 아니야. WordPress의 글이나 테마 코드가 아니라 PHP 실행기 자체의 소스거든. 운영자는 공급자가 빌드한 수정 패키지를 적용하고, 이 부록은 무엇이 바뀌었는지 이해하는 자료로 읽으면 돼.
출처
- PHP 추가 안내 원문php.net
- PHP 공식 조치와 한계php.net
- 8.4.27 공식 변경 기록php.net
- Commit 31c0ea7github.com
- 8.5.12 이력github.com
- 7.4 실제 수정 전체github.com
- 두 번째 결함의 조건github.com
- 첫 결함의 조건github.com
- 지원 종료 기록php.net
- WordPress의 PHP 업데이트 안내wordpress.org
- Cloudways 앱별 변경 안내support.cloudways.com
- Cloudways 배포 완료 공지status.cloudways.com
- Cloudways 버전 변경 안내support.cloudways.com
- WordPress 사이트 건강 안내wordpress.org
- 사전 준비 안내ipa.go.jp
- 수정판 공개 후 안내ipa.go.jp