Untrusted image data restricted from ImageIO codec dispatch in WebExtension icon loading
Apple 플랫폼의 ImageIO는 입력 데이터 앞부분의 magic bytes를 검사하여 codec을 선택합니다. [NSImage initWithData]는 이 dispatch를 아무런 제약 없이 위임하기 때문에, 시스템에 등록된 모든 codec이 공격자가 제공한 bytes에 의해 호출될 수 있습니다. PSD, OpenEXR, raw TIFF 같은 희귀한 포맷도 예외가 아닙니다. WebExtension 아이콘은 UIProcess에서 로드되는데, UIProcess는 WebContent와 달리 sandbox 제한을 받지 않습니다. 따라서 이 경로에서 codec vulnerability가 발생하면 영향도가 더 높아집니다.
Source/WebKit/Platform/cocoa/CocoaImage.mm
이번 수정은 [NSImage initWithData]를 3단계 방식으로 대체합니다. 먼저 CGImageSourceGetType으로 타입을 감지하고, WebCore::isSupportedImageType()(웹 콘텐츠에 적용되는 것과 동일한 allowlist)으로 통과 여부를 판별한 뒤, CGImageSourceCreateImageAtIndex로 디코딩합니다. SVG는 CoreGraphics 경로를 우회하여 macOS에서는 _NSSVGImageRep, iOS에서는 CoreSVG를 통해 별도로 처리됩니다.
Significance
가장 영향도가 높은 프로세스에서의 codec dispatch를 웹 콘텐츠와 동일한 allowlist로 제한함으로써, 공격자가 제어하는 magic bytes가 감사가 거의 이루어지지 않은 ImageIO decoder(PSD, OpenEXR, TIFF)를 sandbox 밖에서 호출하는 경로를 차단합니다.
Audit directions
SVG 분기는 resourceMIMETypeForPath(imagePath)를 기준으로 동작합니다. magic byte를 검사하는 것이 아니라 경로 및 확장자 기반의 heuristic입니다. extension manifest에서 아이콘 경로를 제어할 수 있는 공격자는 임의의 파일에 .svg 확장자를 붙여 해당 bytes를 [_NSSVGImageRep initWithData](macOS) 또는 [UIImage _imageWithCGSVGDocument](iOS)로 흘려보낼 수 있습니다. 이 경우 isSupportedImageType allowlist를 완전히 우회하게 됩니다. 두 API 모두 private API로 공개적인 fuzzing 커버리지가 거의 없으며, UIProcess에서 sandbox 없이 실행됩니다. 한편, 이번 hardening의 강도는 allowlist 자체의 품질에 달려 있습니다. 어떤 타입이 통과 기준을 만족하는지 파악하려면 WebCore/UTIRegistry.cpp를 살펴볼 필요가 있습니다. 다중 프레임이나 메타데이터 파싱이 복잡한 허용 타입(TIFF, JPEG 2000 등)은 집중적인 fuzzing 대상이 될 수 있습니다.