← All issues

[7] WTF Vector growImpl Release Assert Hardening

Severity: Medium | Component: WTF Vector | 3b05441

Release build에서 관찰 가능한 효과가 기반 컨테이너의 silent invariant 위반(size regression)으로, OOB access나 stale data 노출로 이어질 가능성이 있습니다. 다만 실제로 regression을 유발하는 특정 caller에 대한 commit 근거가 없기 때문에 Medium으로 평가했습니다. 이 변경은 특정 버그를 수정하는 패치가 아니라 hardening 조치에 해당합니다.

Vector::growImpl의 debug 전용 assertion을 ASSERT_WITH_SECURITY_IMPLICATION에서 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION으로 격상시켰습니다. 해당 assertion은 새로 요청된 size 파라미터가 현재 m_size 이상인지 확인합니다.

Source/WTF/wtf/Vector.h

template<FailureAction failureAction>
bool Vector<T, inlineCapacity, OverflowHandler, minCapacity, Malloc>::growImpl(size_t size)
{
- ASSERT_WITH_SECURITY_IMPLICATION(size >= m_size);
+ RELEASE_ASSERT_WITH_SECURITY_IMPLICATION(size >= m_size);
if (size > capacity()) {
bool success = expandCapacity<failureAction>(size);
if constexpr (failureAction == FailureAction::Report) {

기반 컨테이너의 caller-supplied size regression에 대해 release build가 보호되지 않는 상태로, security-critical invariant가 debug build에서만 강제된 패턴.

WTF::Vector는 WebKit의 주요 동적 배열로, WebKit의 모든 프로세스에서 광범위하게 사용됩니다. growImplgrow() 연산을 지원하는 내부 메서드로, vector의 논리적 크기를 조정하고 필요 시 capacity를 확장합니다. ASSERT_WITH_SECURITY_IMPLICATION은 release build에서 제거되는 debug 전용 assertion입니다. 반면 RELEASE_ASSERT_WITH_SECURITY_IMPLICATION은 이에 대응하는 release build용 assertion으로, 모든 빌드 환경에서 제어된 프로세스 종료를 유발합니다.

Release build에서는 size >= m_size invariant가 강제되지 않았습니다. grow()를 호출하는 쪽에서 현재 m_size보다 작은 size를 전달하면, 새 size와 기존 size 사이의 요소에 대해 destructor 호출 없이 vector의 논리적 크기가 줄어들게 됩니다. 이후 연산은 m_size는 감소했지만 backing store에 stale 객체가 남아 있는 vector를 대상으로 동작합니다. 요소 타입과 사용 방식에 따라 stale data가 노출되거나, vector 내부 상태가 손상되거나, 단조 증가를 가정하는 이후 코드에서 OOB access가 발생할 가능성이 있습니다.

🔒

Explores the concrete memory corruption scenarios that could arise if the now-enforced invariant were violated in a release build

더 확인하려면 구독해 주세요

🔒

Systematic audit directions for similar debug-only assertion gaps across WebKit's foundational containers

더 확인하려면 구독해 주세요