FlawOpen

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]

핵심 개념 및 용어

임시 업로드
폼 제출이 끝나기 전에 임시로 저장한 파일입니다. 이 단계에서 검사해도 이후 클라이언트가 보내는 메타데이터가 신뢰할 수 있게 되지는 않습니다.[2], [3]
CWE-434
위험한 유형의 파일을 제한 없이 업로드할 수 있는 약점입니다. 파일이 위험한 방식으로 해석되거나 실행될 수 있습니다.[1], [2]
메타데이터 신뢰 경계
이름, URL, MIME 유형 또는 경로가 신뢰할 수 있는 서버 기록에서 왔는지, 신뢰할 수 없는 클라이언트에서 왔는지 애플리케이션이 판단하는 지점입니다.[2], [3]
CVE 점수와 악용 상태
Wordfence CNA의 CVE 기록은 CVSS 3.1을 9.8로 지정하고 CISA enrichment는 악용 없음으로 표시합니다. Patchstack은 10.0을 지정하고 2026년 10월 7일 처음 관측한 텔레메트리를 보고합니다. 각각 출처가 다른 주장입니다. 어느 쪽도 CISA KEV 등재를 확인하지 않습니다.[1], [2], [3], [4]
설명용 코드
아래 PHP 비교는 검증 경계를 일반화한 예입니다. Bricksforge 소스 코드나 실제 패치를 재구성한 것이 아닙니다. 인용된 변경 기록에는 구현 세부 정보가 공개되어 있지 않습니다.[2], [3], [5]

프레임워크 매핑

  • 이 가이드에서 설명하는 약점의 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

Wordfence는 권고문이 공개된 날짜를 10월 7일로 표시합니다. Patchstack은 같은 날 21:47 UTC에 자사 텔레메트리가 최초 시도를 관측했다고 설명합니다. 권고문 공개와 텔레메트리 관측은 별개의 사건입니다.[2], [3]

2026-10-08

CVE 기록의 datePublished는 10월 8일로, Wordfence가 표시한 10월 7일 공개일보다 하루 늦습니다. Patchstack 캠페인 보고서도 10월 8일 발행으로 표시합니다. 서로 다른 기록과 보고서의 날짜입니다.[1], [2], [3]

2026-10-08

Patchstack의 10월 8일 분석은 검증 불일치와 관측된 시도를 설명하고 3.1.8.10을 패치된 버전으로 제시합니다. Bricksforge 변경 기록은 4.0.1의 Pro Forms 업로드 보안 수정도 별도로 언급하지만, 3.x 계열의 정확한 수정 버전은 확정하지 않습니다.[3], [4], [5]

단계별 공격 실행 흐름

단계 1

임시 파일이 초기 검사를 통과합니다

CNA는 앞선 임시 업로드가 MIME 검사를 통과한다고 설명합니다. 이 검사를 통과해도 나중에 파일 이름이나 대상을 임의로 바꿀 권한이 생기지는 않습니다.[2], [1]

단계 2

폼 제출에서 별도 메타데이터를 전달합니다

Patchstack은 후속 처리에서 클라이언트가 보낸 temporaryFileUploads 메타데이터를 신뢰했다고 설명합니다. URL은 이미 검증된 파일과 다를 수 있었습니다. 검증된 내용과 검증되지 않은 대상 메타데이터를 서로 다르게 신뢰한 것이 결함입니다.[2], [3]

단계 3

파일이 위험한 이름으로 저장됩니다

서버가 업로드 완료 시 클라이언트가 제어한 대상을 사용하고 그 위치에서 실행이 허용되면 위험한 확장자로 인해 서버가 파일을 해석할 수 있습니다. 이 설명은 높은 수준의 메커니즘이며 요청 형식이나 페이로드는 필요하지 않습니다.[2], [3]

단계 4

노출된 서버가 침해될 수 있습니다

CNA는 이 문제가 임의 PHP 실행을 허용할 수 있다고 설명합니다. Patchstack은 시도를 보고하고 업데이트를 권고합니다. 이 관측은 모든 대상 사이트가 침해됐다는 증거나 공격자 신원 확인이 아닙니다.[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;
}

엔지니어링 및 시스템 보안 강화 체크리스트

출처