Skip to content

Commit d96c8b6

Browse files
committed
Merge branch 'feature/PB-39183_52-Publish-production-API' into 'master'
PB-39183 Merge release into master (v4.11.1) See merge request passbolt/passbolt-ce-api!337
2 parents bcaf0ad + 9b18cc6 commit d96c8b6

30 files changed

+492
-253
lines changed

CHANGELOG.md

+8
Original file line numberDiff line numberDiff line change
@@ -2,6 +2,14 @@
22
All notable changes to this project will be documented in this file.
33
This project adheres to [Semantic Versioning](http://semver.org/).
44

5+
## [4.11.1] - 2025-02-17
6+
### Security
7+
- PB-39045 Fix empty fullBaseUrl leading to Host header injection attack
8+
9+
## [4.11.1-test.1] - 2025-02-14
10+
### Security
11+
- PB-39045 Fix empty fullBaseUrl leading to Host header injection attack
12+
513
## [4.11.0] - 2025-01-30
614
### Added
715
- PB-35761 As an administrator I receive an email if zero_knowledge_key_share is set to true and a new user completed the setup

RELEASE_NOTES.md

+5-49
Original file line numberDiff line numberDiff line change
@@ -1,53 +1,9 @@
1-
Release song: https://www.youtube.com/watch?v=3RmQTYLD398
1+
Release song: https://youtu.be/U16Xg_rQZkA?si=cVcmovGWluuo8oYj
22

3-
Passbolt v4.11.0 introduces beta support for encrypted metadata in the administration settings, laying groundwork for the upcoming v5 release and its new resource format. This beta feature allows developers and integrators to explore and adapt their systems ahead of the transition.
3+
Passbolt is pleased to announce the immediate availability of version v4.11.1. This version is a targeted security release of the API focusing on fixing the security issue reported by a security researcher.
44

5-
This release also resolves a security issue where an attacker could modify the Passbolt URL in certain emails if an administrator’s configuration was invalid. Additionally, role-based access control is now enforced for the “Copy to Clipboard” feature in the browser extension. Vulnerabilities in dependencies—though not directly impacting Passbolt—have been addressed as well.
6-
7-
As one of the final updates in the v4 series, this version prepares administrators for v5. While v4.11.0 does not require PHP 8.2, v5 will. We recommend beginning to plan or upgrade PHP to ensure a smooth transition. If a server migration is needed, please consult the online documentation.
8-
9-
Thank you to the community for your feedback and support.
10-
11-
## [4.11.0] - 2025-01-30
12-
### Added
13-
- PB-35761 As an administrator I receive an email if zero_knowledge_key_share is set to true and a new user completed the setup
14-
- PB-36558 As an administrator I can mark metadata_keys as expired
15-
- PB-35986 As an administrator I can share missing metadata private keys for users that needs them
16-
- PB-35925 As an administrator I can see if users are missing access to metadata keys
17-
- PB-37069 As an administration I can run a command to share metadata private keys with users that need them
18-
- PB-37068 As a user I can see if I am missing metadata keys
19-
- PB-36600 As an administrator I should be notified when an administrator expires a metadata key
20-
- PB-35418 As an administrator I should receive an email notification when a metadata key is deleted
21-
- PB-37361 As an administrator I can rotate metadata keys encrypting resources metadata
22-
- PB-37697 As an administrator I can upgrade resources to v5 format
23-
- PB-35927 As an administrator I can define an allow_v4_v5_upgrade metadata type settings
24-
- PB-35923 As an administrator I cannot add a new metadata key if there is only 2 that are active
25-
- PB-34463 As an administrator I cannot reuse metadata keys as the account recovery key
26-
- PB-35929 Update edit resource to support allow_v4_v5_upgrade settings
27-
- PB-35932 Update edit folders to support allow_v4_v5_upgrade settings
28-
29-
### Fixed
30-
- PB-37719 Fix resource types index controller should not return deleted resource types per default
31-
- PB-36925 Cast configure usage to avoid fatal type error on missing fullBaseUrl
32-
- PB-36576 Fix as a user I cannot create or edit a tag with an expired or deleted metadata key
33-
- PB-37097 Fix prevent to use v5 resource_type_ids if v5 flag is off
34-
- PB-36930 Fix some email sentences not translated and markers errors in translation
35-
- PB-37096 Fix healthcheck relying on symfony/process should fail gracefully in case of process run exception (GITHUB #531)
36-
- PB-36989 Fix namespace composer warnings
37-
- PB-37343 Fixes postgres dump by adding PGPASSWORD env since .pgpass is not generated on the passbolt installation
38-
- PB-38026 As an administrator running the cleanup command I should not see issues on soft deleted groups
39-
- PB-38261 Fix always failing IsNotAccountRecoveryFingerprintRule for metadata keys
40-
- PB-38262 Fix always failing metadata key creation when zero-knowledge is disabled, and no metadata keys are present
5+
We would like to express our appreciation to the community for their assistance in making Passbolt more secure. Further details can be found in [the incident report](https://www.passbolt.com/incidents/host-header-injection-vulnerability).
416

7+
## [4.11.1] - 2025-02-17
428
### Security
43-
- PB-37974 Upgrade CakePHP to v4.5.9
44-
- PB-38166 Passbolt app router should not fall back on Host header if full-base url is not set
45-
46-
### Maintenance
47-
- PB-35785 Upgrade psalm/phpstan to latest version as applicable
48-
- PB-35119 Fix tests failing when full base url is not-https
49-
- PB-37000 Fix bug of wrong relation for Rbacs to Log.Actions.
50-
- PB-37072 Fix LatestVersionApplicationHealthcheck test failing due to github not reachable
51-
- PB-37071 Fix PHPUnit 10 deprecations
52-
- PB-36237 Fix frequently failing TOTP setup/verify tests
53-
- PB-38184 Fix synk vulnerability for nesbot/carbon PHP Remote File Inclusion
9+
- PB-39045 Fix empty fullBaseUrl leading to Host header injection attack

config/bootstrap.php

+2
Original file line numberDiff line numberDiff line change
@@ -154,6 +154,8 @@
154154
* This URL is used as the base of all absolute links.
155155
*/
156156
$fullBaseUrl = Configure::read('App.fullBaseUrl');
157+
// Store original full base url from config before it's been modified
158+
Configure::write('passbolt.originalFullBaseUrl', $fullBaseUrl);
157159
if (!$fullBaseUrl) {
158160
/*
159161
* When using proxies or load balancers, SSL/TLS connections might

config/default.php

+5-1
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,8 @@
4040
// Edition.
4141
'edition' => 'ce',
4242
'featurePluginAdder' => \App\BaseSolutionBootstrapper::class,
43+
// set in bootstrap.php
44+
'originalFullBaseUrl' => '',
4345
'v5' => [
4446
'enabled' => filter_var(env('PASSBOLT_V5_ENABLED', false), FILTER_VALIDATE_BOOLEAN),
4547
],
@@ -328,7 +330,9 @@
328330
'secure' => filter_var(env('PASSBOLT_SECURITY_COOKIE_SECURE', true), FILTER_VALIDATE_BOOLEAN)
329331
],
330332
'setHeaders' => filter_var(env('PASSBOLT_SECURITY_SET_HEADERS', true), FILTER_VALIDATE_BOOLEAN),
331-
'preventHostHeaderFallback' => filter_var(env('PASSBOLT_SECURITY_PREVENT_HOST_HEADER_FALLBACK', false), FILTER_VALIDATE_BOOLEAN),
333+
// By default, false (unsafe) for BC, will be true in v5.0
334+
'fullBaseUrlEnforce' => filter_var(env('PASSBOLT_SECURITY_FULLBASEURL_ENFORCE', false), FILTER_VALIDATE_BOOLEAN),
335+
'emptyFullBaseUrlWarn' => filter_var(env('PASSBOLT_SECURITY_EMPTY_FULLBASEURL_WARN', true), FILTER_VALIDATE_BOOLEAN),
332336
'csrfProtection' => [
333337
'active' => true,
334338
'unlockedActions' => [

config/version.php

+2-2
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
<?php
22
return [
33
'passbolt' => [
4-
'version' => '4.11.0',
5-
'name' => 'Fortunate Son',
4+
'version' => '4.11.1',
5+
'name' => 'Rebel Rebel',
66
],
77
'php' => [
88
'minVersion' => '7.4',

resources/locales/de_DE/default.po

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
msgid ""
22
msgstr ""
33
"Project-Id-Version: 41c2572bd9bd4cc908d3e09e0cbed6e5\n"
4-
"POT-Creation-Date: 2025-01-29 05:51+0000\n"
5-
"PO-Revision-Date: 2025-01-29 07:23\n"
4+
"POT-Creation-Date: 2025-02-14 07:10+0000\n"
5+
"PO-Revision-Date: 2025-02-14 10:59\n"
66
"Last-Translator: NAME <EMAIL@ADDRESS>\n"
77
"Language-Team: German\n"
88
"MIME-Version: 1.0\n"
@@ -391,6 +391,9 @@ msgstr "Benutzer existiert nicht."
391391
msgid "No admin were found in the database."
392392
msgstr "Es wurde kein Administrator in der Datenbank gefunden."
393393

394+
msgid "The `{0}` configuration must be a valid non-empty string."
395+
msgstr ""
396+
394397
msgid "Invalid expiry time {0}."
395398
msgstr "Ungültige Gültigkeitsdauer {0}."
396399

@@ -1102,6 +1105,9 @@ msgstr "{0} hat das Passwort {1} gelöscht"
11021105
msgid "You edited a resource"
11031106
msgstr ""
11041107

1108+
msgid "{0} edited a resource"
1109+
msgstr ""
1110+
11051111
msgid "You edited the resource {0}"
11061112
msgstr ""
11071113

@@ -1495,12 +1501,15 @@ msgstr "Bearbeite security.salt in {0}"
14951501
msgid "App.fullBaseUrl validation OK."
14961502
msgstr "App.fullBaseUrl Validierung OK."
14971503

1498-
msgid "App.fullBaseUrl does not validate. {0}."
1499-
msgstr "App.fullBaseUrl ist nicht gültig. {0}."
1504+
msgid "App.fullBaseUrl does not validate. A valid URL/IP is accepted, but found \"{0}\"."
1505+
msgstr ""
15001506

15011507
msgid "Select a valid domain name as defined by section 2.3.1 of http://www.ietf.org/rfc/rfc1035.txt"
15021508
msgstr "Wählen Sie einen gültigen Domänennamen gemäß Abschnitt 2.3.1 von http://www.ietf.org/rfc/rfc1035.txt"
15031509

1510+
msgid "IMPORTANT: Using an empty App.fullBaseUrl can lead to host header injection attack: https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection"
1511+
msgstr ""
1512+
15041513
msgid "The application is able to connect to the database"
15051514
msgstr "Die Anwendung kann sich mit der Datenbank verbinden"
15061515

resources/locales/en_UK/default.po

+11-2
Original file line numberDiff line numberDiff line change
@@ -5,7 +5,7 @@
55
msgid ""
66
msgstr ""
77
"Project-Id-Version: PROJECT VERSION\n"
8-
"POT-Creation-Date: 2025-01-29 05:51+0000\n"
8+
"POT-Creation-Date: 2025-02-14 07:10+0000\n"
99
"PO-Revision-Date: YYYY-mm-DD HH:MM+ZZZZ\n"
1010
"Last-Translator: NAME <EMAIL@ADDRESS>\n"
1111
"Language-Team: LANGUAGE <EMAIL@ADDRESS>\n"
@@ -389,6 +389,9 @@ msgstr ""
389389
msgid "No admin were found in the database."
390390
msgstr ""
391391

392+
msgid "The `{0}` configuration must be a valid non-empty string."
393+
msgstr ""
394+
392395
msgid "Invalid expiry time {0}."
393396
msgstr ""
394397

@@ -1100,6 +1103,9 @@ msgstr ""
11001103
msgid "You edited a resource"
11011104
msgstr ""
11021105

1106+
msgid "{0} edited a resource"
1107+
msgstr ""
1108+
11031109
msgid "You edited the resource {0}"
11041110
msgstr ""
11051111

@@ -1493,12 +1499,15 @@ msgstr ""
14931499
msgid "App.fullBaseUrl validation OK."
14941500
msgstr ""
14951501

1496-
msgid "App.fullBaseUrl does not validate. {0}."
1502+
msgid "App.fullBaseUrl does not validate. A valid URL/IP is accepted, but found \"{0}\"."
14971503
msgstr ""
14981504

14991505
msgid "Select a valid domain name as defined by section 2.3.1 of http://www.ietf.org/rfc/rfc1035.txt"
15001506
msgstr ""
15011507

1508+
msgid "IMPORTANT: Using an empty App.fullBaseUrl can lead to host header injection attack: https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection"
1509+
msgstr ""
1510+
15021511
msgid "The application is able to connect to the database"
15031512
msgstr ""
15041513

resources/locales/es_ES/cake.po

+2-2
Original file line numberDiff line numberDiff line change
@@ -2,7 +2,7 @@ msgid ""
22
msgstr ""
33
"Project-Id-Version: 41c2572bd9bd4cc908d3e09e0cbed6e5\n"
44
"POT-Creation-Date: 2020-11-11 13:56+0100\n"
5-
"PO-Revision-Date: 2024-02-01 11:19\n"
5+
"PO-Revision-Date: 2025-02-14 10:59\n"
66
"Last-Translator: NAME <EMAIL@ADDRESS>\n"
77
"Language-Team: Spanish\n"
88
"MIME-Version: 1.0\n"
@@ -31,7 +31,7 @@ msgstr "Ha ocurrido un error interno"
3131

3232
#: Controller/Component/AuthComponent.php:462
3333
msgid "You are not authorized to access that location."
34-
msgstr "No estás autorizado a acceder a esa ubicación."
34+
msgstr "No está autorizado a acceder a esa ubicación."
3535

3636
#: Error/ExceptionRenderer.php:304
3737
msgid "Not Found"

resources/locales/es_ES/default.po

+13-4
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
msgid ""
22
msgstr ""
33
"Project-Id-Version: 41c2572bd9bd4cc908d3e09e0cbed6e5\n"
4-
"POT-Creation-Date: 2025-01-29 05:51+0000\n"
5-
"PO-Revision-Date: 2025-01-29 11:23\n"
4+
"POT-Creation-Date: 2025-02-14 07:10+0000\n"
5+
"PO-Revision-Date: 2025-02-14 10:59\n"
66
"Last-Translator: NAME <EMAIL@ADDRESS>\n"
77
"Language-Team: Spanish\n"
88
"MIME-Version: 1.0\n"
@@ -391,6 +391,9 @@ msgstr "El usuario no existe."
391391
msgid "No admin were found in the database."
392392
msgstr "No se ha encontrado ningún administrador en la base de datos."
393393

394+
msgid "The `{0}` configuration must be a valid non-empty string."
395+
msgstr ""
396+
394397
msgid "Invalid expiry time {0}."
395398
msgstr "Tiempo de expiración no válido {0}."
396399

@@ -1102,6 +1105,9 @@ msgstr "{0} ha eliminado la contraseña {1}"
11021105
msgid "You edited a resource"
11031106
msgstr "Se ha editado un recurso"
11041107

1108+
msgid "{0} edited a resource"
1109+
msgstr ""
1110+
11051111
msgid "You edited the resource {0}"
11061112
msgstr "Se ha editado el recurso {0}"
11071113

@@ -1495,12 +1501,15 @@ msgstr "Edite el security.salt en {0}"
14951501
msgid "App.fullBaseUrl validation OK."
14961502
msgstr "Validación de App.fullBaseUrl OK."
14971503

1498-
msgid "App.fullBaseUrl does not validate. {0}."
1499-
msgstr "App.fullBaseUrl no es válida. {0}."
1504+
msgid "App.fullBaseUrl does not validate. A valid URL/IP is accepted, but found \"{0}\"."
1505+
msgstr ""
15001506

15011507
msgid "Select a valid domain name as defined by section 2.3.1 of http://www.ietf.org/rfc/rfc1035.txt"
15021508
msgstr "Seleccione un nombre de dominio válido como se define en la sección 2.3.1 de http://www.ietf.org/rfc/rfc1035.txt"
15031509

1510+
msgid "IMPORTANT: Using an empty App.fullBaseUrl can lead to host header injection attack: https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection"
1511+
msgstr ""
1512+
15041513
msgid "The application is able to connect to the database"
15051514
msgstr "La aplicación es capaz de conectarse a la base de datos"
15061515

resources/locales/fr_FR/default.po

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
msgid ""
22
msgstr ""
33
"Project-Id-Version: 41c2572bd9bd4cc908d3e09e0cbed6e5\n"
4-
"POT-Creation-Date: 2025-01-29 05:51+0000\n"
5-
"PO-Revision-Date: 2025-01-29 07:23\n"
4+
"POT-Creation-Date: 2025-02-14 07:10+0000\n"
5+
"PO-Revision-Date: 2025-02-14 10:59\n"
66
"Last-Translator: NAME <EMAIL@ADDRESS>\n"
77
"Language-Team: French\n"
88
"MIME-Version: 1.0\n"
@@ -391,6 +391,9 @@ msgstr "L'utilisateur n'existe pas."
391391
msgid "No admin were found in the database."
392392
msgstr "Aucun administrateur n'a été trouvé dans la base de données."
393393

394+
msgid "The `{0}` configuration must be a valid non-empty string."
395+
msgstr ""
396+
394397
msgid "Invalid expiry time {0}."
395398
msgstr "Délai d'expiration invalide {0}."
396399

@@ -1102,6 +1105,9 @@ msgstr "{0} a supprimé le mot de passe {1}"
11021105
msgid "You edited a resource"
11031106
msgstr ""
11041107

1108+
msgid "{0} edited a resource"
1109+
msgstr ""
1110+
11051111
msgid "You edited the resource {0}"
11061112
msgstr ""
11071113

@@ -1495,12 +1501,15 @@ msgstr "Modifier le fichier security.salt dans {0}"
14951501
msgid "App.fullBaseUrl validation OK."
14961502
msgstr ""
14971503

1498-
msgid "App.fullBaseUrl does not validate. {0}."
1504+
msgid "App.fullBaseUrl does not validate. A valid URL/IP is accepted, but found \"{0}\"."
14991505
msgstr ""
15001506

15011507
msgid "Select a valid domain name as defined by section 2.3.1 of http://www.ietf.org/rfc/rfc1035.txt"
15021508
msgstr "Sélectionnez un nom de domaine valide tel que défini par la section 2.3.1 de http://www.ietf.org/rfc/rfc1035.txt"
15031509

1510+
msgid "IMPORTANT: Using an empty App.fullBaseUrl can lead to host header injection attack: https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection"
1511+
msgstr ""
1512+
15041513
msgid "The application is able to connect to the database"
15051514
msgstr "L'application est capable de se connecter à la base de données"
15061515

resources/locales/it_IT/default.po

+12-3
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,8 @@
11
msgid ""
22
msgstr ""
33
"Project-Id-Version: 41c2572bd9bd4cc908d3e09e0cbed6e5\n"
4-
"POT-Creation-Date: 2025-01-29 05:51+0000\n"
5-
"PO-Revision-Date: 2025-01-29 07:23\n"
4+
"POT-Creation-Date: 2025-02-14 07:10+0000\n"
5+
"PO-Revision-Date: 2025-02-14 10:59\n"
66
"Last-Translator: NAME <EMAIL@ADDRESS>\n"
77
"Language-Team: Italian\n"
88
"MIME-Version: 1.0\n"
@@ -391,6 +391,9 @@ msgstr "L'utente non esiste."
391391
msgid "No admin were found in the database."
392392
msgstr "Nel database non è stato trovato nessun amministratore."
393393

394+
msgid "The `{0}` configuration must be a valid non-empty string."
395+
msgstr ""
396+
394397
msgid "Invalid expiry time {0}."
395398
msgstr "Scadenza {0} non valida."
396399

@@ -1102,6 +1105,9 @@ msgstr "{0} ha cancellato la password {1}"
11021105
msgid "You edited a resource"
11031106
msgstr ""
11041107

1108+
msgid "{0} edited a resource"
1109+
msgstr ""
1110+
11051111
msgid "You edited the resource {0}"
11061112
msgstr ""
11071113

@@ -1495,12 +1501,15 @@ msgstr ""
14951501
msgid "App.fullBaseUrl validation OK."
14961502
msgstr ""
14971503

1498-
msgid "App.fullBaseUrl does not validate. {0}."
1504+
msgid "App.fullBaseUrl does not validate. A valid URL/IP is accepted, but found \"{0}\"."
14991505
msgstr ""
15001506

15011507
msgid "Select a valid domain name as defined by section 2.3.1 of http://www.ietf.org/rfc/rfc1035.txt"
15021508
msgstr ""
15031509

1510+
msgid "IMPORTANT: Using an empty App.fullBaseUrl can lead to host header injection attack: https://owasp.org/www-project-web-security-testing-guide/v42/4-Web_Application_Security_Testing/07-Input_Validation_Testing/17-Testing_for_Host_Header_Injection"
1511+
msgstr ""
1512+
15041513
msgid "The application is able to connect to the database"
15051514
msgstr ""
15061515

0 commit comments

Comments
 (0)