본문 바로가기
tmp

Type confusion vulnerabilities

by m_.9m 2023. 1. 18.

1.Type confusion

type confusion 취약점은 프로그램에서 사용하는 변수나 객체를 선언 혹은 초기화되었을 때와 다른 타입으로 사용할 때 발생하는 취약점이다. 개체의 유형을 확인하지 않고 사용해 논리적 오류가 발생할 수 있다. 잘못 사용했을 시 원격 코드 실행이 가능하다

 

 

2. CWE

CWE-843로 등록되어 있다. CWE에 기록된 항목 설명은 다음과 같다.

 

제품이 호환되지 않는 유형을 사용하여 리소스에 액세스하면 리소스에 예상 속성이 없기 때문에 논리적 오류가 발생할 수 있습니다. C 및 C++와 같이 메모리 안전성이 없는 언어에서는 유형 혼동으로 인해 범위를 벗어난 메모리 액세스가 발생할 수 있습니다.

이 약점은 C에서 다양한 포함된 개체 유형이 있는 데이터를 구문 분석할 때 공용체와 자주 연관되지만 동일한 변수 또는 메모리 위치를 여러 방식으로 해석할 수 있는 모든 응용 프로그램에 존재할 수 있습니다.

이 약점은 C 및 C++에만 있는 것이 아닙니다. 예를 들어, PHP 애플리케이션의 오류는 스칼라가 예상되는 경우 배열 매개변수를 제공하거나 그 반대의 경우에 트리거될 수 있습니다. 다른 유형인 것처럼 액세스할 때 한 유형의 변수를 자동으로 변환하는 Perl과 같은 언어에도 이러한 문제가 포함될 수 있습니다.

 

 

3. 캐스팅 작업

C++ casting(형 변환) 작업에 대해 이해가 필요하다. 

프로그래밍에서 메모리 공간에 데이터를 저장을 하기 위해서 알맞는 자료형을 설정해야한다. 한번 선언된 자료형을 변환하거나 다른 자료형끼리 연산하기 위해서는 데이터 자료형을 바꿔주는 작업을 해야하는데 이 기법을 형 변환이라고 한다. 

 

캐스팅 작업에 정적 캐스팅, 동적 캐스팅, C 스타일 캐스팅이 있으며 유형 혼동 취약점은 불법 다운 캐스팅에서 발생한다.

C 스타일 캐스트는 지금 거의 사용되지 않는다.

 

정적 캐스팅

- static_cast 기본 형태

static_cast<바꾸려고 하는 타입>(대상);

 

: 언어에서 지원하는 명시적 변환을 수행합니다. 실수와 정수, 열거형과 정수형, 실수와 실수 사이의 변환을 허용한다. 논리적으로 변환 가능한 타입을 변환한다. 컴파일 시 클래스 계층 검사를한다. 

 

동적 캐스팅

- dynamic_cast 기본 형태

dynamic_cast<바꾸려는 새로운 타입>(대상)

: 안전한 다운 개스팅에 주로 사용된다. 부모 클래스의 포인터에서 자식 클래스의 포인터로 다운 캐스트해주는 연산자이다. 런타임 시간에 실제로 해당 타입의 다운 캐스팅이 가능한지 검사하기 때문에 런타임 비용이 높다. 

이외에도 reinterpret_cast, const_cast가 있다.

 

 

https://bufferoverflows.net/type-confusion-vulnerabilities/

 

 

3. 유형 혼돈 취약점 예시

아래는 형 변환의 예시코드이다.

#include <iostream>
using namespace std;


class Base {}; // Parent Class

class Execute: public Base {   // Child of Base Class
public:
    virtual void exec(const char *program) 
    {
        system(program);
    }
};

class Greeter: public Base {   // Child of Base Class
public:
    virtual void sayHi(const char *str) 
    {
        cout << str << endl; // str 출력(출력 출력문자 개행문자 삽입)
    }

};


int main() {

    Base *b1 = new Greeter();
    Base *b2 = new Execute();
    Greeter *g;

    g = static_cast<Greeter*>(b1); // Safe Casting to the same type "Greeter"
    g->sayHi("Greeter says hi!"); // String passed to sayHi() function

    g = static_cast<Greeter*>(b2); // Unsafe Casting to sibling class "Execute"
    g->sayHi("/usr/bin/xcalc"); // String passed to exec() function 
                                    // which will turn into a command to execute calculator

    delete b1;
    delete b2;
    return 0;
}

 

: sayHi 안에 있는 출력 기능으로 exec()가 실행되어 결과값이 출력된다. 이를 실행할 시 결과로 계산기가 실행되는 것을 확인할 수 있음

 


 

참조

https://bufferoverflows.net/type-confusion-vulnerabilities/

https://jiravvit.tistory.com/entry/type-confusion