본문 바로가기
IT/해킹보안

프로그래밍 코드 오류로 인한 해킹 문제점

by 모르면 모른다고 해 2013. 4. 11.
반응형

프로그램의 공격은 해킹의 핵심 요소다. 프로그램은 컴퓨터에게 뭔가를 지시하는 복잡한 규칙에 불과하다. 프로그램을 공격하는 것은 어떤 일을 컴퓨터가 수행하게끔 하는 좀 더 현명한 방법일 뿐이다. 설사 그 프로그램이 공격을 막을 수 있게 설계됐을지라도 프로그램은 설계대로만 동작하므로 보안 문제점은 프로그램 설계상이나 포르개림이 동작하는 환경에 결점이 있음을 의미한다.

프로그램은 하게 돼 있는 일만 할 수 있다. 불행하게도 프로그램이 하는 일과 프로그래머가 프로그램에게 지시하는 일이 항상 같지는 않다. 다음 이야기를 보자.

     한 남자가 숲속을 걷다가 램프를 발견했다. 그는 호기심에 램프를 들고 소매로 문지르니, 램프에서 요정 지니가 나타나서 자신을 구해줘서 고맙다며, 세 가지 소원을 들어주겠다고 했다. 남자는 너무 기뻐서 자신이 원하는 세 가지를 이야기 했다.
남자가 말했다. "먼저 돈이 1조원 있었으면 좋겠네" 지니가 손가락을 튕기자 돈으로 가득 찬 가방이 남자 주위로 수북이 쌓였다. 남자는 눈이 휘둥그레져서 두 번째 소원을 말했다. "그리고 페라리 스포츠카도 갖고 싶어" 그러자 페라리가(엔초) 나타났다. 남자는 계속해서 말했다. "끝으로 여자들에게 사랑 받고 싶어."
지니가 손가락을 튕기자 그 남자는..... 초콜릿 상자로 변했다.

지니가 생각한 남자의 마지막 소원과 실제 소원이 달랐던 것처럼 프로그램도 자신이 해야 할 일을 정확하게 처리하지만 결과가 프로그래머가 원했던 것과 항상 일치하지는 않는다.
흔히 저지르는 실수 중 하나가 1차이 오류 off-by-one error 이다. 어떤것이 있냐면
- 100미터 짜리 울타리를 만들고 10미터마다 기둥을 세운다면 몇 개의 기둥을 세워야 할까? 많은 사람들이 10개라고 대답하겠지만 틀린 답이다. 정답은 11개.
- 프로그래머가 어떤 숫자 범위(N에서 M까지)에 있는 값을 처리하는 경우, 예를들면 N=5, M=17이라면 프로그램은 몇 개의 아이템을 처리해야 할까? 단순하게 M-N 즉 17-5 = 12 라고 생각하는 사람도 있다. 하지만 그것은 틀렸고 정답은 17-5+1 = 13개다.


1차이 오류는 안전한 프로그램에 보안 취약점을 만들수 있다.  오래된 예로 OpenSSH가 있다. OpenSSH는 암호화되지 않은 서비스인 telnet, rsh, rep 등을 대체하기 위한 프로그램으로 설계된 안전한 터미널 통신 프로그램이다. 그렇지만 이 프로그램의 채널 할당 코드에는 1 차이 오류가 있었고, 그 코드는 해커의 주된 공격 대상이 됐다. 즉 코드에 다음과 같은 부분이 있었다.
-------------------------------------------------
if ( id < 0 || id > channels_alloc) {
-------------------------------------------------
위 코드는 원래 다음 코드처럼 하는 것이 옳다
-------------------------------------------------
if (id < 0 || id >= channels_alloc) {
-------------------------------------------------
첫 번째 코드를 풀어서 설명하면 ID가 0보다 작거나 ID가 채널보다 크면 다음 명령({ 이하)어를 수행하라는 의미다. 하지만 그 코드는 잘못됐고 두 번째 코드인 ID가 0보다 작거나 ID가 채널 이상이면, 다음을 수행하라는 의미가 맞다. 
   
이런 간단한 1 차이 오류로 인해 해커는 프로그램을 공격할 수 있었고, 결국 일반 사용자가 시스템의 관리자 권한을 획득할 수 있었다. 이런 기능은 확실히 OpenSSH의 프로그래머가 의도했던 것은 아니다. 그렇지만 컴퓨터는 자신이 명령 받은 일을 그대로 수행한다.

ㅇㅇ

반응형

댓글