[SECURITY] Add feature toggle to disable record registration 90/59090/2
authorBenni Mack <benni@typo3.org>
Tue, 11 Dec 2018 09:55:42 +0000 (10:55 +0100)
committerOliver Hader <oliver.hader@typo3.org>
Tue, 11 Dec 2018 09:55:44 +0000 (10:55 +0100)
The "recs" query parameter allows to write
arbitrary entries into a session, leading
to a possibility to create a reasonable amount
of frontend user sessions.

In order to prevent this situation, a new configuration
option $TYPO3_CONF_VARS[FE][enableRecordRegistration]
is added to disable the functionality completely.

The feature is disabled per default in order to apply
strong security defaults. Installations that rely on this
functionality have to manually enable the feauture and
its vulnerability by changing the according TYPO3_CONF_VARS
setting in the install tool.

A security report is added to display a warning
in the TYPO3 Backend.

Resolves: #80979
Releases: 8.7, 7.6
Security-Commit: e94871da34275de6b47e10f44a1fb16219598aa9
Security-Bulletin: TYPO3-CORE-SA-2018-012
Change-Id: I1c79525cde0f8a268b2e8747db55735e10668e75
Reviewed-on: https://review.typo3.org/59090
Reviewed-by: Oliver Hader <oliver.hader@typo3.org>
Tested-by: Oliver Hader <oliver.hader@typo3.org>
typo3/sysext/core/Configuration/DefaultConfiguration.php
typo3/sysext/core/Configuration/FactoryConfiguration.php
typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
typo3/sysext/lang/locallang_core.xlf
typo3/sysext/reports/Classes/Report/Status/SecurityStatus.php
typo3/sysext/reports/Resources/Private/Language/locallang_reports.xlf

index 0dc835b..f1f0d1f 100644 (file)
@@ -1095,6 +1095,7 @@ return [
         'XCLASS' => []
     ],
     'FE' => [ // Configuration for the TypoScript frontend (FE). Nothing here relates to the administration backend!
+        'enableRecordRegistration' => false, // Boolean: If set, the TYPO3 Frontend checks for a special GET parameter "recs" and adds data to a new or existing session. As this is a potential security risk, it is recommended to disable this option if not specifically needed.
         'addAllowedPaths' => '',        // Additional relative paths (comma-list) to allow TypoScript resources be in. Should be prepended with '/'. If not, then any path where the first part is like this path will match. That is: 'myfolder/ , myarchive' will match eg. 'myfolder/', 'myarchive/', 'myarchive_one/', 'myarchive_2/' ... No check is done to see if this directory actually exists in the root of the site. Paths are matched by simply checking if these strings equals the first part of any TypoScript resource filepath. (See class template, function init() in \TYPO3\CMS\Core\TypoScript\Parser\TypoScriptParser)
         'debug' => false,        // Boolean: If set, some debug HTML-comments may be output somewhere. Can also be set by TypoScript.
         'noPHPscriptInclude' => false,        // Boolean: If set, PHP-scripts are not included by TypoScript configurations, unless they reside in the folders typo3/ext/, typo3/sysext/ or typo3conf/ext. This is a security option to ensure that users with template-access do not terrorize
index 98f4c38..9fe24dd 100644 (file)
@@ -32,6 +32,7 @@ return [
     ],
     'FE' => [
         'loginSecurityLevel' => 'rsa',
+        'enableRecordRegistration' => false,
         'cHashIncludePageId' => true,
     ],
     'GFX' => [
index c83ce24..6e3f10b 100644 (file)
@@ -1087,10 +1087,12 @@ class TypoScriptFrontendController
         $this->fe_user->unpack_uc('');
         // Gets session data
         $this->fe_user->fetchSessionData();
-        $recs = GeneralUtility::_GP('recs');
-        // If any record registration is submitted, register the record.
-        if (is_array($recs)) {
-            $this->fe_user->record_registration($recs, $this->TYPO3_CONF_VARS['FE']['maxSessionDataSize']);
+        if (!empty($GLOBALS['TYPO3_CONF_VARS']['FE']['enableRecordRegistration'])) {
+            $recs = GeneralUtility::_GP('recs');
+            // If any record registration is submitted, register the record.
+            if (is_array($recs)) {
+                $this->fe_user->record_registration($recs, $this->TYPO3_CONF_VARS['FE']['maxSessionDataSize']);
+            }
         }
         // Call hook for possible manipulation of frontend user object
         if (is_array($this->TYPO3_CONF_VARS['SC_OPTIONS']['tslib/class.tslib_fe.php']['initFEuser'])) {
index 36c75b3..bb55c37 100644 (file)
@@ -1113,6 +1113,9 @@ Do you want to refresh it now?</source>
                        <trans-unit id="warning.install_trustedhosts">
                                <source>The trusted hosts pattern check is disabled. Please define the allowed hosts in the [SYS][trustedHostsPattern] section of the Install Tool.</source>
                        </trans-unit>
+                       <trans-unit id="warning.install_recordregistration">
+                               <source>The record registration functionality is enabled which can lead to frontend user session flooding. Please ensure that you do not need the functionality of evaluating the "&amp;recs=" URL query parameter and disable the [FE][enableRecordRegistration] option within the Install Tool.</source>
+                       </trans-unit>
                        <trans-unit id="warning.install_cache_flooding">
                                <source>Cache Flooding Protection is disabled. Please enable [FE][cHashIncludePageId] in the Install Tool.</source>
                        </trans-unit>
index 68c83d2..1deae78 100644 (file)
@@ -33,6 +33,7 @@ class SecurityStatus implements \TYPO3\CMS\Reports\StatusProviderInterface
     {
         $statuses = [
             'trustedHostsPattern' => $this->getTrustedHostsPatternStatus(),
+            'recordRegistration' => $this->getRecordRegistrationStatus(),
             'adminUserAccount' => $this->getAdminAccountStatus(),
             'fileDenyPattern' => $this->getFileDenyPatternStatus(),
             'htaccessUpload' => $this->getHtaccessUploadStatus(),
@@ -78,6 +79,24 @@ class SecurityStatus implements \TYPO3\CMS\Reports\StatusProviderInterface
     }
 
     /**
+     * Checks if the record registration option is disabled.
+     *
+     * @return \TYPO3\CMS\Reports\Status An object representing whether the check is disabled
+     */
+    protected function getRecordRegistrationStatus()
+    {
+        $value = $GLOBALS['LANG']->getLL('status_ok');
+        $message = '';
+        $severity = \TYPO3\CMS\Reports\Status::OK;
+        if (!empty($GLOBALS['TYPO3_CONF_VARS']['FE']['enableRecordRegistration'])) {
+            $value = $GLOBALS['LANG']->getLL('status_insecure');
+            $severity = \TYPO3\CMS\Reports\Status::ERROR;
+            $message = $GLOBALS['LANG']->sL('LLL:EXT:lang/locallang_core.xlf:warning.install_recordregistration');
+        }
+        return GeneralUtility::makeInstance(\TYPO3\CMS\Reports\Status::class, $GLOBALS['LANG']->getLL('status_recordRegistration'), $value, $message, $severity);
+    }
+
+    /**
      * Checks whether a BE user account named admin with default password exists.
      *
      * @return \TYPO3\CMS\Reports\Status An object representing whether a default admin account exists
index c6b0326..f25666b 100644 (file)
@@ -99,6 +99,9 @@
                        <trans-unit id="status_trustedHostsPattern">
                                <source>Trusted Hosts Pattern</source>
                        </trans-unit>
+                       <trans-unit id="status_recordRegistration">
+                               <source>Record registration via URL parameter starting sessions</source>
+                       </trans-unit>
                        <trans-unit id="status_cacheFloodingProtection">
                                <source>Cache Flooding Protection</source>
                        </trans-unit>