정보관리기술/정보보안

TOCTOU(Time Of Check, Time Of Use)

아이티신비 2024. 2. 6. 10:30

문제4) 구현단계에서 발생 가능한 코딩 보안 약점인 검사시점과 사용시점(TOCTOU)에 대하여 다음을 설명하시오.

가. TOCTOU의 정의와 개념

나. 문제가 발생하는 상황과 보안대책

다. TOCTOU 관점에서 아래 코드 실행시 발생가능한 문제점을 설명하고 해결 방안을 제시하시오.

void deposit(int amount) {

account += amount;

}

void withdraw(int amount) {

account -= amount;

}

 

답)

 

 

1. 시간 및 상태의 부적절한 관리 취약점. TOCTOU(Time Of Check, Time Of Use)의 정의와 개념

정의
  • 멀티프로세스를 구현한 응용프로그램(병렬시스템)에서 자원(파일, 소켓 등)을 사용하기전 자원을 사용하는 시점과 사용하는 시점의 시간 및 상태를 부적절하게 관리해서 발생하는 보안 취약점
개념

 

2. TOCTOU(Time Of Check, Time Of Use) 문제가 발생하는 상황과 보안대책

가. TOCTOU(ime Of Check, Time Of Use) 문제가 발생하는 상황


단계
동작 설명
Process A - 검사 (TOC) 성공
  • 프로세스 A는 File을 읽기 위해 해당 File이 존재하는지 검사후 CPU 제어권 반납(Context Switching)
Process B – 삭제 (TOU) 성공
  • CPU 제어권을 넘겨받은 다른 프로세스 B는 존재하던 File을 삭제후 CPU 제어권 반납(Context Switching)
Process A – 사용 (TOU) 실패
  • 최종적으로 프로세스 A는 파일 존재를 검사하던 시점에 있던 File을 사용하려고 하지만 존재하지 않은 상태가 되어 오류 발생

 

나. TOCTOU(ime Of Check, Time Of Use) 문제 보안 대책

프로세스 동기화
  • 협력하는 프로세스 사이에서 실행 순서 규칙을 정하여 공유 자원의 일관성을 보장하는 기법
기법
설명
뮤텍스
  • 다중 프로세스들이 공유 리소스에 접근할 때, Locking과 Unlocking 기법을 사용하여 서로 임계영역에 동시에 접근하지 못하도록 하는 기법
세마포어
  • 카운터 기법을 이용하여 지정된 수만큼 프로세스(Thread)가 실행하도록 하는 기법
  • 한 순간에 하나의 쓰레드만 접근이 요구되는 공유 자원에 접근하는 코드 영역

 

3. TOCTOU(Time Of Check, Time Of Use) 관점에서 문제 코드 실행 시 발생가능한 문제점과 해결 방안

가. TOCTOU(ime Of Check, Time Of Use) 관점에서 문제 코드 실행 시 발생가능한 문제점

정상 실행 결과
deposit(100) 호출 : (account: 0)
deposit(100) 종료 : (account: 100)
withdraw(100) 호출: (account: 100)
withdraw(100) 종료: (account: 0)
경쟁 조건 상태 실행 결과
deposit(100) 호출 : (account: 0)
withdraw(100) 호출: (account: 0)
deposit(100) 종료 : (account: 100)
withdraw(100) 종료: (account: -100)
  • 정상 실행 결과와 경쟁 조건 상태 실행 결과의 결과 값이 0과 -100으로 서로 상이

 

나. TOCTOU(ime Of Check, Time Of Use) 관점에서 문제 코드 해결 방안

변경 전 코드
문제 코드 해결 방안
static volatile double account;


void deposit(int amount) {
// lock 없이 공유 자원에 접근
account += amount;
}


void deposit(int amount) {
account - = amount;
}
static volatile double account;
static mtx_t account_lock;


void deposit(int amount) {
// mutex_lock, mutex_unlock을 이용해 공유 자원 접근을 제한한다.
mutex_lock(&account_lock);
account += amount
mutex_unlock(&account_lock);
}
void withdraw(int amount) {
mutex_unlock(&account_lock);
account -= amount;
mutex_unlock(&account_lock);
}

 


 

공감과 댓글은 아이티신비에게 큰 힘이 됩니다.

블로그 글이 유용하다면 블로그를 구독해주세요.♥