The vulnerability is a privilege escalation in Vikunja that allows a user with 'Write' access to a project to gain 'Admin' privileges. The root cause is an insufficient permission check in the Project.CanUpdate function, located in pkg/models/project_permissions.go. When a user tries to move a project to a new parent, this function only checks if the user has CanWrite permission on the new parent, which is not a high enough privilege level for such a significant change.
An attacker can exploit this by taking a project on which they have 'Write' access and reparenting it to a project that they own. Because Vikunja's permission model is recursive, the attacker inherits the 'Admin' role from their own parent project onto the moved project. This allows them to perform administrative actions like deleting the project or managing its users.
The exploit is triggered when the UpdateProject function is called, which in turn calls the vulnerable Project.CanUpdate function. The fix, seen in commit 118a0d593469a1b3b797ef1f767064abdc0113df, was to add a more stringent check directly into the UpdateProject function, requiring 'Admin' privileges for both the project being moved and the destination parent project. Therefore, both UpdateProject and Project.CanUpdate would appear in a runtime profile during exploitation.