프로토타입 오염 공격 취약점, 자바스크립트 앱 복잡성 증가로 위협 거세져

2024-05-13 18:14
  • 카카오톡
  • 네이버 블로그
  • url
이글루코퍼레이션, 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)]

<저작권자: 보안뉴스(www.boannews.com) 무단전재-재배포금지>

헤드라인 뉴스

TOP 뉴스

이전 스크랩하기


과월호 eBook List 정기구독 신청하기

    • 아마노코리아

    • 인콘

    • 엔텍디바이스코리아

    • 핀텔

    • KCL

    • 아이디스

    • 씨프로

    • 웹게이트

    • 씨게이트

    • 하이크비전

    • 한화비전

    • ZKTeco

    • 비엔에스테크

    • 엔토스정보통신

    • 원우이엔지

    • 지인테크

    • 홍석

    • 이화트론

    • 다누시스

    • 테크스피어

    • 경인씨엔에스

    • 슈프리마

    • 인텔리빅스

    • 시큐인포

    • 미래정보기술(주)

    • 비전정보통신

    • 지오멕스소프트

    • 트루엔

    • 인터엠

    • 세연테크

    • 성현시스템

    • 한국아이티에스

    • 케비스전자

    • 아이원코리아

    • 다후아테크놀로지코리아

    • 한결피아이에프

    • 스피어AX

    • 동양유니텍

    • 투윈스컴

    • TVT코리아

    • 프로브디지털

    • 위트콘

    • 포엠아이텍

    • 넥스트림

    • 페스카로

    • 아우토크립트

    • 신우테크
      팬틸드 / 하우징

    • 에프에스네트워크

    • 네티마시스템

    • 케이제이테크

    • 알에프코리아

    • (주)일산정밀

    • 아이엔아이

    • 미래시그널

    • 새눈

    • 창성에이스산업

    • 유투에스알

    • 제네텍

    • 이스트컨트롤

    • 현대틸스
      팬틸트 / 카메라

    • 지에스티엔지니어링
      게이트 / 스피드게이트

    • 주식회사 에스카

    • 에이앤티글로벌

    • 모스타

    • 한국씨텍

    • 넥스텝

    • 레이어스

    • 구네보코리아주식회사

    • 에이티앤넷

    • 티에스아이솔루션

    • 엘림광통신

    • 보문테크닉스

    • 포커스에이아이

    • 메트로게이트
      시큐리티 게이트

    • 휴젠

    • 신화시스템

    • 글로넥스

    • 이엘피케이뉴

    • 세환엠에스(주)

    • 유진시스템코리아

    • 카티스

    • 유니온바이오메트릭스

Copyright thebn Co., Ltd. All Rights Reserved.

MENU

회원가입

Passwordless 설정

PC버전

닫기