<?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://db.gcve.eu</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>Wed, 30 Sep 2026 14:24:53 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-54766</title>
      <link>https://db.gcve.eu/vuln/fkie_cve-2026-54766</link>
      <description>&lt;p&gt;Vikunja is an open-source self-hosted task management platform. From 0.21.0 until 2.4.0, the project duplication operation in pkg/models/project_duplicate.go allows an authenticated user who can read a source project to place its duplicate beneath an arbitrary target parent project. ProjectDuplicate.CanCreate calls parent.CanCreate on an unhydrated Project containing only the body supplied parent_project_id instead of calling parent.CanWrite, so the target parent write-permission check is skipped. The ordinary project creation path enforces that permission, but PUT /api/v1/projects/{project}/duplicate does not, allowing attacker-owned content to be injected into another user or team project hierarchy. This issue is fixed in version 2.4.0.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Vikunja is an open-source self-hosted task management platform. From 0.21.0 until 2.4.0, the project duplication operation in pkg/models/project_duplicate.go allows an authenticated user who can read a source project to place its duplicate beneath an arbitrary target parent project. ProjectDuplicate.CanCreate calls parent.CanCreate on an unhydrated Project containing only the body supplied parent_project_id instead of calling parent.CanWrite, so the target parent write-permission check is skipped. The ordinary project creation path enforces that permission, but PUT /api/v1/projects/{project}/duplicate does not, allowing attacker-owned content to be injected into another user or team project hierarchy. This issue is fixed in version 2.4.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/fkie_cve-2026-54766</guid>
    </item>
    <item>
      <title>GHSA-f27p-pw2p-9pr4 — Vikunja has a project duplication bypasses write-permission check on the target parent project</title>
      <link>https://db.gcve.eu/vuln/ghsa-f27p-pw2p-9pr4</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Go: code.vikunja.io/api&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The project-duplication endpoint fails to enforce write access to the target parent project. Any authenticated (non-link-share) user can duplicate a project they can read into **any** parent project on the instance, regardless of whether they have write access to that parent — injecting an attacker-owned project into another user&amp;#39;s or team&amp;#39;s project hierarchy.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;`ProjectDuplicate.CanCreate` (`pkg/models/project_duplicate.go`) is meant to require write access to the parent the duplicate is placed under — its own comment says &amp;#34;Parent project exists + user has write access&amp;#34;. The implementation does neither correctly:&lt;/p&gt;
&lt;p&gt;```go
func (pd *ProjectDuplicate) CanCreate(s *xorm.Session, a web.Auth) (canCreate bool, err error) {
    pd.Project = &amp;amp;Project{ID: pd.ProjectID}
    canRead, _, err := pd.Project.CanRead(s, a)
    if err != nil || !canRead {
        return canRead, err
    }
    if pd.ParentProjectID == 0 {
        return canRead, err
    }
    // Parent project exists + user has write access to is (-&amp;gt; can create new projects)
    parent := &amp;amp;Project{ID: pd.ParentProjectID}
    return parent.CanCreate(s, a)   // &amp;lt;-- bug
}
```&lt;/p&gt;
&lt;p&gt;Two defects compound here:&lt;/p&gt;
&lt;p&gt;1. **Wrong permission method.** It calls `parent.CanCreate` (&amp;#34;may I create *this* project?&amp;#34;) instead of `parent.CanWrite` (&amp;#34;may I create children *inside* this project?&amp;#34;). The latter is what the normal create path uses — `POST /projects` with a `parent_project_id` enforces `parent.CanWrite` via `Project.Can…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Go: code.vikunja.io/api&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The project-duplication endpoint fails to enforce write access to the target parent project. Any authenticated (non-link-share) user can duplicate a project they can read into **any** parent project on the instance, regardless of whether they have write access to that parent — injecting an attacker-owned project into another user&amp;#39;s or team&amp;#39;s project hierarchy.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;`ProjectDuplicate.CanCreate` (`pkg/models/project_duplicate.go`) is meant to require write access to the parent the duplicate is placed under — its own comment says &amp;#34;Parent project exists + user has write access&amp;#34;. The implementation does neither correctly:&lt;/p&gt;
&lt;p&gt;```go
func (pd *ProjectDuplicate) CanCreate(s *xorm.Session, a web.Auth) (canCreate bool, err error) {
    pd.Project = &amp;amp;Project{ID: pd.ProjectID}
    canRead, _, err := pd.Project.CanRead(s, a)
    if err != nil || !canRead {
        return canRead, err
    }
    if pd.ParentProjectID == 0 {
        return canRead, err
    }
    // Parent project exists + user has write access to is (-&amp;gt; can create new projects)
    parent := &amp;amp;Project{ID: pd.ParentProjectID}
    return parent.CanCreate(s, a)   // &amp;lt;-- bug
}
```&lt;/p&gt;
&lt;p&gt;Two defects compound here:&lt;/p&gt;
&lt;p&gt;1. **Wrong permission method.** It calls `parent.CanCreate` (&amp;#34;may I create *this* project?&amp;#34;) instead of `parent.CanWrite` (&amp;#34;may I create children *inside* this project?&amp;#34;). The latter is what the normal create path uses — `POST /projects` with a `parent_project_id` enforces `parent.CanWrite` via `Project.Can…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://db.gcve.eu/vuln/ghsa-f27p-pw2p-9pr4</guid>
    </item>
  </channel>
</rss>
