[DEV] 기록

[Java Secure Coding] TOCTOU

꾸준함. 2022. 7. 29. 13:17

개요

작성한 코드에 대해 보안성 검토를 받았는데 파일에 대해 TOCTOU 문제가 발생할 수 있다는 코멘트를 받았습니다.

제가 작성한 코드는 아래와 같았습니다.

if (file.exists()) {
	file.delete();
}

 

원인

싱글 쓰레드일 경우에는 위 코드가 문제없겠지만 멀티 쓰레드 환경에서는 위 코드에 대해 race condition이 발생할 수 있습니다.

TOCTOU는 Time Of Check to Time Of Use의 줄임말인데 이 말은 즉슨 file이 존재하는지 확인한 시점에는 파일이 존재할 수 있으나 파일을 삭제하려고 하는 시점에 이미 해당 파일이 삭제되었을 수 있다는 뜻입니다.

정리를 하자면 멀티 쓰레드 환경에서 동시에 해당 파일에 접근하여 나중에 들어온 요청이 먼저 들어온 요청보다 먼저 작업을 수행할 경우 문제가 발생할 수 있습니다.

 

해결 방법

위 문제를 방지하기 위해서는 아래와 같이 thread-safe 하게 코드를 작성해야 합니다.

if (file.exists()) {
	deleteFile(file);
}

private synchronized void deleteFile(File file) {
	file.delete();
}

 

위와 같은 코딩 기법에 대해서는 milkye님이 아래와 같이 잘 정리해주셨습니다.

1. 동기화 구문을 통해 한번에 하나의 쓰레드만 공유자원에 접근 가능하도록 처리

2. 꼭 동기화가 필요한 부분만 감싸 성능에 최대한 영향을 끼치지 않도록 처리

 

참고

https://milkye.tistory.com/359

 

[Java Secure Coding] TOCTOU 해결 보안 코딩 방법

 하나의 자원에 동시다발적으로 여러 프로세스가 접근해서 컨트롤을 하게 되는 경우가 생긴다. 이러한 점들로 인해 프로그램이 교착상태, 경쟁조건 및 기타 등등의 오류가 발생할 수 있다.  처

milkye.tistory.com

 

반응형