[시큐어코딩 가이드] 부적절한 자원 해제
- 정보보안/시큐어코딩 가이드
- 2022. 8. 11.
■ 코드오류
타입 변환 오류, 자원(메모리 등)의 부적절한 반환 등과 같이 개발자가 범할 수 있는 코딩 오류로 인해 유발되는 보안약점이다.
부적절한 자원 해제
■ 개요
프로그램의 자원, 예를 들면 열린 파일디스크립터(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()) |