Actual: CSV Formula Injection in Transaction Export via Imported Payee/Notes Fields
Actual is a local-first personal finance tool. Prior to 26.6.0, exportToCSV and exportQueryToCSV in packages/loot-core/src/server/transactions/export/export-to-csv.ts pass user-controlled Payee, Notes, Account, and Category strings to csv-stringify with no cast callback and no formula-prefix neutralization. Strings that begin with equals sign, plus, minus, at sign, tab, or carriage return survive verbatim into the exported CSV, and when a recipient opens the file in Excel, LibreOffice Calc, or Google Sheets, the strings are interpreted as formulas, enabling transaction data exfiltration and attacker-chosen spreadsheet display values. This issue is fixed in version 26.6.0.
- Products
- Not specified
- Affected versions
- Not specified
- Fixed versions
- Not specified
- CVEs
- CVE-2026-50179
- Confirmed fixed CVEs
- Not specified
- Updated in this feed
- 4 Nov 2026, 13:24 UTC · Revision 1
Source evidence
Actual: CSV Formula Injection in Transaction Export via Imported Payee/Notes Fields
core-osv · Original sourcePublished 7 Jul 2026, 20:58 UTC
Actual is a local-first personal finance tool. Prior to 26.6.0, exportToCSV and exportQueryToCSV in packages/loot-core/src/server/transactions/export/export-to-csv.ts pass user-controlled Payee, Notes, Account, and Category strings to csv-stringify with no cast callback and no formula-prefix neutralization. Strings that begin with equals sign, plus, minus, at sign, tab, or carriage return survive verbatim into the exported CSV, and when a recipient opens the file in Excel, LibreOffice Calc, or Google Sheets, the strings are interpreted as formulas, enabling transaction data exfiltration and attacker-chosen spreadsheet display values. This issue is fixed in version 26.6.0.
osv:CVE-2026-50179
Complete source record
{
"id": "c0b68959793134a307c3020d23fe138bf01beed45aeb2ba215686f2f28ae57ff",
"url": "https://osv.dev/vulnerability/CVE-2026-50179",
"method": "structured",
"payload": {
"kind": "advisory",
"title": "Actual: CSV Formula Injection in Transaction Export via Imported Payee/Notes Fields",
"summary": "Actual is a local-first personal finance tool. Prior to 26.6.0, exportToCSV and exportQueryToCSV in packages/loot-core/src/server/transactions/export/export-to-csv.ts pass user-controlled Payee, Notes, Account, and Category strings to csv-stringify with no cast callback and no formula-prefix neutralization. Strings that begin with equals sign, plus, minus, at sign, tab, or carriage return survive verbatim into the exported CSV, and when a recipient opens the file in Excel, LibreOffice Calc, or Google Sheets, the strings are interpreted as formulas, enabling transaction data exfiltration and attacker-chosen spreadsheet display values. This issue is fixed in version 26.6.0.",
"evidence": "osv:CVE-2026-50179",
"products": [],
"severity": "medium",
"structured": {
"id": "CVE-2026-50179",
"aliases": [
"CVE-2026-50179",
"GHSA-xqjm-27pc-rvwm"
],
"metrics": [
{
"type": "CVSS_V3",
"score": "CVSS:3.1/AV:N/AC:H/PR:N/UI:R/S:U/C:L/I:L/A:N"
}
],
"affected": [
{
"ranges": [
{
"repo": "https://github.com/actualbudget/actual",
"type": "GIT",
"events": [
{
"introduced": "0"
},
{
"fixed": "3a730c160f8e6e4ea68f191d075a46bbbb7073d8"
},
{
"fixed": "068185751c03b42e726e3c60b718413d5f96c306"
}
],
"database_specific": {
"extracted_events": [
{
"range": [
{
"introduced": "0"
},
{
"fixed": "26.6.0"
}
],
"source": "AFFECTED_FIELD",
"strategy": "StringRangeExpression"
},
{
"range": [
{
"fixed": "068185751c03b42e726e3c60b718413d5f96c306"
}
],
"source": "REFERENCES_COMMIT"
},
{
"range": [
{
"fixed": "3a730c160f8e6e4ea68f191d075a46bbbb7073d8"
}
],
"source": "REFERENCES_TAG",
"original_tag": "v26.6.0"
}
]
}
}
],
"versions": [
"v26.4.0",
"v26.3.0",
"v26.2.0",
"v26.1.0",
"v25.12.0",
"v25.11.0",
"v25.10.0",
"v25.9.0",
"v25.8.0",
"v25.7.1",
"v25.7.0",
"v25.6.1",
"v25.6.0",
"v25.5.0",
"v25.4.0",
"v25.3.0",
"v25.2.0",
"v25.1.0",
"v24.12.0",
"v24.11.0",
"v24.10.0",
"v24.9.0",
"v24.8.0",
"v24.7.0",
"v24.6.0",
"v24.5.0",
"v24.4.0",
"v24.3.0",
"v24.2.0",
"v24.1.0",
"v23.12.0",
"v23.11.0",
"v23.10.0",
"v23.9.0",
"v23.8.1",
"v23.8.0",
"v23.7.2",
"v23.7.1",
"v23.7.0",
"v23.6.0",
"v23.5.0",
"v23.4.2",
"v23.4.1",
"v23.4.0",
"v23.3.2",
"v23.3.0",
"v23.2.9",
"v23.2.5",
"v23.1.12",
"v22.12.9"
],
"database_specific": {
"source": "https://storage.googleapis.com/cve-osv-conversion/osv-output/CVE-2026-50179.json"
}
}
],
"modified": "2026-10-28T02:30:35.676249155Z",
"provider": "osv",
"references": [
"https://github.com/actualbudget/actual/releases/tag/v26.6.0",
"https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/50xxx/CVE-2026-50179.json",
"https://github.com/actualbudget/actual/security/advisories/GHSA-xqjm-27pc-rvwm",
"https://nvd.nist.gov/vuln/detail/CVE-2026-50179",
"https://github.com/actualbudget/actual/commit/068185751c03b42e726e3c60b718413d5f96c306"
],
"provider_metadata": {
"cwe_ids": [
"CWE-1236"
],
"cna_assigner": "GitHub_M",
"osv_generated_from": "https://github.com/CVEProject/cvelistV5/tree/main/cves/2026/50xxx/CVE-2026-50179.json"
}
},
"related_cves": [
{
"value": "CVE-2026-50179",
"evidence": "/id"
}
],
"security_relevant": true,
"severity_evidence": "/severity/0/score"
},
"source_id": "core-osv",
"document_id": 503049,
"published_at": "2026-07-07T20:58:16.074+00:00"
}