SK쉴더스 로고
ADT캡스캡스홈
SK쉴더스

WordPress 코어 업그레이드 중 미인증 RCE 취약점 (CVE-2026-119977)

EQST Now | 2026.11.05

NOW Briefing

Brief 1 WordPress 코어 업데이트 과정의 미인증 원격 코드 실행(RCE) 취약점 CVE-2026-119977이 CISA 악용 목록에 등재됐습니다.
Brief 2 전체 패키지 코어 업데이트 중 임시 디렉터리에 웹·PHP로 접근할 수 있고, 정리 전에 경로를 알아내 도달하면 미인증 코드 실행이 가능합니다.
Brief 3 7.1.4 또는 각 브랜치의 수정 버전으로 즉시 업데이트하고, 업데이트 전에 웹 서버에서 wp-content/upgrade 접근을 차단해야 합니다.

‍

WordPress 코어 업그레이드 중 미인증 RCE 취약점 (CVE-2026-119977)

‍

■ 개요

‍

WordPress는 웹사이트의 글과 페이지를 관리하는 데 널리 쓰이는 오픈소스 콘텐츠 관리 시스템(CMS)입니다. WordPress 보안팀은 2026년 10월 28일 7.1.4를 공개하며 코어 업데이트 중 발생하는 경쟁 조건(여러 작업의 실행 순서가 엇갈리는 틈을 노리는 취약점)을 수정했습니다. CISA는 2026년 11월 3일 이 취약점을 알려진 악용 취약점 목록(KEV)에 추가했습니다. CVE 레코드는 10월 31일 공개됐으며 할당 기관은 Wordfence, 보고자는 연구자 Umut Bayram입니다.

영향 범위는 WordPress 4.7부터 7.1.3까지로, 현재 운영되는 모든 미패치 브랜치가 포함됩니다. 악용에는 계정이나 비밀번호가 필요하지 않습니다. 다만 Wordfence 분석 기준으로 네 가지 전제가 동시에 성립해야 합니다. 사이트가 설치 파일을 포함한 전체 패키지 코어 업데이트를 실제로 수행하는 중이어야 하고, 임시 작업 디렉터리가 웹과 PHP로 접근 가능해야 합니다. 또 공격자가 그 경로를 알아낼 수 있어야 하고, WordPress가 임시 파일을 정리하기 전에 도달해야 합니다. 같은 분석은 실험 환경에서 해당 디렉터리가 수 초간만 존재했다고 밝혔습니다.

CISA는 미국 연방기관의 조치 기한을 2026년 11월 6일로 지정했습니다. Wordfence는 7.1.4 공개 당일 차단 규칙을 배포한 뒤 21시간 동안 임시 작업 디렉터리의 설치 스크립트(setup-config.php) 경로를 노린 요청을 1만 8,500건 이상 관측했습니다. 이 수치는 차단·탐지된 시도이며, 현재까지 공개적으로 확인된 침해 사례는 보고되지 않았습니다. 그러나 CISA는 실제 악용 증거를 근거로 KEV에 등재했습니다.

‍

■ 요약

‍

항목 내용
CVE ID CVE-2026-119977 (코어 업데이트 임시 작업 디렉터리 경쟁 조건)
CVSS 점수 CVSS v3.1 8.1
취약점 유형 CWE-367, 검사 시점과 사용 시점 불일치(TOCTOU) 경쟁 조건
영향/위험 • 미인증 공격자의 서버 코드 실행 가능
• 업데이트 창에 한해 성립, 계정·인증 불필요
• 작업 디렉터리에 기록된 설정 파일이 설치본으로 승격될 위험(패치에서 복사 제외 처리)
취약 버전 WordPress 4.7 ~ 7.1.3
패치 버전 • 7.1.4 (지원 중인 최신 릴리스)
• 7.0.8 / 6.9.11 / 6.8.12 / 6.7.11 / 6.6.11
• 4.7.39까지 각 구 브랜치에 백포트

‍

■ 업데이트 중 열리는 공격 창

‍

WordPress가 전체 패키지 코어 업데이트를 적용할 때, 새 파일은 사이트 디렉터리에 바로 덮어씌워지지 않고 wp-content/upgrade/ 아래 임시 작업 디렉터리에 먼저 풀립니다. 7.1.4 이전 코드는 이 디렉터리 이름을 내려받은 패키지 파일명에서 그대로 유도했기 때문에, 외부에서 추측할 수 있었습니다. 많은 서버 설정에서 이 경로는 웹으로 제공되며 PHP도 실행됩니다.

압축을 푼 트리는 완전한 WordPress 설치본이고, 여기에는 설정 파일이 없는 상태에서도 동작하도록 만들어진 설치 마법사가 포함됩니다. 계정 없이 이 경로를 반복 조회하던 공격자가 작업 디렉터리 생성 시점을 잡아내면, 자신이 지정한 외부 데이터베이스를 바라보는 설정이 작업 디렉터리에 기록될 수 있습니다. Picus 분석에 따르면 이 설정이 복사 단계에서 실제 사이트로 승격될 경우 WordPress가 공격자 데이터베이스에 연결됩니다. 이후 설치 흐름에서 첫 관리자 계정을 만든 뒤 플러그인을 업로드해 임의 PHP 코드까지 실행할 수 있습니다.

창이 수 초에 불과해 Patchstack은 실제 악용이 실용적이지는 않다고 평가했습니다. 그러나 CISA는 악용 증거를 근거로 KEV에 등재했고, 설치 스크립트 경로를 노린 요청도 대량으로 관측됐습니다.

‍

■ 패치가 바꾼 디렉터리 생성

‍

아래 코드는 WordPress 공식 미러의 패치 커밋 b625b2d에서 wp-admin/includes/class-wp-upgrader.php의 unpack_package() 메서드 중 작업 디렉터리 경로를 결정하는 부분입니다. 삭제된 두 줄이 취약 버전의 예측 가능한 이름 생성 로직입니다. 추가된 줄에서는 상위 디렉터리에 index.php 가드를 만들어 디렉터리 목록 노출을 막은 뒤 새 메서드로 이름을 받습니다.

-		// We need a working directory - strip off any .tmp or .zip suffixes.
-		$working_dir = $upgrade_folder . basename( basename( $package, '.tmp' ), '.zip' );
+		/*
+		 * The upgrade directory is web-served. Keep it from being listed, as core does
+		 * for wp-content and its plugins and themes directories, so the name of the
+		 * working directory created below cannot be discovered from a directory index.
+		 */
+		if ( ! $wp_filesystem->is_dir( $upgrade_folder ) ) {
+			$wp_filesystem->mkdir( $upgrade_folder, FS_CHMOD_DIR );
+		}
+		if ( ! $wp_filesystem->exists( $upgrade_folder . 'index.php' ) ) {
+			$wp_filesystem->put_contents( $upgrade_folder . 'index.php', "<?php\n// Silence is golden.\n", FS_CHMOD_FILE );
+		}
+
+		// We need a working directory.
+		$working_dir = $upgrade_folder . $this->get_working_dir_name( $package );

같은 커밋은 업그레이드 디렉터리를 비우는 정리 루프에서 index.php를 건너뛰도록 바꿔, 이 가드가 다음 업데이트에서도 유지되게 했습니다. 이름 생성은 같은 파일에 새로 추가된 비공개 메서드 get_working_dir_name()이 담당합니다. 패키지 이름 뒤에 16자 난수 접미사를 붙여, 패키지 파일명을 아는 공격자도 실제 경로를 특정하기 어렵게 만듭니다.

+	/**
+	 * Builds an unpredictable name for the directory a package is unpacked into.
+	 *
+	 * @since 7.1.4
+	 *
+	 * @param string $package The full local path or URI of the package.
+	 * @return string The directory name, without a path.
+	 */
+	private function get_working_dir_name( $package ) {
+		// Strip off any .tmp or .zip suffixes.
+		$name = basename( basename( $package, '.tmp' ), '.zip' );
+
+		return $name . '-' . wp_generate_password( 16, false );
+	}

같은 커밋은 wp-admin/includes/update-core.php의 update_core() 복사 제외 목록에 사이트 설정 파일 wp-config.php를 추가했습니다. 커밋 설명에 따르면 작업 디렉터리에 기록됐을 수 있는 설정 파일은 절대 복사하지 않으며, 이 변경으로 작업 디렉터리에 기록된 설정이 실제 사이트로 승격되는 경로를 차단합니다.

‍

■ 탐지 및 점검

‍

• 웹 서버 접근 로그에서 /wp-content/upgrade/ 아래 .php 파일을 대상으로 한 요청과 응답 코드를 조회하고, 200 응답이 있으면 침해 가능성을 전제로 우선 조사합니다. 특히 작업 디렉터리에 풀린 설치본의 setup-config.php 경로를 가리키는 요청을 확인합니다.

• 동일 출처 IP가 /wp-content/upgrade/ 경로를 장시간 반복 조회한 기록을 찾습니다. 업데이트 시점을 기다리는 폴링 흔적일 수 있습니다.

• 업그레이드 디렉터리에 index.php 외의 잔존 파일이 있는지 find wp-content/upgrade -mindepth 1 ! -name index.php로 점검합니다.

• wp-config.php의 변경 시각이 코어 업데이트 시각과 일치하는지, 데이터베이스 호스트와 계정이 정상 값인지 확인합니다.

• 업데이트 전후에 생성된 관리자 계정, 등록되지 않은 플러그인, wp-content/uploads와 mu-plugins 아래의 PHP 파일을 점검합니다.

⚠️ WARN

이미 7.1.4로 올렸더라도 그 업데이트는 취약한 7.1.3 이하 코드가 실행했습니다. 업데이트를 실행한 시각 전후의 접근 로그와 잔존 파일을 소급 점검해야 합니다.

‍

■ 대응 방안

‍

• 7.1.4 또는 운영 중인 브랜치의 수정 버전(7.0.8, 6.9.11, 6.8.12 등, 최소 4.7.39)으로 즉시 업데이트합니다. CISA가 지정한 연방기관 조치 기한은 2026년 11월 6일입니다.

• 업데이트를 실행하기 전에 웹 서버 설정에서 wp-content/upgrade/ 경로의 외부 접근과 PHP 실행을 차단하고, 해당 디렉터리가 목록으로 노출되지 않는지 확인합니다. 취약 버전은 자기 자신을 업데이트하는 동안 창이 열리므로 적용 순서가 중요합니다.

• 코어 마이너 업데이트 자동 적용이 켜져 있는지 확인하고, 자동 업데이트가 멈춘 사이트는 위 차단 설정을 적용한 뒤 수동으로 올립니다.

• 접근 로그나 파일 점검에서 침해가 확인되면 데이터베이스 자격증명, 보안 키·솔트, 관리자 비밀번호를 모두 재발급합니다.

• 지원이 끝난 4.6 이하 브랜치에는 이 수정이 제공되지 않으므로, 해당 브랜치를 쓰고 있다면 지원 릴리스로 업그레이드해야 합니다.

💡 TIP

호스팅 업체가 코어 업데이트를 대행하는 환경에서는 패치 적용 여부와 적용 시각을 업체에 확인해야 합니다. 업데이트 실행 시각을 알면 로그 소급 점검 범위를 좁힐 수 있습니다.

‍

[참고 자료]

• WordPress 공식 릴리스 문서 — Version 7.1.4

• WordPress 코어 패치 커밋 b625b2d

• NVD CVE 상세 정보 — CVE-2026-119977

• CISA 알려진 악용 취약점 목록

• Patchstack — WordPress 7.1.4 보안 릴리스 분석

• Qualys ThreatPROTECT — 실제 악용 경고

• Rapid7 취약점 DB — CVE-2026-119977

• Picus Security — 업데이트 과정 악용 체인 분석

• Rescana 분석 — 업그레이드 창 경쟁 조건 RCE 및 완화

• 코스모스팜 — 국내 WordPress 솔루션 소개

  • #EQST_NOW
  • #취약점

관련 서비스

더 많은 보안 인사이트

SK쉴더스 유튜브 채널에서 확인하세요.

SK쉴더스 유튜브 채널에서 확인하세요.
보안 트렌드와 대응방법

매월 뉴스레터로 확인하세요.

매월 뉴스레터로 확인하세요.