[4] ShareableBitmap IPC validator integer overflow
Severity: High | Component: WebKit IPC serialization | 3d2be34
탈취된 renderer에서 도달 가능한 IPC validation bypass가 High로 분류된 근거입니다. 비일관적인 bitmap parameter가 privileged process까지 전달되어 OOB memory access로 이어지는 escalation 경로는 arithmetic overflow로부터 직접 도출되며, confidence는 0.88입니다. 다만 signed/unsigned promotion의 정확한 동작 방식과 특정 downstream process에 대한 영향 여부는 commit만으로는 확인되지 않습니다.
ShareableBitmap::bytesPerRow()의 IPC validator는 m_size->width() * *bytesPerPixel 곱셈을 그대로 수행하는 방식을 사용했습니다. 이 연산은 overflow될 수 있었고, size 일관성 검사가 우회되는 문제로 이어졌습니다. 패치에서는 해당 곱셈을 WTF::safeMultiply로 교체하여, overflow 발생 시 false를 반환하도록 변경되었습니다.
Source/WebKit/Shared/WebCoreArgumentCoders.serialization.in
- [Validator='*bytesPerRow >= m_size->width() * *bytesPerPixel'] unsigned bytesPerRow();
+ [Validator='[&]() { std::remove_cvref_t<decltype(*bytesPerRow)> bytesForWidth; return WTF::safeMultiply(m_size->width(), *bytesPerPixel, bytesForWidth) && *bytesPerRow >= bytesForWidth; }()'] unsigned bytesPerRow();
Patch Details
패치는 한 줄짜리 inline validator 표현식을 lambda로 교체합니다. 이 lambda는 먼저 WTF::safeMultiply를 통해 width * bytesPerPixel을 계산하고, 결과를 로컬 변수 bytesForWidth에 저장합니다. 곱셈이 overflow되면 safeMultiply는 false를 반환하고, validator는 IPC 메시지를 거부합니다. 곱셈이 성공한 경우에만 *bytesPerRow >= bytesForWidth 비교가 수행됩니다. bytesForWidth의 타입은 std::remove_cvref_t<decltype(*bytesPerRow)>로 추론되어 bytesPerRow와 동일한 타입을 갖습니다. 이를 통해 overflow 검사가 올바른 arithmetic domain에서 수행됩니다.
Background
WebKit의 .serialization.in DSL은 IPC 메시지에 대한 C++ argument coder를 생성합니다. 직렬화된 각 필드에는 [Validator=...] 속성을 지정할 수 있으며, 이 C++ 표현식이 true를 반환해야 역직렬화가 성공합니다. validator는 수신 process에서 실행되며, 탈취된 송신자로부터 오는 비정상적인 IPC payload에 대한 1차 방어선 역할을 담당합니다.
ShareableBitmap은 WebKit에서 shared memory를 통해 process 경계를 넘어 bitmap image 데이터를 공유하기 위한 타입입니다. 직렬화된 형태에는 크기 정보(m_size), bytesPerPixel, bytesPerRow, pixel format 메타데이터가 포함됩니다. 수신 process는 이 parameter들을 바탕으로 shared memory region을 매핑할 때 buffer 크기와 offset을 계산합니다.
WTF::safeMultiply는 WebKit의 유틸리티 함수로, 곱셈 결과가 대상 타입을 overflow할 경우 silent wrapping 대신 false를 반환합니다. 이미 여러 size 계산 위치(SharedVideoFrameInfo, CVUtilities, WebAudioBufferList)에서 사용되고 있어, 이 패턴에 대한 인식이 있었음을 알 수 있습니다. 다만 ShareableBitmap validator에는 적용이 누락되었습니다.
Analysis
IPC input validator에서 발생한 unsigned/signed arithmetic overflow로 인한 size 일관성 검사 우회.
패치 이전에는 validator가 m_size->width() * *bytesPerPixel을 native arithmetic으로 계산했습니다. commit 메시지에서는 이 곱셈이 "음수로 overflow될 수 있다"고 명시하고 있어, 연산이 signed 타입에서 수행되었음을 알 수 있습니다. 다만 mixed signed/unsigned 피연산자에 대한 C++ promotion 규칙에 따라 동작이 달라질 수 있으며, 어느 쪽이든 실질적인 영향은 동일합니다. width가 매우 큰 경우 곱셈이 wrap됩니다. 이때 wrap된 결과가 작은 양수 unsigned 값이 되든 음수 signed 값이 되든, 정상적으로 보이는 bytesPerRow에 대한 >= 비교를 통과하게 됩니다. 결과적으로 validator가 비일관적인 bitmap 설정을 수락하는 상황이 발생했습니다.
Aaa Aaaaaaaaaaaaaaaaaaaa Aaaaaaaaaa Aaa Aa Aaaa Aaaaaaaaaaaaaaa Aaa Aaaa Aaa a Aaaaa Aaaaaa a Aaaaaaaaaaaaaaa Aa Aaa Aaaaaaaaa Aa Aaaaaa Aa Aaaaa Aaa Aaa Aaaa Aaaaa Aaa Aaaaaaaaaaaaa Aa Aa Aaaaaa Aaa Aaa a Aaaaaa Aaaaaaaaaaaaaaaaaaa Aaaaaaaaaaa Aa Aa Aaaaaaaaa Aaaaaa Aa Aaaaaaaaaaa Aa Aaaa Aaaaaaaaa Aaa Aaaaaaaaaaaaaa a Aaaaaa Aaaa Aaaaaa Aaa Aaaaaaa Aaaa Aaa Aaaaa Aaaaaaaaaa Aaaaaaaaa Aaa Aaaa Aa Aaaaaa Aaa Aaaa Aaaaa
a Aaaaaaaaaaaaaa Aaaaaaa a Aaa Aaaaaaaaaa Aaa Aaaaaaa Aaaaaaaaaaaaaaa Aaa Aaaaaaaaaa Aa Aaaaaaaa Aaaaaa Aaaaaaa Aaaaa Aaaa Aaa Aaaaa Aaaaaa Aaaaaaaaaa Aaaaa Aaaa Aaa Aaaa Aaa Aaaaaa Aa Aaaa Aaaaaaaaaa Aaaaaaaa Aaaaaaaaa Aa a Aaaaaa Aa Aaaa Aaaa Aaaaaaaaaaa Aaaaaaaaaa a Aaaaaa a Aa Aa Aaaaaaaa Aaaaa Aaaaaa Aaa Aaaa Aaaa Aa a Aa Aaa Aa Aaaaaaaaa Aaa Aaaaaa Aaaaaaa Aaa Aaaa Aaaa Aaaaaaa Aaaaaa Aaaa Aaa a Aaaaa
Aaaaaaa Aaaaaaaaaaaaaaaaaaa Aaaaa Aaaaaa Aaaaaaaaaa Aaaaa Aaa Aaa Aaaaaaaaaa Aaaaa Aaa Aaa Aaaaaa Aaa Aaaa Aaaa Aaaa Aaa Aaaaaa Aaaaaaaaaaa Aaa Aaaaa Aaaaaaaaa Aa Aaa Aaa Aa Aaaaaa
🔒Explores the cross-process implications of this validation bypass and what memory access primitives it could yield in a privileged process
더 확인하려면 구독해 주세요
Audit directions
a Aaaaaaa Aaaaaaaaaaaaaaaaaaaa Aaa Aaaaaaaaa a Aaaaaaaaa Aaaa Aaa Aaaaaaaa Aa Aa Aaaaaaaaaaa Aaaa Aaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaa Aaa Aaaaaaaaaaaa Aaaa Aaaaa a Aaa Aaa Aaaaaaaaaaa Aa Aaaaaaaaaaaaaa Aa Aaaaaaaaaaaaaaaaa Aaaaa Aaaa Aaaa Aaaa Aaaaa Aaaa Aaa Aaaaaaaa Aa Aaa Aaa Aaaa Aaaaa
a Aaaaaaa Aaaaaaaaaaaaaaaa Aa Aaaaaaaaaaa Aa Aaa Aaaa Aaaa Aaa Aaaaaaaaaa a Aaa Aaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaa Aaaaaa a Aaaaaa Aaa Aaaaaaaaaaaaaaa Aaaaa Aaaa Aaaa Aaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa Aaaaaaaaaaaaaaaaa Aaaaa Aaaaaa Aaaa Aaaa Aaaa Aa Aaaaaa
a Aa Aaaaaaaaaaaaaaa Aaaaaaaaaa Aaa Aaa Aaaaaa Aa Aaaaaa Aaa Aaa a Aaaaaaaaaaaa a Aaaaaaaa Aaaaaaaaaa Aaa Aaaaaaaaaaa Aaaaa Aaaa Aaaa a Aaaa Aaaaaaaaa Aaaaa Aa Aaaa Aaa Aaa Aaaaa Aaaaaa Aa Aaaaaaaa Aaa Aaaaaaaaaaaaaaa Aaaaaaaaaaaa Aa Aaaaaa Aaaaaa Aaa Aaaa Aaa Aaaa Aaa Aaa Aaaaa
Aaaaaaaaa Aa Aaa Aaa Aaaaaaaaaaaaaaa Aaaaaaaaa Aaa Aaaaaa Aa Aaaa Aaa Aaaa Aaaaaa Aaaaaa Aaa Aaaaaa Aa Aaaaaaaaaaaaa a Aaaaaaaaaa Aaaaaaaaa Aa Aaa Aaaaaaaaa Aa a a Aa Aaaaaa
🔒Multiple IPC validation audit patterns identified, with concrete search targets across WebKit's serialization infrastructure
더 확인하려면 구독해 주세요