CPAN Security Group opublikował 8 września 2026 serię advisory dla Perl HTML::FormHandler. Ciąg jest pouczający: CVE-2026-19872 (submitted values trafiają do error message renderowanego jako aktywny HTML/JS) naprawiono w 0.410000; potem CVE-2026-85485 pokazało, że Table layout oraz Bootstrap 2 i 3 wrappers nadal wstawiają error strings bez escaping — fix rozszerzono w 0.410002 (razem z CVE-2026-85484 i 85630).
process_attrs).Patch completeness, nie correctness
Nie ma dowodu, że kod naprawiony w 0.410000 nadal był podatny. Raczej: variant A fixed / variant B/C/D missed. To typowy failure mode variant analysis. „Incomplete fix” jest trafne operacyjnie, ale precyzyjnie: poprzedni patch nie objął wszystkich równoważnych rendering paths — nie „patch w ogóle nie działał”.
Stored vs reflected to nie najważniejsze rozróżnienie
Źródłem untrusted data nie musi być request parameter — może być rekord DB, labelka z dynamicznej listy, wcześniej zapisany value. Prawdziwe pytanie: can attacker influence rendered string? VM/SAST powinny modelować data flow, nie tylko endpoint. A escaping musi być context-specific: bezpieczne w <div>TEXT</div> niekoniecznie jest bezpieczne w value="ATTRIBUTE". Variant analysis szuka wszystkich attacker-influenced values docierających do: element content, attribute, URL, JS.
Patch churn i lineage
Zespół wdraża 0.410000, zamyka finding, a nazajutrz CVE-85485 przywraca ten sam komponent jako affected < 0.410002. Warto zachować lineage (0.409999 → 0.410000 partial → 0.410002 broader) — nie by obwiniać maintainera, lecz by wiedzieć, że security property była ponownie oceniona. Świeżo wdrożone 0.410000 to nie „30 dni na patch”, lecz REOPEN / SUPERSEDED REMEDIATION.
Configuration-aware VEX
Nie każda aplikacja jest exploitable: własna warstwa template z poprawnym escaping, brak Bootstrap wrapper, brak dynamic labels z DB. VEX może rozróżniać not_affected / vulnerable_rendering_path_not_used (layout: CustomEscapingLayout) od affected (layout: Bootstrap3). Weryfikacja po 0.410002: test regresyjny na wszystkich rendererach (Table, Bootstrap 2/3, Select/RadioGroup labels, attribute rendering) — oczekiwany wynik: literal encoded text, nie executable markup.
Wniosek
CVE-2026-19872 → 85485 pokazuje praktyczną prawdę: naprawienie reproduktora nie jest tym samym co naprawienie klasy błędu. Pierwsze daje patch, drugie — confidence. I właśnie to drugie jest domeną Vulnerability Engineering.
Powiązane na blogu
- PostgreSQL Anonymizer: patch lineage — seria CVE tej samej klasy
- SVG sanitizer: variant analysis — pełne pokrycie klasy błędu
Źródła
- CPAN Security Group / oss-security — CVE-2026-19872 (08.09.2026) — seclists.org
- CPAN Security Group / oss-security — CVE-2026-85485 (08.09.2026) — seclists.org
- HTML::FormHandler 0.410002 — metacpan.org
Nota redakcyjna: stan informacji 9 września 2026. CVE-2026-19872 (HTML::FormHandler, XSS error rendering, fix 0.410000) okazał się niepełny — CVE-2026-85485 domyka Table + Bootstrap 2/3 w 0.410002 (z 85484/85630). Artykuł koncentruje się na patch completeness i variant analysis wszystkich sinków.