운영 체제 명령을 실행하거나 기본 시스템과 상호 작용하는 명령을 실행하는 애플리케이션은 해당 명령에 사용된 외부 제공 값을 무력화해야 합니다. 그렇게 하지 않으면 공격자가 의도하지 않은 명령을 실행하거나 민감한 데이터를 노출하는 입력을 포함할 수 있습니다.
이 문제는 다음 중 한 가지 방법으로 완화할 수 있습니다:
- shell=true 없이 subprocess 모듈 사용. 이 경우 서브프로세스는 명령과 인수가 명확하게 구분된 배열을 기대합니다.
- shlex.quote로 셸 인자 치환
규칙을 어긴 코드
os
from flask import request
import os
@app.route('/ping')
def ping():
address = request.args.get("address")
cmd = "ping -c 1 %s" % address
os.popen(cmd) # 규칙을 어긴 코드
subprocess
from flask import request
import subprocess
@app.route('/ping')
def ping():
address = request.args.get("address")
cmd = "ping -c 1 %s" % address
subprocess.Popen(cmd, shell=True) # 규칙을 어긴 코드; shell=true을 사용하는 것은 안전하지 않습니다
규칙을 준수한 해결책
os
from flask import request
import os
@app.route('/ping')
def ping():
address = shlex.quote(request.args.get("address")) # address argument is shell-escaped
cmd = "ping -c 1 %s" % address
os.popen(cmd ) # 규칙을 준수한 코드
subprocess
from flask import request
import subprocess
@app.route('/ping')
def ping():
address = request.args.get("address")
args = ["ping", "-c1", address]
subprocess.Popen(args) # 규칙을 준수한 코드
같이보면 좋은 자료
- OWASP Top 10 2021 Category A3 - 인젝션
- OWASP OS 커맨드 인젝션 방어 치트 시트
- OWASP Top 10 2017 Category A1 - 인젝션
- MITRE, CWE-20 - 부적절한 입력 유효성 검사
- MITRE, CWE-78 - OS 명령어에 사용되는 특수 요소의 부적절한 무력화
-
SANS Top 25 - 구성 요소 간의 안전하지 않은 상호 작용
If you like SONARKUBE, don’t forget to give me a star.