본문 바로가기
Hack/System

Type Confusion이란?

by Becoming a Hacker 2023. 2. 12.
반응형

Type Confusion

Type Confusion은 프로그래밍 언어에서 발생할 수 있는 취약점 중 하나로, 데이터 타입이 불일치하는 상황에서 발생할 수 있습니다. 예를 들어, 어떤 프로그램에서 문자열을 입력받아 처리하는 기능이 있다고 가정해보겠습니다. 이때, 사용자가 문자열 대신 정수형 데이터를 입력할 경우, 프로그램은 예상치 못한 방식으로 작동할 수 있습니다.

※ 주로 변수나 객체를 선언 또는 초기하였을 때와는 다른 타입으로 사용할 때 발생

 

이처럼 프로그램에서는 예상치 못한 데이터 타입 변환이 일어나는 상황에서 Type Confusion 취약점이 발생할 수 있습니다. 참고로 Type Confusion은 메모리 손상 등의 심각한 보안 문제를 야기할 수 있으며, 악의적인 공격자가 해당 취약점을 이용해 시스템을 침해하는 경우도 많습니다.

 

Type Confusion 예제 코드

이 취약점은 아래의 예제와 같이 단순히 프로그램이 본래 의도했던 로직과는 다르게 작동하는 경우도 있지만, RCE(Remote Controll Exectuion)까지 가능할 수 있는 매우 위험한 취약점 입니다.

 

예제 코드에 대한 자세한 설명은 주석에 달아놓았습니다.

#include <iostream>

class Animal {
public:
    virtual void make_sound() {
        std::cout << "Animal sound" << std::endl;
    }
};

class Dog : public Animal {
public:
    virtual void make_sound() {
        std::cout << "Bark" << std::endl;
    }
};

class Cat : public Animal {
public:
    virtual void make_sound() {
        std::cout << "Meow" << std::endl;
    }
};

int main() {
    // Animal 포인터 변수 animal을 선언하고, Dog 클래스의 객체를 생성하여 대입합니다.
    Animal* animal = new Dog();

    // Cat 포인터 변수 cat을 선언하고, animal을 Cat 클래스로 형 변환하고 있습니다.
    // 이때, animal이 가리키는 객체는 Dog 클래스의 객체이므로 Type Confusion 취약점이 발생합니다.
    Cat* cat = static_cast<Cat*>(animal);

    // cat이 가리키는 객체는 Dog 클래스의 객체이므로, make_sound 함수가 Bark를 출력하게 됩니다.
    // 이는 원래 목적과 다른 동작을 유발할 수 있기 때문에 보안 취약점으로 이어질 수 있습니다.
    cat->make_sound();

    return 0;
}

 

실제 Adobe Flash에서 Type Confusion 취약점으로 RCE 취약점이 발생했었습니다. Hahwul님이 해당 취약점을 자신의 블로그에 상세히 포스팅해 주셨는데, 궁금하신 분들은 아래의 링크를 통해 참고해주세요.

 

[HACKING] Adobe Flash Player NetConnection Type Confusion(CVE-2015-0336) 분석

오랜만에 취약점 분석글을 작성합니다. 별다른건 아니고 x90c와 메일로 이야기하던 건이 있는데, 퇴근길에 보다보니 포스팅거리가 되어버렸네요. (아깝잖아요..)

www.hahwul.com

 

댓글