{"id":"CVE-2025-55013","aliases":["EUVD-2025-24028","GHSA-75jv-vfxf-3865","PYSEC-2026-1194"],"status":"published","title":"Assemblyline 4 Service Client: Arbitrary Write through path traversal in Client code","description":"The Assemblyline 4 Service Client interfaces with the API to fetch tasks and publish the result for a service in Assemblyline 4. In versions below 4.6.1.dev138, the Assemblyline 4 Service Client (task_handler.py) accepts a SHA-256 value returned by the service server and uses it directly as a local file name.A malicious or compromised server (or any MITM that can speak to client) can return a path-traversal payload such as `../../../etc/cron.d/evil` and force the client to write the downloaded bytes to an arbitrary location on disk. This is fixed in version 4.6.1.dev138.","severity":{"version":"3.1","score":4.2,"vector":"CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L","level":"medium","assessor":"cna","from":"cve"},"epss":{"day":"2026-11-10","score":0.00666,"percentile":0.5215,"model":"v2026.06.15"},"facts":{"in_kev":false,"known_exploited":false,"public_exploit":false,"fix_available":true},"cwes":["CWE-23"],"published":"2025-07-25T14:15:48Z","modified":"2026-10-28T02:30:43Z","fixes":[{"ecosystem":"PyPI","package":"assemblyline-service-client","fixed_in":["4.6.0.stable11","4.6.1.dev138"],"sources":["ghsa","osv"]}],"affected":[{"source":"ghsa","ecosystem":"PyPI","package":"assemblyline-service-client","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.6.0.stable11"}]}]},{"source":"ghsa","ecosystem":"PyPI","package":"assemblyline-service-client","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"4.6.1.dev0"},{"fixed":"4.6.1.dev138"}]}]},{"source":"osv","ecosystem":"PyPI","package":"assemblyline-service-client","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.6.0.stable11"}]}]},{"source":"osv","ecosystem":"PyPI","package":"assemblyline-service-client","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"4.6.1.dev0"},{"fixed":"4.6.1.dev138"}]}],"versions":["4.6.1.dev0","4.6.1.dev1","4.6.1.dev10","4.6.1.dev100","4.6.1.dev101","4.6.1.dev102","4.6.1.dev105","4.6.1.dev106","4.6.1.dev107","4.6.1.dev108","4.6.1.dev109","4.6.1.dev110","4.6.1.dev111","4.6.1.dev112","4.6.1.dev113","4.6.1.dev114","4.6.1.dev115","4.6.1.dev116","4.6.1.dev117","4.6.1.dev119","4.6.1.dev120","4.6.1.dev121","4.6.1.dev122","4.6.1.dev123","4.6.1.dev124","4.6.1.dev125","4.6.1.dev126","4.6.1.dev128","4.6.1.dev129","4.6.1.dev13","4.6.1.dev130","4.6.1.dev131","4.6.1.dev132","4.6.1.dev133","4.6.1.dev134","4.6.1.dev135","4.6.1.dev136","4.6.1.dev137","4.6.1.dev15","4.6.1.dev16","4.6.1.dev18","4.6.1.dev2","4.6.1.dev20","4.6.1.dev21","4.6.1.dev22","4.6.1.dev23","4.6.1.dev24","4.6.1.dev25","4.6.1.dev26","4.6.1.dev27","4.6.1.dev28","4.6.1.dev31","4.6.1.dev32","4.6.1.dev33","4.6.1.dev34","4.6.1.dev35","4.6.1.dev36","4.6.1.dev37","4.6.1.dev38","4.6.1.dev39","4.6.1.dev4","4.6.1.dev40","4.6.1.dev41","4.6.1.dev42","4.6.1.dev43","4.6.1.dev44","4.6.1.dev48","4.6.1.dev49","4.6.1.dev5","4.6.1.dev50","4.6.1.dev51","4.6.1.dev52","4.6.1.dev53","4.6.1.dev54","4.6.1.dev55","4.6.1.dev56","4.6.1.dev57","4.6.1.dev58","4.6.1.dev59","4.6.1.dev60","4.6.1.dev62","4.6.1.dev63","4.6.1.dev64","4.6.1.dev65","4.6.1.dev66","4.6.1.dev67","4.6.1.dev68","4.6.1.dev69","4.6.1.dev7","4.6.1.dev72","4.6.1.dev73","4.6.1.dev74","4.6.1.dev75","4.6.1.dev76","4.6.1.dev77","4.6.1.dev78","4.6.1.dev79","4.6.1.dev80","4.6.1.dev81","4.6.1.dev82","4.6.1.dev84","4.6.1.dev85","4.6.1.dev86","4.6.1.dev87","4.6.1.dev88","4.6.1.dev89","4.6.1.dev9","4.6.1.dev90","4.6.1.dev92","4.6.1.dev93","4.6.1.dev94","4.6.1.dev95","4.6.1.dev97","4.6.1.dev98","4.6.1.dev99"]},{"source":"osv","ecosystem":"PyPI","package":"assemblyline-service-client","ranges":[{"type":"ECOSYSTEM","events":[{"introduced":"0"},{"fixed":"4.6.0.stable11"},{"introduced":"4.6.1.dev0"},{"fixed":"4.6.1.dev138"}]}],"versions":["4.6.1.dev0","4.6.1.dev1","4.6.1.dev10","4.6.1.dev100","4.6.1.dev101","4.6.1.dev102","4.6.1.dev105","4.6.1.dev106","4.6.1.dev107","4.6.1.dev108","4.6.1.dev109","4.6.1.dev110","4.6.1.dev111","4.6.1.dev112","4.6.1.dev113","4.6.1.dev114","4.6.1.dev115","4.6.1.dev116","4.6.1.dev117","4.6.1.dev119","4.6.1.dev120","4.6.1.dev121","4.6.1.dev122","4.6.1.dev123","4.6.1.dev124","4.6.1.dev125","4.6.1.dev126","4.6.1.dev128","4.6.1.dev129","4.6.1.dev13","4.6.1.dev130","4.6.1.dev131","4.6.1.dev132","4.6.1.dev133","4.6.1.dev134","4.6.1.dev135","4.6.1.dev136","4.6.1.dev137","4.6.1.dev15","4.6.1.dev16","4.6.1.dev18","4.6.1.dev2","4.6.1.dev20","4.6.1.dev21","4.6.1.dev22","4.6.1.dev23","4.6.1.dev24","4.6.1.dev25","4.6.1.dev26","4.6.1.dev27","4.6.1.dev28","4.6.1.dev31","4.6.1.dev32","4.6.1.dev33","4.6.1.dev34","4.6.1.dev35","4.6.1.dev36","4.6.1.dev37","4.6.1.dev38","4.6.1.dev39","4.6.1.dev4","4.6.1.dev40","4.6.1.dev41","4.6.1.dev42","4.6.1.dev43","4.6.1.dev44","4.6.1.dev48","4.6.1.dev49","4.6.1.dev5","4.6.1.dev50","4.6.1.dev51","4.6.1.dev52","4.6.1.dev53","4.6.1.dev54","4.6.1.dev55","4.6.1.dev56","4.6.1.dev57","4.6.1.dev58","4.6.1.dev59","4.6.1.dev60","4.6.1.dev62","4.6.1.dev63","4.6.1.dev64","4.6.1.dev65","4.6.1.dev66","4.6.1.dev67","4.6.1.dev68","4.6.1.dev69","4.6.1.dev7","4.6.1.dev72","4.6.1.dev73","4.6.1.dev74","4.6.1.dev75","4.6.1.dev76","4.6.1.dev77","4.6.1.dev78","4.6.1.dev79","4.6.1.dev80","4.6.1.dev81","4.6.1.dev82","4.6.1.dev84","4.6.1.dev85","4.6.1.dev86","4.6.1.dev87","4.6.1.dev88","4.6.1.dev89","4.6.1.dev9","4.6.1.dev90","4.6.1.dev92","4.6.1.dev93","4.6.1.dev94","4.6.1.dev95","4.6.1.dev97","4.6.1.dev98","4.6.1.dev99"]}],"products":[{"vendor":"cybercentrecanada","product":"assemblyline"}],"references":[{"url":"https://github.com/CybercentreCanada/assemblyline/security/advisories/GHSA-75jv-vfxf-3865","tags":["x_refsource_CONFIRM","advisory","web"]},{"url":"https://github.com/CybercentreCanada/assemblyline-service-client/commit/351414e7e96cc1f5640ae71ae51b939e8ba30900","tags":["x_refsource_MISC","fix","web"]},{"url":"https://nvd.nist.gov/vuln/detail/CVE-2025-55013","tags":["advisory"]},{"url":"https://github.com/advisories/GHSA-75jv-vfxf-3865","tags":["advisory"]},{"url":"https://github.com/CVEProject/cvelistV5/tree/main/cves/2025/55xxx/CVE-2025-55013.json","tags":["advisory"]},{"url":"https://github.com/CybercentreCanada/assemblyline-service-client","tags":["package"]},{"url":"https://pypi.org/project/assemblyline-service-client","tags":["package"]}],"sources":{"cve":[{"id":"CVE-2025-55013","title":"Assemblyline 4 Service Client: Arbitrary Write through path traversal in Client code","description":"The Assemblyline 4 Service Client interfaces with the API to fetch tasks and publish the result for a service in Assemblyline 4. In versions below 4.6.1.dev138, the Assemblyline 4 Service Client (task_handler.py) accepts a SHA-256 value returned by the service server and uses it directly as a local file name.A malicious or compromised server (or any MITM that can speak to client) can return a path-traversal payload such as `../../../etc/cron.d/evil` and force the client to write the downloaded bytes to an arbitrary location on disk. This is fixed in version 4.6.1.dev138.","status":"published","published":"2025-08-09T02:02:23.602Z","modified":"2025-08-12T13:26:26.9Z","cvss":[{"version":"3.1","score":4.2,"vector":"CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L","level":"medium","assessor":"cna"}],"cwes":["CWE-23"],"updated_at":"2026-11-02T14:32:52.839698Z"}],"euvd":[{"id":"EUVD-2025-24028","description":"The Assemblyline 4 Service Client interfaces with the API to fetch tasks and publish the result for a service in Assemblyline 4. In versions below 4.6.1.dev138, the Assemblyline 4 Service Client (task_handler.py) accepts a SHA-256 value returned by the service server and uses it directly as a local file name.A malicious or compromised server (or any MITM that can speak to client) can return a path-traversal payload such as `../../../etc/cron.d/evil` and force the client to write the downloaded bytes to an arbitrary location on disk. This is fixed in version 4.6.1.dev138.","status":"published","published":"2025-08-09T02:02:23Z","modified":"2025-08-12T13:26:26Z","cvss":[{"version":"3.1","score":4.2,"vector":"CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L","level":"medium"}],"updated_at":"2026-11-02T20:31:59.474585Z"}],"ghsa":[{"id":"GHSA-75jv-vfxf-3865","title":"Assemblyline 4 service client vulnerable to Arbitrary Write through path traversal in Client code ","description":"**Path-Traversal -\u003e Arbitrary File Write in Assemblyline Service Client**\n\n**IMPORTANT**: This vulnerability is valid if you decide to use the assemblyline-service-client outside of the normal practice to using Assemblyline in a production environment. In practice, this code should always be executed within a containerized environment such as [assemblyline-v4-service](https://github.com/CybercentreCanada/assemblyline-v4-service) which ensures filesystem-level permissions of what the running user is allowed to access. Furthermore, there is fewer chances for a MiTM compromise when deployed properly in a Docker or Kubernetes deployment where the platform will assign the correct network policies to secure connections between containers instead of relying on the user to set this up manually.\n\nSee https://github.com/CybercentreCanada/assemblyline/issues/382 for further discussion.\n\n---\n\n## 1. Summary  \nThe Assemblyline 4 **service client** (`task_handler.py`) accepts a SHA-256 value returned by the service **server** and uses it directly as a local file name.  \n\u003e No validation / sanitisation is performed.\n\nA **malicious or compromised server** (or any MITM that can speak to client) can return a path-traversal payload such as  \n`../../../etc/cron.d/evil`  \nand force the client to write the downloaded bytes to an arbitrary location on disk.\n\n---\n\n## 2. Affected Versions  \n| Item | Value |\n|---|---|\n| **Component** | `assemblyline-service-client` |\n| **Repository** | [CybercentreCanada/assemblyline-service-client](https://github.com/CybercentreCanada/assemblyline-service-client) |\n| **Affected** | **All releases up to master branch.**  |\n\n\n---\n\n## 3. CVSS 3.1 Vector \u0026 Score  \n```\nCVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L\n```\n\n\n---\n\n## 4. Technical Details\n\n| Field | Content |\n|---|---|\n| **Location** | `assemblyline_service_client/task_handler.py`, inside `download_file()` |\n| **Vulnerable Line** | `file_path = os.path.join(self.tasking_dir, sha256)` |\n| **Root Cause** | The `sha256` string is taken directly from the service-server JSON response and used as a file name without any validation or sanitisation. |\n| **Exploit Flow** | 1. Attacker (service server) returns HTTP 200 for `GET /api/v1/file/../../../etc/cron.d/evil`.\u003cbr\u003e2. Client writes the response body to `/etc/cron.d/evil`.\u003cbr\u003e3. Achieves arbitrary file write (code execution if file is executable). |\n\n---\n\n## 5. Impact  \n- **Integrity** – Overwrite any file writable by the service UID (often root).  \n- **Availability** – Corrupt critical files or exhaust disk space.  \n- **Code Execution** – Drop cron jobs, systemd units, or overwrite binaries.\n\n---\n\n## 6. Mitigation / Fix\n\n```python\nimport re\n\n_SHA256_RE = re.compile(r'^[0-9a-fA-F]{64}\\Z')\n\ndef download_file(self, sha256: str, sid: str) -\u003e Optional[str]:\n    if not _SHA256_RE.fullmatch(sha256):\n        self.log.error(f\"[{sid}] Invalid SHA256: {sha256}\")\n        self.status = STATUSES.ERROR_FOUND\n        return None\n    # or your preferred way to check if a string is a shasum.\n```\n---","status":"published","published":"2025-07-25T14:15:48Z","modified":"2026-08-06T04:33:24Z","cvss":[{"version":"3.1","score":4.2,"vector":"CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L","level":"medium"}],"cwes":["CWE-23"],"updated_at":"2026-11-02T14:40:57.999375Z"}],"nvd":[{"id":"CVE-2025-55013","description":"The Assemblyline 4 Service Client interfaces with the API to fetch tasks and publish the result for a service in Assemblyline 4. In versions below 4.6.1.dev138, the Assemblyline 4 Service Client (task_handler.py) accepts a SHA-256 value returned by the service server and uses it directly as a local file name.A malicious or compromised server (or any MITM that can speak to client) can return a path-traversal payload such as `../../../etc/cron.d/evil` and force the client to write the downloaded bytes to an arbitrary location on disk. This is fixed in version 4.6.1.dev138.","status":"published","published":"2025-08-09T03:15:47.62Z","modified":"2026-06-17T09:41:06.903Z","cvss":[{"version":"3.1","score":4.2,"vector":"CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L","level":"medium","assessor":"secondary"}],"cwes":["CWE-23"],"updated_at":"2026-11-02T14:11:22.953396Z"}],"osv":[{"id":"CVE-2025-55013","title":"Assemblyline 4 Service Client: Arbitrary Write through path traversal in Client code","description":"The Assemblyline 4 Service Client interfaces with the API to fetch tasks and publish the result for a service in Assemblyline 4. In versions below 4.6.1.dev138, the Assemblyline 4 Service Client (task_handler.py) accepts a SHA-256 value returned by the service server and uses it directly as a local file name.A malicious or compromised server (or any MITM that can speak to client) can return a path-traversal payload such as `../../../etc/cron.d/evil` and force the client to write the downloaded bytes to an arbitrary location on disk. This is fixed in version 4.6.1.dev138.","status":"published","published":"2025-08-09T02:02:23.602Z","modified":"2026-10-28T02:30:43.803795465Z","cvss":[{"version":"3.1","score":4.2,"vector":"CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L","level":"medium"}],"cwes":["CWE-23"],"updated_at":"2026-11-02T15:44:50.863921Z"},{"id":"GHSA-75jv-vfxf-3865","title":"Assemblyline 4 service client vulnerable to Arbitrary Write through path traversal in Client code ","description":"**Path-Traversal -\u003e Arbitrary File Write in Assemblyline Service Client**\n\n**IMPORTANT**: This vulnerability is valid if you decide to use the assemblyline-service-client outside of the normal practice to using Assemblyline in a production environment. In practice, this code should always be executed within a containerized environment such as [assemblyline-v4-service](https://github.com/CybercentreCanada/assemblyline-v4-service) which ensures filesystem-level permissions of what the running user is allowed to access. Furthermore, there is fewer chances for a MiTM compromise when deployed properly in a Docker or Kubernetes deployment where the platform will assign the correct network policies to secure connections between containers instead of relying on the user to set this up manually.\n\nSee https://github.com/CybercentreCanada/assemblyline/issues/382 for further discussion.\n\n---\n\n## 1. Summary  \nThe Assemblyline 4 **service client** (`task_handler.py`) accepts a SHA-256 value returned by the service **server** and uses it directly as a local file name.  \n\u003e No validation / sanitisation is performed.\n\nA **malicious or compromised server** (or any MITM that can speak to client) can return a path-traversal payload such as  \n`../../../etc/cron.d/evil`  \nand force the client to write the downloaded bytes to an arbitrary location on disk.\n\n---\n\n## 2. Affected Versions  \n| Item | Value |\n|---|---|\n| **Component** | `assemblyline-service-client` |\n| **Repository** | [CybercentreCanada/assemblyline-service-client](https://github.com/CybercentreCanada/assemblyline-service-client) |\n| **Affected** | **All releases up to master branch.**  |\n\n\n---\n\n## 3. CVSS 3.1 Vector \u0026 Score  \n```\nCVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L\n```\n\n\n---\n\n## 4. Technical Details\n\n| Field | Content |\n|---|---|\n| **Location** | `assemblyline_service_client/task_handler.py`, inside `download_file()` |\n| **Vulnerable Line** | `file_path = os.path.join(self.tasking_dir, sha256)` |\n| **Root Cause** | The `sha256` string is taken directly from the service-server JSON response and used as a file name without any validation or sanitisation. |\n| **Exploit Flow** | 1. Attacker (service server) returns HTTP 200 for `GET /api/v1/file/../../../etc/cron.d/evil`.\u003cbr\u003e2. Client writes the response body to `/etc/cron.d/evil`.\u003cbr\u003e3. Achieves arbitrary file write (code execution if file is executable). |\n\n---\n\n## 5. Impact  \n- **Integrity** – Overwrite any file writable by the service UID (often root).  \n- **Availability** – Corrupt critical files or exhaust disk space.  \n- **Code Execution** – Drop cron jobs, systemd units, or overwrite binaries.\n\n---\n\n## 6. Mitigation / Fix\n\n```python\nimport re\n\n_SHA256_RE = re.compile(r'^[0-9a-fA-F]{64}\\Z')\n\ndef download_file(self, sha256: str, sid: str) -\u003e Optional[str]:\n    if not _SHA256_RE.fullmatch(sha256):\n        self.log.error(f\"[{sid}] Invalid SHA256: {sha256}\")\n        self.status = STATUSES.ERROR_FOUND\n        return None\n    # or your preferred way to check if a string is a shasum.\n```\n---","status":"published","published":"2025-07-25T14:15:48Z","modified":"2026-07-07T17:57:02.848397489Z","cvss":[{"version":"3.1","score":4.2,"vector":"CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L","level":"medium"}],"cwes":["CWE-23"],"updated_at":"2026-11-02T15:46:40.657155Z"},{"id":"PYSEC-2026-1194","title":"Assemblyline 4 service client vulnerable to Arbitrary Write through path traversal in Client code ","description":"**Path-Traversal -\u003e Arbitrary File Write in Assemblyline Service Client**\n\n**IMPORTANT**: This vulnerability is valid if you decide to use the assemblyline-service-client outside of the normal practice to using Assemblyline in a production environment. In practice, this code should always be executed within a containerized environment such as [assemblyline-v4-service](https://github.com/CybercentreCanada/assemblyline-v4-service) which ensures filesystem-level permissions of what the running user is allowed to access. Furthermore, there is fewer chances for a MiTM compromise when deployed properly in a Docker or Kubernetes deployment where the platform will assign the correct network policies to secure connections between containers instead of relying on the user to set this up manually.\n\nSee https://github.com/CybercentreCanada/assemblyline/issues/382 for further discussion.\n\n---\n\n## 1. Summary  \nThe Assemblyline 4 **service client** (`task_handler.py`) accepts a SHA-256 value returned by the service **server** and uses it directly as a local file name.  \n\u003e No validation / sanitisation is performed.\n\nA **malicious or compromised server** (or any MITM that can speak to client) can return a path-traversal payload such as  \n`../../../etc/cron.d/evil`  \nand force the client to write the downloaded bytes to an arbitrary location on disk.\n\n---\n\n## 2. Affected Versions  \n| Item | Value |\n|---|---|\n| **Component** | `assemblyline-service-client` |\n| **Repository** | [CybercentreCanada/assemblyline-service-client](https://github.com/CybercentreCanada/assemblyline-service-client) |\n| **Affected** | **All releases up to master branch.**  |\n\n\n---\n\n## 3. CVSS 3.1 Vector \u0026 Score  \n```\nCVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L\n```\n\n\n---\n\n## 4. Technical Details\n\n| Field | Content |\n|---|---|\n| **Location** | `assemblyline_service_client/task_handler.py`, inside `download_file()` |\n| **Vulnerable Line** | `file_path = os.path.join(self.tasking_dir, sha256)` |\n| **Root Cause** | The `sha256` string is taken directly from the service-server JSON response and used as a file name without any validation or sanitisation. |\n| **Exploit Flow** | 1. Attacker (service server) returns HTTP 200 for `GET /api/v1/file/../../../etc/cron.d/evil`.\u003cbr\u003e2. Client writes the response body to `/etc/cron.d/evil`.\u003cbr\u003e3. Achieves arbitrary file write (code execution if file is executable). |\n\n---\n\n## 5. Impact  \n- **Integrity** – Overwrite any file writable by the service UID (often root).  \n- **Availability** – Corrupt critical files or exhaust disk space.  \n- **Code Execution** – Drop cron jobs, systemd units, or overwrite binaries.\n\n---\n\n## 6. Mitigation / Fix\n\n```python\nimport re\n\n_SHA256_RE = re.compile(r'^[0-9a-fA-F]{64}\\Z')\n\ndef download_file(self, sha256: str, sid: str) -\u003e Optional[str]:\n    if not _SHA256_RE.fullmatch(sha256):\n        self.log.error(f\"[{sid}] Invalid SHA256: {sha256}\")\n        self.status = STATUSES.ERROR_FOUND\n        return None\n    # or your preferred way to check if a string is a shasum.\n```\n---","status":"published","published":"2026-07-07T16:02:58.794662Z","modified":"2026-07-07T17:47:11.629554721Z","cvss":[{"version":"3.1","score":4.2,"vector":"CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L","level":"medium"}],"updated_at":"2026-11-02T15:52:54.622769Z"}]}}
