Puncte:1

Este o abordare validă să aveți un CSP diferit bazat pe starea de conectare și browser?

drapel bd

În prezent lucrez la îmbunătățirea securității unui site Drupal 8 prin implementarea unei politici de securitate a conținutului. Deoarece acest lucru este încă nou pentru mine, aș dori să primesc câteva informații despre strategia mea.

Configurare de bază relevantă

  • Drupal 8, cu un patch personalizat care face ckeditor.js transmiteți non-urile la încărcarea pluginurilor sale, CKEditor fiind folosit doar de utilizatorii autentificați
  • Kit de securitate, corecţionat pentru a oferi un cârlig de modificare pentru directivele CSP (https://www.drupal.org/project/seckit/issues/2844205#comment-14217383).
  • Cod personalizat pentru a face modificări HTML-ului redat și configurației CSP din modulul Security Kit

Considerații preliminare

As dori sa nu folosesc „nesigur în linie” pentru scripturi, dacă este posibil, dar în cele din urmă m-am gândit că acest lucru ar funcționa numai pentru anumite browsere. De asemenea, aș dori să am un CSP adecvat pentru diferite situații (diferite browsere, autentificat vs neconectat).

Asta mă duce la această idee pt script-src:

  • folosind nonce și „strict-dinamic” pentru browsere care acceptă CSP v3 și pagini necachabile
  • utilizarea hash-urilor pentru browsere care acceptă CSP v3 și pagini care se pot stoca în cache
  • folosind „nesigur în linie” împreună cu o listă bazată pe domenii pentru toate celelalte browsere

Motivul principal pentru a avea o distincție de browser este că nu am putut găsi o modalitate de a crea directivele CSP compatibile cu versiunea inversă fără o cantitate nerezonabilă de modificări la modulele de bază și contrib.

Ce am făcut până acum pe site-ul meu local de testare

Am adăugat o logică care folosește a nonce și „strict-dinamic” pentru browserele bazate pe Chrome pentru utilizatorii autentificați, pentru care paginile nu sunt stocate în cache, asigurându-se că nonces-urile sunt noi și unice pentru fiecare solicitare. Această logică se bazează pe șirul User Agent (care știu că este nesigur, dar nu văd o soluție mai bună).

Deci, practic, pentru browserul bazat pe Chrome, utilizatorii conectați vor primi un antet CSP cu acele politici CSP legate de script („nesigur în linie” în script-src va fi ignorat de browserele care acceptă „strict-dinamic”):

script-src 'self' 'unsafe-inline' *.googletagmanager.com *.google-analytics.com 'nonce-SECURENONCE' 'strict-dynamic';
script-src-attr 'unsafe-inline';

Utilizatorii anonimi vor primi un CSP care arată aproximativ astfel:

script-src 'self' 'unsafe-inline' *.googletagmanager.com *.google-analytics.com 'sha256-HASH_1' 'sha256-HASH_2' 'sha256-HASH_3' 'sha256-HASH_4' 'sha256-HASH_5' .. .;
script-src-attr 'unsafe-inline';

Browserele care nu sunt bazate pe Chrome primesc un antet CSP care arată astfel:

script-src 'self' 'unsafe-inline' *.google-analytics.com *.googletagmanager.com;

Am adăugat și logică, care, pe baza criteriilor de selecție de mai sus, adaugă fie nonce atribute fiecărei etichete de script (pagini fără cache) sau coduri hash pentru fiecare etichetă de script (pagini stocate în cache). Acest lucru îmi permite, de asemenea, să am CKEditor să funcționeze bine în backend.

Se pare că funcționează bine pe diferitele browsere cu care am testat: Brave, Chrome, Edge, Firefox și Safari. Doar cei trei primii au un CSP pe care l-aș considera sigur (verificat și cu https://csp-evaluator.withgoogle.com/).

Este o abordare validă să ai:

  1. CSP-uri diferite pentru utilizatorii autentificați vs utilizatori anonimi?
  2. CSP-uri diferite pentru browsere diferite (sau diferite „browsere raportate” de fapt)?
drapel cn
Se pare că întrebările tale principale s-ar aplica oricărui site web, mai degrabă decât unuia Drupal în special? Scuze dacă greșesc acolo. Dacă ar face-o, totuși, acest lucru ar putea fi mai potrivit pentru (și, mai important, pentru a obține răspunsuri mai bune despre) Stack Overflow
berliner avatar
drapel bd
@Clive S-ar putea să ai dreptate. Speram totuși că CSP-urile ar putea fi un subiect pentru oamenii Drupal în general și, de asemenea, speram că cineva ar putea confirma sau contesta abordarea mea în contextul specific Drupal.
Puncte:3
drapel th
  1. A te baza pe user agent nu este de încredere - de exemplu, am schimbat user agent în vechiul meu browser, altfel YouTube refuză să funcționeze. Dacă, pe baza rezultatelor analizei rapoartelor de încălcare, modificați CSP-ul agentului meu de utilizare, utilizatorii legitimi ai acestui browser pot avea de suferit.

  2. Folosirea de script-src-attr 'unsafe-inline'; va deschide ușa pentru XSS în browserele bazate pe Chromium, deoarece permite gestionarea evenimentelor în etichete (cum ar fi onckick="alert('XSS')").

  3. Folosirea de „sha256-HASH” este nu sprijinit pentru extern scripturi în Safari/Firefox. Dacă îl folosiți pentru inline <script> numai etichete, este mai ușor de utilizat „valoare hash” atât pentru utilizatorii conectați, cât și pentru utilizatorii nelogați (și nu pentru a utiliza „nunce”).
    Puteți folosi mix 'niciodată-' și 'sha256-' dar în cazul XSS 'niciodată-' poate fi reutilizat în paginile încasate prin browser (acest lucru este dificil și puțin probabil).

Pe scurt, puteți utiliza CSP în modul de compatibilitate inversă a browserelor:

script-src 'self' 'strict-dynamic' *.googletagmanager.com *.google-analytics.com
  'sha256-HASH_1' 'sha256-HASH_2' ...;

sau

script-src 'self' 'strict-dynamic' *.googletagmanager.com *.google-analytics.com 'nonce-SECURENONCE';
  • Acceptă Chrome/Edge/Firefox „strict-dinamic” (care anulează orice sursă bazată pe gazdă), prin urmare CSP-ul real va fi script-src 'strict-dynamic' 'sha256-HASH_1' 'sha256-HASH_2' ...; sau script-src 'strict-dynamic' 'nonce-SECURENONCE'; respectiv.

  • Safari nu acceptă „strict-dinamic”, prin urmare CSP real va fi script-src 'self' *.googletagmanager.com *.google-analytics.com 'sha256-HASH_1' 'sha256-HASH_2' ...; sau script-src 'self' *.googletagmanager.com *.google-analytics.com 'nonce-SECURENONCE'; respectiv.

  • nu trebuie să utilizați „nesigur în linie” deloc pentru că este anulat de „nu-valoare” sau „valoare hash” oricum. Deocamdată nu există browsere care să nu accepte „nu-valoare” / „valoare hash”.

CSP-ul de mai sus nu permite un handler de evenimente inline în etichete, dar:

  1. CKEditor-5 face nu cere „nesigur în linie” și poate fi permis cu nonce/hash. The „nesigur în linie” este necesar doar pentru CKEditor-4.

  2. Google Analytics nu necesită „nesigur în linie” și poate fi permis cu nonce/hash.

  3. Managerul de etichete Google în sine nu necesită „nesigur în linie” și poate fi permis cu nonce/hash. The „nesigur în linie” pentru GTM este necesar numai dacă utilizați scripturi personalizate în linie în „Etichete HTML personalizate”.
    Folosind un „nu-valoare” poate fi preferat deoarece dacă scriptul GTM este inserat cu nonce= atribut, va fi redistribuit către toate scripturile inserate de Managerul de etichete, cu excepția „Etichete HTML personalizate”.

  4. Dacă utilizați handlere de evenimente inline în etichete - an „nesigur în linie” este obligatoriu asa ca uita „noces”, "hashes" și „strict-dinamic” jetoane. De când an „hash-uri nesigure” nu este acceptat de Safari, nu aveți cum să permiteți în siguranță gestionarea evenimentelor inline în etichete.

berliner avatar
drapel bd
Mulțumesc pentru acest răspuns amplu. Am însă îndoieli cu privire la următorii pași. Ideea mea a fost să ofer un maxim de securitate pentru browserele moderne și să nu iau bara de jos doar pentru că browserele mai puțin moderne nu o acceptă. Safari, de exemplu, înțelege nonces, dar nu înțelege `strict-dynamic`, ceea ce face imposibil (în contextul Drupal) să existe un backend funcțional. Pe de altă parte, hashe-urile nu permit „moștenirea” CSP, așa cum fac nonces-urile cu `strict-dynamic` (afaik). Și în Drupal, care vine încă la pachet cu CKEditor 4, sincer nu văd o modalitate de a ocoli „unsafe-inline”.
berliner avatar
drapel bd
Deci, este în mod inerent rău să furnizați reguli CSP diferite bazate pe agentul utilizator, chiar dacă nu este de încredere? Din înțelegerea mea, regulile CSP cu bară scăzută s-ar aplica întotdeauna ca bază de referință, dar agenții utilizatori care raportează ca fiind moderni ar primi reguli mai sigure. Nu văd cum ar crea asta o problemă.

Postează un răspuns

Majoritatea oamenilor nu înțeleg că a pune multe întrebări deblochează învățarea și îmbunătățește legătura interpersonală. În studiile lui Alison, de exemplu, deși oamenii își puteau aminti cu exactitate câte întrebări au fost puse în conversațiile lor, ei nu au intuit legătura dintre întrebări și apreciere. În patru studii, în care participanții au fost implicați în conversații ei înșiși sau au citit transcrieri ale conversațiilor altora, oamenii au avut tendința să nu realizeze că întrebarea ar influența – sau ar fi influențat – nivelul de prietenie dintre conversatori.