<?xml version='1.0' encoding='UTF-8'?>
<?xml-stylesheet href="/static/style.xsl" type="text/xsl"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
  <id>https://vulnerability.circl.lu/rss/recent/all/10</id>
  <title>Most recent entries from all</title>
  <updated>2026-09-30T01:52:15.717475+00:00</updated>
  <author>
    <name>Vulnerability-Lookup</name>
    <email>info@circl.lu</email>
  </author>
  <link href="https://vulnerability.circl.lu" rel="alternate"/>
  <generator uri="https://lkiesow.github.io/python-feedgen" version="1.0.0">python-feedgen</generator>
  <subtitle>Contains only the most 10 recent entries.</subtitle>
  <entry>
    <id>https://vulnerability.circl.lu/vuln/fkie_cve-2026-52820</id>
    <title>fkie_cve-2026-52820</title>
    <updated>2026-09-30T01:52:15.751872+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml">
        <p>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'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.</p>
      </div>
    </content>
    <link href="https://vulnerability.circl.lu/vuln/fkie_cve-2026-52820"/>
  </entry>
  <entry>
    <id>https://vulnerability.circl.lu/vuln/ghsa-vrr2-g9gh-c3jc</id>
    <title>GHSA-vrr2-g9gh-c3jc — Kimai: Timesheet PATCH/POST allows assigning to project outside user's team via query_builder OR-bypass</title>
    <updated>2026-09-30T01:52:15.751980+00:00</updated>
    <content type="xhtml">
      <div xmlns="http://www.w3.org/1999/xhtml"><p><strong>Affected:</strong> Packagist: kimai/kimai</p>
<p>## Summary</p>
<p>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.</p>
<p>## Details</p>
<p>### Entry point — only ownership is checked in `src/API/TimesheetController.php:317-355`</p>
<p>```php
#[IsGranted('edit', 'timesheet')]
#[Route(methods: ['PATCH'], path: '/{id}', name: 'patch_timesheet', requirements: ['id' =&gt; '\d+'])]
public function patchAction(Request $request, Timesheet $timesheet): Response
{
    ...
    $form = $this-&gt;createForm(TimesheetApiEditForm::class, $timesheet, [...]);
    $form-&gt;setData($timesheet);
    $form-&gt;submit($request-&gt;request-&gt;all(), false);
    if (false === $form-&gt;isValid()) { ... }
    $this-&gt;service-&gt;saveTimesheet($timesheet);
    ...
}
```</p>
<p>`src/Voter/TimesheetVoter.php:134-142`:</p>
<p>```php
if ($subject-&gt;getUser()?-&gt;getId() === $user-&gt;getId()) {
    return $this-&gt;permissionManager-&gt;hasRolePermission($user, $permission . '_own_timesh…</p></div>
    </content>
    <link href="https://vulnerability.circl.lu/vuln/ghsa-vrr2-g9gh-c3jc"/>
  </entry>
</feed>
