Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

CSP violated-directive: script-src-elem #320

Open
oioix opened this issue Mar 10, 2024 · 0 comments
Open

CSP violated-directive: script-src-elem #320

oioix opened this issue Mar 10, 2024 · 0 comments
Assignees

Comments

@oioix
Copy link

oioix commented Mar 10, 2024

AddOns: consent_manager 4.2.0

Ähnlich wie das gestern beschriebene Problem in #319 nur, dass es dieses Mal um das injizierte Script geht, sobald die Zustimmung erteilt wurde/wird und vom consent_manager ein Script injiziert wird.

Wenn man CSP im Einsatz hat und in consent_manager einen Dienst verwendet, der nach dem Einverständnis ein Script lädt, bekommt man einen CSP-Verstoß.

Screenshot 2024-03-10 | 09 27 21

Das Problem
In der Datei consent_manager_box.php Zeile 98 findet sich nachfolgende Zeile
echo '<div style="display: none" class="consent_manager-script" data-uid="script-' . $uid . '" data-script="' . $script . '"></div>';
Diese Zeile wird nur geladen, wenn man einen Dienst mit Script aktiviert hat. Das div scheint leer zu sein, aber sobald ein consent erteilt ist, wird hier das Script injiziert:
Screenshot 2024-03-10 | 09 39 46

Genau diese nachträgliche Injizierung ist das Problem, welches den CSP-Verstoß darstellt.

Ich habe versucht im Dienst, wo man das Script hinterlegt, einen nonce einzubinden. Leider geht das aus drei Gründen nicht.

  1. php ist dort funktionslos. Man kann also keinen zentral generierten nonce per php (zum Beispiel mit: global $myNonce) einlesen welches man dann dem Script tag übergeben könnte (zum Beispiel mit: nonce="")
  2. selbst wenn php hier funktionieren würde und man einen nonce an das Script tag übergeben könnte, hätte es keinen Effekt, weil der consent_manager offenbar nur das Script selbst innerhalb des <script>DASSCRIPT</script> ausliest und deshalb ein nonce Attribut <script nonce="123">DASSCRIPT</script> gar nicht erst erkannt werden würde.
  3. Selbst wenn 1. und 2. gelöst wären, bliebe immer noch ein drittes Problem. Das Script wird base64 codiert im Cache gespeichert und dann von dort base64 codiert im div intelegt, um dann bei Bedarf vom frontend JS interpretiert und injiziert zu werden. Der nonce wäre daher nie aktuell und korrekt.

Lösung?
Einen nonce mitzugeben, würde nur gelingen, vorgenannten Punkte 1. bis 3. gelöst würden.

Ein ganz anderer vermutlich viel einfacherer Weg könnte sein, dass man das Script auf ganz anderem Weg aktiviert. Mein Vorschlag wäre, dass das benötigte Script immer geladen wird, aber noch nicht feuert, weil zuerst geprüft wird, ob ein bestimmtes Attribut vorhanden ist, welches benötigt wird, um das Script zu aktivieren. Anstatt also das Script zu injizieren, würde das Attribut in dem div injiziert werden (Beispiel data-script-firecode=""). Ist dies injiziert und damit vorhanden (Beispiel data-script-firecode="123XYZ") läuft das Script.

@aeberhard aeberhard self-assigned this Apr 17, 2024
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

2 participants