Przejdź do głównej zawartości

Aktualizacje bezpieczeństwa zależności

Jak projekt utrzymuje alerty Dependabota na zero i co zrobić, gdy pojawi się nowy.

👤 Dla kogo

Dokument techniczny (dla developerów). Opisuje, gdzie mieszkają przypięcia wersji, jak podnieść zależność zgłoszoną przez Dependabota, jak zweryfikować zmianę przed pushem i które alerty są świadomie zostawione otwarte.

🗺️ Dwa manifesty

Repozytorium ma dwa niezależne drzewa zależności i Dependabot skanuje oba osobno:

ManifestMenedżerZakresMechanizm przypięcia
yarn.lockYarn 4aplikacja Next.js + workspace docsresolutions w package.json
docs/package-lock.jsonnpmtylko cd docs && npm start (Docusaurus)overrides w docs/package.json

docs jest jednocześnie workspace'em Yarna (buildy yarn docs:build idą przez yarn.lock) i ma własny lockfile npm dla lokalnego npm start. Poprawkę bezpieczeństwa w pakiecie tranzytywnym Docusaurusa trzeba więc nanieść w obu miejscach.

W katalogu głównym nie może powstać package-lock.json — pilnuje tego .gitignore. Lockfile dla docs regeneruj w kopii katalogu poza repo:

cp docs/package.json docs/package-lock.json /tmp/docsnpm/ && cd /tmp/docsnpm && npm install --package-lock-only

a wynik skopiuj z powrotem. Dzięki temu npm nie dotknie docs/node_modules, którym zarządza Yarn.

🔑 Klucze w resolutions

Yarn dopasowuje klucz do deskryptora, którego żąda pakiet nadrzędny, a nie do zainstalowanej wersji. Klucz bez zakresu ("postcss": "8.5.23") nadpisuje wszystkie wystąpienia; klucz z zakresem ("js-yaml@npm:^3.13.1": "3.15.1") tylko te pasujące. Zakresu używaj wszędzie tam, gdzie w drzewie żyje kilka głównych wersji naraz — inaczej konsument js-yaml@^3 dostanie wersję 4 i się wywali.

Deskryptor odczytasz z yarn why <pakiet>:

yarn why brace-expansion

Po podniesieniu resolucji zweryfikuj, że w lockfile nie została stara wersja — sam yarn install nie zgłasza, że klucz przestał do czegokolwiek pasować.

🧪 Weryfikacja przed pushem

Podniesienie wersji major wymaga sprawdzenia, czy konsument nadal działa. Dwa realne przypadki z historii projektu:

  • fast-xml-parser 4 → 5 — używa go bir1 (wyszukiwanie po NIP w GUS/REGON). API new XMLParser({ parseTagValue: false }).parse() przeżyło majora, ale sprawdzone to zostało dopiero skryptem parsującym przykładową odpowiedź SOAP.
  • tar 6 → 7@capacitor/cli woła tar.default.extract(...), a build CJS wersji 7 nie eksportuje default. Podniesienie wywala cap sync ios na etapie rozpakowania szablonu.

Wniosek: przy majorze znajdź miejsce wywołania (grep po node_modules/<konsument>) i odpal je na sucho, zanim uznasz zmianę za bezpieczną.

Pełny zestaw sprawdzeń CI uruchamiasz lokalnie:

yarn ci:local && yarn ci:local worker

Po podniesieniu pdfjs-dist dodatkowo skasuj public/pdf/.version i odpal node scripts/copy-pdf-worker.mjs — pliki runtime pdf.js są kopiowane, nie commitowane, a stempel wersji blokuje ponowną kopię.

🚧 Alerty świadomie otwarte

PakietPrzez kogoDlaczego zostaje
image-size@docusaurus/mdx-loaderBrak poprawki u dostawcy. DoS przy parsowaniu spreparowanego obrazka — dotyczy wyłącznie buildu dokumentacji z naszych plików.
tar 6.2.1@capacitor/cli 8.0.0Poprawka istnieje tylko w linii 7.x, a ta psuje CLI (patrz wyżej). Rozpakowywane są szablony zaszyte w samym pakiecie, nie dane z zewnątrz. Właściwe rozwiązanie to podniesienie całego zestawu @capacitor/* do 8.5.x — zmienia natywny projekt SPM, więc idzie osobno, razem z wydaniem iOS.

Oba zestawy dotyczą narzędzi deweloperskich i nie trafiają do bundle'a workerów.