Spring/Java

[자바 시큐어코딩] TOCTOU 경쟁 조건 보안 수정

snow_hong 2024. 12. 26. 14:05

TOCTOU 경쟁 조건 체커는 리소스의 상태를 확인하고 실제 사용하는 시간 간의 차이로 인해 발생하 는 경쟁 조건을 검출합니다.

리소스의 상태를 확인하고 그 결과에 따라 리소스에 접근하는 코드를 작성할 때는 보통 리소스에 접근 하는 순간에도 조금 전 확인한 그 상태가 유지되고 있을 것을 가정하게 됩니다. 하지만 그 사이에 리소 Sparrow 보고서 6 스의 상태는 변할 수 있으며, 특히 파일과 같은 리소스는 프로그램이 다중 스레드로 작성되지 않더라 도 다른 프로그램이나 운영 체제에 의해 상태가 변할 수 있습니다. 이러한 경쟁 조건으로 인해 프로그 램이 의도하지 않게 동작하거나 예외가 발생하거나 공격의 진입로로 활용될 수 있습니다.

 

하나의 자원에 동시다발적으로 여러 프로세스가 접근해서 컨트롤을 하게 되는 경우가 생긴다.

이러한 일들로 프로그램이 교착상태, 경쟁조건 및 기타 등등의 오류가 발생한다.

 

해당 오류를 해결하는 방법이다.

 1. 동기화 구문을 통해 한번에 하나의 스레드만 공유자원(예:파일)에 접근 가능하도록 해야한다.

 2. 필요 없는 부분은 구문으로 감싸지 않아 성능에 최대한 영향이 적도록 한다.

 

[ TOCTOU 경쟁 조건 이슈 발생 코드]

// TOCTOU 경쟁 조건 보안이슈난 코드
File file = new File(URL);

if(file.exist()){

file.delete();

}

 

이렇게 파일이 이미 생성이 존재하는 상태라면 파일을 삭제하는 명령어를 사용하는 방법은 보안이 취약하다. 

 

똑같은 삭제를 하더라도 아래와같이 진행해야지 TOCTOU 문제 없이 안정적으로 할 수 있다.

[해결방안]

//보안 해결방안
File file = new File(URL);

if(file.exist()){

FileDelete(file);

}



//Delete 동기화 함수 사용
private synchronized void FileDelete(File file){

file.delete();

}

 

※ 다중 Thread로 공유자원에 접근을 할 때에는 Thread safe 함수를 사용하자.

 

참고 - https://milkye.tistory.com/359

728x90