[시큐어코딩 가이드] Null Pointer 역참조
- 정보보안/시큐어코딩 가이드
- 2022. 8. 11.
■ 코드오류
타입 변환 오류, 자원(메모리 등)의 부적절한 반환 등과 같이 개발자가 범할 수 있는 코딩 오류로 인해 유발되는 보안약점이다.
Null Pointer 역참조
■ 개요
널 포인터(Null Pointer) 역참조는 '일반적으로 그 객체가 널(Null)이 될 수 없다'라고 하는 가정을 위반했을 때 발생한다.
공격자가 의도적으로 널 포인터 역참조를 발생시키는 경우, 그 결과 발생하는 예외 상황을 이용하여 추후의 공격을 계획하는 데 사용될 수 있다.
Python에서는 Null pointer dereference가 발생하지 않는다. Python에서는 Null 객체가 사용되지 않으며 대신 None 키워드를 사용하여 null 개체와 변수를 정의 한다. None은 다른 언어의 null과 동일한 기능을 수행하지 않으며 None이 0 또는 다른 값을 정의 하진 않는다.
■ 안전한 코딩 기법
특별한 의미를 표시하는 None을 반환하는 함수를 사용하면 None과 다른 값(예: 0이나 빈 문자열)이 조건문에서 False로 평가될 수 있기 때문에 실수하기 쉽다.
None이 될 수 있는 개체를 참조하기 전에 None 값인지를 검사하여 시스템 오류를 줄일 수 있다.
코드예제
Python에서 포인터를 사용하지는 않지만 Null pointer와 유사한 None값을 참조하는 오류를 범할 수 있다.
안전하지 않은 코드의 예 |
from django.shortcuts import render from xml.sax import make_parser, handler import os def parse_xml(request): filename = request.POST.get('filename') # filename의 None 체크를 하지 않아 에러 발생 가능 if (filename.count('.') > 0): name, ext = os.path.splitext(filename) else: ext = '' if ext == '.xml': parser = make_parser() ...... sax_handler = Handler() parser.setContentHandler(sax_handler) parser.parse(filename) return sax_handler.root |
참조하고자 하는 자원을 호출할 때에는 개체가 None이 아닌지 검증하여야 한다.
안전한 코드의 예 |
from django.shortcuts import render from xml.sax import make_parser, handler import os def parse_xml(request): filename = request.POST.get('filename') # filename이 None 인지 체크 if filename is None or filename.strip() == "": raise ValueError("파일 이름이 없습니다.") if (filename.count('.') > 0): name, ext = os.path.splitext(filename) else: ext = '' if ext == '.xml': parser = make_parser() ...... sax_handler = Handler() parser.setContentHandler(sax_handler) parser.parse(filename) return sax_handler.root |