반응형
Use After Free (UAF)
Use After Free (UAF) 취약점은 프로그램이 메모리를 해제한 후에도 해당 메모리 위치를 계속 사용하는 경우 발생하는 보안 취약점이다.
운영 체제는 메모리를 효율적으로 사용하기 위해 동일한 크기의 메모리를 재할당할 때 종종 이전에 해제된 메모리 영역을 재사용한다. 만약 메모리를 해제하는 과정에서 데이터가 제대로 지워지지 않으면, 재할당된 포인터가 이전 데이터를 참조하게 되어 문제가 발생한다.
다음은 UAF 취약점을 설명하는 간단한 C++ 예제다.
#include <iostream>
#include <cstring>
class Vulnerable {
public:
char* data;
Vulnerable(size_t size) {
data = new char[size];
}
~Vulnerable() {
delete[] data;
}
void useData() {
std::cout << "Data: " << data << std::endl;
}
};
int main() {
Vulnerable* obj = new Vulnerable(10);
strcpy(obj->data, "Hello");
delete obj; // 메모리 해제
obj->useData(); // UAF: 해제된 후 메모리 사용
return 0;
}
- 할당:
Vulnerable
클래스의data
포인터에 동적으로 메모리가 할당된다. - 사용:
data
에 문자열이 저장되고 출력된다. - 해제:
delete
를 사용하여 메모리가 해제된다. - Use After Free: 프로그램이 해제된 메모리를 사용하려고 시도하며, 이는 정의되지 않은 동작을 초래하고 잠재적인 보안 위험을 야기한다.
이러한 결함은 임의 코드 실행이나 권한 상승과 같은 심각한 문제로 이어질 수 있다. 이는 재할당된 메모리가 이전 사용 시의 데이터를 여전히 포함하고 있을 때, 악의적인 행위자가 이를 악용할 수 있기 때문이다.
다음은 UAF 취약점을 방지하는 방법이다.
- 포인터 초기화: 메모리를 해제한 후 포인터를
nullptr
로 설정하여 해제된 메모리를 참조하지 않도록 한다.
delete obj;
obj = nullptr;
- 스마트 포인터 사용: C++의 스마트 포인터(
std::unique_ptr
와std::shared_ptr
)를 사용하여 메모리를 자동으로 관리하도록 한다.
#include <memory>
class Safe {
public:
std::unique_ptr<char[]> data;
Safe(size_t size) {
data = std::make_unique<char[]>(size);
}
void useData() {
std::cout << "Data: " << data.get() << std::endl;
}
};
int main() {
auto obj = std::make_unique<Safe>(10);
strcpy(obj->data.get(), "Hello");
obj->useData();
// 수동으로 delete할 필요 없음, unique_ptr이 메모리를 관리함
return 0;
}
- RAII (Resource Acquisition Is Initialization): 이는 C++에서 객체의 생성자와 소멸자에 리소스 할당 및 해제 코드를 구현하여 메모리 누수를 방지하는 메모리 관리 기술이다. 이를 통해 UAF 취약점을 방지할 수 있다.
#include <iostream>
#include <memory>
class RAII {
public:
std::unique_ptr<char[]> data;
RAII(size_t size) {
data = std::make_unique<char[]>(size);
}
void useData() {
std::cout << "Data: " << data.get() << std::endl;
}
};
int main() {
{
RAII obj(10);
strcpy(obj.data.get(), "Hello");
obj.useData();
// obj가 범위를 벗어나면 메모리가 자동으로 해제됨
}
// obj가 범위를 벗어났으므로 UAF 발생 가능성 없음
return 0;
}
반응형