FlawOpen

flawopen.com/Incidents/polyfill-io-supply-chain-incident-june-2024

● Polyfill.io service · CWE-829 · June 2024 · 높음
보안 연구 · FlawOpen

Polyfill.io 공급망 공격 (2024)

2024년 사건에서 polyfill.io가 일부 방문자를 리디렉션했다. CDN 참조를 제거하라. CVE는 지정되지 않았다.

💡 알기 쉬운 설명 (ELI5)

식당이 외부 공급업체의 음료병을 모든 테이블에 둔다고 하자. 공급업체가 병의 내용물을 바꾸면 식당이 메뉴를 바꾸지 않아도 손님에게 영향이 갈 수 있다.

핵심 개념 및 용어

Dynamic User-Agent Polyfilling
클라이언트 브라우저의 헤더에 따라 서로 다른 JavaScript 번들을 제공하기 때문에 하위 리소스 무결성(SRI) 해시를 쓸 수 없게 되는 방식입니다.
Conditional Payload Evasion
HTTP Referer, 화면 크기, user-agent, 개발자 도구 사용 여부를 살펴 개발자에게는 깨끗한 스크립트를 주고 실제 모바일 사용자를 공격하는 수법입니다.
Domain Ownership Transfer Risk
인수되거나 만료되거나 동의 없이 양도될 수 있는 도메인에서 서드파티 스크립트를 불러오는 데 따르는 본질적인 위험입니다.
Subresource Integrity (SRI)
스크립트를 실행하기 전에 암호학적 해시를 검증하는 브라우저 메커니즘입니다.

프레임워크 매핑

  • 이 가이드에서 설명하는 약점의 CWE 참조: CWE-829

사고 타임라인

2024년 2월

Sansec는 도메인과 GitHub 계정의 소유권 변경을 보고했고 Fastly는 예방 차원의 대안을 제공했다.

2024년 6월 25일

Sansec는 분석을 공개하고 자체 측정에 따라 10만 개 이상 사이트의 노출 가능성을 추정했다.

2024년 6월 26~27일

Cloudflare가 자체 미러로 자동 재작성한다고 발표했고 이후 도메인은 보류됐다. 임시 재작성에 의존하지 말고 기존 참조를 제거하라.

단계별 공격 실행 흐름

단계 1

소유권 변경

Sansec는 2024년 2월 도메인과 GitHub 계정의 소유권이 바뀌었다고 보고했다. 악성 응답이 보고되기 전 Fastly는 예방 차원의 대안을 제공했다. Fastly는 나중에 Sansec 보고서가 공개되었을 때 공격을 알게 되었다고 밝혔습니다. 2월의 대체 서비스 제안은 예방 조치였으며 당시 악의적 활동을 알고 있었다는 증거는 아닙니다.

단계 2

사이트가 CDN 로드

cdn.polyfill.io를 참조하는 페이지는 브라우저가 반환된 JavaScript를 가져와 해당 페이지의 컨텍스트에서 실행하게 한다.

단계 3

조건부 리디렉션 관측

Sansec가 분석한 샘플은 조건에 따라 일부 모바일 방문자를 리디렉션했다. 이는 해당 샘플의 동작이지 CDN의 모든 응답을 뜻하지 않는다.

단계 4

완화와 대응

Cloudflare는 자체 미러로 자동 재작성했고 Fastly는 별도 대안을 제공했다. Sansec는 일부 전자상거래 사이트의 Google Ads 거부를 보고했으며, 자연 검색 전체의 페널티를 말한 것은 아니다.

소스 코드 비교: 취약한 구현 vs 보안 패치

취약한 구현
<!-- VULNERABLE: Direct 3rd-party CDN script without integrity verification -->
<!DOCTYPE html>
<html>
<head>
  <title>Production Web App</title>
  <!-- Polyfill CDN serves arbitrary dynamic code controlled by third party -->
  <script src="https://cdn.polyfill.io/v3/polyfill.min.js?features=default,Array.prototype.flat"></script>
</head>
<body>
  <h1>Welcome</h1>
</body>
</html>
보안 강화 패치
<!-- Build this file from a reviewed, version-pinned dependency. -->
<script defer src="/assets/vendor/polyfills.min.js"></script>

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

출처