id: PYSEC-2026-1194
published: "2026-07-07T16:02:58.794662Z"
modified: "2026-07-07T17:23:47.502955Z"
aliases:
- CVE-2025-55013
- GHSA-75jv-vfxf-3865
summary: "Assemblyline 4 service client vulnerable to Arbitrary Write through path traversal in Client code "
details: "**Path-Traversal -> 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> 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 & 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`.
2. Client writes the response body to `/etc/cron.d/evil`.
3. 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) -> 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---"
affected:
- package:
name: assemblyline-service-client
ecosystem: PyPI
purl: pkg:pypi/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
references:
- type: WEB
url: https://github.com/CybercentreCanada/assemblyline/security/advisories/GHSA-75jv-vfxf-3865
- type: ADVISORY
url: https://nvd.nist.gov/vuln/detail/CVE-2025-55013
- type: WEB
url: https://github.com/CybercentreCanada/assemblyline-service-client/commit/351414e7e96cc1f5640ae71ae51b939e8ba30900
- type: PACKAGE
url: https://github.com/CybercentreCanada/assemblyline-service-client
- type: PACKAGE
url: https://pypi.org/project/assemblyline-service-client
- type: ADVISORY
url: https://github.com/advisories/GHSA-75jv-vfxf-3865
severity:
- type: CVSS_V3
score: CVSS:3.1/AV:A/AC:H/PR:N/UI:N/S:U/C:N/I:L/A:L