Software Security (1)

임정환·2023년 6월 8일
0

소프트웨어는 해커들의 타겟이 될 수 있다. 사실, 다들 한번씩은 불법 복제 게임을 해본 경험이 있을텐데 이 또한 소프트웨어 크래킹의 좋은 예시이다. 지금부터, 소프트웨어 공격 방식과 대처법을 알아보자

프로그램 결함

  • Error : 잘못된 코드로 인한 오류
  • Fault: 에러로 인해, 예측과는 다른 내부(Internal) 상태
  • Failure: 폴트의 누적으로 인한 외부적인 실패 ( external )

컴퓨터는 유한 상태 기계 (FSM) 이다. 유한한 상태이며, 상태에 따른 입력에 따라서 다른 상태로 넘어가게 된다. 만일 코드에 에러가 존재한다면, 예상과는 다른 상태로 이동할 것이고 그러한 상태의 누적으로 인해 외부적인 Failure가 발생하게 된다.
결함으로 인한 해커들의 소프트웨어 공격 방법을 살펴보자

버퍼 오버플로우 ( 스택 스매싱 )


스택에서 할당된 배열을 벗어나서, 정수를 할당해 주고 있다. 이렇게 될 경우, 전혀 예상하지 못한 정보를 OverWrite하게 될 수 있다.
위와 같이, 특정한 flag를 true로 덮어 쓸 수 있게 된다.

만일 사용자가 입력한 값이, 할당된 buffer의 범위를 벗어나서 ret을 오버라이트 할 수 있다. 여기서 ret이란, 해당 함수가 끝나고 제어권이 돌아갈 메모리 주소이다. 즉, 함수 종류 후 실행할 함수의 주소이다. 만일, ret을 악의적인 함수가 존재하는 메모리로 오버라이트할 경우 함수 실행 종류 후 악의적인 함수가 실행되게 된다.

  • Smashing the Stack

    버퍼 오버플로우 공격에서는, 프로세스에 할당된 메모리 구조를 모르기 때문에 정확하게 ret주소를 설정하기 힘들다. 이럴 경우, 악성 코드 근처에 NOP, ret 와 같이 랜딩 포인트를 설정하여 악성 코드가 실행될 수 있는 확률을 높일 수 있다.

결론적으로, 메모리 주소를 정확히 모르기 때문에 항상 성공을 보장할 수 없으나 만일 성공할 경우 Code injection이 가능하다. Trial&Error를 통해 많은 노동이 필요한 공격 방법이다.

  • 대응법
    • non-executable stack
      data가 저장되는 영역에서는 코드가 실행될 수 없게끔 한다.
    • 안전한 프로그래밍 언어 사용
      JAVA와 같은 언어는 배열에 대해 safe하다.
    • 안전한 함수 사용
      C언어에서 Scanf_s와 같은 함수는 입력값을 검사한다.
    • canary

      만일 버퍼 오버플로우가 발생해, 카나리 코드의 변조가 발생하면 즉시 종료하거나 이벤트 핸들러로 통제할 수 있다. 후자의 경우도, 위험할 수 있다 공격자에게 이벤트 핸들러가 특정당할 경우 이 또한 제어권을 탈취당할 수 있다.

Incomplete Mediation

함수 수행 시, 검증을 제대로 안할 시에 발생할 수 있다. 예를 들어, Web front에서 입력값을 제대로 검사 안하고 Back에서 그 값을 그대로 사용할 경우 위험하다.

위의 예시처럼, 파라미터를 조작할 수 있고 프론트에서 검증을 안할 경우 위험하다.

Race Condition

운영체제에서 보던 단어를 여기서 보니 뭔가 반갑다. Atomic 하지 않은 보안 프로세스에서 발생 가능한 결함이다. 예를 들어, mkdir의 예시를 보자

공간을 할당한 후, 해당 dir에 대한 소유권을 유저에게 부여한다. 만일 위와 같은 과정이 atomic하지 않아서 중간에 공격자가 개입할 경우 아래와 같이 된다.
공격자가 중간 과정에 개입하여 해당 space에 대한 symbolic link를 만들 경우, 유저는 전혀 엉뚱한 디렉토리로 이동하게 될 수도 있다.
보안에 민감한 과정은, 최대한 atomic하게 만들어야 함을 알 수 있다.

Malware

지금까지, 프로그래머의 실수로 인해 발생할 수 있는 공격법을 알아봤다면 이제부터는 공격자의 의도로 인해 발생하는 악성 소프트웨어를 알아보자 우선 멀웨어의 종류로는

  • Virus: 수동적인 전파
  • Worm: 능동적인 전파
  • Trojan: 정상적인 파일인척 위장하고 전혀 다른 기능을 함
  • Backdoor: 인가받지 않은 접근
  • Rabbit: 시스템 리소스를 소모함

멀웨어의 역사

  • Brain 바이러스
    최초의 바이러스, 직접적인 위해를 끼치지는 않았다.
  • Morris 웜
    사전 공격, mail 등을 통해 능동적인 전파가 이루어졌다. PID의 주기적인 변경, 숙주 컴퓨터에 설치 중 에러가 일어난다면 모든 코드를 삭제하는 행위 등을 통해서 흔적을 지웠다. 초기 인터넷을 마비시켰으며, CERT가 창설되는 계기가 되었다.
  • Code Red 웜
    마이크로 소프트 서버의 버퍼 오버플로우 취약점을 이용해 시스템에 접근한 후 , 숙주를 감염시키고 백악관 홈페이지에대한 DDOS 공격을 실행했다.
  • SQL 슬래머 웜
    10분만에 250,000개의 시스템을 감염시켰다. 방화벽인 작은 byte의 udp 패킷을 잘 검사하지 않는 헛점을 이용하여 시스템들을 감염시켰지만 너무 빠른 감염속도 탓에 네트워크 대역폭을 고갈시켜 금방 감염이 멈추게 되었다. 마치, 바이러스의 살상력이 너무 높으면 숙주가 다 죽어버려서 증식할 수 없듯이
  • 트로이 목마
    정상적인 파일인척 하지만, 전혀 다른 기능을 수행한다.

멀웨어 탐지

시그니쳐 기반 탐지

앞의 네트워크에서 말했듯이, 악성 프로그램에 존재하는 특수한 비트 스트림을 기반으로 탐지한다. 결백한 file인데도 오진단 할 수있는 가능성이 존재한다. 이미 잘 알려져있는 멀웨어 탐지에 유리하다.하지만, 알려지지 않은 virus탐지에는 불리하다.

변화 탐지

file에 대한 hash 체크섬을 만든 후 변화를 대조한다. 악성코드에 감염되면, file에 변화가 무조건 일어나므로 '감염된 파일'을 '감염되지 않음' 이라고는 하지 않는다. 하지만, file은 많은 변화가 일어나므로 오알람이 발생할 가능성이 있다.

이상 감지

'정상적이지 않은' 작동을 감지한다. 알려지지 않은 바이러스를 탐지 가능하지만, '정상적이지 않은' 작동을 정의하기 어렵다. 최근, ML과 결합되어서 사용되는 탐지법이다.

미래의 멀웨어

Polymorphic 멀웨어

암호화 키로 코드를 암호화 하고, 감염시마다 새로운 키를 생성하여 암호화 하는 멀웨어이다. 복호화하는 코드를 기반으로 탐지가 가능하다.

Metamorphic 멀웨어

폴리모르픽의 진화형이다. 감염시마다, 자신을 디스어셈블하고 여러 코드를 추가적으로 집어 넣어 전혀 다른 이진파일로 보이게 한다. 스캔 기반 탐지로는, 탐지하기 어렵다.

  • 워홀 웜
    굉장히 빠른 감염속도를 자랑했던 웜이다. 15분만에, 전 인터넷을 감염시키는 것이 목표이다. 감염시마다 연결된 취약한 IP 리스트를 계산 후, 공격한다.
  • Flash 웜
    워홀 웜보다도 발전된 웜이다. 미리 모든 취약한 IP 리스트 테이블을 만든 후, 공격한다.

그 외의 공격 방법

  • 살라미 어택
    내부에서, 크게 차이가 안나도록 조금씩 공격을 진행한다. ( 예를 들어, 돈을 100원씩 매일 출금하기 )
  • 선형 공격

    위와 같은 비밀번호 탐지 로직에서는, 틀린 암호가 발생하면 break가 걸린다는 사실을 이용하여 선형적인 시간내의 brute force 공격이 가능하다.
  • 시한 폭탄
profile
CS 박제

0개의 댓글

관련 채용 정보