vBulletin 인증 전 원격 코드 실행 취약점 CVE-2026-61511


요약
2026년 7월 27일, vBulletin의 인증 전 원격 코드 실행 취약점 CVE-2026-61511과 공개 개념 증명 코드가 공개됐다. 취약점은 템플릿 수식을 처리하는 vB5_Template_Runtime::runMaths()가 제한된 문자만 남긴 표현식을 PHP eval()로 실행하는 구조에서 발생한다.
공개 개념 증명은 인증이 필요 없는 ajax/render/pagenav 경로와 pagenav[pagenumber] 매개변수를 이용해 공격자 입력을 취약한 함수까지 전달한다. vBulletin은 6.2.2를 배포했으며 지원 중인 이전 릴리스에도 보안 패치를 제공했다.
| 항목 | 내용 |
|---|---|
| 식별자 | CVE-2026-61511 |
| 공개일 | 2026-07-27 |
| 취약점 유형 | 인증 전 원격 코드 실행 |
| 취약 파일 | /includes/vb5/template/runtime.php |
| 취약 메서드 | vB5_Template_Runtime::runMaths() |
| 요청 경로 | ajax/render/pagenav |
| 입력값 | pagenav[pagenumber] |
| 실행 지점 | PHP eval() |
| 수정 버전 | vBulletin 6.2.2 |
| 공개 개념 증명 | 있음 |
인터넷 노출 자산
공격에는 계정이나 관리자 권한이 필요하지 않다. 인터넷에서 접근 가능한 vBulletin 서버는 버전과 보안 패치 적용 여부를 먼저 확인한다.
기술 분석
취약한 코드는 /includes/vb5/template/runtime.php의 vB5_Template_Runtime::runMaths()에 있다. 이 메서드는 {vb:math} 템플릿 태그의 수식을 처리한다. 입력에서 허용되지 않은 문자를 제거한 뒤 결과를 eval()에 전달한다.
필터는 영문자를 차단하지만 숫자, 괄호, 문자열 결합 연산자, 산술 연산자와 비트 배타적 논리합 연산자를 허용한다. PHP에서는 허용된 연산자만 조합해 문자열과 호출 가능한 함수 이름을 구성할 수 있다. 따라서 system과 같은 함수 이름이 요청에 평문으로 포함되지 않아도 임의의 PHP 함수 호출을 만들 수 있다.
인증 전 요청 흐름은 다음과 같다.
- 공격자가
ajax/render/pagenav템플릿 렌더링 경로를 요청한다. pagenav템플릿이pagenav[pagenumber]값을 템플릿 변수로 가져온다.- 해당 변수가
{vb:math}수식에 포함된다. - 템플릿 실행기가 수식을
vB5_Template_Runtime::runMaths()로 전달한다. - 필터를 통과한 표현식이
eval()에서 PHP 코드로 평가된다.
공개 개념 증명은 숫자와 연산자를 조합해 PHP 함수 이름과 명령 문자열을 재구성한다. 핵심 취약 요소는 운영체제 명령 자체가 아니라 공격자 입력이 인증 없이 템플릿 수식을 거쳐 eval()에 도달한다는 점이다.
영향
악용에 성공하면 vBulletin을 처리하는 PHP 프로세스 권한으로 코드가 실행된다. 이 권한으로 읽거나 변경할 수 있는 애플리케이션 설정, 데이터베이스 연결 정보, 사용자·세션 데이터, 플러그인, 템플릿과 업로드 경로가 영향을 받을 수 있다.
운영체제 권한 상승이나 다른 서버로의 확산은 이 취약점만으로 보장되지 않는다. 실제 범위는 PHP 실행 계정의 권한, 파일시스템 접근 제어와 서버 격리 구성에 따라 달라진다.
자산 및 패치 확인
vBulletin 6.2.2로 갱신하거나 사용 중인 지원 릴리스에 맞는 벤더 보안 패치를 적용한다. 인터넷 응답에서 버전이 보이지 않으면 애플리케이션 파일, 배포 기록과 고객 포털의 패키지 정보를 대조한다.
| 우선순위 | 조건 | 조치 |
|---|---|---|
| 긴급 | 인터넷 노출, 6.2.1 이하 또는 패치 상태 불명 | 접근 제한, 버전 확인, 보안 패치 적용 |
| 높음 | 내부망 노출, 다수 사용자가 접근 | 패치 적용, 웹 요청과 프로세스 실행 기록 점검 |
| 중간 | 패치 적용 완료 | 패치 전 기간의 관련 요청과 파일 변경 확인 |
| 낮음 | 비가동 또는 폐기 자산 | 프록시, 도메인, 복제본과 백업의 잔존 여부 확인 |
패치 후에도 기존 웹 셸이나 변조 파일은 남을 수 있다. 의심 흔적이 있으면 애플리케이션 파일을 신뢰할 수 있는 동일 버전 패키지와 비교한다.
탐지 포인트
네트워크
웹 서버와 프록시 기록에서 다음 조합을 찾는다.
ajax/render/pagenav요청routestring=ajax/render/pagenav가 포함된 요청- 비정상적으로 긴
pagenav[pagenumber]값 - 숫자, 괄호, 마침표와
^연산자가 반복되는 값 - 동일 출발지에서 반복되는 요청과 서버 오류 응답
- 요청 직후 포럼 서버에서 시작된 외부 연결이나 DNS 질의
함수 이름과 명령어 문자열만 검색하면 연산자로 인코딩된 입력을 놓칠 수 있다. 긴 매개변수와 높은 연산자 밀도를 함께 본다.
다음 규칙은 공개 개념 증명의 요청 형태를 이용한 초기 탐지 예시다. 필드 이름은 실제 웹 서버나 보안 장비의 기록 형식에 맞춰 조정한다.
title: Suspicious vBulletin Pagenav Template Rendering Request
status: experimental
logsource:
category: webserver
detection:
route:
url|contains:
- 'ajax/render/pagenav'
- 'routestring=ajax%2Frender%2Fpagenav'
- 'routestring=ajax/render/pagenav'
parameter:
url|contains:
- 'pagenav%5Bpagenumber%5D='
- 'pagenav[pagenumber]='
operators:
url|contains:
- '%5E'
- '^'
condition: route and parameter and operators
falsepositives:
- Security testing against an authorized vBulletin instance
level: high
엔드포인트
php-fpm,apache2또는httpd가 실행한 셸과 시스템 도구- 웹 요청 직후 실행된
sh,bash,curl,wget,python또는perl - vBulletin 경로에 새로 생성되거나 수정된 PHP 파일
- 템플릿, 플러그인, 캐시와 업로드 경로의 실행 가능 파일
- 웹 서버 계정이 생성한 예약 작업이나 SSH 키
- PHP 프로세스에서 시작된 비정상 외부 연결
일반적인 PHP-FPM 구성에서는 nginx보다 php-fpm의 자식 프로세스가 코드 실행에 가까운 신호다.
서버
- 설치 패키지와 현재 애플리케이션 파일의 해시 차이
- 템플릿과 플러그인의 비인가 변경
- 관리자 계정 생성이나 권한 변경
- 설정 파일과 데이터베이스 자격 증명에 대한 비정상 접근
- 같은 시각에 발생한 웹 요청, 프로세스 생성, 파일 변경과 외부 통신
침해 점검과 대응
- vBulletin 서버와 프록시 뒤의 원본 서버를 식별한다.
- 설치 버전과 벤더 보안 패치 적용 여부를 확인한다.
- 패치 전까지 불필요한 외부 접근을 프록시나 웹 방화벽에서 제한한다.
ajax/render/pagenav요청과pagenav[pagenumber]값을 검색한다.- 관련 요청 시각의 PHP 자식 프로세스, 파일 변경, DNS 질의와 외부 연결을 대조한다.
- 애플리케이션 파일을 신뢰할 수 있는 동일 버전 패키지와 비교한다.
- 변조가 발견되면 신뢰 가능한 이미지와 패키지로 서버를 재구성한다.
- 노출 가능성이 있는 관리자 계정, 데이터베이스 자격 증명, API 키와 세션을 교체한다.
참고 자료
- vBulletin Runtime Template runMaths Pre-Auth RCE
- Public Exploit Released for Patched vBulletin Pre-Auth Code Execution Flaw
- Critical vBulletin Flaw Lets Unauthenticated Attackers Execute PHP Code Remotely