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가 있다.
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
'tmp' 카테고리의 다른 글
YAML (0) | 2023.01.28 |
---|---|
직렬화(Serialization)와 역직렬화(Deserialization) (0) | 2023.01.20 |
네이버 기사 크롤링 파이썬 코드(네이버 뉴스 특정 카테고리) (0) | 2022.11.23 |
네이버 기사 크롤링 파이썬 코드(네이버 전체 창) (0) | 2022.11.18 |
Buffer Overflow Attack(달고나 문서) (0) | 2022.08.07 |