Today, we are going to explore a new vulnerability called “Type Confusion” and as the name indicates this is a logical bug which results from a confusion between object types.
First we need to know about C++ Casting operations and there are 3 main types of them.
C++ Casting Operations:
1- Static Casting –> static_cast<ToClass>(Object)
- Class hierarchy check at compile time
 
2- Dynamic Casting –> dynamic_cast<ToClass>(Object)
- Run-time check based on allocated type (vtable pointer)
 - Not used in performance critical code
 
3- C-style Casting –> (ToClass) (Object)
- C-style cast, no check for the object type at all
 
Type Confusion bugs arises from illegal down-casts

Up-casting (Widening):
- Cast subclass to base class
 - Done automatically
 
Down-casting (Narrowing):
- Cast base class to subclass
 - Need explicit cast
 
Child1 *c = new Child1(); Parent *p = static_cast<Parent*>(c); //Up-casting Child2 *d = static_cast<Child2*>(p); //Down-casting
How can we exploit type confusion bugs?
Fundamentally we need to control two pointers of different types to the same memory area
Simple Exploitation Demo
#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;
	}
};
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;
}
Let’s compile this simple c++ program and run it
g++ typeConfusion_Example.cpp -o typeConfusion_Example

And boom you got a command execution!
Leave a Reply