JSON 데이터 쿼리 및 변환 언어 JSONata 취약점 패치
JSONata는 JSON 데이터를 쿼리하고 변환하는데 사용되는 경량이면서 강력한 쿼리 및 변환 언어입니다. 이는 JavaScript 객체 표기법(JSON) 데이터에 대한 질의를 간단하고 효율적으로 작성할 수 있도록 설계된 표현식 기반의 언어입니다. JSONata는 특히 JSON 데이터 구조 내에서 복잡한 데이터 검색, 필터링, 매핑 및 집계 작업을 수행할 수 있는 다양한 기능을 제공합니다.
사용 용도
JSONata는 데이터 처리와 관련된 다양한 분야에서 활용됩니다. 주로 JSON 형식의 데이터를 다루는 웹 개발, API 통신, 데이터 변환 작업, 서버리스 아키텍처에서의 메시지 처리 등에 널리 사용됩니다. 특히, API 응답에서 특정 데이터를 추출하거나, 여러 JSON 객체에서 데이터를 합치고 변형하는 등의 작업에 유용합니다.
예시
아래는 JSONata의 사용 예시를 몇 가지 보여줍니다.
기본 쿼리 예시
- JSON 데이터
{ "books": [ {"title": "Learning JSONata", "author": "John Doe"}, {"title": "Advanced JSONata", "author": "Jane Doe"} ] }
- JSONata 표현식:
$[books.title]
이 표현식은 모든 책의 제목을 배열로 반환합니다. - 결과
["Learning JSONata", "Advanced JSONata"]
데이터 필터링 예시
- JSONata 표현식:
books[author='John Doe'].title
이 표현식은 저자가 'John Doe'인 모든 책의 제목을 찾습니다. - 결과
["Learning JSONata"]
데이터 집계 예시
- JSON 데이터 추가
{ "orders": [ {"customer": "John Doe", "amount": 150}, {"customer": "Jane Doe", "amount": 200}, {"customer": "John Doe", "amount": 100} ] }
- JSONata 표현식:
orders[customer='John Doe'].amount.$sum()
이 표현식은 'John Doe' 고객의 모든 주문 금액을 합산합니다. - 결과
250
JSONata는 이처럼 JSON 데이터를 다루는 작업을 단순화하고, 코드의 복잡성을 줄이며, 데이터 처리 작업을 보다 효율적으로 만들어줍니다. 또한, JSONata 표현식은 매우 강력하며, 복잡한 데이터 구조에서도 유연하게 데이터를 검색하고 조작할 수 있습니다.
최근에 JavaScript의 JSONata 라이브러리의 취약점이 발견되었는데, 취약점의 영향, 기술적 세부사항, 그리고 이를 해결하기 위한 패치에 관한 내용을 정리합니다.
개요
- JSONata 라이브러리에서 중대한 보안 취약점이 발견되었으며, 이는 서비스 거부(DoS), 원격 코드 실행(RCE), 또는 기타 예상치 못한 행동을 유발할 수 있는 심각한 위협입니다.
- 이 취약점은 특정 버전의 JSONata 라이브러리에서 "Object" 프로토타입을 오염시킬 수 있는 가능성과 관련이 있습니다.
취약점 세부사항
- 취약점 식별자: CVE-2024-27307
- 영향받는 버전: 1.4.0 이상, 1.8.7 미만 및 2.0.0 이상, 2.0.4 미만
- 영향: 악의적인 JSONata 표현식을 사용하여 Object 생성자와 프로토타입의 속성을 재정의할 수 있습니다. 이를 통해 애플리케이션이 사용자 제공 JSONata 표현식을 평가하는 경우 서비스 거부, 원격 코드 실행 또는 기타 예상치 못한 행동이 발생할 수 있습니다.
해결 방안 및 패치
- 패치: 이 문제는 JSONata 버전 1.8.7 이상 및 2.0.4 이상에서 수정되었습니다. 사용자 제공 표현식을 평가하는 애플리케이션은 가능한 한 빨리 업데이트하여 악용을 방지해야 합니다.
- 임시 패치: 만약 즉시 업데이트가 불가능한 경우, 다음과 같은 패치를 적용할 수 있습니다. 이 패치는 Object 프로토타입에 대한 접근을 시도할 때 오류를 발생시켜, 이를 통해 발생할 수 있는 보안 위협을 차단합니다.
--- a/src/jsonata.js
+++ b/src/jsonata.js
@@ -1293,6 +1293,13 @@ var jsonata = (function() {
}
for(var ii = 0; ii < matches.length; ii++) {
var match = matches[ii];
+ if (match && (match.isPrototypeOf(result) || match instanceof Object.constructor)) {
+ throw {
+ code: "D1010",
+ stack: (new Error()).stack,
+ position: expr.position
+ };
+ }
// evaluate the update value for each match
var update = await evaluate(expr.update, match, environment);
// update must be an object
@@ -1539,7 +1546,7 @@ var jsonata = (function() {
if (typeof err.token == 'undefined' && typeof proc.token !== 'undefined') {
err.token = proc.token;
}
- err.position = proc.position;
+ err.position = proc.position || err.position;
}
throw err;
}
@@ -1972,6 +1979,7 @@ var jsonata = (function() {
"T1007": "Attempted to partially apply a non-function. Did you mean ${{{token}}}?",
"T1008": "Attempted to partially apply a non-function",
"D1009": "Multiple key definitions evaluate to same key: {{value}}",
+ "D1010": "Attempted to access the Javascript object prototype", // Javascript specific
"T1010": "The matcher function argument passed to function {{token}} does not return the correct object structure",
"T2001": "The left side of the {{token}} operator must evaluate to a number",
"T2002":"The right side of the {{token}} operator must evaluate to a number",
```diff
"D1010": "Attempted to access the Javascript object prototype", // Javascript specific
"T1010": "The matcher function argument passed to function {{token}} does not return the correct object structure",
"T2001": "The left side of the {{token}} operator must evaluate to a number",
"T2002": "The right side of the {{token}} operator must evaluate to a number",
이러한 수정 사항은 JSONata의 내부 구현 파일에 직접 적용되며, Object 프로토타입 오염을 시도하는 표현식을 감지하고 차단하는 기능을 추가합니다. 특히, 새로운 조건을 추가하여, 결과 객체의 프로토타입 또는 Object 생성자의 인스턴스가 대상과 일치하는 경우 오류를 발생시키도록 합니다. 이 오류는 "Attempted to access the Javascript object prototype"라는 메시지와 함께, 보안 위험을 알리는 명확한 신호를 제공합니다.
중요성
이러한 종류의 취약점은 애플리케이션의 보안을 심각하게 위협할 수 있습니다. 특히, 애플리케이션이 사용자로부터 제공받은 입력을 처리할 때, 이러한 취약점이 악용될 경우 무단으로 코드를 실행하거나, 시스템의 안정성을 해치는 등의 보안 사고로 이어질 수 있습니다.
따라서, JSONata를 사용하는 개발자나 시스템 관리자는 가능한 한 빨리 적절한 버전으로의 업데이트나 위에 제시된 패치 적용을 통해 이러한 보안 위협을 방지하는 조치를 취해야 합니다. 안전한 애플리케이션 개발 및 유지 관리를 위해서는 정기적으로 사용하는 라이브러리와 종속성의 보안 업데이트를 확인하고 적용하는 것이 매우 중요합니다.