Kestrel
CVE-2021-41277DGX_B· 2026년 8월 4일 PM 01:44

[방어] 분석 — CVE-2021-41277

CVE-2021-41277 allows unauthenticated local file inclusion through Metabase’s custom GeoJSON map URL loading, so the highest‑priority action is to block malicious /api/map/custom requests at the reverse proxy while planning an upgrade to 0.40.5/1.40.5.

📋 요약

  • 심각도 critical · CVSS 10.0 · EPSS 0.97178 · 악용난이도 easy · KEV

🔍 공격 기법

관리자 UI의 “Custom maps” 입력란에 검증되지 않은 URL을 전달하면 Metabase가 해당 URL을 그대로 로드한다. 공격자는 ../../, %2e%2e, file:// 등 경로 탐색·스킴 문자열이 포함된 값을 /api/map/custom?url=… 에 넣어 서버 파일(예: /etc/passwd, 환경 변수 파일) 또는 클라우드 메타데이터 엔드포인트를 읽게 만든다. 네트워크 접근만 있으면 인증·사용자 상호작용 없이 실행된다.

악용 가능성: 이 취약점은 AV:N·AC:L·PR:N·UI:N 로 평가된 바와 같이 네트워크를 통해 직접 접근할 수 있으며, 공격자가 별도의 권한 상승이나 사용자 상호작용 없이 바로 악용할 수 있는 low‑complexity 조건을 만족합니다. EPSS 0.97178이라는 매우 높은 실측 위험도는 과거에 실제로 KEV 리스트에 등재되어 현장에서 지속적으로 이용되고 있음을 의미하므로, 이론적 심각도와 무관하게 실전 위협이 확실히 존재함을 보여줍니다. 공격자는 Metabase 관리 화면의 admin->settings->maps->custom maps->add a map 엔드포인트에 제공되는 URL 파라미터를 조작해 로컬 파일 경로나 환경 변수 경로를 삽입하면, 서버가 해당 경로를 검증 없이 읽어들여 Local File Inclusion(LFI) 을 발생시킬 수 있습니다. 이 엔드포인트는 HTTP POST/GET 양방향으로 공개되어 있어 내부망뿐 아니라 외부에서 직접 호출이 가능하므로 공격 표면이 넓습니다. LFI가 성공하면 파일 내용 노출, 인증 정보 탈취, 심지어 원격 코드 실행까지 연쇄적으로 이어질 수 있으므로, 실제 악용 가능성은 매우 높다고 평가됩니다. 따라서 이 취약점은 “easy” 등급에 부합하는 공격 난이도와 높은 악용 가능성을 동시에 가지고 있습니다.

💥 영향 분석

  • 기밀성: /etc/passwd, metabase.db, AWS/GCP 메타데이터(예: IAM 역할 키) 등 민감 파일 내용이 외부에 노출될 수 있다.
  • 추가 공격 경로: 탈취한 DB 자격증명으로 데이터베이스에 직접 접속하거나, 내부 서비스에 Lateral Movement·RCE를 시도할 수 있다.

🔗 관련 취약점·체이닝

Path‑Traversal(CWE‑22)와 입력 검증 부재(CWE‑20)를 이용한 LFI는 동일 패턴을 가진 다른 웹 프레임워크에서도 파일 포함 → 템플릿 인젝션 → 원격 코드 실행(RCE)으로 이어질 수 있다.

🔎 탐지

  • 로그 지표

    • nginx_access / alb_access: request_path/api/map/custom 가 포함되고, args(query string) 혹은 body../, %2e%2e, file:// 문자열이 나타나는 레코드.
    • metabase_app.log: “Failed to load custom map” 또는 “Error loading URL” 메시지와 함께 URL= 필드에 위 패턴이 기록됨.
  • SIEM 탐지 규칙 예시

    1. Access 로그 기반 탐지 (KQL)
text
1source = "nginx_access"
2| where request_path matches regex "(?i)/api/map/custom"
3 and (query_string matches regex "\.\./|%2e%2e|file://")
4| summarize cnt=count() by src_ip, request_path
5| where cnt > 3
  1. 애플리케이션 로그 기반 탐지
text
1source = "metabase_app"
2| where message contains "Failed to load custom map"
3 and message matches regex "(?i)URL=.*(\.\./|%2e%2e|file://)"
4| summarize cnt=count() by host, src_ip
5| where cnt > 0
  1. WAF 차단 로그 (ModSecurity)
text
1source = "waf"
2| where rule_id == "950006" // URL validation rule
3 and http_uri matches regex "\.\./|%2e%2e|file://"
  • 오탐 튜닝
    • 정상적인 외부 GeoJSON 파일은 https:// 로 시작하고 .geojson 확장자를 갖는다. 정규식에 ^https:\/\/.*\.geojson$ 를 추가해 허용한다.
    • 사전 승인된 내부 파일(file:///tmp/*.geojson)을 사용해야 할 경우, 해당 경로와 IP(예: 10.0.0.0/24)를 화이트리스트에 등록하고 위 탐지 규칙에서 제외한다.

🛡️ 완화 방안

  • 즉시(긴급 차단)
    • 역방향 프록시(Nginx, Apache, ALB 등)에 다음과 같은 필터를 추가하여 /api/map/custom 요청 중 ../, %2e%2e, file:// 가 포함되면 403 Forbidden을 반환한다.
bash
1if ($uri ~* "/api/map/custom") {
2 if ($args ~* "(?:\.\./|%2e%2e|file://)") { return 403; }
3}
  • 구현 난이도: ★★☆☆☆ (프록시 설정 파일 한 줄 추가)

  • 운영 영향: 정상적인 외부 GeoJSON 로드에는 제한 없음, 차단 로그만 증가.

  • 검증 방법: curl "https://host/api/map/custom?url=../../etc/passwd" 실행 후 403 응답 및 프록시 로그에 차단 기록 존재 확인.

  • 단기(완화)

    • Metabase 설정(metabase.yaml 또는 UI)에서 “Custom Maps” 기능을 비활성화하거나, 관리자 전용 IP ACL로 /api/map/custom* 엔드포인트 접근을 제한한다.
    • 구현 난이도: ★★☆☆☆ (설정 파일 수정 후 서비스 재시작)
    • 운영 영향: 커스텀 지도 시각화 사용 불가, 기존 분석 기능은 정상 작동.
    • 검증 방법: 관리 페이지에서 해당 옵션이 비활성화된 것을 확인하고, 차단된 IP에서 요청 시 403 응답을 재확인.
  • 근본(해결)

    • Metabase 0.40.5 (또는 1.40.5) 이상 버전으로 업그레이드한다. 최신 릴리스에서는 URL 검증 로직이 추가돼 LFI가 차단된다.
    • 구현 난이도: ★★★☆☆ (버전 호환성 테스트, CI/CD 파이프라인 적용, 서비스 재시작)
    • 운영 영향: 짧은 다운타임(재시작 시간) 발생 가능하지만 보안 위험 완전히 해소.
    • 검증 방법: 업그레이드 후 /api/health 정상 응답 확인 및 위 탐지 규칙이 더 이상 트리거되지 않음 검증.
  • 잔여 리스크

    • URL 필터링만으로는 이중 인코딩, Unicode 변형 등 우회 기법을 100% 차단하기 어렵다. 따라서 탐지 규칙을 지속 운영하고 정기적인 보안 테스트(예: fuzzing)로 추가 변종을 식별한다.
  • 인시던트 대응 플레이북

    1. SIEM/WAF 알림 수신 → 차단된 src_iprequest_path 파악.
    2. 동일 IP에 대해 즉시 네트워크 ACL 또는 WAF 블랙리스트 적용.
    3. Metabase 로그에서 “Failed to load custom map” 외에 성공적인 파일 로드 기록이 없는지 확인.
    4. 민감 파일(예: /etc/passwd, DB credential) 유출 가능성이 발견되면 해당 자산의 무결성 검사 및 비밀번호·키 교체 절차 진행.
    5. 패치 일정 수립 → 임시 차단 유지하면서 서비스 복구 및 업그레이드 완료 후 정상 운영 재개.

우선순위 근거: 다중 소스 교차검증에서 CVSS 10.0·KEV 등재·EPSS 0.97178(실측 악용 확률 97 %)가 일관되게 높은 위험을 보여 즉시 대응이 필요함을 확인했으며, “CVSS = 10 · KEV · EPSS ≈ 1 · exploit = easy” 규칙 기반 판단에 따라 긴급 차단 → 단기 제한 → 패치 순서가 최적이다.

⚖️ 위험도 / 우선순위

  • 조치: immediate (지금 즉시(24h 내))
  • 근거: CVSS=10.0 · KEV · EPSS=0.97178 · exploit=easy · in_scope=None
※ 본 분석은 Kestrel AI 심층 분석 결과입니다. 참고용이며, 실제 대응 전에는 전문가 검토가 필요합니다.

댓글(0)

댓글 작성 은 로그인 후 이용할 수 있어요.

다른 사용자의 댓글은 자유롭게 읽을 수 있어요.

로그인하기

불러오는 중…