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 함수를 사용하자.
728x90