Niska

ApostropheCMS: Brak uwierzytelnienia w trasie `cleanExport`

  • Ujawniono: 21.10.2026
  • Aktualizacja: 21.10.2026 20:24

1. Podsumowanie

Punkt końcowy API POST /api/v1/@apostrophecms/import-export/clean-export w @apostrophecms/import-export nie posiada weryfikacji uwierzytelnienia ani autoryzacji. Dowolny klient — w tym nieuwierzytelnieni anonimowi użytkownicy, którzy uzyskali standardowy plik cookie CSRF po odwiedzeniu witryny — może bezpośrednio wywołać tę trasę i uruchomić bazową metodę self.cleanExport(req).


2. Pliki i punkty końcowe, których dotyczy problem

  • Punkt końcowy: POST /api/v1/@apostrophecms/import-export/clean-export
  • Definicja trasy: packages/import-export/lib/apiRoutes.js (linie 32–34)
  • Implementacja metody: packages/import-export/lib/methods/import.js (linie 1271–1324)

3. Analiza przyczyny źródłowej

W packages/import-export/lib/apiRoutes.js procedura obsługi get.related jawnie weryfikuje, czy wywołujący jest zalogowany:

js
get: {
  async related(req) {
    if (!req.user) {
      throw self.apos.error('forbidden');
    }
    // ...
  }
}

W przeciwieństwie do tego, post.cleanExport (jak również post.overrideDuplicates) nie zawiera żadnej weryfikacji req.user:

js
post: {
  async overrideDuplicates(req) {
    return self.overrideDuplicates(req);
  },

  async cleanExport(req) {
    return self.cleanExport(req); // <-- No authentication check
  }
}

Ponieważ ApostropheCMS nie wymusza uwierzytelnienia globalnie na wszystkich apiRoutes, pominięcie jawnego zabezpieczenia if (!req.user) pozwala anonimowym żądaniom przejść bezpośrednio do warstwy logiki biznesowej.


4. Dowód podatności

Podczas wysyłania nieuwierzytelnionego żądania POST ze standardowym plikiem cookie CSRF witryny (wydawanym każdemu odwiedzającemu na GET /), żądanie całkowicie omija kontrolę dostępu i wykonuje self.cleanExport(req), na co wskazuje ślad stosu serwera:

at Object.cleanExport (.../packages/import-export/lib/methods/import.js)
at .../packages/apostrophe/modules/@apostrophecms/module/index.js:193:30

Potwierdza to, że wykonanie bezpośrednio dociera do głównego modułu importu/eksportu bez uwierzytelnionej sesji.


5. Wpływ

  1. Naruszenie kontroli dostępu: Nieuwierzytelnieni użytkownicy mogą wywoływać operacje czyszczenia oraz usuwać tymczasowe pliki i artefakty eksportu przechowywane na serwerze.
  2. Nieautoryzowana zmiana stanu: Punkt końcowy umożliwia modyfikację rekordów zadań w bazie danych za pośrednictwem req.body.jobId (wymuszając ich stan na ended: true, status: 'completed') oraz odrzucanie powiadomień przez req.body.notificationId bez weryfikacji, czy zasoby należą do wnioskującego użytkownika.

6. Sugerowane rozwiązanie (łatka)

Wymuś sprawdzanie uwierzytelnienia w packages/import-export/lib/apiRoutes.js przed wykonaniem bazowych metod:

diff
--- a/packages/import-export/lib/apiRoutes.js
+++ b/packages/import-export/lib/apiRoutes.js
@@ -26,10 +26,16 @@ module.exports = self => {
     get: { ... },
     post: {
       async overrideDuplicates(req) {
+        if (!req.user) {
+          throw self.apos.error('forbidden');
+        }
         return self.overrideDuplicates(req);
       },
 
       async cleanExport(req) {
+        if (!req.user) {
+          throw self.apos.error('forbidden');
+        }
         return self.cleanExport(req);
       }
     }

Co trzeba zrobić

Zaktualizuj pakiet @apostrophecms/import-export do wersji 3.7.1 lub nowszej. Alternatywnie wdróż sprawdzanie uwierzytelnienia w packages/import-export/lib/apiRoutes.js przed wykonaniem bazowych metod.

Czego dotyczy

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

PlatformaPaczkaPodatne wersjePoprawka w wersji
Paczka npm @apostrophecms/import-export < 3.7.1 3.7.1

Odnośniki

Ocena CVSS 3.1/10
Wektor CVSS
CVSS:3.1/AV:N/AC:H/PR:L/UI:N/S:U/C:N/I:L/A:N
Słabość (CWE)
CWE-306, CWE-862
Platforma
npm
Paczka
@apostrophecms/import-export
Ujawniono
21.10.2026
Aktualizacja
21.10.2026 20:24

Źródła i licencje · Redakcja lub tłumaczenie: DockRay. Zachowano prawa źródeł i obowiązujące licencje.

OSV / GitHub Advisory Database - GHSA-rw26-wwfc-9wvm - CC BY 4.0

Historia podatności: @apostrophecms/import-export

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

Wszystkie (9) w archiwum
Wszystkich wpisów
9
Pierwsza → ostatnia
03.2026 10.2026
Bez poprawki
0
Wykorzystywana w atakach
0

Rozkład istotności

  • Krytyczna 1
  • Wysoka 1
  • Średnia 6
  • Niska 1

Ujawnienia w latach

  1. 2026: 9
Istotność:
  1. ApostropheCMS: Brak uwierzytelnienia w trasie `cleanExport` ten wpis
    Niska · 3.1 CVE-2026-113648 < 3.7.1 3.7.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.