지니온

PHP2Shell·Node2Shell·Fortinet 긴급 패치 — 10월 넷째 주 취약점 정리와 점검 순서

지니온 기술팀출처: PHP 보안 공지(2026-10-21·23), Node.js 보안 릴리스(2026-10-21), Fortinet 발표(2026-10-22), CISA KEV(2026-10-23·26), KISA 보안공지 2574~2582

10월 21일부터 일주일 사이에 PHP, Node.js, Fortinet, Nextcloud 구성요소에서 인증 없이 원격 코드 실행이 가능한 취약점이 잇달아 공개됐고, PHP 두 건은 이미 실제 공격에 쓰이고 있습니다. 인터넷에 열린 자산부터 버전을 확인하고, 패치가 없는 항목은 임시 조치를 먼저 적용해야 합니다.

무엇이 벌어졌나

2026년 10월 21일부터 26일 사이에 웹 서비스의 바탕이 되는 런타임과 네트워크 장비에서 인증 없이 원격 코드 실행(RCE)이 가능한 취약점이 연달아 공개됐습니다. KISA 보호나라에는 같은 기간에 PHP(3건), Node.js, Fortinet, Laravel, GitLab, Oracle, Google 제품 공지가 올라왔습니다.

대상식별자내용상태
PHP 5.4 ~ 8.5.11CVE-2026-109618, CVE-2026-109619 (통칭 PHP2Shell)메모리 부족·치명적 오류 처리 중 longjmp()로 제어가 돌아오면서 요청 메모리가 미초기화·해제 상태로 남아, 다음 요청에서 코드 실행으로 이어짐. CVSS 4.0 9.210/21 패치 8.5.12 / 8.4.27 / 8.3.36 / 8.2.35. 10/26 CISA KEV 등재(실제 악용 확인). 8.1 이하는 지원 종료라 패치 없음
PHP (세션 업로드 진행 기능)CVE-2026-115560PHP2Shell과 별개의 세션 처리 RCE. session.serialize_handler를 런타임에 바꾸는 드문 구성에서만 성립10/23 공개, 아직 패치 없음. 임시 조치 session.upload_progress.enabled = Off. KISA 10/24 임시 조치 권고
Node.js 22.x / 24.x / 26.xCVE-2026-111497 (통칭 Node2Shell) 외 9건내장 Brotli 디코더의 범위 밖 쓰기. 공격자가 준 압축 데이터를 node:zlib으로 풀면 크래시·메모리 노출·RCE 가능. 같은 릴리스에 TLS 호스트명 검증 우회 2건(CVE-2026-105483, CVE-2026-106069), DNS 조회 오류(CVE-2026-105482) 포함10/21 패치 22.23.4 / 24.22.1 / 26.12.1. 완화책 없음, 20.x 이하는 지원 종료. 악용 보고 없음
Fortinet FortiOS·FortiManager·FortiAnalyzerCVE 미공개 (11/10 PSIRT 발표 예정)심각·고위험 취약점 일괄 수정. AI 보조 테스트로 찾은 결함 포함10/22 패치 FortiOS 8.0.2 / 7.6.8 / 7.4.13 / 7.2.14. 7.0 이하는 대상 아님(지원 종료). 악용 보고 없음
Collabora Online (Nextcloud 내장 CODE 서버)CVE-2026-110447OS 명령 주입. Nextcloud 서버에 웹셸을 심는 공격에 이미 사용됨. CVSS 9.210/23 CISA KEV 등재
Arista VeloCloud Orchestrator (온프레미스)CVE-2026-114625SQL 인젝션, 읽기 전용 계정으로도 가능. CVSS 9.910/22 악용 공개, 10/23 CISA KEV 등재

PHP2Shell은 공개 당일 GitHub에 "php2shell" 이름의 저장소가 100개 가까이 생겼고, 10월 21일 허니팟에서 공격이 관측됐습니다. Node2Shell은 OpenAI가 AI 에이전트의 자율 보안 테스트 과정에서 찾아 제보한 건으로, 공개된 실증 코드는 표준 빌드에서 크래시와 제한적 메모리 노출까지만 재현됐습니다. 두 사안 모두 발견 주체와 공격 도구 양쪽에 AI가 들어가 있다는 점이 이번 주의 특징입니다.

왜 중요한가

  1. 개발자 코드가 깨끗해도 당합니다. PHP와 Node.js 모두 애플리케이션이 아니라 실행 환경 자체의 결함입니다. 프레임워크(Laravel, WordPress, Next.js 등)를 어떤 걸 쓰든, 아래 깔린 런타임 버전이 낮으면 노출됩니다. 웹 취약점 점검을 통과한 사이트도 예외가 아닙니다.
  2. 지원 종료 버전이 가장 위험합니다. PHP 8.1 이하, Node.js 20 이하, FortiOS 7.0 이하는 패치가 나오지 않습니다. 국내 중소 규모 웹 서비스에는 PHP 7.x와 FortiOS 6.x·7.0이 아직 많습니다. 이 경우 "패치"가 아니라 버전 업그레이드 또는 교체 일정이 필요합니다.
  3. PHP는 이미 공격 중입니다. CISA가 10월 26일 두 건을 KEV에 올렸고, 공개 PoC가 널려 있습니다. 패치 전에 노출돼 있던 PHP 서버는 침해 흔적 점검과 자격 증명 교체까지 해야 끝납니다. KISA 대응 수칙도 같은 순서입니다.
  4. Fortinet은 CVE가 나오기 전에 패치해야 합니다. 11월 10일 PSIRT 발표 전까지 세부 내용이 없지만, Fortinet 스스로 "인터넷 노출 장비 우선"이라고 못 박았습니다. 과거 FortiOS 취약점은 공개 후 수일 안에 대량 스캔으로 이어졌습니다.

무엇을 해야 하나

1. 확인 — 어디에 무엇이 깔려 있는지부터

대상확인 명령 / 위치안전 기준
PHPphp -v, 컨테이너는 docker exec <id> php -v. 웹 서버 모듈(mod_php)·PHP-FPM·CGI 어느 방식인지 함께 확인8.5.12 / 8.4.27 / 8.3.36 / 8.2.35 이상
PHP 세션 설정php -i | grep -E 'serialize_handler|upload_progress'session.upload_progress.enabled => Off (패치 전까지)
Node.jsnode -v, 컨테이너는 docker exec <id> node -v. n8n·Outline·Grafana·Uptime Kuma 등 Node 기반 서비스는 이미지 안의 버전을 봐야 함22.23.4 / 24.22.1 / 26.12.1 이상
FortiOSget system status 또는 GUI 대시보드8.0.2 / 7.6.8 / 7.4.13 / 7.2.14 이상
Nextcloud관리 → 앱 → Collabora Online Built-in CODE Server 버전벤더 공지의 수정 버전

Qualys를 쓰는 환경이라면 Node.js는 QID 389117(Brotli 포함 7건), 389119(TLS 우회, 24.x·26.x), 389122(26.x 전용 2건)로 바로 잡히고, 지원 종료 런타임은 QID 106287·106242(Node 18·16)로 따로 집계됩니다. CSAM 인벤토리에서 software:(name:"Node.js" or name:"PHP")로 설치 자산을 먼저 뽑으면 스캔 전에 범위를 알 수 있습니다.

2. 조치 — 노출된 것부터, 패치 없는 것은 임시 조치

  1. 인터넷에서 직접 닿는 서버·장비부터 올립니다. 순서는 PHP(악용 중) → FortiOS(경계 장비) → Node.js → 내부 서버.
  2. PHP 8.1 이하는 패치가 없으므로 8.2 이상으로 올리거나, 그때까지 WAF에서 PHP 요청 본문 크기·속도 제한을 걸고 노출 범위를 줄입니다.
  3. CVE-2026-115560은 패치가 나올 때까지 php.ini 또는 FPM 풀 설정에 session.upload_progress.enabled = Off를 넣고 워커를 재시작합니다. 대부분의 애플리케이션은 이 기능을 쓰지 않습니다.
  4. Node.js는 런타임 교체 외에 완화책이 없습니다. 바로 올릴 수 없다면 외부 입력을 Brotli로 푸는 경로(압축 업로드 처리, fetch로 받은 외부 응답의 자동 압축 해제)를 앞단 프록시에서 Content-Encoding: br로 거부하는 방법이 있습니다. 브라우저는 요청 본문을 br로 보내지 않으므로 부작용이 거의 없습니다.
  5. FortiOS는 패치 전까지 관리 인터페이스를 신뢰 IP로 제한하고 관리자 계정에 MFA를 켭니다. 이 두 가지는 패치 후에도 유지합니다.

3. 검증 — 패치했다고 끝이 아닙니다

  • 재스캔 또는 에이전트 재수집으로 버전이 바뀌었는지 확인합니다. 컨테이너는 이미지 태그만 바꾸고 재생성하지 않으면 그대로입니다.
  • PHP 서버는 패치 전 로그에서 비정상적으로 큰 요청, 알 수 없는 PHP 파일 생성, 새 관리자 계정을 찾습니다. 의심되면 DB·API·관리자 비밀번호를 바꿉니다.
  • 패치 후 같은 공격 시나리오를 다시 돌려 실제로 막히는지 봅니다. 버전만 믿고 끝내면 재발을 알 수 없습니다.

지니온 솔루션에서는

지니온도 이번 주에 같은 일을 했습니다. 홈페이지 서버의 Node.js와 사내 협업 플랫폼의 Node 기반 컨테이너 4종(위키·자동화·분석·모니터링)을 하루 안에 패치 버전으로 올렸고, 앞단 프록시에 Brotli 요청 거부 규칙을 넣어 패치 전후를 가렸습니다. 작업 전에 DB 덤프를 받고, 작업 후 각 서비스의 헬스 체크와 외부 경로 응답을 확인하는 순서였습니다.

  • Qualys VMDR·CSAM: 공지 직후 기존 인벤토리와 대조해 스캔 없이 노출 자산을 먼저 식별하고(InstaScan), 비표준 경로에 깔린 런타임은 Deep Scan으로 찾습니다. TruRisk 점수에 "악용 중(KEV)" 가중치가 붙어 PHP2Shell이 자동으로 맨 위에 옵니다.
  • Recorded Future 취약점·공격 표면 인텔리전스: CVE별 악용 신호(PoC 공개, 다크웹 언급, 스캔 트래픽)를 시간순으로 보여 줘 "패치 순서"를 정하는 근거가 되고, 외부에서 보이는 우리 자산의 PHP·FortiOS 버전을 공격자 시점에서 확인합니다.
  • Cymulate Exposure Validation: 패치 전후로 같은 공격 시나리오를 실행해 WAF·IPS·EDR이 실제로 막는지 점수로 비교합니다. "버전은 올렸는데 왜 뚫렸나"를 사후가 아니라 사전에 봅니다.

세부 버전과 조치 방법은 각 벤더 공지가 기준입니다. 이 글은 2026년 10월 27일 기준이며, Fortinet CVE 세부 내용은 11월 10일 발표 후 갱신하겠습니다.

관련 솔루션

전화 문의도입 문의