[하루한줄] macOS: Integer overflow in CoreGraphics leading to oob write

URL

macOS: Integer overflow in CoreGraphics leading to out-of-bounds write when rendering fonts

Target

  • CoreGraphics, Big Sur version 11.1

Explain

macOS CoreGraphics에서 폰트를 렌더링 할 때 out-of-bound write가 가능한 취약점이 발견되었습니다. 해당 취약점은 glyphs를 bitmap으로 렌더링 할 때 CoreGraphics library의 범위 검증 미흡으로 인해 발생합니다. glyph bitmap을 렌더링 하기 위한 delta 기반의 anti-aliasing 알고리즘은 2^30보다 작은 좌표만 올바르게 처리할 수 있습니다. 그러나 이 좌표에 대한 검사가 존재하지 않습니다. 취약점이 존재하는 코드는 다음과 같습니다.

if ( v96 >> 12 == v94 >> 12 )
              {
                v106 = v101 - v100;
(1)             v107 = (v96 + v94) >> 13;
                v108 = v96 - v94;
                if ( v96 - v94 < 1 )
                  v108 = v94 - v96;
                if ( v94 - v96 > 0 )
                  LOWORD(v96) = v94;
                v109 = (v106 * (v108 - ((2 * (unsigned __int16)v96) & 0x1FFE) + 0x2000)) >> 13;
(2)             *(_WORD *)(v86 + 2 * v107) += v109;
(3)             *(_WORD *)(v86 + 2 * v107 + 2) += v106 - v109;
                v90 = v160;
              }

(1)에서 두 좌표의 중간 지점을 계산하고 숫자로 변환합니다. 이때 x 좌표는 둘 다 -2^30보다 작으므로 두 값을 더할 경우 integer overflow가 발생하여 값이 큰 양의 정수가 됩니다. 이로 인해 (2)와 (3)에서 oob write가 발생합니다.