[시큐어코딩] 부적절한 자원 해제_개념 및 해결방법

2024. 2. 4. 14:30보안/시큐어코딩

 

 

부적절한 자원 해제란?

프로그램의 자원, 예를 들면 열린 파일 디스크립터(Open File Descripter), *힙 메모리(Heap Memory), 소켓(Socker) 등은 유한한 자원이다. 이러한 자원을 할당받아 사용한 후, 더 이상 사용하지 않는 경우에는 적절히 반환하여야 하는데,

프로그램 오류 또는 에러로 사용이 끝난 자원을 반환하지 못하는 경우

*힙 메모리(Heap Memory): 소프트웨어가 자유롭게 사용할 수 있는 메모리 공간.

 

 

 

안전하지 않은 이유

힙 메모리, 소켓 등의 유한한 시스템 자원이 계속 점유하고 있으면

자원 부족으로 인해 새로운 입력을 처리하지 못할 수 있음

 

 

보안대책

자원을 획득하여 사용한 다음에는 반드시 자원을 해제하여 반환

 

즉, 해결방법은 프로그램 내에 제어문, 예외처리문 등의 분기 등에 따라 모든 흐름(control flow)을 판단하여 자원 반환 코드가 누락되었는지 확인하고, 오류로 인해 함수가 중간에 종료되었을 때 예외처리에 관계없이 자원이 반환되도록 코딩함으로써 방지가능하다.

 


 

 

[안전하지 않은 코드의 예 JAVA]

Input Stream in=null;
OutputStream out=null;
 try{
 in=new FileInputStream(inputFile);
 out=new FileOutputStream(outputFile);
 ...
 FileCopyUtils.copy(fis,os);
 //자원반환 실행 전에 오류가 발생할 경우 자원이 반환되지 않으며, 할당된 모든 자원을 반환해야 한다.
 in.close();
 out.close();
 }catch(IOException e){
 	logger.error(e);
 }

 

#예외상황이 발생하여 함수가 종료될 때, 예외의 발생 여부와 상관없이 항상 실행되는 finally 블록에서 할당받은 모든 자원을 반드시 반환하도록 한다.

 

아래 안전한 코드를 보면 try-catch-finally문을 써서 항상 실행되는 finally 블록에서 close()함수로 자원반환을 처리하고 있다.

 

[안전한 코드의 예 JAVA]

InputStream in=null;
OutputStream out=null;
 try{
  in=new FileInputStream(inputFile);
  out=new FileOutputStream(outputFile);
  ...
  FileCopyUtils.copy(fis,os);
 }catch(IOException e){
  logger.error(e);
  //항상 수행되는 finally 블록에서 할당받은 모든 자원에 대해 각각 null 검사를 수행 후 예외처리를 하여 자원을 해제하여야 한다.
 }finally{
  if(in!=null){
   try{
   	in.close();
   }catch(IOException e){
    logger.error(e);
   }
  }
  if(out!=null){
   try{
    out.close();
   }catch(IOException e){
    logger.error(e);
   }
  }
 }

 

 

[오탐코드의 예]

public class DBUtil{
 public static Connection getConnection(){
  Connection conn=null;
  try{
   Class.forName("oracle.jdbc.driver.OracleDriver");
   conn=DriverManager.getConnection(DBInfo.url,DbInfo.id,DbInfo.password);
  }catch(SQLException e){
   //TODO Auto-generated catch block
   e.printStackTrace();
  }catch (ClassNotFoundException e){
   //TODO Auto-generated catch block
   e.printStackTrace();
  }
  return conn;
 }
}

 - 함수의 역할이 자원을 리턴하는 경우에는 자원의 해제는 함수를 호출한 쪽에서 담당하므로 취약하지 않음.

 

서칭을 해보다가

 

ByteArrayOutputStream 의 경우엔 flush(), close() 메서드의 경우는 구현이 되어있지 않다고 한다. close()를 해주지 않아도 괜찮다고 한다.

 

 

 

 

[참고]

소프트웨어 개발보안 가이드

소프트웨어 보안약점 진단가이드

https://www.youtube.com/watch?v=zeQUc898vCM

https://okky.kr/questions/1082665