Secure Coding Guide | 부적절한 자원 해제


정의

사용된 자원을 적절하게 해제하지 않으면 자원 누수들이 발생하고, 자원이 부족해 새로운 입력을 처리할 수 없게 되는 보안약점이다.

영향

자원 고갈 및 정보 노출된다.

안전하지 않은 소스코드

잘못된 조치 방법 1

try {
    OutputStream os = response.getOutputStream();
    FileInputStream fis = new FileInputStream(file);
    FileCopyUtils.copy(fis, os);
    fis.close();
    return true;
} catch (IOException e) {
    logger.error(e, e);
}

자원을 할당받은 모든 객체에 대해 해제하지 않았다. os의 자원해제 구문이 누락되었다.

잘못된 조치 방법 2

OutputStream os = null;
FileInputStream fis = null;
try {
    os = response.getOutputStream();
    fis = new FileInputStream(file);
    FileCopyUtils.copy(fis, os);
} catch (IOException e) {
    logger.error(e.getMessage());
} finally {
    try {
        fis.close();
        os.close();
    } catch (IOException e) {
        logger.error(e.getMessage());
    }
}

finally 에서 자원 해제와 예외처리를 수행하나 모든 자원 해제를 함께 예외처리 하고 있어 fis.close() 예외 발생시 os.close 실행 안된다.

올바른 조치 방법

OutputStream os = null;
FileInputStream fis = null;
try {
    os = response.getOutputStream();
    fis = new FileInputStream(file);
    FileCopyUtils.copy(fis, os);
} catch (IOException e) {
    logger.error(e.getMessage());
} finally {
    try {
	     if (fis =! null)
	         fis.close();
    } catch (IOException e) {
        logger.error(e.getMessage());
    }
    try {
	     if (os =! null)
	         os.close();
    } catch (IOException e) {
        logger.error(e.getMessage());
    }    
}

자원을 할당 받은 모든 객체(os, fis)들에 대해서 함수의 종료 등 예외 발생 여부와 상관없이 무조건 수행되는 finally 블록에서 Null 검사를 수행하고 모든 자원 해제를 함께 예외 처리하면, 예외 발생시 일부 자원 이 해제가 안되므로, 각각 예외처리를 수행하며 자원을 할당 받은 모든 객체(os, fis)에 대해 빠짐없이 자원 해제를 수행한다.