Programming world: Pointer in C++



| 보안 이슈와 포인터의 남용 개요


  모든 어플리케이션에서 보안과 신뢰성은 주요한 관심 요소이다. 잦은 비도로 나타나는 보안 사고와 어플리케이션의 비정상 동작 떄문에 보안과 신뢰성에 대한 관심이 더욱 강화되고 있다. 애플리케이션의 보안에 대한 책임은 대부분 그 개발자에게 있다. 


  C로 안전한 어플리케이션을 작성하는 것은 언어에 고유한 몇 가지 속성 떄문에 쉽지 않다. 예를 들어, C는 프로그래머가 배열의 영역을 넘어선 영역에 데이터를 기록하는 것을 막지 않는다. 이러한 접근은 메모리가 손상되어 보안에 잠재적인 취약점이 될 수 있다. 또한, 포인터의 부적절한 사용은 종종 많은 보안 문제의 근본적인 원인이 되기도 한다.


  어플리케이션이 예상하지 못한 방식으로 동작한다고 해도 최소한 인가되지 않은(unauthorized) 접근이 발생하지 않는다는 점에서 보면, 보안 문제로 보이지 않을 수도 있다. 하지만 이런 비정상적인 동작을 이용해서 애플리케이션의 서비스를 거부하여 침해를 당할 수도 있다. 


  CERT(http://www.cert.org/)에서는 C와 다른 언어에서의 보안 이슈를 포괄적으로 다루고 있다. 이 조직은 인터넷 보안 취약점에 대해 연구한다. 포인터의 사용에 관한 보안 이슈에 대해 집중해 살펴보도록 하자. CERT 조직의 보안 이슈 중 많은 부분이 포인터의 부적절한 사용에 기인한다. 포인터와 그 적절한 사용 방법에 대한 이해는 안전하고 신뢰할 수 있는 애플리케이션을 개발하는 데 매우 중요한 역할을 한다. 


  운영체제의 보안은 많이 개선됐다. 그런 개선 사항 중의 일부는 메모리의 사용 방법에 반영되었다. 일반적으로 운영체제의 개선 사항은 개발자의 통제 범위를 벗어나 있긴 하지만 애플리케이션에도 영향을 준다. 이런 이슈를 이해해야만 애플리케이션의 동작에 대해 설명할 수 있다. 주소 영역 배치 랜덤화(Address Space Layout Randomization)와 데이터 실행 방지(Data Execution Prevention)에 대해 집중적으로 살펴보고자 한다.


  주소 영역 배치 랜덤화(ASLR) 절차는 메모리 내 애플리케이션의 데이터 영역을 랜덤하게 배치한다. 데이터 영역은 코드, 스택, 힙을 포함한다. 이 영역의 배치를 랜덤화하면 공격자가 메모리가 어디에 위치할지 예측하기 어려우므로 데이터 영역에 접근하기 힘들다. return-to-libc같은 특정한 종류의 공격은 스택 일부를 덮어쓴 후, 제어를 이 영역으로 넘긴다. 이 영역은 보통 공유 C 라이브러리인 libc이다. 스택과 libc의 위치가 알려지지 않는다면, 이런 공격은 성공하기 어려울 것이다.


  데이터 실행 방지(DEP) 기법은 코드가 메모리의 실행 불가능한 영역에 있을 때 실행을 차단한다. 몇몇 종류의 공격은 메모리의 영역을 악성 코드로 덮어쓴 후, 제어를 이 영역으로 넘긴다. 이 코드 영역이 스택이나 힙처럼 실행 불가능한 영역일 경우 실행되지 않는다. 이 기법은 하드웨어나 소프트웨어로 구현할 수 있다.


앞으로 다음과 같은 몇 가지 측면에서 보안 이슈에 대해 알아보도록 하겠다. 


* 포인터의 선언과 초기화

* 부적절한 포인터 사용

* 메모리 해제 문제



※ 'Understanding and Using C Pointers' 책에서 일부 내용을 따온 것입니다.




+ Recent posts