정보보안/시스템보안

시스템 보안위협 시스템 자원고갈 공격

피갓자 2025. 2. 25. 09:00

시스템 보안위협 시스템 자원고갈 공격
시스템 보안위협 시스템 자원고갈 공격

시스템 자원고갈 공격(서비스 거부 공격)

개요

대부분의 시스템을 대상으로 하는 서비스 거부 공격(DoS, Denial of Service)은 시스템이 보유하고 있는 자원을 선점하거나 모두 고갈하는 방식으로 수행됨

대표적인 방법으로 디스크 채우기, 메모리 고갈, 모든 프로세스 죽이기, 프로세스 무한 생성 방법 등이 있음

공격의 종류

가용 디스크 자원고갈 공격

임의의 파일을 생성한 후 계속해서 파일의 크기를 증가시켜 디스크를 쓸모없는 데이터로 채우는 공격

#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>

void main() {
			int fd;
			char buf[1000] = {0}; // 버퍼 초기화
			fd = creat("/root/temfile" , 0777); // 파일 생성
			while(1) { // 무한 루프, 파일에 계속 쓰기
						write(fd, buf, sizeof(buf)); // 파일에 버퍼 내용 쓰기
			}
}

 

대응 방법

  • 문제의 프로세스를 찾아 종료
  • 각 사용자에 대한 쿼터(Quota) 설정
  • 공용 디렉터리(/tmp, /var/tmp)에 대해 독립적인 파티션으로 구성
  • 디스크 사용 모니터링 도구를 사용하여 이상 징후 실시간 확인

가용 메모리 자원고갈 공격

하나의 프로세스가 시스템에서 사용할 수 있는 모든 메모리 자원을 고갈시킴으로써 시스템을 마비시키는 공격

#include <stdio.h>

void main() {
			char *m;
			while(1) // 무한 루프, 메모리 계속 덮어쓰기
					m = malloc(1000); // 메모리 동적 할당
}

 

대응 방법

  • 각 사용자에 대한 최대 메모리 사용량 제한
  • ulimit CMD 활용 : 프로세스의 자원 한도를 설정하는 명령으로, soft 한도와 hard 한도를 설정하는 명령어
  • 시스템 메모리 사용 모니터링 도구(vmstat, top)를 사용하여 메모리 상태 실시간 확인

가용 프로세스 자원고갈 공격

프로세스를 지속적으로 생성하여 시스템 자원을 고갈시킴으로써 시스템을 마비시키는 공격

#include <unistd.h>

void main() {
			while(1) // 무한 루프, fork() 계속 호출
					fork(); // 현재 프로세스를 복제하여 자식 프로세스 생성
			return(0);
}

 

대응 방법

  • 사용자마다 생성할 수 있는 최대 프로세스의 수를 제한
  • ulimit CMD 활용
  • /etc/security/limits.conf 파일을 사용하여 프로세스 제한 설정

프로세스 죽이기 공격

공격자가 루트 권한을 획득한 상태에서 스크립트를 통해 사용 중인 프로세스를 죽이는 공격. 이를 통해 웹 또는 FTP 서비스를 제공하는 데몬이 함께 죽으면서 시스템에서 제공하는 모든 서비스가 동작하지 못하게 됨

#!bin/sh
sync
kill -15 1 # PID 1에 SIGTERM(15) 시그널을 보내 프로세스 종료

 

대응 방법

  • PID 1(시스템 관리 프로세스)을 보호하도록 설정
  • 시스템에서 중요한 프로세스를 종료하려는 시도 모니터링
  • 서비스 관리 도구(systemd, supervisord)를 사용하여 중요한 서비스가 종료될 경우 자동 재시작 설정