FutureInfra 무료로 시작
블로그

PHP 취약점 PHP2Shell 대응 체크리스트 2026 — 패치 버전·버전 확인 3가지·웹셸 점검

PHP2Shell(CVE-2026-109618·109619)을 고친 버전은 8.5.12·8.4.27·8.3.36·8.2.35 예요. 8.1 이하 처리, 내 PHP 버전 확인 3가지, 우분투에서 php -v 가 8.3.6 이어도 고쳐진 이유, 버전을 못 박은 도커 태그 함정을 직접 돌려 보며 정리했어요. 임시 조치·웹셸 점검·하드닝 체크리스트까지 담았어요.

목차 보기

PHP2Shell은 PHP 자체에 있던 원격 코드 실행 취약점 두 개(CVE-2026-109618·109619)예요. 고친 버전은 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35이고 2026년 10월 21일에 나왔어요. 내 버전이 이보다 낮으면 올리고, 웹 서비스를 꼭 다시 시작하세요. 8.1 이하도 "패치가 아예 없는" 건 아니에요. PHP 보안팀이 7.4·8.0·8.1 용 소스 패치를 따로 냈고, 배포판과 호스팅사가 이를 넣고 있어요. 다만 버전 숫자만 보면 틀릴 수 있어요. 직접 돌려 보니 우분투 24.04 는 고쳐진 뒤에도 php -v 가 8.3.6 으로 나왔고, 버전을 못 박은 도커 태그는 다시 받아도 패치 전 PHP 그대로였어요.

3줄 요약

  • 무엇이 문제 — PHP 엔진 안의 메모리 처리 결함 2개로, 로그인 없이 밖에서 서버 명령을 실행할 수 있어요(PHP 측 CVSS v4.0 9.2).
  • 누가 영향 — 웹 요청을 받는 거의 모든 PHP 예요. PHP-FPM·Apache mod_php·php-cgi·FrankenPHP·LiteSpeed 가 다 들어가고, 워드프레스·그누보드도 PHP 위에서 돌아요.
  • 지금 할 일 — ① 실제 웹이 쓰는 PHP 버전 확인 ② 고친 버전(또는 배포판 패치)으로 올리고 재시작 ③ 10월 20일 이후 기록과 웹 폴더 점검 ④ 노출됐던 서버는 DB·API 키 비밀번호 교체.
4개고친 버전 8.5.12 · 8.4.27 · 8.3.36 · 8.2.35 (10/21)
9.2CVSS v4.0 위험도 — 두 취약점 모두(PHP 보안팀)
10/20KISA 가 밝힌 정보 유출일 — 이날 이후 기록 점검
10/26미국 CISA '실제 악용 취약점' 목록 등록

이 글에 나오는 말

  • 원격 코드 실행(RCE) — 밖에서 보낸 요청만으로 내 서버에서 명령이 돌아가는 것. 가장 위험한 등급이에요.
  • CVE·CVSS — CVE 는 취약점 고유 번호, CVSS 는 0~10 위험 점수예요. 같은 취약점도 기관과 기준판(v3.1·v4.0)에 따라 점수가 달라요.
  • mod_php·PHP-FPM — 웹서버가 PHP 를 부르는 방식. mod_php 는 Apache 안에 PHP 가 들어가고, PHP-FPM 은 따로 도는 PHP 프로세스예요.
  • 백포트 — 새 버전의 수정만 떼어 옛 버전에 붙이는 것. 그래서 버전 숫자는 그대로인데 고쳐진 상태가 생겨요.
  • 웹셸 — 공격자가 웹 폴더에 몰래 올려 두는 원격 조종용 파일이에요.
가상서버 하나 만들어 보기
분 단위 과금 · 지우면 바로 멈춰요 · 가입하면 2,000원 크레딧
서버 만들기 →요금표

PHP2Shell 은 무엇이고 누가 영향을 받나요?

두 취약점 모두 PHP 엔진 내부의 메모리 관리 문제예요. 앱 코드가 아니라 PHP 자체의 문제라서, 아무리 잘 짠 사이트라도 PHP 버전이 낮으면 해당돼요.

번호쉽게 말하면PHP 측 점수NVD 점수(CVSS 3.1)
CVE-2026-109618메모리가 부족해 요청 처리가 끊길 때, 반쯤 준비된 데이터를 정상으로 착각해 정리하다가 메모리가 망가져요.9.2 (v4.0)9.8
CVE-2026-109619요청이 끝난 뒤에도 지워진 메모리를 가리키는 값이 남아, 다음 요청이 그 값을 써 버려요.9.2 (v4.0)8.1

PHP 보안팀은 웹 요청을 받는 모든 PHP 가 위험하다고 했어요. 그중 Apache mod_php 가 가장 위험하다고 적었어요. 앱 코드가 돌기도 전에 공격이 시작되는 사례가 확인됐기 때문이에요. 공격 방법은 이 글에서 다루지 않아요. 지킬 일만 정리해요.

"PHP2Shell"이라는 이름은 처음 찾아낸 Wiz Research 가 10월 21일 공개한 글 제목에서 왔어요. 캐나다 사이버보안센터도 이 이름으로 부르고 있어요.

8월 19일 · 24일Wiz 가 첫 결함을 찾고 PHP 보안팀에 알림(Wiz 발표 기준)
10월 20일php.net 이 "다음 날 긴급 보안 릴리스" 예고 · KISA 가 밝힌 정보 유출일
10월 21일8.5.12·8.4.27·8.3.36·8.2.35 공개, 7.4·8.0·8.1 소스 패치 공개 · KISA 업데이트 권고
10월 22일KISA 기업 대응 수칙 · 과기정통부 민간 사이버위기 경보 '주의'로 상향(12시)
10월 23일별개 취약점 CVE-2026-115560 안내 — 10/21 패치로는 안 고쳐짐, 드문 설정에서만 해당
10월 26일미국 CISA, 두 CVE 를 '실제 악용이 확인된 취약점' 목록에 등록(연방기관 조치 기한 10/29)
php.net 2026년 10월 21일 보안 공지 — 8.5.12, 8.4.27, 8.3.36, 8.2.35 가 두 취약점을 고쳤다는 문장과 PHP 8.1 이하 백포트 안내
php.net 공지 원문(2026-10-27 캡처). ① 고친 버전 4개 ② 8.1 이하는 프로젝트 업데이트가 끝났지만 7.4·8.0·8.1 용 최소 소스 패치를 따로 냈다는 문장

몇 버전이면 안전한가요?

같은 계열 안에서 아래 번호 이상이면 두 취약점이 고쳐진 버전이에요. 계열을 바꾸라는 뜻이 아니에요. 8.3 을 쓰면 8.3.36 으로 올리면 돼요.

지금 쓰는 계열고친 버전할 일보안 지원 끝
8.58.5.12 이상바로 업데이트. 8.5 는 fatal_error_backtraces 경로도 있었어요2029-12-31
8.48.4.27 이상바로 업데이트2028-12-31
8.38.3.36 이상바로 업데이트2027-12-31
8.28.2.35 이상바로 업데이트하고, 8.3 이상으로 옮길 계획 세우기2026-12-31
8.1 · 8.0 · 7.4PHP 프로젝트 정식판 없음배포판·호스팅사·장기지원 업체의 백포트 패치를 먼저 받고, 직접 빌드하면 PHP 보안팀 소스 패치 적용 → 지원 버전으로 옮길 계획이미 끝남
7.3 이하정식판·공식 소스 패치 없음호스팅사 완화 조치 여부 확인, 서둘러 업그레이드. 그 전까지 앞단 차단·임시 설정이미 끝남

8.1 이하를 두고 "패치가 없다"고 쓴 글이 많아요. 정확히는 PHP 프로젝트가 새 정식판을 내지 않을 뿐이에요. 우분투 22.04 의 PHP 8.1 패키지나 카페24 의 7.4·8.1 서비스처럼 고친 판이 이미 나온 곳이 있어요. 내 서버가 어디서 PHP 를 받았는지가 답을 정해요.

PHP 계열별 남은 보안 지원 기간2026-10-27 기준 · php.net 지원 버전 표 · 길수록 오래 패치를 받아요
8.1 이하이미 끝남8.2약 2개월8.3약 14개월8.4약 26개월8.5약 38개월

8.2 는 이번에 고친 판(8.2.35)을 받아도 2026년 12월 31일에 지원이 끝나요. KISA 도 8.3 이상으로 옮기라고 권했어요.

표로 보기
계열보안 지원 끝남은 기간(2026-10-27 기준)
8.12025-12-31끝남
8.22026-12-31약 2개월
8.32027-12-31약 14개월
8.42028-12-31약 26개월
8.52029-12-31약 38개월

내 PHP 버전은 어떻게 확인하나요? — 3가지

방법어디서이런 분께주의
① 호스팅 관리 화면호스팅사 '나의 서비스 관리'·PHP 설정 메뉴공유 웹호스팅·쇼핑몰 플랫폼계열(8.3)만 보이고 세부 번호는 안 보일 수 있어요 → 호스팅사 공지로 패치 여부 확인
② SSH 명령서버 터미널가상서버·서버 직접 운영명령줄(CLI) PHP 와 웹이 쓰는 PHP 가 다를 수 있어요
③ phpinfo·버전 출력 파일웹 브라우저웹이 실제로 쓰는 버전을 보고 싶을 때확인하자마자 파일을 지우세요. 남겨 두면 공격자에게 설정을 다 보여 줘요

② SSH 에서 확인하는 명령

직접 해 봤어요. 이 PC 의 도커로 공식 PHP 이미지의 패치 전(8.3.35)·후(8.3.36) 태그를 127.0.0.1 에서만 띄우고 같은 명령을 쳤어요(2026-10-27 13:17).

$ docker run --rm php:8.3.35-cli php -v
PHP 8.3.35 (cli) (built: Oct 21 2026 00:32:41) (NTS)

$ docker run --rm php:8.3.36-cli php -v
PHP 8.3.36 (cli) (built: Oct 21 2026 15:57:19) (NTS)

서버에서는 아래 명령을 차례로 쳐 보세요. php-fpm 은 배포판마다 이름이 php-fpm8.3·php8.4-fpm 처럼 달라요.

php -v                       # 명령줄 PHP 버전
php-fpm8.3 -v                # PHP-FPM 버전 (배포판 이름에 맞게)
apache2ctl -M | grep -i php  # Apache 가 mod_php 를 쓰는지 (php_module 이 보이면 mod_php)
php -m                       # 켜진 확장 목록

③ 웹이 쓰는 버전을 브라우저로 확인

워드프레스는 관리자 화면 도구 → 사이트 건강 → 정보 → 서버에 PHP 버전이 나와요. 그누보드5 는 관리자 환경설정 → phpinfo() 메뉴가 있어요. 둘 다 없으면 이름을 알아보기 어렵게 지은 임시 파일을 하나 올려 확인하고 바로 지워요.

<?php echo PHP_VERSION, ' ', php_sapi_name();   // 예: ver-check-7f3a.php → 확인 후 즉시 삭제

도커 Apache 컨테이너에 이 파일을 올려 열어 보니 8.3.36 apache2handler 가 나왔어요. 뒤쪽 말은 PHP 가 붙은 방식이에요(apache2handler = mod_php, fpm-fcgi = PHP-FPM). phpinfo() 파일을 써도 되지만 설정 전부가 드러나니 더 서둘러 지워야 해요.

버전 숫자만 보면 틀리는 두 경우

첫째, 배포판 패키지는 번호가 그대로일 수 있어요. 우분투 24.04 컨테이너에 배포판 PHP 를 깔아 보니 php -v 는 8.3.6 이었어요. 8.3.36 보다 한참 낮아 보이지만, 패키지 번호 끝이 .13 이고 변경 이력에 두 CVE 가 적혀 있었어요. 고쳐진 상태예요.

우분투 24.04 컨테이너 터미널 — php -v 는 8.3.6, dpkg-query 는 8.3.6-0ubuntu0.24.04.13, 변경 이력에 CVE-2026-109618 과 109619
직접 실행한 출력(2026-10-27 13:19). 주황 상자가 '고쳐졌다'는 증거예요 — 패키지 번호와 변경 이력
배포판(기본 PHP)고친 패키지 번호확인한 곳
Debian 13 (php8.4)8.4.27-1~deb13u1 · php -v 도 8.4.27DSA-6574-1 · 컨테이너에 직접 설치해 확인
Debian 12 (php8.2)8.2.35-1~deb12u1DLA-4848-1 (데비안 보안 추적기)
Ubuntu 24.04 (php8.3)8.3.6-0ubuntu0.24.04.13 · php -v 는 8.3.6USN-8948 · 직접 설치해 확인
Ubuntu 22.04 (php8.1)8.1.2-1ubuntu2.28USN-8948 · 직접 설치해 확인
RHEL 8 · 9 · 10RHSA 공지별 패키지(10/21~23 배포)Red Hat CVE 페이지 — 내 버전의 RHSA 번호 확인
# 데비안·우분투: 설치된 패키지 번호와 변경 이력에서 CVE 찾기
dpkg-query -W 'php*-cli' 'php*-fpm' 'libapache2-mod-php*'
zgrep -n 'CVE-2026-10961[89]' /usr/share/doc/php8.3-cli/changelog.Debian.gz

# 레드햇 계열(Rocky·Alma 포함): 변경 이력에서 CVE 찾기
rpm -q --changelog php-cli | grep -E 'CVE-2026-10961[89]'

둘째, 버전을 못 박은 도커 태그는 다시 받아도 그대로예요. 공식 워드프레스 이미지로 확인했어요. 8월에 만들어진 wordpress:7.0.2-php8.4-apache 는 오늘 다시 받아도 PHP 8.4.24(패치 전)였어요. 10월 21일 이후 빌드된 wordpress:7.1.3-php8.4-apache 는 8.4.27 이었어요. php:8.4-apache 처럼 계열만 적은 태그는 다시 받으면 새 이미지가 와요. 반대로 공식 php:8.1-cli 이미지는 2025년 12월 빌드에 멈춰 있어 이번 수정이 없어요.

$ docker run --rm --entrypoint php wordpress:7.0.2-php8.4-apache -r 'echo PHP_VERSION;'
8.4.24     ← 패치 전 (이미지 생성 2026-08-05)
$ docker run --rm --entrypoint php wordpress:7.1.3-php8.4-apache -r 'echo PHP_VERSION;'
8.4.27     ← 패치 (이미지 생성 2026-10-21)
$ docker run --rm php:8.1-cli php -v | head -1
PHP 8.1.34 (cli) (built: Dec 29 2025 23:35:21) (NTS)   ← 이번 수정 없음
KISA 보호나라 PHP2Shell 기업 보안 대응 수칙 — 해결 버전 문장과 php -v 버전이 웹 서비스 버전과 다를 수 있고 배포판 패키지는 버전 번호가 바뀌지 않을 수 있다는 안내
KISA 대응 수칙 원문(2026-10-22 게시, 2026-10-27 캡처). ① 해결 버전 ② 명령줄 버전과 웹 버전이 다를 수 있고, 배포판 패키지는 번호가 안 바뀔 수 있어 변경 이력으로 확인하라는 안내
가상서버 하나 만들어 보기
분 단위 과금 · 지우면 바로 멈춰요 · 가입하면 2,000원 크레딧
서버 만들기 →요금표

내 환경에서는 무엇을 하면 되나요?

환경PHP 는 누가 관리하나지금 할 일
공유 웹호스팅·쇼핑몰 플랫폼호스팅사호스팅사 공지에서 내 상품·버전에 패치가 들어갔는지 확인. 없으면 적용 일정과 근거(패키지 번호)를 문의
가상서버·서버 직접 운영나스냅샷 → 배포판 보안 업데이트 → PHP-FPM·Apache 재시작 → 패키지 번호·변경 이력 확인
도커 이미지로 띄운 앱나(이미지 선택)패치된 태그로 바꾸거나 다시 빌드 → 다시 배포 → 컨테이너 안 버전 확인
워드프레스·그누보드PHP 는 위 셋 중 하나CMS 업데이트와 별개. 아래 PHP 를 올려야 해요. CMS·플러그인 업데이트도 함께
외주로 만든 사이트·안 쓰는 옛 사이트확인 필요KISA 는 이벤트·테스트 서버, 관리자 페이지까지 실제로 도는 서버 기준으로 찾으라고 했어요

호스팅을 쓰면 무엇을 물어보나요?

예를 들어 카페24 는 10월 23일 종합 공지에서 "8.2 이상은 패치 완료, 7.4~8.1 도 반영 완료, 7.3 이하는 완화 조치"라고 알렸어요. 7.4·8.1 에는 7.4.33p2·8.1.34p2 처럼 이름 뒤에 표시가 붙은 판을 넣었어요. 같은 공지에서 서버호스팅·가상서버처럼 직접 관리하는 서버는 조치 대상이 아니니 KISA 수칙대로 직접 하라고 했어요. 호스팅사가 다르면 문장도 다르니, 내 호스팅사 공지를 확인하세요.

호스팅사에 보낼 질문 3줄

  • 제 계정(도메인 ○○)의 PHP 버전과, CVE-2026-109618·109619 패치가 들어간 날짜를 알려 주세요.
  • 패치 뒤 웹 서비스(PHP-FPM 또는 Apache)가 다시 시작됐나요?
  • 8.1 이하라면 어떤 패치(백포트·완화 조치)를 넣었고, 지원 버전으로 옮기는 방법은 무엇인가요?

워드프레스만 업데이트하면 되나요?

아니요. 이번 문제는 워드프레스 아래에 깔린 PHP 에 있어요. 워드프레스·테마·플러그인을 다 올려도 PHP 가 그대로면 해결되지 않아요. 참고로 워드프레스는 PHP 8.3 이상을 권장해요. 8.2 이하라면 이번 기회에 같이 옮길 계획을 세우세요.

퓨쳐인프라 서버에서는 이렇게 하세요

퓨쳐인프라에서 PHP 를 돌리는 방법은 크게 둘이에요. 가상서버에 직접 깐 경우와, 앱 호스팅에 도커 이미지로 올린 경우예요.

가상서버(Debian 13 · Ubuntu)

  1. 스냅샷부터 찍어요. 콘솔에서 서버를 고르고 스냅샷을 만들어요. 업데이트 뒤 문제가 생기면 그 시점으로 돌아갈 수 있어요. 스냅샷은 무료예요.
  2. SSH 로 들어가요. 만들 때 등록한 SSH 키로 접속해요. root 가 아니면 아래 명령 앞에 sudo 를 붙여요.
  3. 배포판 보안 업데이트를 받아요. 데비안·우분투는 배포판이 고친 PHP 패키지를 내놓았어요.
  4. PHP 를 다시 시작해요. 쓰는 쪽만 다시 시작하면 돼요(PHP-FPM 이면 fpm, mod_php 면 Apache).
  5. 고쳐졌는지 확인해요. 위 표의 패키지 번호와 비교하고, 변경 이력에서 CVE 를 찾아요.
apt update
apt list --upgradable 2>/dev/null | grep -i php     # 올라갈 PHP 패키지 보기
apt upgrade                                          # 보안 업데이트 적용

systemctl restart php8.4-fpm     # Debian 13 기본 PHP-FPM (우분투 24.04 는 php8.3-fpm)
systemctl restart apache2        # Apache mod_php 를 쓰면

dpkg-query -W 'php*-fpm' 'php*-cli'               # 패키지 번호 확인
apt changelog php8.4-cli | head -20                # 맨 위 항목에 CVE-2026-109618 이 보이면 고쳐진 것

Debian 13 은 배포판 기본 PHP 가 8.4 예요. 직접 깔아 보니 고친 패키지(8.4.27-1~deb13u1)에서 php -v 도 8.4.27 로 나왔어요. 우분투 24.04 는 앞에서 본 대로 8.3.6 으로 보여도 패키지 번호 끝이 .13 이면 고쳐진 거예요.

앱 호스팅(도커 이미지로 올린 PHP 앱·원클릭 WordPress)

  1. 쓰는 이미지 태그를 확인해요. php:8.3.35-apache 나 wordpress:7.0.2-php8.4-apache 처럼 숫자를 못 박은 태그는 그 안의 PHP 도 그대로예요.
  2. 패치된 태그로 바꿔요. 예: php:8.3.36-apache, wordpress:7.1.3-php8.4-apache. 직접 만든 이미지라면 베이스 이미지를 올려 다시 빌드해요.
  3. 앱 화면에서 이미지 태그를 바꿔 다시 배포해요. 다시 배포하면 이미지를 새로 받아요. 앱 문서에 적힌 대로 볼륨 데이터는 다시 배포해도 남아요.
  4. 바뀐 버전을 확인해요. 앱 주소를 열어 다음 절의 방법(응답 헤더·임시 확인 파일)으로 웹이 쓰는 PHP 버전을 봐요.

API 로 할 때는 앱 문서의 배포 요청에 새 태그를 넣으면 돼요. 앱 문서는 latest 대신 정확한 태그를 쓰라고 권해요. 언제 무엇이 바뀌었는지 알 수 있고, 문제가 생기면 이전 태그로 되돌릴 수 있기 때문이에요.

POST /v1/apps/<앱 id>/deploy
{ "image": "wordpress:7.1.3-php8.4-apache" }

업데이트한 뒤 제대로 됐는지 어떻게 확인하나요?

가장 흔한 실수는 재시작을 안 한 것이에요. 패키지를 올려도 이미 떠 있는 PHP 프로세스는 옛 코드 그대로예요. KISA 도 재시작하지 않으면 여전히 취약하다고 적었어요.

확인할 것명령·방법됐다는 신호
명령줄 PHPphp -v · dpkg-query -W고친 번호 이상, 또는 배포판 고친 패키지 번호
PHP-FPMphp-fpm8.4 -v · systemctl status php8.4-fpm버전이 같고, 시작 시각이 업데이트 뒤
웹이 쓰는 PHP임시 확인 파일 · 사이트 건강 · phpinfo()같은 번호 (확인 뒤 파일 삭제)
응답 헤더curl -sI https://내도메인/X-Powered-By 가 보이면 번호 확인 — 다만 운영에선 숨기는 게 좋아요
도커docker exec <컨테이너> php -v새 태그의 번호

도커로 실제 헤더를 찍어 봤어요. 공식 Apache 이미지는 기본 설정이라 PHP 번호가 그대로 보였어요. 아래 「하드닝 체크리스트」의 설정을 넣자 그 줄이 사라졌어요.

$ curl -sI http://127.0.0.1:18080/        # 기본 설정
HTTP/1.1 200 OK
Server: Apache/2.4.69 (Debian)
X-Powered-By: PHP/8.3.36

$ curl -sI http://127.0.0.1:18181/        # expose_php = Off 를 넣은 컨테이너
HTTP/1.1 200 OK
Server: Apache/2.4.69 (Debian)

바로 못 올리면 임시로 무엇을 하나요?

PHP 보안팀은 아래 설정이 일부 공격 경로만 줄일 뿐, 설치가 안전해지지는 않는다고 못 박았어요. 업데이트 날짜를 잡는 동안만 쓰는 방법이에요.

설정값어디에막는 것·주의
session.upload_progress.enabled0php.ini · FPM pool (ini_set·.user.ini 는 안 됨)109619 의 확인된 세션 경로. 10/23 의 CVE-2026-115560 도 이 설정으로 막혀요
memory_limit-1FPM pool 의 php_admin_value 처럼 앱이 못 바꾸는 곳109618 의 메모리 한도 경로. 컨테이너·cgroup 메모리 한도를 같이 두세요
post_max_size업로드 없으면 8M, 있으면 32Mphp.iniupload_max_filesize 는 이보다 작게
fatal_error_backtraces0PHP 8.5 만8.5 의 확인된 경로 하나만 막아요
앞단 요청 제한요청 크기·필드 수·업로드(multipart) 제한웹 방화벽·웹서버·프록시업로드가 필요 없는 서비스는 multipart 요청 차단

설정을 바꾼 뒤에는 PHP 프로세스를 전부 다시 시작해야 해요. RLIMIT_AS 같은 메모리 제한은 오히려 문제 경로를 부를 수 있어 쓰지 말라고 했어요. 이것도 어렵다면 KISA 는 업데이트 전까지 외부 접속을 막거나 서비스를 잠시 멈추는 방안까지 권했어요.

해킹 흔적은 어떻게 보나요? — 웹셸 점검 기초

업데이트는 앞으로의 공격을 막을 뿐이에요. 그 전에 들어온 흔적은 따로 찾아야 해요. KISA 는 최소 10월 20일 이후 기록 전체를 보라고 했어요. 아래는 지키는 쪽에서 쓰는 기초 명령이에요.

도커 컨테이너 안에 무해한 한 줄짜리 가짜 파일 4개(정상 PHP 2개는 9월 날짜, 업로드 폴더의 PHP 1개는 10월 22일 날짜, 사진 1개)를 만들고 돌려 봤어요.

# ① 10월 20일 이후 새로 생기거나 바뀐 PHP 파일
$ find /tmp/site -type f -name "*.php" -newermt "2026-10-20" -printf "%TY-%Tm-%Td %TH:%TM  %p\n"
2026-10-22 03:14  /tmp/site/data/uploads/thumb.php

# ② 업로드 폴더 안의 PHP 파일 (원래 있으면 안 되는 곳)
$ find /tmp/site -path "*upload*" -type f -iname "*.php*"
/tmp/site/data/uploads/thumb.php

# ③ 웹 서버 계정이 띄운 셸·다운로드 프로세스
$ ps -eo user,pid,args | awk '$1=="www-data"' | grep -E '(^| )(sh|bash|curl|wget)( |$)'
(없음)

실제 서버에서는 /tmp/site 자리에 웹 폴더(예: /var/www)를 넣어요. 플러그인 업데이트처럼 정상으로 바뀐 파일도 같이 나오니, 목록을 보고 하나씩 확인해요. 시간 정보는 공격자가 바꿀 수도 있어서, 안 나왔다고 안심하면 안 돼요.

더 볼 것 (KISA 수칙 5)어디서
유난히 큰 요청 뒤에 반복된 HTTP 500 오류웹 접근 기록 (응답 코드 칸 집계)
원인 모를 PHP 재시작·비정상 종료(segfault)·메모리 부족 오류PHP-FPM·웹서버 오류 기록, journalctl
홈페이지·결제 페이지에 몰래 붙은 외부 스크립트페이지 소스, 테마 파일
웹 서버가 모르는 외부 주소로 새로 연결한 흔적방화벽·연결 기록
# 접근 기록에서 응답 코드별 개수 (Apache·nginx 기본 형식은 9번째 칸)
awk '{print $9}' /var/log/apache2/access.log | sort | uniq -c | sort -rn

비밀번호도 바꾸세요. 이번 취약점은 서버 메모리에 든 비밀번호·토큰·API 키를 새게 할 수 있어요. 업데이트 전까지 인터넷에 열려 있던 서버라면 DB 비밀번호, 외부 서비스 키, 관리자 비밀번호를 바꾸는 게 좋아요. 흔적이 나왔다면 반드시 바꿔요.

흔적을 찾았다면 — 순서가 중요해요 (KISA 수칙 7)

  • ① 서버를 끄거나 재시작하지 말고, 외부 접속만 끊어요. 재시작하면 메모리 속 흔적이 사라져요.
  • ② 보호나라(boho.or.kr)의 침해사고 신고로 알려요.
  • ③ 기록·실행 중인 프로세스 목록·네트워크 연결을 먼저 보존해요.
  • ④ 그다음에 업데이트·재시작, 웹셸 제거, 비밀번호 교체를 해요.

앞으로 무엇을 해 두면 좋을까요? — 하드닝 체크리스트

아래는 우리가 PHP 서버를 운영하며 실제로 적용한 구성이에요. 이번 같은 엔진 결함을 설정으로 막을 수는 없어요. 대신 뚫렸을 때 피해를 줄이고, 빨리 알아채게 해 줘요.

항목적용한 구성왜
자동 보안 업데이트unattended-upgrades 로 매일 보안 업데이트 적용배포판 패치를 놓치지 않게. 다만 웹 서비스 재시작은 따로 확인
PHP 설정 하드닝아래 ini 를 웹 PHP 에만 적용(명령줄 PHP 는 제외)정기 작업·관리 스크립트가 깨지지 않게
웹 방화벽ModSecurity + OWASP CRS 를 먼저 '탐지만' 모드로 켜고, 기록을 본 뒤 차단으로처음부터 차단하면 정상 요청이 막혀 사이트가 깨질 수 있어요
악성 파일 감시ClamAV + maldet 로 웹 폴더 실시간 감시, 찾으면 격리(자동 치료는 끔)업로드 폴더에 생긴 웹셸을 빨리 알아채게
SSH 보호fail2ban — 10분에 5번 틀리면 1시간 차단비밀번호 대입 공격 줄이기
DB 접근DB 는 127.0.0.1 에서만 접속웹이 뚫려도 DB 를 밖에서 직접 못 건드리게
정보 숨기기Apache ServerTokens Prod · ServerSignature Off · expose_php = Off버전을 보고 고르는 자동 공격을 덜 받게
관리 화면 보호관리 페이지는 별도 비밀번호(Basic 인증)를 한 겹 더, 프로그램은 127.0.0.1 에서만 듣게관리 화면이 가장 먼저 노려져요

웹 방화벽 기록을 보면 .env·.git 같은 설정 파일을 찾는 자동 요청이 꾸준히 들어와요. 웹 폴더 안에 이런 파일을 두지 말고, 웹서버에서 점(.)으로 시작하는 경로를 막아 두면 좋아요.

PHP 하드닝 ini 예시예요. 사이트가 쓰는 함수가 있으면 disable_functions 에서 빼야 해요. 적용 전에는 스냅샷이나 백업을 먼저 해요.

; /etc/php/8.4/fpm/conf.d/99-hardening.ini  (경로는 버전·방식에 맞게)
expose_php = Off
display_errors = Off
log_errors = On
allow_url_include = Off
disable_functions = exec,passthru,shell_exec,system,proc_open,popen,pcntl_exec,show_source
open_basedir = /var/www:/tmp
session.cookie_httponly = 1
session.use_strict_mode = 1
session.upload_progress.enabled = 0

넣기 전과 뒤를 도커로 비교했어요. 공식 PHP 이미지는 php.ini 가 없는 기본값이라, 점검한 9개 중 2개만 권장값이었어요.

$ php -i | grep -E "^(expose_php|display_errors|disable_functions|open_basedir|session.upload_progress.enabled) "
# 넣기 전 (php:8.3.36-cli 기본)          # 넣은 뒤
expose_php => On                          expose_php => Off
display_errors => STDOUT                  display_errors => Off
disable_functions => no value             disable_functions => exec,passthru,shell_exec,...
open_basedir => no value                  open_basedir => /var/www:/tmp
session.upload_progress.enabled => On     session.upload_progress.enabled => Off
점검 항목권장값공식 이미지 기본값하드닝 뒤
expose_phpOffOnOff
display_errorsOffSTDOUTOff
allow_url_includeOffOffOff
disable_functions위험 함수 지정없음8개 지정
open_basedir웹 폴더로 제한없음/var/www:/tmp
session.cookie_httponlyOnOffOn
session.use_strict_modeOnOffOn
session.upload_progress.enabledOff (이번 권고)OnOff
post_max_size8M 이하(업로드 없을 때)8M8M

자주 묻는 질문

실제로 공격이 있나요?

KISA 는 패치 전에 정보가 새어 나갔고 해외 보안업체 중심으로 공격 시도가 보고된다고 했어요. 미국 CISA 는 10월 26일 두 CVE 를 '실제 악용이 확인된 취약점' 목록에 올렸어요. 캐나다 사이버보안센터는 10월 23일 기준 공개된 시험 코드는 있으나 활발한 악용은 확인 안 됐다고 적었어요. 기관마다 확인 시점이 달라요.

'PHP2Shell' 이름은 누가 붙였나요?

처음 찾아낸 Wiz Research 가 10월 21일 공개한 글 제목과 소개 사이트(php2shell.com)에서 쓴 이름이에요. 공식 CVE 이름은 아니고, 정부 기관들도 이 별칭을 함께 쓰고 있어요.

인터넷에 도는 점검 스크립트·공격 코드로 확인해 봐도 되나요?

권하지 않아요. KISA 는 출처가 불분명한 공격 코드 중에 악성코드가 숨은 가짜가 많다며, 버전 확인과 기록 점검으로 판단하라고 했어요. 분석이 꼭 필요하면 업무망과 분리된 곳에서만 하세요.

10월 23일에 또 나온 CVE-2026-115560 은 뭔가요?

세션 처리의 다른 결함이에요. 설정 파일에서 session.serialize_handler 를 php_binary 나 php_serialize 로 두고, 코드에서 ini_set() 으로 php 로 바꾸는 드문 경우에만 해당해요. 10/21 패치로는 안 고쳐지고 다음 정기 릴리스에서 고쳐질 예정이에요. session.upload_progress.enabled=0 을 이미 넣었다면 추가로 할 일은 없어요.

업데이트하면 사이트가 깨지지 않나요?

8.3.35 → 8.3.36 처럼 같은 계열 안에서 올리는 건 보안 수정 릴리스예요. 8.1 → 8.3 처럼 계열을 바꾸면 코드가 안 맞을 수 있어요. 어느 쪽이든 스냅샷이나 백업을 먼저 하고, 로그인·글쓰기·결제 같은 주요 기능을 확인하세요.

8.1 을 쓰는데 당장 8.3 으로 못 옮겨요.

먼저 배포판이나 호스팅사가 낸 8.1 백포트 패치를 받으세요. 직접 빌드한다면 PHP 보안팀이 공개한 8.1 용 소스 패치를 쓸 수 있어요. 그다음 8.3 이상으로 옮길 날짜를 정해요. 그 사이에는 「바로 못 올리면」 절의 임시 설정과 앞단 제한을 겹쳐 두세요.

PHP 8.6 은요?

8.6 은 아직 정식판이 아니에요. 10월 21일에 나온 8.6.0 RC4 에 수정이 들어갔지만, php.net 은 운영 서버에 쓰지 말라고 했어요.

이럴 땐 이렇게

상황먼저 할 일
호스팅에 맡긴 홈페이지호스팅사 공지 확인 → 질문 3줄로 문의
가상서버에 직접 깐 PHP스냅샷 → apt upgrade → 재시작 → 패키지 번호·변경 이력
도커 이미지로 올린 앱패치된 태그로 바꿔 다시 배포 → 웹 버전 확인
8.1 이하백포트 패치 확인 → 임시 설정 → 8.3 이상 이전 날짜 잡기
노출됐던 서버10/20 이후 기록·웹 폴더 점검 → 비밀번호·키 교체

함께 보면 좋은 글 — 서버 스냅샷과 백업, 뭐가 달라요? · 워드프레스 호스팅 비교 · 도커 호스팅 비용

업데이트 전에 스냅샷부터

가상서버 살펴보기

퓨쳐인프라 가상서버는 Debian·Ubuntu 를 고를 수 있고, 스냅샷은 무료예요(요금·조건은 가상서버 페이지 기준).

이 글의 사실은 어디서 왔나요?

이 글의 숫자 출처

이 글에 대하여
  • 작성: 서순명(솔리드그루 이사 · 퓨쳐인프라 — 국내 IDC 에서 클라우드 서버·앱 호스팅·AI API 를 운영) · 작성일 2026년 10월 27일
  • 운영사: 솔리드그루 · 사업자등록번호 875-44-00335 · 서울특별시 구로구 디지털로29길 38, 7층 707호 · 전화 02-6933-6229 · support@futureinfra.ai · 고객센터 · 이용약관
  • 한계: 취약점을 직접 재현하지 않았고, 버전·설정·패키지 확인만 했어요. 점검 명령은 기초 단계라 '아무것도 안 나왔다'가 '안전하다'를 뜻하지 않아요. 배포판 패키지 번호는 쓴 날 각 배포판 공지 기준이고, 호스팅사 조치는 예로 든 한 곳의 공지만 옮겼어요. 새 공지가 나오면 내용이 바뀔 수 있어요.
  • 이해관계: 퓨쳐인프라는 가상서버·앱 호스팅을 파는 회사예요. 글 중간의 '퓨쳐인프라 서버에서는' 절과 끝의 버튼이 우리 서비스 안내예요. PHP 프로젝트·Wiz·카페24 등 글에 나온 곳과는 관계가 없어요.

연관 서비스

클라우드 서버 살펴보기 →국내 IDC 가상서버 · 분 단위 과금 · 스냅샷·방화벽 셀프 관리요금 확인하기 →부가세 포함 · 분 단위 · 월 구독 없음

연관 글

클라우드플레어 장애 확인·대비법 2026, 사후 보고서 5건 정리

클라우드플레어가 터졌는지 1분 안에 가리는 법(상태 페이지·오류 화면·nslookup·curl), 2025~2026년 큰 장애 5건의 공식 사후 보고서, 같이 멈추지 않게 미리 해 둘 대비책을 서울에서 직접 잰 결과와 함께 정리했어요.

포트폴리오 사이트 만들기 2026 — 직군별 구성, 노션·깃허브·빌더 비교, 1년 비용

개발자·디자이너·기획자 포트폴리오에 무엇을 넣을지 정리하고, 직군별 예시 3개를 직접 만들어 봤어요. 작업 사진 6장을 WebP 로 바꾸니 8.8MB 가 92KB 로 줄었어요. 노션·깃허브 페이지·프레이머·어도비 포트폴리오·윅스·직접 만들기를 2026-11-03 공식 요금으로 비교하고, 내 도메인 연결 값까지 정리했어요.

무료 웹호스팅·무료 홈페이지 추천 2026 — 10곳 광고·트래픽·상업적 이용 비교, 서울 속도 실측

깃허브 페이지·클라우드플레어·넷리파이·버셀·파이어베이스·렌더·닷홈·인피니티프리와 윅스·워드프레스닷컴 무료 요금제를 2026-11-03 공식 화면으로 비교했어요. 광고·주소, 트래픽 한도(1MB 페이지면 몇 명), 넘으면 어떻게 되는지, 장사에 써도 되는지를 원문으로 정리하고 서울에서 응답 속도를 직접 쟀어요.

국내 클라우드 서버 비교 2026 — 4코어·8GB 월 5.5만~17만 원, 6곳 요금표

네이버클라우드·KT클라우드·NHN클라우드·가비아·iwinv·퓨쳐인프라(자사) 6곳을 같은 사양, 부가세 포함으로 맞춰 비교했어요. 2026-11-03 공식 요금표로 1코어·2코어·4코어 서버의 한 달 값과 트래픽 초과 요금까지 계산했어요.

Vercel 사용법·요금 2026 — 무료 Hobby 한도로 한 달 몇 명까지 버틸까

버셀(Vercel) 무료 Hobby 한도(요청 100만 번·전송 100GB)가 실제 페이지 뷰로 얼마인지 데모 사이트 7곳 무게로 계산하고, 서울에서 속도를 재 봤어요. 2026년 11월 공식 요금(Pro $20·크레딧·정액 CDN), 가입 없이 배포하는 법, 한도를 넘으면 생기는 일, 자주 막히는 곳을 정리했어요.

많이 본 글

  1. 블로그 무료 도메인 사이트 추천 2026 — 내도메인.한국·DuckDNS 발급 방법 내도메인.한국·DuckDNS 처럼 계속 무료인 주소 10곳을 11월 3일 서울에서 다시 재고(6곳 6ms 안), 발급 순서·구글·네이버 무료 주소·'첫해 무료'의 2년째 값까지 정리했어요.
  2. 블로그 도메인 구매 사이트 추천 2026 — 가비아·후이즈 등 15곳 갱신·이전비 비교 같은 .co.kr 도 등록업체 15곳의 3년 값이 3.8만~8.6만 원이에요(11월 3일 KRNIC 표). 갱신가·이전비·해외 업체 조건, 11월 인상 뒤 가비아 실제 화면, 구매처 확인과 기관이전까지 정리했어요.
  3. 블로그 클로드 MCP·Gemini MCP 연동 방법 2026, MCP 서버 9곳 클로드 MCP(데스크톱·Claude Code)와 Gemini MCP 연동(Gemini CLI·안티그래비티·Gemini 앱·API) 등 9곳의 MCP 서버 연결법을 공식 문서로 정리했어요. 원격 57ms 실측과 오류 해결까지.
  4. 블로그 Gemini 3.9 Flash 나왔나요? 지금 최신은 3.8 Flash — 3.7과 직접 잰 속도·비용 2026년 9월 22일 기준 Gemini 3.9 Flash는 미출시입니다. 최신 3.8 Flash의 사양·가격(2027년 2배 인상)과, 3.7 Flash와 같은 과제로 직접 잰 속도·비용·JSON 형식 준수 차이를 정리했습니다.
  5. 블로그 서버비 한 달 얼마? 방문자 10만 명도 월 3만 2천 원(2026 계산) 월 방문자 1천·1만 명은 1만 4천 원, 10만 명은 3만 2천 원이에요. 요금제별 트래픽 기본 제공량까지 넣어 다시 계산하고 AWS·카페24·가비아·네이버클라우드 값과 숨은 비용을 비교했어요(2026-10-26 확인).

댓글 0

  1. 첫 댓글을 남겨 주세요.

← 목록으로