🇰🇷 한글 설명
PhpSpreadsheet 라이브러리의 SpreadsheetML XML reader가 행 인덱스 검증을 수행하지 않아, 공격자가 ss:Index="999999999"로 설정된 악의적 XML 파일로 내부 행 수를 약 10억으로 증가시킬 수 있습니다. getRowIterator() 호출 시 수십억 개 행 반복으로 인한 CPU 소진 및 서비스 거부가 발생합니다.
💡 쉬운 설명
PhpSpreadsheet 라이브러리가 엑셀 파일의 행 번호를 검증하지 않아, 공격자가 거짓 행 번호를 포함한 파일로 서버를 속일 수 있습니다. 서버가 수십억 개 행을 처리하려 시도해 CPU가 과부하되어 서비스가 중단됩니다.
🇺🇸 원문 (English)
PhpSpreadsheet is a pure PHP library for reading and writing spreadsheet files. Prior to 1.30.4, 2.1.16, 2.4.5, 3.10.5, and 5.7.0, the SpreadsheetML XML reader (Reader\Xml) does not validate the ss:Index row attribute against the maximum allowed row count (AddressRange::MAX_ROW = 1,048,576). An attacker can craft a SpreadsheetML XML file with ss:Index="999999999" on a <Row> element, which inflates the internal cachedHighestRow to ~1 billion. Any subsequent call to getRowIterator() without an explicit end row will attempt to iterate ~1 billion rows, causing CPU exhaustion and denial of service. This vulnerability is fixed in 1.30.4, 2.1.16, 2.4.5, 3.10.5, and 5.7.0.
📍 영향받는 시스템
PhpSpreadsheet 1.30.3 이하, 2.1.15 이하, 2.4.4 이하, 3.10.4 이하, 5.6.x 이하
⚔️ 공격 벡터
악의적으로 조작된 SpreadsheetML XML 파일(ss:Index 속성을 매우 큰 값으로 설정)을 업로드하여 서버 CPU 소진 유발
🛡️ 대응 방법
PhpSpreadsheet를 1.30.4, 2.1.16, 2.4.5, 3.10.5 또는 5.7.0 이상으로 즉시 업데이트
🔧 검증 코드
표시된 버전이 1.30.4, 2.1.16, 2.4.5, 3.10.5, 5.7.0 이상 중 하나이면 안전함
composer show phpoffice/phpspreadsheet 2>/dev/null | grep -i version