URL 매개변수, POST 데이터 페이로드 또는 쿠키와 같은 사용자가 제공한 데이터는 항상 신뢰할 수 없고 오염된 것으로 간주해야 합니다. 사용자가 제공한 데이터를 기반으로 역직렬화하면 두 가지 유형의 공격이 발생할 수 있습니다:
- 원격 코드 실행 공격: 직렬화된 데이터의 구조를 변경하여 직렬화되지 않은 객체의 동작을 수정하는 공격입니다.
- 매개변수 변조 공격: 권한을 상승시키거나 제품의 수량이나 가격 등을 변경하기 위해 데이터를 수정하는 공격입니다.
역직렬화 공격으로부터 보호하는 가장 좋은 방법은 애플리케이션에서 역직렬화 메커니즘의 사용에 이의를 제기하는 것입니다. 역직렬화 메커니즘의 사용이 정당화되지 않아 침해가 발생한 경우입니다(CVE-2017-9785).
역직렬화 메커니즘을 사용하는 것이 상황에 맞는 경우 다음 중 한 가지 방법으로 문제를 완화할 수 있습니다:
- pickle 모듈은 안전하지 않으므로 신뢰할 수 없는 데이터를 역직렬화하는데 사용하지 마세요.
- 기본 안전 로더와 함께 PyYAML 모듈만 사용하세요.
- 기본 데이터 교환 형식을 사용하는 대신 형식이 지정되지 않은 JSON 또는 Google 프로토콜 버퍼와 같은 구조화된 데이터 접근 방식과 같은 안전한 표준 형식을 사용하세요.
- 무결성이 손상되지 않도록 직렬화된 데이터에 역직렬화 전에 유효성을 검사하는 디지털 서명(HMAC)을 추가합니다(클라이언트가 직렬화된 데이터를 수정할 필요가 없는 경우에만 유효함).
- 최후의 수단으로, 특정 화이트리스트 클래스에만 역직렬화가 가능하도록 제한하세요.
규칙을 어긴 코드
from flask import request
import pickle
import yaml
@app.route('/pickle')
def pickle_loads():
file = request.files['pickle']
pickle.load(file) # 규칙을 어긴 코드; 피클 모듈을 사용하여 사용자 입력을 역직렬화하지 마십시오.
@app.route('/yaml')
def yaml_load():
data = request.GET.get("data")
yaml.load(data, Loader=yaml.Loader) # 규칙을 어긴 코드; 안전하지 않은 yaml.Loader와 함께 yaml.load를 사용하지 마십시오.
규칙을 준수한 해결책
from flask import request
import yaml
@app.route('/yaml')
def yaml_load():
data = request.GET.get("data")
yaml.load(data) # 규칙을 준수한 코드; 기본 세이프 로더와 함께 yaml.load 사용을 선호합니다.
같이보면 좋은 자료
- OWASP Top 10 2021 Category A8 - 소프트웨어 및 데이터 무결성 실패
- OWASP Top 10 2017 Category A8 - 안전하지 않은 역직렬화
- MITRE, CWE-20 - 부적절한 입력 검증
- MITRE, CWE-502 - 신뢰할 수 없는 데이터의 역직렬화
-
SANS Top 25 - 위험한 리소스 관리
If you like SONARKUBE, don’t forget to give me a star.