---
title: "Ruby 4.0 Array#pack에서 메모리 읽기 취약점 발견 — 2002년부터 숨어있던 버그"
published: 2026-01-06T23:46:24.000Z
canonical: https://jeff.news/article/511
---
# Ruby 4.0 Array#pack에서 메모리 읽기 취약점 발견 — 2002년부터 숨어있던 버그

Ruby MRI의 Array#pack 메서드에서 부호 불일치로 인해 메모리를 범위 밖으로 읽을 수 있는 취약점이 발견됨. Ruby 4.0.0부터 1.6.7까지 영향.

- Ruby 4.0.0 크리스마스 릴리스를 기념(?)해서 Luke Jahnke가 Ruby MRI의 정수 처리 버그를 다시 들여다봤는데, `Array#pack` 메서드에서 할당된 문자열 버퍼 범위를 넘어 메모리를 읽을 수 있는 취약점을 발견함

- 영향 범위가 좀 놀라운데, Ruby 4.0.0은 물론이고 **2002년에 나온 Ruby 1.6.7까지 거슬러 올라감**. 20년 넘게 숨어있던 버그인 셈

- 핵심은 `pack` 메서드의 반복 횟수(repeat count) 처리에 있음. `ruby_strtoul`이 unsigned long을 반환하는데 이걸 받는 `len` 변수는 signed long이라, 큰 양수 값이 음수로 해석되는 고전적인 부호 불일치(signedness mismatch) 문제

- 여기에 `X` 디렉티브("1바이트 뒤로")를 결합하면 재밌는 일이 벌어짐. 음수만큼 문자열을 줄이라고 했더니 오히려 **문자열이 커져버리는** 것. 이걸로 할당 범위 밖의 메모리를 읽을 수 있게 됨

- 무제한으로 읽을 수 있는 건 아니고, `rb_str_set_len`의 가드 조건에 걸림. 용량이 2의 거듭제곱으로 반올림되기 때문에, 배열 안의 문자열 길이를 2의 거듭제곱으로 맞추면 가드를 피하면서 최대한 많이 읽을 수 있음

> [!NOTE]
> 실제로 영향을 받을 가능성은 낮음. `Array#pack`이 실제 Ruby 앱에서 거의 안 쓰이고, 공격자가 메서드 인자를 제어할 수 있는 경우는 더 드묾. 하지만 메모리 디스클로저 자체의 심각성은 높으니 업데이트 권장

- 수정은 [PR #15763](https://github.com/ruby/ruby/pull/15763)에서 진행 중

## 핵심 포인트

- unsigned/signed long 불일치로 반복 횟수가 음수가 됨
- X 디렉티브와 결합하면 버퍼 밖 메모리 읽기 가능
- 실제 앱에서 악용 가능성은 낮지만 20년 이상 존재한 버그

## 인사이트

C 언어의 부호 불일치 버그가 20년 넘게 생존한 사례. 잘 안 쓰이는 API일수록 감사가 소홀해지는 전형적인 패턴임.
