NEWS

HOME

SECURITY NEWS

[보안뉴스] 프로토타입 오염 공격 취약점, 자바스크립트 앱 복잡성 증가로 위협 거세져
  • 관리자
  • |
  • 4498
  • |
  • 2024-05-13 19:03:43

이글루코퍼레이션, Prototype-Pollution 취약점 이용 공격사례 분석 발표

취약점 대응방안...사용자 입력 값 검증 등 앱의 전반적인 보안 상태 강화가 중요

 

[보안뉴스 김영명 기자] Prototype-Pollution(프로토타입 오염 공격)은 자바스크립트의 프로토타입 기반 상속 모델에 의해 발생하며, 공격자가 전역 객체 프로토타입에 임의의 속성과 메서드를 도입하거나 수정할 수 있는 취약점이다. 따라서 Prototype-Pollution의 개념 이해는 자바스크립트 앱 보안의 기본을 이해하는 것으로 볼 수 있다.

 

▲Prototype-Pollution 공격 흐름도[출처=portswigger]

 

 

이글루코퍼레이션은 최근 Prototype-Pollution 취약점을 이용한 공격사례 분석 및 대응방안을 발표했다. Prototype-Pollution은 독립형 취약점으로 악용된 사례는 적지만 이를 통해 공격자가 접근불가능한 개체의 속성을 제어할 수 있다. 애플리케이션이 공격자가 제어하는 ​​속성을 안전하지 않게 처리하는 경우 다른 취약점과 연결될 가능성이 있다. 클라이언트 측에서는 주로 DOM XSS로 발현되며, 서버 측에서는 원격코드 실행(RCE)으로 이어질 수도 있다.

 

자바스크립트 애플리케이션이 계속 복잡해지면서 Prototype-Pollution의 가능성은 여전히 ​​중요한 우려사항이 되고 있다. 자바스크립트는 객체 지향 언어로 상속 기능이 존재한다. ‘class’의 개념으로 상속을 구현하는 타 언어와는 다르게 ‘class’의 개념이 존재하지 않는 자바스크립트는 상속의 개념을 프로토타입을 이용해 구현한다.

 

자바스크립트에서는 객체의 원형인 프로토타입을 이용해 새로운 객체를 만들게 되는데 새롭게 생성된 객체도 또 다른 객체의 원형이 될 수 있다. 이를 프로토타입 체인(prototype chain)이라 부르며 프로토타입 체인을 통해 객체가 어떠한 속성에 접근하고자 할 때 그 객체의 속성뿐만 아니라 객체의 프로토타입으로 이동하며 속성을 탐색한다. 프로토타입 객체는 생성자 함수의 프로토타입 프로퍼티(prototype property)에 할당해 정의되며 정의된 프로토타입 객체에 메서드나 프로퍼티를 추가하면, 해당 생성자 함수를 통해 생성된 모든 객체가 이를 상속하게 된다.

 

▲프로토타입 체인 이해를 위한 예제 코드의 시각화한 모습[자료=이글루코퍼레이션]

 

 

프로토타입 체인의 예제코드에 포함된 myCat 객체는 Cat 생성자 함수의 인스턴스이기 때문에 먼저 Cat.prototype을 확인하는데, 만약 해당 메서드나 속성을 찾지 못하면 Cat.prototype의 프로토타입인 Animal.prototype에서 검색하게 된다. 이어 myCat 객체는 Cat 생성자 함수와 Animal 생성자 함수의 프로토타입 메서드를 모두 사용할 수 있게 된다.

 

Object 프로토타입에는 많은 속성이 존재하지만 그 가운데 ‘constructor’와 ‘prototype’, ‘proto’ 속성을 살펴본다. ‘constructor’는 객체의 생성자 함수를 참조하는 속성이다. 클래스를 사용해 객체를 생성할 때 ‘constructor’ 속성이 자동으로 설정되고, 해당 객체의 프로토타입을 가리키는 ‘prototype’ 속성이 프로토타입 체인을 사용해 관리되는 것이다.

 

‘proto’는 객체 클래스의 ‘Prototype’을 반환하는 속성이다. ‘proto’ 속성은 자바스크립트 언어의 표준은 아니지만 NodeJS 환경에서는 지원하고 있다. ‘proto’ 속성에 접근하거나 값을 설정할 경우 프로토타입에 대한 명시적인 작업이 수행된다.

 

사용자 조작으로 일어나는 Prototype-Pollution의 예는 크게 3가지로 나눌 수 있다. 먼저 ‘안전하지 않은 객체의 재귀 병합’에서 재귀 병합 함수는 사용자로부터의 입력이나 외부 데이터를 받아들일 때 안전하지 않게 구현되면 prototype-pollution에 취약해질 가능성이 크다.

 

▲객체의 재귀 병합 악용 사례[자료=이글루코퍼레이션]

 

 

두 번째로 ‘경로별 속성 정의’는 주어진 경로에 따라 객체의 프로퍼티 값을 설정하는 함수에서 사용자가 제어할 수 있는 입력에 대한 검증이 적절히 이뤄지지 않을 경우 사용자가 ‘proto’ 경로를 임의로 지정해 prototype-pollution을 유도할 수 있다.

 

세 번째로 ‘객체 복제(clone())’는 객체를 복제하는 역할을 하는 clone 함수와 여러 객체를 병합하는 merge 함수가 사용자 입력 처리 시 충분한 검증 없이 동작할 때 악의적인 사용자가 입력 값을 조작해 prototype-pollution 공격을 수행할 수 있다는 것을 의미한다.

 

Prototype-Pollution을 이용한 공격 시나리오는 CVE-2018-16487의 취약한 환경 구성에서 찾을 수 있다. CVE-2018-16487는 npm(node package manager)의 인기 있는 라이브러리인 lodash에서 발견된 취약점이다. lodash는 문자열, 숫자, 배열, 함수 및 개체 프로그래밍을 단순화해 프로그래머가 자바스크립트 코드를 보다 효율적으로 작성하고 유지·관리하는데 유용한 도구가 포함돼 있어 많은 사람들이 사용 중이다.

 

하지만 이 취약점은 ‘_.merge()’ 함수가 객체 병합 시 적절한 검증을 수행하지 않아 악의적인 사용자가 예상치 못한 속성을 추가하거나 기존 속성을 변경할 수 있는 취약점이 존재한다. 공격자는 이 취약점을 활용해 응용 프로그램 내에 개체 동작에 따라 권한 상승 또는 잠재적으로 RCE 공격을 초래할 수 있는 개체 프로토타입 속성을 추가할 수 있다.

 

▲CVE-2018-16487 공격흐름도[자료=이글루코퍼레이션]

 

 

Prototype-Pollution은 중요한 보안 문제이기 때문에 기술적 복잡성을 이해하고 사전 예방적 완화 전략을 채택해 개발자는 악용 위험을 크게 줄이고 애플리케이션의 전반적인 보안 상태를 강화해야 한다. 이를 위해 먼저 ‘사용자 입력 값 검증’이 필요하다. 사용자의 입력 값 검증을 수행하려면 사용자로 입력받은 후 입력을 검증하는 코드를 추가하거나 수정해야 한다.

 

다음으로 ‘Object.freeze()’ 메서드를 활용해야 한다. Object.freeze() 메서드는 객체를 동결해 더 이상 변경이 불가능하도록 한다. 동결된 객체는 새로운 속성 추가, 존재하는 속성을 제거하는 것을 방지해 속성의 불변성과 프로토타입이 변경되는 것을 방지한다.

 

Object.create() 메서드는 지정된 프로토타입 객체 및 속성을 갖는 새 객체를 만든다. 이때 프로토타입이 null인 객체를 생성할 경우 기본 프로토타입을 상속받지 않아 프로토타입 체인에서 벗어나게 된다.

 

마지막으로 npm(node package manager)는 모듈을 최신화하면 Prototype-Pollution 등 보안 위협 및 버그를 방지할 수 있다. npm 모듈의 최신 버전은 깃허브 레포지토리, npm 공식 웹사이트, 또는 npm 명령어를 통해 확인이 가능하다.

[김영명 기자(boan@boannews.com)]

 

[출처 : 보안뉴스(https://www.boannews.com/media/view.asp?idx=129710&page=1&mkind=1&kind=)]​ 

이전글 [보안뉴스] 국세청, ‘세무조사 안내문’ 등으로 기관 사칭하는 해킹 메일 주의 당부
다음글 [보안뉴스] 국내 SW 그누보드와 보안 솔루션 2종에서 취약점 발견... 신속한 보안 업데이트 필요
비밀번호 입력
비밀번호
확인
비밀번호 입력
비밀번호
확인
TOP