<?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://vulnerability.circl.lu</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>Tue, 29 Sep 2026 14:18:52 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-52820</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-52820</link>
      <description>&lt;p&gt;Kimai is an open-source time tracking application. Prior to 2.57.0, PATCH /api/timesheets/{id} and POST /api/timesheets accept a user-controlled project identifier through TimesheetApiEditForm and FormTrait, and ProjectRepository::getQueryBuilderForFormType() places that identifier in an unconditional OR branch that bypasses the team access criteria. Any authenticated user with edit_own_timesheet can therefore assign an owned timesheet to a project outside the user&amp;#39;s teams, persist unauthorized project attribution, and retrieve project and customer metadata through GET /api/timesheets/{id}?full=true. TimesheetTeamAccessValidator now checks changed project and activity associations against current team access. This issue is fixed in version 2.57.0.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Kimai is an open-source time tracking application. Prior to 2.57.0, PATCH /api/timesheets/{id} and POST /api/timesheets accept a user-controlled project identifier through TimesheetApiEditForm and FormTrait, and ProjectRepository::getQueryBuilderForFormType() places that identifier in an unconditional OR branch that bypasses the team access criteria. Any authenticated user with edit_own_timesheet can therefore assign an owned timesheet to a project outside the user&amp;#39;s teams, persist unauthorized project attribution, and retrieve project and customer metadata through GET /api/timesheets/{id}?full=true. TimesheetTeamAccessValidator now checks changed project and activity associations against current team access. This issue is fixed in version 2.57.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-52820</guid>
    </item>
    <item>
      <title>GHSA-vrr2-g9gh-c3jc — Kimai: Timesheet PATCH/POST allows assigning to project outside user's team via query_builder OR-bypass</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-vrr2-g9gh-c3jc</link>
      <description>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Packagist: kimai/kimai&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The Timesheet API `PATCH /api/timesheets/{id}` and `POST /api/timesheets` endpoints accept a user-supplied `project` ID and resolve it through a Symfony `EntityType` whose `query_builder` allows the submitted ID to satisfy the access predicate via an unconditional OR branch. As a result, any authenticated user can re-assign their own timesheet to any project in the database — including projects that belong to teams or customers they have no membership in and cannot otherwise see. The user can then read serialized project/customer details via `GET /api/timesheets/{id}?full=true`, leaking metadata (name, currency, customer hierarchy) that would otherwise be filtered out by the team ACL.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;### Entry point — only ownership is checked in `src/API/TimesheetController.php:317-355`&lt;/p&gt;
&lt;p&gt;```php
#[IsGranted(&amp;#39;edit&amp;#39;, &amp;#39;timesheet&amp;#39;)]
#[Route(methods: [&amp;#39;PATCH&amp;#39;], path: &amp;#39;/{id}&amp;#39;, name: &amp;#39;patch_timesheet&amp;#39;, requirements: [&amp;#39;id&amp;#39; =&amp;gt; &amp;#39;\d+&amp;#39;])]
public function patchAction(Request $request, Timesheet $timesheet): Response
{
    ...
    $form = $this-&amp;gt;createForm(TimesheetApiEditForm::class, $timesheet, [...]);
    $form-&amp;gt;setData($timesheet);
    $form-&amp;gt;submit($request-&amp;gt;request-&amp;gt;all(), false);
    if (false === $form-&amp;gt;isValid()) { ... }
    $this-&amp;gt;service-&amp;gt;saveTimesheet($timesheet);
    ...
}
```&lt;/p&gt;
&lt;p&gt;`src/Voter/TimesheetVoter.php:134-142`:&lt;/p&gt;
&lt;p&gt;```php
if ($subject-&amp;gt;getUser()?-&amp;gt;getId() === $user-&amp;gt;getId()) {
    return $this-&amp;gt;permissionManager-&amp;gt;hasRolePermission($user, $permission . &amp;#39;_own_timesh…&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;&lt;strong&gt;Affected:&lt;/strong&gt; Packagist: kimai/kimai&lt;/p&gt;
&lt;p&gt;## Summary&lt;/p&gt;
&lt;p&gt;The Timesheet API `PATCH /api/timesheets/{id}` and `POST /api/timesheets` endpoints accept a user-supplied `project` ID and resolve it through a Symfony `EntityType` whose `query_builder` allows the submitted ID to satisfy the access predicate via an unconditional OR branch. As a result, any authenticated user can re-assign their own timesheet to any project in the database — including projects that belong to teams or customers they have no membership in and cannot otherwise see. The user can then read serialized project/customer details via `GET /api/timesheets/{id}?full=true`, leaking metadata (name, currency, customer hierarchy) that would otherwise be filtered out by the team ACL.&lt;/p&gt;
&lt;p&gt;## Details&lt;/p&gt;
&lt;p&gt;### Entry point — only ownership is checked in `src/API/TimesheetController.php:317-355`&lt;/p&gt;
&lt;p&gt;```php
#[IsGranted(&amp;#39;edit&amp;#39;, &amp;#39;timesheet&amp;#39;)]
#[Route(methods: [&amp;#39;PATCH&amp;#39;], path: &amp;#39;/{id}&amp;#39;, name: &amp;#39;patch_timesheet&amp;#39;, requirements: [&amp;#39;id&amp;#39; =&amp;gt; &amp;#39;\d+&amp;#39;])]
public function patchAction(Request $request, Timesheet $timesheet): Response
{
    ...
    $form = $this-&amp;gt;createForm(TimesheetApiEditForm::class, $timesheet, [...]);
    $form-&amp;gt;setData($timesheet);
    $form-&amp;gt;submit($request-&amp;gt;request-&amp;gt;all(), false);
    if (false === $form-&amp;gt;isValid()) { ... }
    $this-&amp;gt;service-&amp;gt;saveTimesheet($timesheet);
    ...
}
```&lt;/p&gt;
&lt;p&gt;`src/Voter/TimesheetVoter.php:134-142`:&lt;/p&gt;
&lt;p&gt;```php
if ($subject-&amp;gt;getUser()?-&amp;gt;getId() === $user-&amp;gt;getId()) {
    return $this-&amp;gt;permissionManager-&amp;gt;hasRolePermission($user, $permission . &amp;#39;_own_timesh…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-vrr2-g9gh-c3jc</guid>
    </item>
  </channel>
</rss>
