[SECURITY] Add feature toggle to disable record registration 98/59098/2
authorBenni Mack <benni@typo3.org>
Tue, 11 Dec 2018 09:56:43 +0000 (10:56 +0100)
committerOliver Hader <oliver.hader@typo3.org>
Tue, 11 Dec 2018 09:56:45 +0000 (10:56 +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: 32762f9654fba3e8ddcf1f67d1c0fbf4967b5149
Security-Bulletin: TYPO3-CORE-SA-2018-012
Change-Id: I488bdf412361a0c56290deb842b16a3958501430
Reviewed-on: https://review.typo3.org/59098
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/DefaultConfigurationDescription.php
typo3/sysext/core/Configuration/FactoryConfiguration.php
typo3/sysext/frontend/Classes/Controller/TypoScriptFrontendController.php
typo3/sysext/lang/Resources/Private/Language/locallang_core.xlf
typo3/sysext/reports/Classes/Report/Status/SecurityStatus.php
typo3/sysext/reports/Resources/Private/Language/locallang_reports.xlf

index 2f723e5..5a2b56b 100644 (file)
@@ -972,6 +972,7 @@ return [
     ],
     'FE' => [ // Configuration for the TypoScript frontend (FE). Nothing here relates to the administration backend!
         'addAllowedPaths' => '',
+        'enableRecordRegistration' => false,
         'debug' => false,
         'noPHPscriptInclude' => false,
         'compressionLevel' => 0,
index 6343373..202624d 100644 (file)
@@ -130,6 +130,7 @@ return [
         'debug' => 'Boolean: If set, the loginrefresh is disabled and pageRenderer is set to debug mode. Use this to debug the backend only!',
     ],
     'FE' => [ // Configuration for the TypoScript frontend (FE). Nothing here relates to the administration backend!
+        'enableRecordRegistration' => '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 <code>\\TYPO3\\CMS\\Core\\TypoScript\\Parser\\TypoScriptParser)</code>',
         'debug' => 'Boolean: If set, some debug HTML-comments may be output somewhere. Can also be set by TypoScript.',
         'noPHPscriptInclude' => '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 107b0b8..6171862 100644 (file)
@@ -40,6 +40,7 @@ return [
         ],
     ],
     'FE' => [
+        'enableRecordRegistration' => false,
         'loginSecurityLevel' => 'rsa',
     ],
     'GFX' => [
index 86b4863..464b896 100644 (file)
@@ -1017,10 +1017,12 @@ class TypoScriptFrontendController
         // @deprecated since TYPO3 v8, will be removed in TYPO3 v9
         // @todo: With the removal of that in v9, TYPO3_CONF_VARS maxSessionDataSize can be removed as well,
         // @todo: and a silent ugrade wizard to remove the setting from LocalConfiguration should be added.
-        $recs = GeneralUtility::_GP('recs');
-        if (is_array($recs)) {
-            // If any record registration is submitted, register the record.
-            $this->fe_user->record_registration($recs, $GLOBALS['TYPO3_CONF_VARS']['FE']['maxSessionDataSize']);
+        if (!empty($GLOBALS['TYPO3_CONF_VARS']['FE']['enableRecordRegistration'])) {
+            $recs = GeneralUtility::_GP('recs');
+            if (is_array($recs)) {
+                // If any record registration is submitted, register the record.
+                $this->fe_user->record_registration($recs, $GLOBALS['TYPO3_CONF_VARS']['FE']['maxSessionDataSize']);
+            }
         }
 
         // Call hook for possible manipulation of frontend user object
index 4fb9d23..5dc6ce7 100644 (file)
@@ -1161,6 +1161,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_update">
                                <source>This installation is not configured for the TYPO3 version it is running. If you did so intentionally, this message can be safely ignored. If you are unsure, visit the Update Wizard section of the %sInstall Tool%s to see how TYPO3 would change.</source>
                        </trans-unit>
index 7ae5706..0b4f222 100644 (file)
@@ -41,6 +41,7 @@ class SecurityStatus implements StatusProviderInterface
     {
         $statuses = [
             'trustedHostsPattern' => $this->getTrustedHostsPatternStatus(),
+            'recordRegistration' => $this->getRecordRegistrationStatus(),
             'adminUserAccount' => $this->getAdminAccountStatus(),
             'fileDenyPattern' => $this->getFileDenyPatternStatus(),
             'htaccessUpload' => $this->getHtaccessUploadStatus(),
@@ -68,6 +69,24 @@ class SecurityStatus implements 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 = $this->getLanguageService()->getLL('status_ok');
+        $message = '';
+        $severity = ReportStatus::OK;
+        if (!empty($GLOBALS['TYPO3_CONF_VARS']['FE']['enableRecordRegistration'])) {
+            $value = $this->getLanguageService()->getLL('status_insecure');
+            $severity = ReportStatus::ERROR;
+            $message = $this->getLanguageService()->sL('LLL:EXT:lang/Resources/Private/Language/locallang_core.xlf:warning.install_recordregistration');
+        }
+        return GeneralUtility::makeInstance(ReportStatus::class, $this->getLanguageService()->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 f72fb0b..2f3d0dd 100644 (file)
                        <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_adminUserAccount">
                                <source>Admin User Account</source>
                        </trans-unit>