<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/" version="2.0">
  <channel>
    <title>Most recent entries from all</title>
    <link>https://cve.radiocsirt.org</link>
    <description>Contains only the most 10 recent entries.</description>
    <docs>http://www.rssboard.org/rss-specification</docs>
    <generator>python-feedgen</generator>
    <language>en</language>
    <lastBuildDate>Mon, 19 Oct 2026 07:40:47 +0000</lastBuildDate>
    <item>
      <title>EUVD-2026-273973</title>
      <link>https://cve.radiocsirt.org/vuln/euvd-2026-273973</link>
      <description>EUVD-2026-273973</description>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/euvd-2026-273973</guid>
    </item>
    <item>
      <title>fkie_cve-2026-27638</title>
      <link>https://cve.radiocsirt.org/vuln/fkie_cve-2026-27638</link>
      <description>&lt;p&gt;Actual is a local-first personal finance tool. Prior to version 26.2.1, in multi-user mode (OpenID), the sync API endpoints (`/sync/*`) don&amp;#39;t verify that the authenticated user owns or has access to the file being operated on. Any authenticated user can read, modify, and overwrite any other user&amp;#39;s budget files by providing their file ID. Version 26.2.1 patches the issue.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Actual is a local-first personal finance tool. Prior to version 26.2.1, in multi-user mode (OpenID), the sync API endpoints (`/sync/*`) don&amp;#39;t verify that the authenticated user owns or has access to the file being operated on. Any authenticated user can read, modify, and overwrite any other user&amp;#39;s budget files by providing their file ID. Version 26.2.1 patches the issue.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/fkie_cve-2026-27638</guid>
    </item>
    <item>
      <title>GHSA-qmjj-p7m9-wjrv — @actual-app/sync-server: Missing authorization in sync endpoints allows cross-user budget file access in multi-user mode</title>
      <link>https://cve.radiocsirt.org/vuln/ghsa-qmjj-p7m9-wjrv</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: @actual-app/sync-server&lt;/p&gt;
&lt;p&gt;In multi-user mode (OpenID), the sync API endpoints (`/sync/*`) don&amp;#39;t verify that the authenticated user owns or has access to the file being operated on. Any authenticated user can read, modify, and overwrite any other user&amp;#39;s budget files by providing their file ID.&lt;/p&gt;
&lt;p&gt;## Affected Code&lt;/p&gt;
&lt;p&gt;File: `packages/sync-server/src/app-sync.ts`&lt;/p&gt;
&lt;p&gt;The `validateSessionMiddleware` on line 31 confirms the user is authenticated, but individual endpoints only check that the file *exists* (via `verifyFileExists`), never that the requesting user *owns* or *has access to* the file.&lt;/p&gt;
&lt;p&gt;Compare with `POST /sync/delete-user-file` (lines 394-430) which correctly checks:
```js
const isOwner = file.owner === userId;
const isServerAdmin = isAdmin(userId);
if (!isOwner &amp;amp;&amp;amp; !isServerAdmin) { ... }
```&lt;/p&gt;
&lt;p&gt;This check is missing from all other endpoints.&lt;/p&gt;
&lt;p&gt;## Affected Endpoints&lt;/p&gt;
&lt;p&gt;- `GET /sync/download-user-file` - download any budget file
- `POST /sync/upload-user-file` - overwrite any budget file
- `POST /sync/sync` - read/write sync messages of any file
- `POST /sync/user-get-key` - read encryption key info
- `POST /sync/user-create-key` - change encryption key
- `POST /sync/reset-user-file` - reset sync state
- `POST /sync/update-user-filename` - rename file
- `GET /sync/get-user-file-info` - read file metadata&lt;/p&gt;
&lt;p&gt;## PoC&lt;/p&gt;
&lt;p&gt;Setup: Two users (Alice, Bob) authenticated via OpenID on the same Actual server. Alice has a budget with fileId `abc-123`.&lt;/p&gt;
&lt;p&gt;Bob downloads Alice&amp;#39;s budget:
```bash
curl -X GET &amp;#39;https://actual.example…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; npm: @actual-app/sync-server&lt;/p&gt;
&lt;p&gt;In multi-user mode (OpenID), the sync API endpoints (`/sync/*`) don&amp;#39;t verify that the authenticated user owns or has access to the file being operated on. Any authenticated user can read, modify, and overwrite any other user&amp;#39;s budget files by providing their file ID.&lt;/p&gt;
&lt;p&gt;## Affected Code&lt;/p&gt;
&lt;p&gt;File: `packages/sync-server/src/app-sync.ts`&lt;/p&gt;
&lt;p&gt;The `validateSessionMiddleware` on line 31 confirms the user is authenticated, but individual endpoints only check that the file *exists* (via `verifyFileExists`), never that the requesting user *owns* or *has access to* the file.&lt;/p&gt;
&lt;p&gt;Compare with `POST /sync/delete-user-file` (lines 394-430) which correctly checks:
```js
const isOwner = file.owner === userId;
const isServerAdmin = isAdmin(userId);
if (!isOwner &amp;amp;&amp;amp; !isServerAdmin) { ... }
```&lt;/p&gt;
&lt;p&gt;This check is missing from all other endpoints.&lt;/p&gt;
&lt;p&gt;## Affected Endpoints&lt;/p&gt;
&lt;p&gt;- `GET /sync/download-user-file` - download any budget file
- `POST /sync/upload-user-file` - overwrite any budget file
- `POST /sync/sync` - read/write sync messages of any file
- `POST /sync/user-get-key` - read encryption key info
- `POST /sync/user-create-key` - change encryption key
- `POST /sync/reset-user-file` - reset sync state
- `POST /sync/update-user-filename` - rename file
- `GET /sync/get-user-file-info` - read file metadata&lt;/p&gt;
&lt;p&gt;## PoC&lt;/p&gt;
&lt;p&gt;Setup: Two users (Alice, Bob) authenticated via OpenID on the same Actual server. Alice has a budget with fileId `abc-123`.&lt;/p&gt;
&lt;p&gt;Bob downloads Alice&amp;#39;s budget:
```bash
curl -X GET &amp;#39;https://actual.example…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://cve.radiocsirt.org/vuln/ghsa-qmjj-p7m9-wjrv</guid>
    </item>
  </channel>
</rss>
