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)에 대해 빠짐없이 자원 해제를 수행한다.
최종 수정 : 2018-05-27