[시큐어코딩 가이드] 부적절한 자원 해제

 

 

 

■ 코드오류

 

타입 변환 오류, 자원(메모리 등)의 부적절한 반환 등과 같이 개발자가 범할 수 있는 코딩 오류로 인해 유발되는 보안약점이다.

 

 

부적절한 자원 해제

 

■ 개요

 

프로그램의 자원, 예를 들면 열린 파일디스크립터(Open File Descriptor), 힙 메모리(Heap Memory), 소켓(Socket) 등은 유한한 자원이다.

 

이러한 자원을 할당 받아 사용한 후, 더 이상 사용하지 않는 경우 에는 적절히 반환하여야 하는데, 프로그램
오류 또는 에러로 사용이 끝난 자원을 반환하지 못하는 경우이다.

 

 

■ 안전한 코딩 기법

 

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

 

 

코드예제

 

try구문 내 처리 중 오류가 발생할 경우, close() 메소드가 실행되지 않아 사용한 자원이 반환되지 않을 수 있다.

 

안전하지 않은 코드의 예
import sys
def get_config():
lines = None
try:
f = open('config.cfg')
lines = f.readlines()
...
# try 절에서 할당한 자원이 반환(close)되기 전에
# 예외가 발생하면 할당된 자원이 시스템에 반환되지 않음
f.close()
return lines
except Exception as e:
...
return ''

 

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

 

안전한 코드의 예
import sys

def get_config():
lines = None
try:
f = open('config.cfg')
lines = f.readlines()
except Exception as e:
...
finally:
# try 절에서 할당한 자원은
# finally절에서 시스템에 반환을 해 주어야 한다
f.close()
return lines

 

다른 방법은 with문을 사용하여 파일을 처리하는 방법으로, with문의 블록이 끝날 때 자동으로 파일을 닫아줍니다. 이 방식은 다른 예외가 발생하더라도 파일 닫기가 보장된다.

 

안전한 코드의 예
# with 절을 빠져나갈 때 f를 시스템에 반환
with open('filename.py') as f:
print(f.read())

 

 

댓글

Designed by JB FACTORY