[시큐어코딩 가이드] Null Pointer 역참조

 

 

 

■ 코드오류

 

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

 

 

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

 

 

댓글

Designed by JB FACTORY