[19] Fix format string issue in WebExtension error handling
Severity: Low | Component: WebKit Web Extensions error utilities | 8dea243
Severity가 Low인 이유는, 이 취약점에 도달하려면 일반 web origin이 아닌 설치된 extension이 해당 binding API를 직접 호출해야 하기 때문입니다. 또한 분석가는 패치 이전 경로에서 extension 유래 문자열이 실제로 format argument로 전달된 사례가 있었는지를 미검증 사항으로 표시합니다. 그 경로가 확인되지 않는다면, 잠재적인 format string attack surface는 이론적 수준에 머뭅니다.
Source/WebKit/Shared/Extensions/WebExtensionUtilities.cpp
-String toErrorString(const String& callingAPIName, const String& sourceKey, String underlyingErrorString, ...)
+String toErrorString(const String& callingAPIName, const String& sourceKey, const String& underlyingErrorString)
{
ASSERT(!underlyingErrorString.isEmpty());
- va_list arguments;
- va_start(arguments, underlyingErrorString);
- String formattedUnderlyingErrorString = formatString(underlyingErrorString.utf8().data(), arguments).trim(...);
- va_end(arguments);
+ String formattedUnderlyingErrorString = underlyingErrorString.trim(...);
...
- return formatString("Invalid call to %s. The '%s' value is invalid, because %s.", callingAPIName.utf8().data(), source.utf8().data(), lowercaseFirst(formattedUnderlyingErrorString).utf8().data());
+ return makeString("Invalid call to "_s, callingAPIName, ". The '"_s, source, "' value is invalid, because "_s, lowercaseFirst(formattedUnderlyingErrorString), "."_s);
}
Patch Details
toErrorString()에서 trailing variadic과 내부의 va_list/vsnprintf/CFStringCreateWithFormatAndArguments/_vsnwprintf 처리 과정이 제거되었습니다. static formatString 헬퍼 함수들도 완전히 삭제되었습니다. WebExtensionUtilities.h에 있던 toWebExtensionError 템플릿 variadic 역시 non-variadic inline으로 축소되었습니다. UIProcess/WebProcess extension API 파일 전반에 걸친 30개 이상의 호출 지점은 모두 WTF::makeString(...)을 통해 오류 메시지를 구성하도록 재작성되었습니다. NSString* 인자는 String(...)으로 감싸고, 정수는 직접 전달한 뒤, 최종 결과를 단일 const String&로 toErrorString/toWebExtensionError에 전달합니다.
런타임에 구성된 문자열을 printf 방식의 format argument로 사용함으로써, tainted 데이터 내의 %-specifier가 conversion specification으로 해석될 수 있는 문제.
Background
printf 계열 함수는 format 문자열에서 %s, %@, %n, %llu 등의 conversion specifier를 해석하고, specifier 개수만큼 va_list에서 variadic argument를 읽습니다. WTF::String::utf8().data()는 런타임에 구성된 문자열에 대한 const char* view를 반환하는데, 여기에는 리터럴 % 문자도 포함될 수 있습니다. 반면 WTF::makeString(...)은 타입 기반의 piece concatenation 방식으로 String을 구성하므로, format 해석이 발생하지 않습니다. WTF_ATTRIBUTE_PRINTF는 컴파일러에게 -Wformat 계열 검사를 활성화하는 힌트이지만, 이 검사는 호출 지점에서 format이 리터럴일 때만 동작합니다. String 파라미터를 통해 전달되는 경우에는 효과가 없습니다.
Analysis
패치 이전의 toErrorString은 variadic ...을 받아 underlyingErrorString.utf8().data()를 format으로 전달했습니다. underlyingErrorString이 attacker가 제어하는 데이터의 영향을 받는 경로가 존재한다면 문제가 됩니다. extension이 제공한 script ID, ruleset 이름, match pattern, URL, %@ 슬롯에 주입된 NSString 등이 그 예입니다. 이 경우 데이터 내의 %-specifier가 conversion specification으로 해석되어, argument 불일치 read (stack disclosure) 또는 vsnprintf 경로에서 %n을 통한 OOB write가 발생할 가능성이 있습니다. Cocoa에서는 CFStringCreateWithFormatAndArguments가 CF semantics를 따르므로, 매칭되지 않은 %@가 va_list에서 pointer 크기의 argument를 소비하고 Objective-C 방식으로 decode합니다.
a Aaa Aaaaaaaaaaaaaaaaaaaaaaa Aaa Aaaa a a Aaa Aaaa Aaaa Aaaaa a Aaaaaaaaaa Aa Aaaa Aaaaaaa Aaaa Aa Aaaaaaaaaa Aaa Aaaaaaa Aa a Aaaaa Aaaaaaa Aaaaaaa Aaaaaaaaaaaaaaaaaaaaaa Aaaaa Aa Aaaaa Aaaa Aaaa Aaa Aaa Aaaa Aaaaaaa Aaa Aaaa Aaaaaaaa Aaaaaaaa Aaaa Aaaaa Aaaaaaaaaaaa Aaaaaaaaaaaaaa Aaaaa Aaaa Aaaaa Aa Aaa Aaa Aaaaa Aaaa a Aaa Aaaaaa Aaaa Aaaaa Aaaaaa Aaaa Aaa Aaaaaa
a Aaaa Aaa Aaaaaaaaa Aaa Aa Aaa Aaaa Aaaa Aaa Aaa Aa Aaaa Aaaaaaa Aaaaaaaa Aaaa Aaaa Aaaaaaaaaa Aaaa Aaa Aaaa Aaaa Aa Aaa Aaaaaaaaaaaaaaaaaaaaaaa Aa Aaaaaaaaaaaaaaaaaaaaaaaa
🔒Detailed analysis of the format-string surface and whether the pre-fix code was ever reachable with attacker-influenced format input.
더 확인하려면 구독해 주세요
Audit directions
a Aaaaaa Aaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaa Aaaaaa Aaaaaaaaa Aa Aaaaaaaa Aaaaaa Aaa Aa Aaaaa Aaaa Aaaa Aaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaa a Aaaa Aaaa Aaa Aaaaaaaaaaaaaaaaaaaaaaaaa Aaaa Aaaaaaaaa Aaaaaa
a Aaaaaaaaaaa Aaa Aa a Aa Aaaa Aaaaaa Aaaa Aaaa Aa Aa Aaaaa Aaaaaaaaaaaaaaaaaa Aaaaaaaaa a Aaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaa Aa Aaa Aaa Aaa Aaaaa
a Aaaaaaaaaaaaaa Aaaaaa Aaaa Aaaaaaaaaaaa Aaaaaaaaaaaaaaa Aaa Aa Aaaaa Aaaaaaaaaaaaa Aaa Aaaaaaaaaaa Aa Aaaa Aa Aaa Aa Aaa Aaaaaa Aaa Aa Aaaaaaaa Aaaaaaaaaaaaa Aaaa Aaa Aaa Aaa Aaaa Aaaaaa
a Aaaaaaaaaaaaaaaaaa Aaaaaaaaa Aaaa Aaaaa Aaa Aaaaaaaaaaaaaaaaaaaaaaaa Aa Aaaa Aaa Aaaaa Aaaaa Aa Aa Aaaa Aaaaaa Aaaaaa Aaaa Aaaaaaaaaa Aaa Aaaa Aaa Aaaa Aaaaaa
🔒Multiple reusable audit patterns identified, including grep starting points for variadic printf-style helpers across WebKit.
더 확인하려면 구독해 주세요