flawopen.com/Incidents/polyfill-io-supply-chain-incident-june-2024
Polyfill.io 공급망 공격 (2024)
2024년 사건에서 polyfill.io가 일부 방문자를 리디렉션했다. CDN 참조를 제거하라. CVE는 지정되지 않았다.
식당이 외부 공급업체의 음료병을 모든 테이블에 둔다고 하자. 공급업체가 병의 내용물을 바꾸면 식당이 메뉴를 바꾸지 않아도 손님에게 영향이 갈 수 있다.
핵심 개념 및 용어
Dynamic User-Agent Polyfilling- 클라이언트 브라우저의 헤더에 따라 서로 다른 JavaScript 번들을 제공하기 때문에 하위 리소스 무결성(SRI) 해시를 쓸 수 없게 되는 방식입니다.
Conditional Payload Evasion- HTTP Referer, 화면 크기, user-agent, 개발자 도구 사용 여부를 살펴 개발자에게는 깨끗한 스크립트를 주고 실제 모바일 사용자를 공격하는 수법입니다.
Domain Ownership Transfer Risk- 인수되거나 만료되거나 동의 없이 양도될 수 있는 도메인에서 서드파티 스크립트를 불러오는 데 따르는 본질적인 위험입니다.
Subresource Integrity (SRI)- 스크립트를 실행하기 전에 암호학적 해시를 검증하는 브라우저 메커니즘입니다.
프레임워크 매핑
- 이 가이드에서 설명하는 약점의 CWE 참조: CWE-829
사고 타임라인
Sansec는 도메인과 GitHub 계정의 소유권 변경을 보고했고 Fastly는 예방 차원의 대안을 제공했다.
Sansec는 분석을 공개하고 자체 측정에 따라 10만 개 이상 사이트의 노출 가능성을 추정했다.
Cloudflare가 자체 미러로 자동 재작성한다고 발표했고 이후 도메인은 보류됐다. 임시 재작성에 의존하지 말고 기존 참조를 제거하라.
단계별 공격 실행 흐름
소유권 변경
Sansec는 2024년 2월 도메인과 GitHub 계정의 소유권이 바뀌었다고 보고했다. 악성 응답이 보고되기 전 Fastly는 예방 차원의 대안을 제공했다. Fastly는 나중에 Sansec 보고서가 공개되었을 때 공격을 알게 되었다고 밝혔습니다. 2월의 대체 서비스 제안은 예방 조치였으며 당시 악의적 활동을 알고 있었다는 증거는 아닙니다.
사이트가 CDN 로드
cdn.polyfill.io를 참조하는 페이지는 브라우저가 반환된 JavaScript를 가져와 해당 페이지의 컨텍스트에서 실행하게 한다.
조건부 리디렉션 관측
Sansec가 분석한 샘플은 조건에 따라 일부 모바일 방문자를 리디렉션했다. 이는 해당 샘플의 동작이지 CDN의 모든 응답을 뜻하지 않는다.
완화와 대응
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>엔지니어링 및 시스템 보안 강화 체크리스트
- ✓절대 load third-party scripts from public CDNs into production applications without Subresource Integrity (SRI) hashes하지 마십시오.
- ✓권장 보안 엔지니어링 지침: Vendor all runtime polyfills and libraries directly into your application bundle via npm/yarn/pnpm lockfiles.
- ✓a strict Content Security Policy (CSP) with script-src 'self' to prevent unauthorized script injections을(를) 강제 적용하십시오.
- ✓all domain assets periodically to ensure embedded hosts have not lapsed or transferred ownership을(를) 정기적으로 감사하십시오.
- ✓SRI를 의존성 통제권 검토의 대체 수단으로 여기지 말라. 바이트가 고정되고 해시가 검증된 경우에만 사용하라.