Średnia

Kimai has an arbitrary file read in its invoice PDF renderer (admin)

  • Ujawniono: 08.05.2026
  • Aktualizacja: 11.10.2026 10:22

Summary

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('associated_files', ...) inside the sandboxed Twig render.

This is forwarded to mPDF's SetAssociatedFiles(), whose writer calls file_get_contents($entry['path']) 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.

Root cause

  1. src/Twig/SecurityPolicy/StrictPolicy.php:123-128 explicitly whitelists PdfContext::setOption():

    php
    if ($obj instanceof PdfContext) {
        if ($lcm !== 'setoption') { throw ...; }
        return;
    }
  2. src/Pdf/MPdfConverter.php keeps associated_files in the pass-through allowlist:

    php
    $allowed = ['mode','format','default_font_size','default_font', ... , 'associated_files','additional_xmp_rdf'];

    and then forwards it to mPDF:

    php
    if (array_key_exists('associated_files', $options) && is_array($options['associated_files'])) {
        $associatedFiles = $options['associated_files'];
        unset($options['associated_files']);
    }
    ...
    $mpdf->SetAssociatedFiles($associatedFiles);
  3. mPDF 8.3.1 MetadataWriter::writeAssociatedFiles() calls file_get_contents, which respects PHP stream wrappers:

    php
    if (isset($file['path'])) {
        $fileContent = @file_get_contents($file['path']);
    }
    ...
    $filestream = gzcompress($fileContent);
    $this->writer->write('<</Type /EmbeddedFile');

The sandbox and the option allowlist were both written defensively (short whitelists, not blacklists), but neither side considered that associated_files is a PDF/A file-embedding feature whose path key is a sink.

Fix

The implemented fix has two aspects:

  1. The PdfContext now works with a strict allow-list, that excludes associated_files
  2. The MPdfConverter now removes any path from the $associatedFiles array, which can still be used by plugins:
php
        if (\count($associatedFiles) > 0) {
            // remove "path" so mPDF will not use file_get_contents() on local files
            // callers must pre-read and pass the bytes via "content"
            $associatedFiles = array_map(static function ($entry): array {
                if (!\is_array($entry)) {
                    return [];
                }

                if (\array_key_exists('path', $entry)) {
                    unset($entry['path']);
                }

                return $entry;
            }, $associatedFiles);
            $mpdf->SetAssociatedFiles($associatedFiles);
        }

Czego dotyczy

Kliknij technologię, aby zobaczyć wszystkie dotyczące jej podatności.

PlatformaPaczkaPodatne wersjePoprawka w wersji
Paczka Composer kimai/kimai >= 2.32.0, < 2.56 2.56

Odnośniki

Ocena CVSS 4.1/10
Wektor CVSS
CVSS:3.1/AV:N/AC:L/PR:H/UI:N/S:C/C:L/I:N/A:N
Słabość (CWE)
CWE-22
Platforma
Composer
Paczka
kimai/kimai
Ujawniono
08.05.2026
Aktualizacja
11.10.2026 10:22

Źródła i licencje

OSV / GitHub Advisory Database - GHSA-h5fh-7hwr-97mw - CC BY 4.0

Historia podatności: kimai/kimai

Wszystkie opisane podatności tej paczki (Paczka Composer), od najnowszej. Widać, czy to jednorazowa wpadka, czy paczka, której trzeba pilnować.

Wszystkie (33) w archiwum
Wszystkich wpisów
33
Pierwsza → ostatnia
02.2023 07.2026
Bez poprawki
1
Wykorzystywana w atakach
0

Rozkład istotności

  • Krytyczna 2
  • Wysoka 4
  • Średnia 20
  • Niska 7

Ujawnienia w latach

  1. 2023: 2
  2. 2024: 3
  3. 2025: 1
  4. 2026: 27
Istotność:
  1. Kimai has an arbitrary file read in its invoice PDF renderer (admin) ten wpis
    Średnia · 4.1 CVE-2026-44298 >= 2.32.0, < 2.56 2.56
  2. Wysoka · 9.8 CVE-2023-53957 <= 1.30.10 brak poprawki
  3. Wysoka · 6.5 ghsa-534c-hcr7-67jg < 2.21.0 2.21.0
  4. Krytyczna · 9.6 CVE-2020-19825 < 1.1 1.1

Dowiedz się, które podatności dotyczą Twojej aplikacji

Po podłączeniu integracji DockRay i włączeniu raportowania oprogramowania DockRay porównuje zgłoszone wersje komponentów ze znanymi podatnościami i powiadamia o potwierdzonych dopasowaniach. Zakres zależy od obsługiwanej technologii i dostępnych biuletynów.

Podłącz swoją aplikację
Newsletter DockRay

Bezpieczeństwo aplikacji w Twojej skrzynce

Najważniejsze podatności, konkretne zalecenia i praktyczne wskazówki dla Twoich aplikacji. Wybierz technologie i śledź to, co ma znaczenie dla Twojego projektu.

  • Codzienne zestawienie nowych podatności, także krytycznych.
  • Powiadomienia o ważnych aktualizacjach.
  • Praktyczne porady o bezpieczeństwie i monitoringu aplikacji.

Pozostaw puste, aby otrzymywać informacje o wszystkich technologiach.

Zapis jest bezpłatny. Wypiszesz się jednym kliknięciem w wiadomości.