운영체제 명령어 삽입
정의
- 정의 적절한 검증 절차를 거치지 않은 사용자 입력값이 운영체제 명령어의 일부 또는 전부로 구성되어 실행되는 경우, 의도하지 않은 시스템 명령어가 실행돼 부적절하게 권한이 변경되거나 시스템 동작 및 운영에 악영향을 미칠 수 있다.
- eval() 함수와 exec() 함수는 내부에서 문자열을 실행하기에 편리하지만, 같이 사용하면 여러 변수들에 동적으로 값을 할당해 사용할 수 있어 명령어 삽입(Command Injection) 공격에 취약하다
안전한 코딩기법
- 입력값 내에 시스템 명령어를 포함하는 경우 |, ;, &, :, >, <, `(backtick), \, ! 과 같이 멀티라인 및 리다이렉트 문자 등을 필터링해야한다.
- 외부 입력에 따라 명령어를 생성하거나 선택이 필요한 경우에는 명령어 생성에 필요한 값들을 미리 지정해 놓고 사용해야 한다
코드예제
다음은 안전하지 않은 코드예제로 os.system을 이용해 입력값을 통해 프로그램을 실행하며, 외부에서 전달 되는 인자값은 명령어 생성에 사용됩니다. 아래 코드에서는 실행할 프로그램을 제한하지 않고 있어 공격자는 원하는 모든 프로그램을 실행할 수 있습니다.
#운영체제 명령어 삽입(안전X)
def execute_command_bad(request):
app_name = request.GET.get('app_name')
os.system(app_name)
return render(request, 'success.html')
execute_command/?app_name=dir
다음은 안전한 코드예제로 사전에 화이트리스트를 설정한 코드입니다.
#운영체제 명령어 삽입(안전O)
ALLOW_PROGRAM = ['calc', 'notepad']
def execute_command_good(request):
app_name = request.GET.get('app_name')
if app_name not in ALLOW_PROGRAM:
return render(request, 'error.html', {'msg': '허용되지 않은 프로그램입니다.'})
os.system(app_name)
return render(request, 'success.html')
execute_command/?app_name=dir
execute_command/?app_name=calc
입력데이터 검증 및 표현/운영체제 명령어 삽입
[참고문헌] Python 시큐어코딩 가이드(2022) / KISA(한국인터넷진흥원)