Fixed bug #16593: It is possible to bypass 'verifyFilenameAgainstDenyPattern'
authorOliver Hader <oliver.hader@typo3.org>
Thu, 16 Dec 2010 13:42:21 +0000 (13:42 +0000)
committerOliver Hader <oliver.hader@typo3.org>
Thu, 16 Dec 2010 13:42:21 +0000 (13:42 +0000)
git-svn-id: https://svn.typo3.org/TYPO3v4/Core/branches/TYPO3_4-2@9795 709f56b5-9817-0410-a4d7-c38de5d9e867

ChangeLog
t3lib/class.t3lib_div.php

index be78cec..b3c6e17 100755 (executable)
--- a/ChangeLog
+++ b/ChangeLog
@@ -6,6 +6,7 @@
        * Fixed bug #16653: SQL injection problem in class.db_list.inc (thanks to Jigal van Hemert)
        * Fixed bug #15735: FORM content object is susceptible to XSS (thanks to Benjamin Mack)
        * Fixed bug #16362: Directory traversal attack in em_unzip
+       * Fixed bug #16593: It is possible to bypass 'verifyFilenameAgainstDenyPattern'
 
 2010-11-12  Ernesto Baschny  <ernst@cron-it.de>
 
index f84c9dd..11519a0 100755 (executable)
@@ -3915,17 +3915,19 @@ final class t3lib_div {
 
        /**
         * Checks for malicious file paths.
-        * Returns true if no '//', '..' or '\' is in the $theFile
+        *
+        * Returns TRUE if no '//', '..', '\' or control characters are found in the $theFile.
         * This should make sure that the path is not pointing 'backwards' and further doesn't contain double/back slashes.
         * So it's compatible with the UNIX style path strings valid for TYPO3 internally.
         * Usage: 14
         *
         * @param       string          Filepath to evaluate
-        * @return      boolean         True, if no '//', '\', '/../' is in the $theFile and $theFile doesn't begin with '../'
+        * @return      boolean         TRUE, $theFile is allowed path string
+        * @see         http://php.net/manual/en/security.filesystem.nullbytes.php
         * @todo        Possible improvement: Should it rawurldecode the string first to check if any of these characters is encoded ?
         */
        public static function validPathStr($theFile)   {
-               if (strpos($theFile, '//')===false && strpos($theFile, '\\')===false && !preg_match('#(?:^\.\.|/\.\./)#', $theFile)) {
+               if (strpos($theFile, '//') === FALSE && strpos($theFile, '\\') === FALSE && !preg_match('#(?:^\.\.|/\.\./|[[:cntrl:]])#', $theFile)) {
                        return true;
                }
        }
@@ -3966,6 +3968,11 @@ final class t3lib_div {
         * @return      boolean
         */
        public static function verifyFilenameAgainstDenyPattern($filename)      {
+                       // Filenames are not allowed to contain control characters:
+               if (preg_match('/[[:cntrl:]]/', $filename)) {
+                       return FALSE;
+               }
+
                if (strcmp($filename,'') && strcmp($GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'],''))    {
                        $result = eregi($GLOBALS['TYPO3_CONF_VARS']['BE']['fileDenyPattern'],$filename);
                        if ($result)    return false;   // so if a matching filename is found, return false;