악성 사용자가 우회를 통해 서버의 민감 파일을 읽을 수 있다.
[ 취약점 분석 ]
(참고한 Writeup)
함수 is_local_uri 내부에 취약점이 존재한다.
uri 값을 //proc/self/root라고 넣는 경우, urlparse가 파싱하는 hostname이 proc이 되어 is_local_uri가 False가 return된다. //proc/self/root가 local URI가 확실하더라도 리눅스에서는 //가 /로 인식 되기 때문이다.
이 취약점을 이용하면 공격자가 서버의 민감한 파일에 접근해 파일을 읽을 수 있다.
[ Exploit ]
- 환경 설정
취약점이 발견된 버전은 1.0.0 - 2.8.0인데, 현재 pip3 install mlflow로 설치하면 취약점이 패치된 최신 버전이 설치되기 때문에, 취약점이 존재하는 구버전을 설치해야 exploit 실습이 가능하다.
Writeup 을 참고하여 exploit 코드를 실행하면 아래와 같이 성공하는 것을 볼 수 있다.
[ Patch ]
패치 완료
패치 전에는 parsed_uri.hostname 확인 후에 parsed_uri.scheme을 통해 scheme을 가져오지만,
패치 후에는 확인 전에 scheme을 가져와 scheme값이 없으면 True를 return하도록 로직을 수정하여 패치되었다.
[ 배운점 ]
패치 내용을 보면 코드 내용이 크게 바뀌지는 않았는데, 로직으로 인해 취약점이 발생할 수 있다는 것을 눈으로 확인할 수 있었다.
개발을 할때에도 로직 상의 취약점이 발생하지 않도록 주의를 기울여야겠다.