<?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>Wed, 07 Oct 2026 09:49:54 +0000</lastBuildDate>
    <item>
      <title>fkie_cve-2026-44298</title>
      <link>https://vulnerability.circl.lu/vuln/fkie_cve-2026-44298</link>
      <description>&lt;p&gt;Kimai is an open-source time tracking application. From version 2.32.0 to before version 2.56.0, users with the role System-Admin (ROLE_SYSTE_ADMIN) and the permission upload_invoice_template can upload PDF invoice templates, which can call pdfContext.setOption(&amp;#39;associated_files&amp;#39;, ...) inside the sandboxed Twig render. This is forwarded to mPDF&amp;#39;s SetAssociatedFiles(), whose writer calls file_get_contents($entry[&amp;#39;path&amp;#39;]) during PDF output and embeds the bytes as a FlateDecode stream in the PDF. Any file readable by the PHP worker is returned to the attacker inside the rendered invoice. This issue has been patched in version 2.56.0.&lt;/p&gt;</description>
      <content:encoded>&lt;p&gt;Kimai is an open-source time tracking application. From version 2.32.0 to before version 2.56.0, users with the role System-Admin (ROLE_SYSTE_ADMIN) and the permission upload_invoice_template can upload PDF invoice templates, which can call pdfContext.setOption(&amp;#39;associated_files&amp;#39;, ...) inside the sandboxed Twig render. This is forwarded to mPDF&amp;#39;s SetAssociatedFiles(), whose writer calls file_get_contents($entry[&amp;#39;path&amp;#39;]) during PDF output and embeds the bytes as a FlateDecode stream in the PDF. Any file readable by the PHP worker is returned to the attacker inside the rendered invoice. This issue has been patched in version 2.56.0.&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/fkie_cve-2026-44298</guid>
    </item>
    <item>
      <title>GHSA-h5fh-7hwr-97mw — Kimai has an arbitrary file read in its invoice PDF renderer (admin)</title>
      <link>https://vulnerability.circl.lu/vuln/ghsa-h5fh-7hwr-97mw</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;Users with the role `System-Admin` (`ROLE_SYSTE_ADMIN`) and the permission `upload_invoice_template` can upload PDF invoice templates, which can call `pdfContext.setOption(&amp;#39;associated_files&amp;#39;, ...)` inside the sandboxed Twig render.&lt;/p&gt;
&lt;p&gt;This is forwarded to mPDF&amp;#39;s `SetAssociatedFiles()`, whose writer calls `file_get_contents($entry[&amp;#39;path&amp;#39;])` during PDF output and embeds the bytes as a FlateDecode stream in the PDF. Any file readable by the PHP worker is returned to the attacker inside the rendered invoice.&lt;/p&gt;
&lt;p&gt;## Root cause&lt;/p&gt;
&lt;p&gt;1. `src/Twig/SecurityPolicy/StrictPolicy.php:123-128` explicitly whitelists `PdfContext::setOption()`:
   ```php
   if ($obj instanceof PdfContext) {
       if ($lcm !== &amp;#39;setoption&amp;#39;) { throw ...; }
       return;
   }
   ```&lt;/p&gt;
&lt;p&gt;2. `src/Pdf/MPdfConverter.php` keeps `associated_files` in the pass-through allowlist:
   ```php
   $allowed = [&amp;#39;mode&amp;#39;,&amp;#39;format&amp;#39;,&amp;#39;default_font_size&amp;#39;,&amp;#39;default_font&amp;#39;, ... , &amp;#39;associated_files&amp;#39;,&amp;#39;additional_xmp_rdf&amp;#39;];
   ```
   and then forwards it to mPDF:
   ```php
   if (array_key_exists(&amp;#39;associated_files&amp;#39;, $options) &amp;amp;&amp;amp; is_array($options[&amp;#39;associated_files&amp;#39;])) {
       $associatedFiles = $options[&amp;#39;associated_files&amp;#39;];
       unset($options[&amp;#39;associated_files&amp;#39;]);
   }
   ...
   $mpdf-&amp;gt;SetAssociatedFiles($associatedFiles);
   ```&lt;/p&gt;
&lt;p&gt;3. mPDF 8.3.1 `MetadataWriter::writeAssociatedFiles()` calls `file_get_contents`, which respects PHP stream wrappers:
   ```php
   if (isset($file[&amp;#39;path&amp;#39;])) {
       $fileContent = @file_get_contents($file[&amp;#39;…&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;Users with the role `System-Admin` (`ROLE_SYSTE_ADMIN`) and the permission `upload_invoice_template` can upload PDF invoice templates, which can call `pdfContext.setOption(&amp;#39;associated_files&amp;#39;, ...)` inside the sandboxed Twig render.&lt;/p&gt;
&lt;p&gt;This is forwarded to mPDF&amp;#39;s `SetAssociatedFiles()`, whose writer calls `file_get_contents($entry[&amp;#39;path&amp;#39;])` during PDF output and embeds the bytes as a FlateDecode stream in the PDF. Any file readable by the PHP worker is returned to the attacker inside the rendered invoice.&lt;/p&gt;
&lt;p&gt;## Root cause&lt;/p&gt;
&lt;p&gt;1. `src/Twig/SecurityPolicy/StrictPolicy.php:123-128` explicitly whitelists `PdfContext::setOption()`:
   ```php
   if ($obj instanceof PdfContext) {
       if ($lcm !== &amp;#39;setoption&amp;#39;) { throw ...; }
       return;
   }
   ```&lt;/p&gt;
&lt;p&gt;2. `src/Pdf/MPdfConverter.php` keeps `associated_files` in the pass-through allowlist:
   ```php
   $allowed = [&amp;#39;mode&amp;#39;,&amp;#39;format&amp;#39;,&amp;#39;default_font_size&amp;#39;,&amp;#39;default_font&amp;#39;, ... , &amp;#39;associated_files&amp;#39;,&amp;#39;additional_xmp_rdf&amp;#39;];
   ```
   and then forwards it to mPDF:
   ```php
   if (array_key_exists(&amp;#39;associated_files&amp;#39;, $options) &amp;amp;&amp;amp; is_array($options[&amp;#39;associated_files&amp;#39;])) {
       $associatedFiles = $options[&amp;#39;associated_files&amp;#39;];
       unset($options[&amp;#39;associated_files&amp;#39;]);
   }
   ...
   $mpdf-&amp;gt;SetAssociatedFiles($associatedFiles);
   ```&lt;/p&gt;
&lt;p&gt;3. mPDF 8.3.1 `MetadataWriter::writeAssociatedFiles()` calls `file_get_contents`, which respects PHP stream wrappers:
   ```php
   if (isset($file[&amp;#39;path&amp;#39;])) {
       $fileContent = @file_get_contents($file[&amp;#39;…&lt;/p&gt;</content:encoded>
      <guid isPermaLink="false">https://vulnerability.circl.lu/vuln/ghsa-h5fh-7hwr-97mw</guid>
    </item>
  </channel>
</rss>
