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

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

정의

응용 프로그램이 입력값에 대한 신뢰를 전제로 보호 메커니즘을 사용하는 경우 공격자가 입력값을 조작할 수 있다면 보호 메커니즘을 우회할 수 있게 된다. 개발자들이 흔히 쿠키, 환경변수 또는 히든필드와 같은 입력값이 조작될 수 없다고 가정하지만 공격자는 다양한 방법을 통해 이러한 입력값들을 변경할 수 있고 조작된 내용은 탐지되지 않을 수 있다.

 

안전한 코딩기법

  • 상태 정보, 민감한 데이터, 중요 정보는 서버에 저장하고 보안확인 절차도 서버에서 실행
  • 신뢰할 수 없는 입력값이 응용 프로그램 내부로 들어올 수 있는 지점을 검토하고, 민감한 보안 기능 실행에 사용되는 입력값을 식별해 입력값에 대한 의존성을 없애는 구조로 변경 가능한지 분석

 

코드예제

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

#보안기능 결정에 사용되는 부적절한 입력값(안전X)
def init_pwd_bad(request):
    role = request.COOKIE['role']
    id = request.POST.get('id',)
    mail = request.POST.get('mail', )

    if role == 'admin':
        password_init_and_sendmail(id, mail)
        return render(request, 'success.html')
    else:
        return render(request, 'error.html')

 

중요 기능 수행을 위한 데이터는 위변조 가능성이 높은 쿠키보다 세션에 저장해야합니다. 아래는 안전한 코드예제입니다.

#보안기능 결정에 사용되는 부적절한 입력값(안전O)
def init_pwd_good(request):
    role = request.session['role']
    id = request.POST.get('id',)
    mail = request.POST.get('mail', )

    if role == 'admin':
        password_init_and_sendmail(id, mail)
        return render(request, 'success.html')
    else:
        return render(request, 'error.html')

 

 

 

입력데이터 검증 및 표현/보안기능 결정에 사용되는 부적절한 입력값

[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)