[시큐어코딩 가이드] 보안기능 결정에 사용되는 부적절한 입력값

 

 

 

■ 입력데이터 검증 및 표현

 

프로그램 입력 값에 대한 검증 누락 또는 부적절한 검증, 데이터의 잘못된 형식지정, 일관되지 않은 언어셋 사용 등으로 인해 발생되는 보안약점으로 SQL 삽입, 크로스사이트 스크립트(XSS) 등의 공격을 유발할 수 있다.

 

 

보안기능 결정에 사용되는 부적절한 입력값

 

■ 개요

 

응용프로그램이 외부 입력값에 대한 신뢰를 전제로 보호메커니즘을 사용하는 경우 공격자가 입력값을 조작할 수 있다면 보호메커니즘을 우회할 수 있게 된다.


개발자들이 흔히 쿠키, 환경변수 또는 히든필드와 같은 입력값이 조작될 수 없다고 가정하지만 공격자는 다양한 방법을 통해 이러한 입력값들을 변경할 수 있고 조작된 내용은 탐지되지 않을 수 있다. 인증이나 인가와 같은 보안결정이 이런 입력값(쿠키, 환경변수, 히든필드 등)에 기반을 두어 수행되는 경우 공격자는 이런 입력값을 조작하여 응용프로그램의 보안을 우회할 수 있으므로 충분한 암호화, 무결성 체크를 수행하고 이와 같은 메커니즘이 없는 경우엔 외부사용자에 의한 입력값을 신뢰해서는 안 된다.


파이썬의 Djagno 프레임워크에서 세션을 관리하는 기능을 제공하고 있어 이 기능사용 시에는 세션쿠키의 만료 시점을 설정하여 사용할 수 있으며 DRF(Django Rest Framework)에서 제공하는 토큰 및 세션 기능을 사용하여 안전하게 구성할 수 있다.

 

 

■ 안전한 코딩 기법

 

상태정보나 민감한 데이터 특히 사용자 세션정보와 같은 중요한 정보는 서버에 저장하고 보안확인 절차도 서버에서 실행한다.


보안설계관점에서 신뢰할 수 없는 입력 값이 응용프로그램 내부로 들어올 수 있는 지점과 보안결정에 사용되는 입력 값을 식별하고 제공되는 입력 값에 의존할 필요가 없는 구조로 변경할 수 있는지 검토한다.

 

 

코드예제

 

다음은 안전하지 않은 코드로 쿠키에 저장된 권한 등급을 가져와 관리자인지 확인 후에 사용자의 패스워드를 초기화 하고 메일을 보내는 예제이다. 5라인에서 쿠키에서 등급을 가져와 9라인에서 관리자인지 확인하고 있다.

 

안전하지 않은 코드의 예
from django.shortcuts import render

def init_password(request):
# 쿠키에서 권한 정보를 가져옴
roll = request.COOKIE['roll']
request_id = request.POST.get('user_id', '')
request_mail = request.POST.get('user_email','')
# 쿠키에서 가져온 권한이 관리자인지 비교
if roll == 'admin'
# 사용자의 패스워드 초기화 및 메일 발송 처리
password_init_and_sendmail(request_id, request_mail)
return render(request, '/sucess.html')
else:
return render(request, '/failed.html')

 

중요기능을 수행하는 결정을 위한 데이터는 위변조 가능성이 높은 쿠키보다 세션에 저장하도록 한다.

 

안전한 코드의 예
from django.shortcuts import render
def init_password(request):
# 세션에서 권한 정보를 가져옴
roll = request.session['roll']
request_id = request.POST.get('user_id', '')
request_mail = request.POST.get('user_email','')
# 세션에서 가져온 권한이 관리자인지 비교
if roll == ‘admin’
# 사용자의 패스워드 초기화 및 메일 발송 처리
password_init_and_sendmail(request_id, request_mail)
return render(request, '/sucess.html')
else:
return render(request, '/failed.html')

 

 

댓글

Designed by JB FACTORY