flawopen.com/Incidents/bricksforge-pro-forms-upload-metadata-october-2026
●
Bricksforge WordPress plugin · CVE-2026-85097 · 2026-10-07 · CVSS 9.8 · 심각
보안 연구 · FlawOpen
CVE-2026-85097: Bricksforge Pro Forms 업로드 결함
CVE-2026-85097은 Bricksforge Pro Forms에서 검증된 임시 파일 내용과 클라이언트가 제어하는 대상 메타데이터 사이의 불일치를 인증되지 않은 요청이 악용할 수 있게 했습니다. Patchstack은 악용 시도를 보고했습니다. 플러그인을 업데이트하고 노출된 사이트를 조사하세요.[1], [2], [3], [4], [5]
💡 알기 쉬운 설명 (ELI5)
우편실에서 소포에 무해한 그림이 들었는지 확인한 뒤, 특정 라벨을 프로그램처럼 여는 사무실로 보내기 직전에 발신자가 라벨을 바꿀 수 있다고 생각해 보세요. Bricksforge는 임시 업로드를 검사했지만, 이후 폼 제출에서 다른 저장 이름을 지정할 수 있었습니다. 파일의 식별 정보와 저장 위치를 처리 전 과정에서 서버가 결정하도록 해야 합니다.[3], [2]
핵심 개념 및 용어
메타데이터 신뢰 경계- 이름, URL, MIME 유형 또는 경로가 신뢰할 수 있는 서버 기록에서 왔는지, 신뢰할 수 없는 클라이언트에서 왔는지 애플리케이션이 판단하는 지점입니다.[2], [3]
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-434
보고된 버전 상태와 운영자 조치
| 근거 출처 | 출처의 설명 | 방어 조치 |
|---|---|---|
| Wordfence CNA / CVE 기록 | 인증되지 않은 임의 파일 업로드를 설명하며, 기록된 영향 범위는 3.1.8.9까지입니다. | CNA에 기록된 범위로 취급하고, 배포된 사이트가 안전하다는 증거로 보지 마세요. |
| Patchstack(2026년 10월 8일) | 10월 7일 처음 관찰한 공격 시도를 보고하고 3.1.8.10을 수정 버전으로 제시합니다. | Patchstack이 제시한 수정 경계로 취급하고 각 사이트에 실제 설치된 플러그인 버전을 확인하세요. |
| Bricksforge 공개 변경 기록 | 4.0.1에 Pro Forms 업로드 보안 수정이 있지만 3.1.8.10 경계는 명시하지 않습니다. | 변경 기록만으로 4.0.1이 최초 수정 버전이거나 특정 3.x 버전이 안전하다고 추론하지 마세요. |
| 외부에 노출되었거나 침해가 의심되는 사이트 | 출처는 공격 시도를 보고하지만, 표적이 된 모든 사이트의 침해를 입증하지는 않습니다. | 현재 지원되는 버전으로 업데이트하세요. 복구를 완료로 판단하기 전에 업로드 및 웹 서버 로그를 검토하고 예상치 못한 파일을 조사하세요. |
사고 타임라인
2026-10-07
2026-10-08
단계별 공격 실행 흐름
단계 1
단계 2
단계 3
소스 코드 비교: 취약한 구현 vs 보안 패치
이 일반적인 예시는 서버가 관리하는 업로드 식별자, 사용자별 조회, 콘텐츠 유형 재검사, 생성된 파일 이름, 비공개 저장을 보여 줍니다. Bricksforge 코드나 실제 패치가 아닙니다. 운영 코드에는 크기 제한, 안전한 권한, 원자적 상태 전환, 적절한 제공 방식도 필요합니다. 영향을 받은 사이트는 공급업체가 지원하는 수정 버전으로 업데이트해야 합니다.[2], [3]
취약한 구현
function finalize_upload( array $item, string $stagedPath, string $uploadDir ): string {
// 앞서 MIME 검사를 했더라도 최종 이름은 클라이언트 메타데이터가 결정합니다.
$name = basename( (string) parse_url( $item['file']['url'], PHP_URL_PATH ) );
$destination = $uploadDir . DIRECTORY_SEPARATOR . $name;
if ( ! rename( $stagedPath, $destination ) ) {
throw new RuntimeException( 'Could not finalize upload' );
}
return $destination;
}
보안 강화 패치
function finalize_upload( string $uploadId, UploadRegistry $registry, string $privateDir ): string {
// 소유자와 경로는 서버 측 레코드에서 확인하고 클라이언트 URL은 사용하지 마세요.
$upload = $registry->findPendingForCurrentUser( $uploadId );
if ( $upload === null || ! is_file( $upload->path ) ) {
throw new RuntimeException( 'Unknown pending upload' );
}
$types = [ 'image/jpeg' => 'jpg', 'image/png' => 'png' ];
$mime = ( new finfo( FILEINFO_MIME_TYPE ) )->file( $upload->path );
if ( ! isset( $types[ $mime ] ) ) {
throw new RuntimeException( 'Unsupported file type' );
}
$destination = $privateDir . DIRECTORY_SEPARATOR . bin2hex( random_bytes( 16 ) ) . '.' . $types[ $mime ];
if ( ! rename( $upload->path, $destination ) ) {
throw new RuntimeException( 'Could not finalize upload' );
}
$registry->markConsumed( $uploadId );
return $destination;
}
엔지니어링 및 시스템 보안 강화 체크리스트
- ✓운영, 스테이징, 관리형 고객 사이트의 Bricksforge 버전을 확인하고 영향을 받은 설치를 공급업체의 최신 지원 버전으로 업데이트합니다. Patchstack은 3.1.8.10을 수정 버전으로 식별하지만 공급업체 변경 기록은 4.0.1의 수정을 기록할 뿐 3.x의 정확한 경계를 밝히지 않습니다.[1], [2], [3], [4], [5]
- ✓FlawOpen 운영 지침: 업로드 완료 시 클라이언트가 보낸 이름, URL, 경로, MIME 라벨을 모두 신뢰하지 말고 서버 기록과 검사한 내용에 기반한 허용 목록으로 저장 이름과 경로를 결정합니다.
- ✓FlawOpen 운영 지침: 가능하면 업로드를 실행 가능한 웹 루트 밖에 저장합니다. 그렇지 않으면 웹 서버에서 모든 업로드 및 임시 업로드 디렉터리의 스크립트 실행을 차단합니다.
- ✓FlawOpen 운영 지침: 각 대기 업로드를 생성한 폼 세션에 연결하고 한 번만 사용할 수 있게 하며, 누락·만료·재사용·불일치 식별자를 거부합니다.
- ✓FlawOpen 운영 지침: 취약한 사이트가 공개되어 있었다면 비정상 폼 업로드와 업로드 디렉터리의 새 파일을 웹 및 애플리케이션 로그에서 조사합니다. 정리 전에 증거를 보존하고 호스팅 업체의 사고 대응 절차를 따릅니다.
- ✓FlawOpen 운영 지침: 불일치 메타데이터, 허용되지 않은 콘텐츠, 다른 세션·만료·재사용 ID를 다루는 회귀 테스트를 추가하고 요청이 거부되며 실행 가능한 위치에 파일이 기록되지 않는지 확인합니다.