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:
| Manifest | Menedżer | Zakres | Mechanizm przypięcia |
|---|---|---|---|
yarn.lock | Yarn 4 | aplikacja Next.js + workspace docs | resolutions w package.json |
docs/package-lock.json | npm | tylko 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-parser4 → 5 — używa gobir1(wyszukiwanie po NIP w GUS/REGON). APInew XMLParser({ parseTagValue: false }).parse()przeżyło majora, ale sprawdzone to zostało dopiero skryptem parsującym przykładową odpowiedź SOAP.tar6 → 7 —@capacitor/cliwołatar.default.extract(...), a build CJS wersji 7 nie eksportujedefault. Podniesienie wywalacap sync iosna 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
| Pakiet | Przez kogo | Dlaczego zostaje |
|---|---|---|
image-size | @docusaurus/mdx-loader | Brak 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.0 | Poprawka 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.