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

■ 입력데이터 검증 및 표현
프로그램 입력 값에 대한 검증 누락 또는 부적절한 검증, 데이터의 잘못된 형식지정, 일관되지 않은 언어셋 사용 등으로 인해 발생되는 보안약점으로 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') |