Array
pack 메서드의 취약점 상세
이 취약점은 Array 클래스의 인스턴스 메서드인 pack 내부에 존재합니다. pack 메서드는 배열 요소를 이진 문자열로 변환하는 데 사용되는 템플릿 문자열 인수를 받습니다.
템플릿 문자열 및 지시자
-
템플릿 문자열은 ‘H’(높은 니블 우선의 헥스 문자열) 또는 ‘m’(base64 인코딩 문자열)과 같은 지시자로 구성됩니다.
-
지시자 뒤에는 해당 지시자가 소비해야 할 양을 지정하는 반복 횟수가 올 수 있습니다 (예:
H2는 두 개의 헥스 문자를 소비).
음수 반복 횟수 발생 원인
-
pack메서드의 반복 횟수 처리 코드는ruby/pack.c에 있습니다. -
STRTOUL매크로는unsigned long값을 반환하지만, 이 값을 저장하는len변수는signed long입니다. -
이러한 부호 불일치로 인해 매우 큰 부호 없는 값이
len에 저장될 때 음수 값으로 해석될 수 있습니다.
‘X’ 지시자를 이용한 익스플로잇
-
‘X’ 지시자는 “바이트 뒤로 이동”하는 기능을 하며, 문자열의 길이를 줄이는 데 사용됩니다.
-
rb_str_set_len함수는plen - len을 통해 문자열 길이를 조정합니다. -
len이 음수가 되면plen - (음수)는plen + (양수)가 되어 문자열이 의도치 않게 확장됩니다. -
예시: `[“414243”].pack(“H6X
{2**64 - 1}”)`는 원래 문자열에 널 바이트를 추가하여 메모리 누출을 시연합니다.
보호 장치 및 우회
-
ruby/string.c의rb_str_set_len함수에는len > capa또는len < 0일 때 “probable buffer overflow” 버그를 발생시키는 보호 장치가 있습니다. -
그러나 문자열의 길이를 2의 거듭제곱으로 조절하면, 할당된 용량(capacity)이 다음 2의 거듭제곱으로 반올림되는 특성을 이용하여 보호 장치를 트리거하지 않고 가장 많은 메모리를 누출할 수 있습니다.