핵심 문제는 Oj
가 콜론으로 시작하는 JSON 문자열을 Ruby 심볼로 자동 변환하는 기본 기능입니다. 이 기능은 공격자가 조작된 입력을 제공할 경우 심각한 취약점으로 작용합니다. 예를 들어, {"name":":admin_notes"}
와 같은 JSON이 Oj.load
에 의해 {"name"=>:admin_notes}
로 로드되면, 데이터베이스 업데이트 쿼리에서 admin_notes
컬럼의 내용을 name
컬럼으로 복사하여 민감한 데이터 유출을 유발할 수 있습니다. 더 나아가, Oj
가 임의의 Ruby 객체를 JSON으로부터 생성할 수 있다는 점은 원격 코드 실행(RCE)으로 이어질 수 있습니다. 필자는 “기본적으로 안전하지 않은” 소프트웨어 개발 관행을 비판하며, 라이브러리는 기본적으로 보안을 최우선으로 하고, 위험한 작업은 명시적으로 표시되어야 한다고 주장합니다.
Ruby Oj JSON 파서의 객체 역직렬화 취약점
Brane Dump: Object deserialization attacks using Ruby's Oj JSON parser
작성자
발행일
2025년 07월 26일
핵심 요약
- 1 Ruby의 Oj JSON 파서는 기본 설정에서 객체 역직렬화 취약점을 유발할 수 있습니다.
- 2 JSON 문자열 내의 콜론 접두사가 Ruby 심볼로 변환되어 SQL 주입 및 원격 코드 실행으로 이어질 수 있습니다.
- 3 안전한 사용을 위해 Oj.default_options = { mode: :strict } 설정 및 Oj.safe_load 사용이 권장됩니다.
도입
이 글은 필자가 겪은 `PG::UndefinedColumn` 예외에서 시작됩니다. JSON 문자열 내의 콜론 접두사가 Ruby `Oj` JSON 파서에 의해 Ruby 심볼로 해석되는 문제가 발견되었습니다. `Oj`는 Ruby 프로젝트에서 널리 사용되는데, 이러한 기본 동작이 신뢰할 수 없는 입력을 처리할 때 심각한 객체 역직렬화 취약점을 초래할 수 있음을 필자는 강조합니다. 이는 `Oj` 파서의 기본 설정이 예기치 않은 보안 문제를 야기할 수 있음을 시사합니다.
결론
이 글은 `Oj` 파서의 객체 역직렬화 취약점에 대한 완화 전략을 제시합니다. 가장 중요한 권고는 애플리케이션 초기화 코드에 `Oj.default_options = { mode: :strict }`를 설정하여 안전하지 않은 역직렬화를 방지하는 것입니다. 또한, `Gemfile.lock`에서 `oj` gem의 사용 여부를 확인하고, 가능한 경우 표준 `json` gem으로 전환하거나 `Oj.safe_load`를 사용할 것을 제안합니다. `Oj`를 사용하여 JSON을 객체로 역직렬화하는 것은 필요한 안전 기능이 부족하므로 피해야 한다고 강조하며, 위험한 함수 호출에는 명확한 경고 라벨을 붙여 개발자가 잠재적 위험을 인지하도록 해야 한다는 "기본적으로 안전한" 소프트웨어 개발 철학을 재차 강조합니다.