VYPR
Moderate severityNVD Advisory· Published Dec 8, 2020· Updated Aug 4, 2024

PHP Phar archives could be uploaded and executed in Kirby

CVE-2020-26255

Description

Kirby is a CMS. In Kirby CMS (getkirby/cms) before version 3.4.5, and Kirby Panel before version 2.5.14 , an editor with full access to the Kirby Panel can upload a PHP .phar file and execute it on the server. This vulnerability is critical if you might have potential attackers in your group of authenticated Panel users, as they can gain access to the server with such a Phar file. Visitors without Panel access *cannot* use this attack vector. The problem has been patched in Kirby 2.5.14 and Kirby 3.4.5. Please update to one of these or a later version to fix the vulnerability. Note: Kirby 2 reaches end of life on December 31, 2020. We therefore recommend to upgrade your Kirby 2 sites to Kirby 3. If you cannot upgrade, we still recommend to update to Kirby 2.5.14.

Affected packages

Versions sourced from the GitHub Security Advisory.

PackageAffected versionsPatched versions
getkirby/panelPackagist
< 2.5.142.5.14
getkirby/cmsPackagist
>= 3.0.0, < 3.4.53.4.5

Affected products

1

Patches

2
db8f371b1303

Merge pull request #2962 from getkirby/fix/upload-validation

https://github.com/getkirby/kirbyBastian AllgeierDec 1, 2020via ghsa
8 files changed · +222 97
  • cacert.pem+67 79 modified
    @@ -1,7 +1,7 @@
     ##
     ## Bundle of CA Root Certificates
     ##
    -## Certificate data from Mozilla as of: Wed Jul 22 03:12:14 2020 GMT
    +## Certificate data from Mozilla as of: Wed Oct 14 03:12:15 2020 GMT
     ##
     ## This is a bundle of X.509 certificates of public Certificate Authorities
     ## (CA). These were automatically extracted from Mozilla's root certificates
    @@ -14,7 +14,7 @@
     ## Just configure this file as the SSLCACertificateFile.
     ##
     ## Conversion done with mk-ca-bundle.pl version 1.28.
    -## SHA256: cc6408bd4be7fbfb8699bdb40ccb7f6de5780d681d87785ea362646e4dad5e8e
    +## SHA256: a831d3bc63ba1f65478afe28038742b7150c0c2efd243ac342b64792a75d2038
     ##
     
     
    @@ -448,36 +448,6 @@ KVtHCN2MQWplBqjlIapBtJUhlbl90TSrE9atvNziPTnNvT51cKEYWQPJIrSPnNVeKtelttQKbfi3
     QBFGmh95DmK/D5fs4C8fF5Q=
     -----END CERTIFICATE-----
     
    -Taiwan GRCA
    -===========
    ------BEGIN CERTIFICATE-----
    -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
    ------END CERTIFICATE-----
    -
     DigiCert Assured ID Root CA
     ===========================
     -----BEGIN CERTIFICATE-----
    @@ -806,29 +776,6 @@ FAkK+qDmfQjGGoe9GKhzvSbKYAydzpmfz1wPMOG+FDHqAjAU9JM8SaczepBGR7NjfRObTrdvGDeA
     U/7dIOA1mjbRxwG55tzd8/8dLDoWV9mSOdY=
     -----END CERTIFICATE-----
     
    -OISTE WISeKey Global Root GA CA
    -===============================
    ------BEGIN CERTIFICATE-----
    -MIID8TCCAtmgAwIBAgIQQT1yx/RrH4FDffHSKFTfmjANBgkqhkiG9w0BAQUFADCBijELMAkGA1UE
    -BhMCQ0gxEDAOBgNVBAoTB1dJU2VLZXkxGzAZBgNVBAsTEkNvcHlyaWdodCAoYykgMjAwNTEiMCAG
    -A1UECxMZT0lTVEUgRm91bmRhdGlvbiBFbmRvcnNlZDEoMCYGA1UEAxMfT0lTVEUgV0lTZUtleSBH
    -bG9iYWwgUm9vdCBHQSBDQTAeFw0wNTEyMTExNjAzNDRaFw0zNzEyMTExNjA5NTFaMIGKMQswCQYD
    -VQQGEwJDSDEQMA4GA1UEChMHV0lTZUtleTEbMBkGA1UECxMSQ29weXJpZ2h0IChjKSAyMDA1MSIw
    -IAYDVQQLExlPSVNURSBGb3VuZGF0aW9uIEVuZG9yc2VkMSgwJgYDVQQDEx9PSVNURSBXSVNlS2V5
    -IEdsb2JhbCBSb290IEdBIENBMIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAy0+zAJs9
    -Nt350UlqaxBJH+zYK7LG+DKBKUOVTJoZIyEVRd7jyBxRVVuuk+g3/ytr6dTqvirdqFEr12bDYVxg
    -Asj1znJ7O7jyTmUIms2kahnBAbtzptf2w93NvKSLtZlhuAGio9RN1AU9ka34tAhxZK9w8RxrfvbD
    -d50kc3vkDIzh2TbhmYsFmQvtRTEJysIA2/dyoJaqlYfQjse2YXMNdmaM3Bu0Y6Kff5MTMPGhJ9vZ
    -/yxViJGg4E8HsChWjBgbl0SOid3gF27nKu+POQoxhILYQBRJLnpB5Kf+42TMwVlxSywhp1t94B3R
    -LoGbw9ho972WG6xwsRYUC9tguSYBBQIDAQABo1EwTzALBgNVHQ8EBAMCAYYwDwYDVR0TAQH/BAUw
    -AwEB/zAdBgNVHQ4EFgQUswN+rja8sHnR3JQmthG+IbJphpQwEAYJKwYBBAGCNxUBBAMCAQAwDQYJ
    -KoZIhvcNAQEFBQADggEBAEuh/wuHbrP5wUOxSPMowB0uyQlB+pQAHKSkq0lPjz0e701vvbyk9vIm
    -MMkQyh2I+3QZH4VFvbBsUfk2ftv1TDI6QU9bR8/oCy22xBmddMVHxjtqD6wU2zz0c5ypBd8A3HR4
    -+vg1YFkCExh8vPtNsCBtQ7tgMHpnM1zFmdH4LTlSc/uMqpclXHLZCB6rTjzjgTGfA6b7wP4piFXa
    -hNVQA7bihKOmNqoROgHhGEvWRGizPflTdISzRpFGlgC3gCy24eMQ4tui5yiPAZZiFj4A4xylNoEY
    -okxSdsARo27mHbrjWr42U8U+dY+GaSlYU7Wcu2+fXMUY7N0v4ZjJ/L7fCg0=
    ------END CERTIFICATE-----
    -
     Certigna
     ========
     -----BEGIN CERTIFICATE-----
    @@ -1709,30 +1656,6 @@ P0HHRwA11fXT91Q+gT3aSWqas+8QPebrb9HIIkfLzM8BMZLZGOMivgkeGj5asuRrDFR6fUNOuIml
     e9eiPZaGzPImNC1qkp2aGtAw4l1OBLBfiyB+d8E9lYLRRpo7PHi4b6HQDWSieB4pTpPDpFQUWw==
     -----END CERTIFICATE-----
     
    -EE Certification Centre Root CA
    -===============================
    ------BEGIN CERTIFICATE-----
    -MIIEAzCCAuugAwIBAgIQVID5oHPtPwBMyonY43HmSjANBgkqhkiG9w0BAQUFADB1MQswCQYDVQQG
    -EwJFRTEiMCAGA1UECgwZQVMgU2VydGlmaXRzZWVyaW1pc2tlc2t1czEoMCYGA1UEAwwfRUUgQ2Vy
    -dGlmaWNhdGlvbiBDZW50cmUgUm9vdCBDQTEYMBYGCSqGSIb3DQEJARYJcGtpQHNrLmVlMCIYDzIw
    -MTAxMDMwMTAxMDMwWhgPMjAzMDEyMTcyMzU5NTlaMHUxCzAJBgNVBAYTAkVFMSIwIAYDVQQKDBlB
    -UyBTZXJ0aWZpdHNlZXJpbWlza2Vza3VzMSgwJgYDVQQDDB9FRSBDZXJ0aWZpY2F0aW9uIENlbnRy
    -ZSBSb290IENBMRgwFgYJKoZIhvcNAQkBFglwa2lAc2suZWUwggEiMA0GCSqGSIb3DQEBAQUAA4IB
    -DwAwggEKAoIBAQDIIMDs4MVLqwd4lfNE7vsLDP90jmG7sWLqI9iroWUyeuuOF0+W2Ap7kaJjbMeM
    -TC55v6kF/GlclY1i+blw7cNRfdCT5mzrMEvhvH2/UpvObntl8jixwKIy72KyaOBhU8E2lf/slLo2
    -rpwcpzIP5Xy0xm90/XsY6KxX7QYgSzIwWFv9zajmofxwvI6Sc9uXp3whrj3B9UiHbCe9nyV0gVWw
    -93X2PaRka9ZP585ArQ/dMtO8ihJTmMmJ+xAdTX7Nfh9WDSFwhfYggx/2uh8Ej+p3iDXE/+pOoYtN
    -P2MbRMNE1CV2yreN1x5KZmTNXMWcg+HCCIia7E6j8T4cLNlsHaFLAgMBAAGjgYowgYcwDwYDVR0T
    -AQH/BAUwAwEB/zAOBgNVHQ8BAf8EBAMCAQYwHQYDVR0OBBYEFBLyWj7qVhy/zQas8fElyalL1BSZ
    -MEUGA1UdJQQ+MDwGCCsGAQUFBwMCBggrBgEFBQcDAQYIKwYBBQUHAwMGCCsGAQUFBwMEBggrBgEF
    -BQcDCAYIKwYBBQUHAwkwDQYJKoZIhvcNAQEFBQADggEBAHv25MANqhlHt01Xo/6tu7Fq1Q+e2+Rj
    -xY6hUFaTlrg4wCQiZrxTFGGVv9DHKpY5P30osxBAIWrEr7BSdxjhlthWXePdNl4dp1BUoMUq5KqM
    -lIpPnTX/dqQGE5Gion0ARD9V04I8GtVbvFZMIi5GQ4okQC3zErg7cBqklrkar4dBGmoYDQZPxz5u
    -uSlNDUmJEYcyW+ZLBMjkXOZ0c5RdFpgTlf7727FE5TpwrDdr5rMzcijJs1eg9gIWiAYLtqZLICjU
    -3j2LrTcFU3T+bsy8QxdxXvnFzBqpYe73dgzzcvRyrc9yAjYHR8/vGVCJYMzpJJUPwssd8m92kMfM
    -dcGWxZ0=
    ------END CERTIFICATE-----
    -
     D-TRUST Root Class 3 CA 2 2009
     ==============================
     -----BEGIN CERTIFICATE-----
    @@ -3445,3 +3368,68 @@ Sxfj03k9bWtJySgOLnRQvwzZRjoQhsmnP+mg7H/rpXdYaXHmgwo38oZJar55CJD2AhZkPuXaTH4M
     NMn5X7azKFGnpyuqSfqNZSlO42sTp5SjLVFteAxEy9/eCG/Oo2Sr05WE1LlSVHJ7liXMvGnjSG4N
     0MedJ5qq+BOS3R7fY581qRY27Iy4g/Q9iY/NtBde17MXQRBdJ3NghVdJIgc=
     -----END CERTIFICATE-----
    +
    +Trustwave Global Certification Authority
    +========================================
    +-----BEGIN CERTIFICATE-----
    +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
    +29FpHOTKyeC2nOnOcXHebD8WpHk=
    +-----END CERTIFICATE-----
    +
    +Trustwave Global ECC P256 Certification Authority
    +=================================================
    +-----BEGIN CERTIFICATE-----
    +MIICYDCCAgegAwIBAgIMDWpfCD8oXD5Rld9dMAoGCCqGSM49BAMCMIGRMQswCQYDVQQGEwJVUzER
    +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
    +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1NiBDZXJ0aWZp
    +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM1MTBaFw00MjA4MjMxOTM1MTBaMIGRMQswCQYD
    +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
    +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDI1
    +NiBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTBZMBMGByqGSM49AgEGCCqGSM49AwEHA0IABH77bOYj
    +43MyCMpg5lOcunSNGLB4kFKA3TjASh3RqMyTpJcGOMoNFWLGjgEqZZ2q3zSRLoHB5DOSMcT9CTqm
    +P62jQzBBMA8GA1UdEwEB/wQFMAMBAf8wDwYDVR0PAQH/BAUDAwcGADAdBgNVHQ4EFgQUo0EGrJBt
    +0UrrdaVKEJmzsaGLSvcwCgYIKoZIzj0EAwIDRwAwRAIgB+ZU2g6gWrKuEZ+Hxbb/ad4lvvigtwjz
    +RM4q3wghDDcCIC0mA6AFvWvR9lz4ZcyGbbOcNEhjhAnFjXca4syc4XR7
    +-----END CERTIFICATE-----
    +
    +Trustwave Global ECC P384 Certification Authority
    +=================================================
    +-----BEGIN CERTIFICATE-----
    +MIICnTCCAiSgAwIBAgIMCL2Fl2yZJ6SAaEc7MAoGCCqGSM49BAMDMIGRMQswCQYDVQQGEwJVUzER
    +MA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRydXN0d2F2ZSBI
    +b2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4NCBDZXJ0aWZp
    +Y2F0aW9uIEF1dGhvcml0eTAeFw0xNzA4MjMxOTM2NDNaFw00MjA4MjMxOTM2NDNaMIGRMQswCQYD
    +VQQGEwJVUzERMA8GA1UECBMISWxsaW5vaXMxEDAOBgNVBAcTB0NoaWNhZ28xITAfBgNVBAoTGFRy
    +dXN0d2F2ZSBIb2xkaW5ncywgSW5jLjE6MDgGA1UEAxMxVHJ1c3R3YXZlIEdsb2JhbCBFQ0MgUDM4
    +NCBDZXJ0aWZpY2F0aW9uIEF1dGhvcml0eTB2MBAGByqGSM49AgEGBSuBBAAiA2IABGvaDXU1CDFH
    +Ba5FmVXxERMuSvgQMSOjfoPTfygIOiYaOs+Xgh+AtycJj9GOMMQKmw6sWASr9zZ9lCOkmwqKi6vr
    +/TklZvFe/oyujUF5nQlgziip04pt89ZF1PKYhDhloKNDMEEwDwYDVR0TAQH/BAUwAwEB/zAPBgNV
    +HQ8BAf8EBQMDBwYAMB0GA1UdDgQWBBRVqYSJ0sEyvRjLbKYHTsjnnb6CkDAKBggqhkjOPQQDAwNn
    +ADBkAjA3AZKXRRJ+oPM+rRk6ct30UJMDEr5E0k9BpIycnR+j9sKS50gU/k6bpZFXrsY3crsCMGcl
    +CrEMXu6pY5Jv5ZAL/mYiykf9ijH3g/56vxC+GCsej/YpHpRZ744hN8tRmKVuSw==
    +-----END CERTIFICATE-----
    
  • composer.json+1 1 modified
    @@ -1,7 +1,7 @@
     {
       "name": "getkirby/cms",
       "description": "The Kirby 3 core",
    -  "version": "3.4.4",
    +  "version": "3.4.5",
       "license": "proprietary",
       "keywords": ["kirby", "cms", "core"],
       "homepage": "https://getkirby.com",
    
  • composer.lock+64 9 modified
    @@ -4,7 +4,7 @@
             "Read more about it at https://getcomposer.org/doc/01-basic-usage.md#installing-dependencies",
             "This file is @generated automatically"
         ],
    -    "content-hash": "b85ce02787ff0e052a3cc7a01c2daa91",
    +    "content-hash": "1ca40c0fbd9e8d3584e7ae28b84e0a1c",
         "packages": [
             {
                 "name": "claviska/simpleimage",
    @@ -142,6 +142,10 @@
                 ],
                 "description": "Kirby's custom Composer installer for the Kirby CMS and for Kirby plugins",
                 "homepage": "https://getkirby.com",
    +            "support": {
    +                "issues": "https://github.com/getkirby/composer-installer/issues",
    +                "source": "https://github.com/getkirby/composer-installer/tree/1.2.0"
    +            },
                 "time": "2020-09-13T14:43:34+00:00"
             },
             {
    @@ -239,6 +243,18 @@
                     "laminas",
                     "zf"
                 ],
    +            "support": {
    +                "forum": "https://discourse.laminas.dev/",
    +                "issues": "https://github.com/laminas/laminas-zendframework-bridge/issues",
    +                "rss": "https://github.com/laminas/laminas-zendframework-bridge/releases.atom",
    +                "source": "https://github.com/laminas/laminas-zendframework-bridge"
    +            },
    +            "funding": [
    +                {
    +                    "url": "https://funding.communitybridge.org/projects/laminas-project",
    +                    "type": "community_bridge"
    +                }
    +            ],
                 "time": "2020-09-14T14:23:00+00:00"
             },
             {
    @@ -293,6 +309,10 @@
                     "image",
                     "palette"
                 ],
    +            "support": {
    +                "issues": "https://github.com/thephpleague/color-extractor/issues",
    +                "source": "https://github.com/thephpleague/color-extractor/tree/master"
    +            },
                 "time": "2016-12-15T09:30:02+00:00"
             },
             {
    @@ -343,6 +363,10 @@
                     "typographer",
                     "typography"
                 ],
    +            "support": {
    +                "issues": "https://github.com/michelf/php-smartypants/issues",
    +                "source": "https://github.com/michelf/php-smartypants/tree/1.8.1"
    +            },
                 "time": "2016-12-13T01:01:17+00:00"
             },
             {
    @@ -455,6 +479,12 @@
                     }
                 ],
                 "description": "PHPMailer is a full-featured email creation and transfer class for PHP",
    +            "funding": [
    +                {
    +                    "url": "https://github.com/synchro",
    +                    "type": "github"
    +                }
    +            ],
                 "time": "2020-05-27T12:24:03+00:00"
             },
             {
    @@ -502,32 +532,35 @@
                     "psr",
                     "psr-3"
                 ],
    +            "support": {
    +                "source": "https://github.com/php-fig/log/tree/1.1.3"
    +            },
                 "time": "2020-03-23T09:12:05+00:00"
             },
             {
                 "name": "symfony/polyfill-mbstring",
    -            "version": "v1.18.1",
    +            "version": "v1.20.0",
                 "source": {
                     "type": "git",
                     "url": "https://github.com/symfony/polyfill-mbstring.git",
    -                "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a"
    +                "reference": "39d483bdf39be819deabf04ec872eb0b2410b531"
                 },
                 "dist": {
                     "type": "zip",
    -                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/a6977d63bf9a0ad4c65cd352709e230876f9904a",
    -                "reference": "a6977d63bf9a0ad4c65cd352709e230876f9904a",
    +                "url": "https://api.github.com/repos/symfony/polyfill-mbstring/zipball/39d483bdf39be819deabf04ec872eb0b2410b531",
    +                "reference": "39d483bdf39be819deabf04ec872eb0b2410b531",
                     "shasum": ""
                 },
                 "require": {
    -                "php": ">=5.3.3"
    +                "php": ">=7.1"
                 },
                 "suggest": {
                     "ext-mbstring": "For best performance"
                 },
                 "type": "library",
                 "extra": {
                     "branch-alias": {
    -                    "dev-master": "1.18-dev"
    +                    "dev-main": "1.20-dev"
                     },
                     "thanks": {
                         "name": "symfony/polyfill",
    @@ -565,7 +598,24 @@
                     "portable",
                     "shim"
                 ],
    -            "time": "2020-07-14T12:35:20+00:00"
    +            "support": {
    +                "source": "https://github.com/symfony/polyfill-mbstring/tree/v1.20.0"
    +            },
    +            "funding": [
    +                {
    +                    "url": "https://symfony.com/sponsor",
    +                    "type": "custom"
    +                },
    +                {
    +                    "url": "https://github.com/fabpot",
    +                    "type": "github"
    +                },
    +                {
    +                    "url": "https://tidelift.com/funding/github/packagist/symfony/symfony",
    +                    "type": "tidelift"
    +                }
    +            ],
    +            "time": "2020-10-23T14:02:19+00:00"
             },
             {
                 "name": "true/punycode",
    @@ -611,6 +661,10 @@
                     "idna",
                     "punycode"
                 ],
    +            "support": {
    +                "issues": "https://github.com/true/php-punycode/issues",
    +                "source": "https://github.com/true/php-punycode/tree/master"
    +            },
                 "time": "2016-11-16T10:37:54+00:00"
             }
         ],
    @@ -625,5 +679,6 @@
             "ext-mbstring": "*",
             "ext-ctype": "*"
         },
    -    "platform-dev": []
    +    "platform-dev": [],
    +    "plugin-api-version": "1.1.0"
     }
    
  • src/Cms/FileRules.php+21 7 modified
    @@ -82,9 +82,7 @@ public static function create(File $file, Image $upload): bool
                 throw new PermissionException('The file cannot be created');
             }
     
    -        static::validExtension($file, $file->extension());
    -        static::validMime($file, $upload->mime());
    -        static::validFilename($file, $file->filename());
    +        static::validFile($file, $upload->mime());
     
             $upload->match($file->blueprint()->accept());
     
    @@ -176,14 +174,14 @@ public static function validExtension(File $file, string $extension): bool
                 ]);
             }
     
    -        if (V::in($extension, ['php', 'html', 'htm', 'exe', App::instance()->contentExtension()])) {
    +        if (V::in($extension, ['php', 'phar', 'html', 'htm', 'exe', App::instance()->contentExtension()])) {
                 throw new InvalidArgumentException([
                     'key'  => 'file.extension.forbidden',
                     'data' => ['extension' => $extension]
                 ]);
             }
     
    -        if (Str::contains($extension, 'php')) {
    +        if (Str::contains($extension, 'php') || Str::contains($extension, 'phar')) {
                 throw new InvalidArgumentException([
                     'key'  => 'file.type.forbidden',
                     'data' => ['type' => 'PHP']
    @@ -200,6 +198,22 @@ public static function validExtension(File $file, string $extension): bool
             return true;
         }
     
    +    /**
    +     * Validates the extension, MIME type and filename
    +     *
    +     * @param \Kirby\Cms\File $file
    +     * @param string|null $mime If not passed, the MIME type is detected from the file
    +     * @return bool
    +     * @throws \Kirby\Exception\InvalidArgumentException If the extension, MIME type or filename is missing or forbidden
    +     */
    +    public static function validFile(File $file, ?string $mime = null): bool
    +    {
    +        return
    +            static::validExtension($file, $file->extension()) &&
    +            static::validMime($file, $mime ?? $file->mime()) &&
    +            static::validFilename($file, $file->filename());
    +    }
    +
         /**
          * Validates the filename
          *
    @@ -208,7 +222,7 @@ public static function validExtension(File $file, string $extension): bool
          * @return bool
          * @throws \Kirby\Exception\InvalidArgumentException If the filename is missing or forbidden
          */
    -    public static function validFilename(File $file, string $filename)
    +    public static function validFilename(File $file, string $filename): bool
         {
             // make it easier to compare the filename
             $filename = strtolower($filename);
    @@ -247,7 +261,7 @@ public static function validFilename(File $file, string $filename)
          * @return bool
          * @throws \Kirby\Exception\InvalidArgumentException If the MIME type is missing or forbidden
          */
    -    public static function validMime(File $file, string $mime = null)
    +    public static function validMime(File $file, string $mime = null): bool
         {
             // make it easier to compare the mime
             $mime = strtolower($mime);
    
  • src/Cms/Media.php+3 0 modified
    @@ -70,6 +70,9 @@ public static function link(Model $model = null, string $hash, string $filename)
          */
         public static function publish(File $file, string $dest): bool
         {
    +        // never publish risky files (e.g. HTML, PHP or Apache config files)
    +        FileRules::validFile($file);
    +
             $src       = $file->root();
             $version   = dirname($dest);
             $directory = dirname($version);
    
  • tests/Cms/Files/FileRulesTest.php+62 0 modified
    @@ -190,8 +190,10 @@ public function extensionProvider()
                 ['htm', false, 'The extension "htm" is not allowed'],
                 ['html', false, 'The extension "html" is not allowed'],
                 ['php', false, 'The extension "php" is not allowed'],
    +            ['phar', false, 'The extension "phar" is not allowed'],
                 ['exe', false, 'The extension "exe" is not allowed'],
                 ['php4', false, 'You are not allowed to upload PHP files'],
    +            ['1phar2', false, 'You are not allowed to upload PHP files'],
             ];
         }
     
    @@ -213,6 +215,66 @@ public function testValidExtension($extension, $expected, $message = null)
             $this->assertTrue($result);
         }
     
    +    public function fileProvider()
    +    {
    +        return [
    +            // valid examples
    +            ['test.jpg', 'jpg', 'image/jpeg', true],
    +            ['abc.png', 'png', 'image/png', true],
    +
    +            // extension
    +            ['test', '', 'text/plain', false, 'The extensions for "test" is missing'],
    +            ['test.htm', 'htm', 'text/plain', false, 'The extension "htm" is not allowed'],
    +            ['test.html', 'html', 'text/plain', false, 'The extension "html" is not allowed'],
    +            ['test.php', 'php', 'text/plain', false, 'The extension "php" is not allowed'],
    +            ['test.phar', 'phar', 'text/plain', false, 'The extension "phar" is not allowed'],
    +            ['test.exe', 'exe', 'text/plain', false, 'The extension "exe" is not allowed'],
    +            ['test.php4', 'php4', 'text/plain', false, 'You are not allowed to upload PHP files'],
    +            ['test.1phar2', '1phar2', 'text/plain', false, 'You are not allowed to upload PHP files'],
    +
    +            // mime
    +            ['test', 'jpg', '', false, 'The media type for "test" cannot be detected'],
    +            ['test.jpg', 'jpg', 'application/php', false, 'You are not allowed to upload PHP files'],
    +            ['test.jpg', 'jpg', 'text/html', false, 'The media type "text/html" is not allowed'],
    +            ['test.jpg', 'jpg', 'application/x-msdownload', false, 'The media type "application/x-msdownload" is not allowed'],
    +
    +            // filename
    +            ['', 'jpg', 'image/jpg', false, 'The filename must not be empty'],
    +            ['.htaccess', 'htaccess', 'application/x-apache', false, 'You are not allowed to upload Apache config files'],
    +            ['.htpasswd', 'htpasswd', 'application/x-apache', false, 'You are not allowed to upload Apache config files'],
    +            ['.gitignore', 'gitignore', 'application/x-git', false, 'You are not allowed to upload invisible files'],
    +
    +            // rule order
    +            ['.test.htm', 'htm', 'application/php', false, 'The extension "htm" is not allowed'],
    +            ['.test.htm', 'jpg', 'application/php', false, 'You are not allowed to upload PHP files'],
    +            ['.test.htm', 'jpg', 'text/plain', false, 'You are not allowed to upload invisible files'],
    +        ];
    +    }
    +
    +    /**
    +     * @dataProvider fileProvider
    +     */
    +    public function testValidFile($filename, $extension, $mime, $expected, $message = null)
    +    {
    +        $file = $this->getMockBuilder(File::class)
    +            ->disableOriginalConstructor()
    +            ->onlyMethods(['filename', 'extension'])
    +            ->addMethods(['mime'])
    +            ->getMock();
    +        $file->method('filename')->willReturn($filename);
    +        $file->method('extension')->willReturn($extension);
    +        $file->method('mime')->willReturn($mime);
    +
    +        if ($expected === false) {
    +            $this->expectException('Kirby\Exception\InvalidArgumentException');
    +            $this->expectExceptionMessage($message);
    +        }
    +
    +        $result = FileRules::validFile($file);
    +
    +        $this->assertTrue($result);
    +    }
    +
         public function filenameProvider()
         {
             return [
    
  • vendor/composer/autoload_real.php+3 0 modified
    @@ -13,6 +13,9 @@ public static function loadClassLoader($class)
             }
         }
     
    +    /**
    +     * @return \Composer\Autoload\ClassLoader
    +     */
         public static function getLoader()
         {
             if (null !== self::$loader) {
    
  • vendor/composer/ClassLoader.php+1 1 modified
    @@ -60,7 +60,7 @@ class ClassLoader
         public function getPrefixes()
         {
             if (!empty($this->prefixesPsr0)) {
    -            return call_user_func_array('array_merge', $this->prefixesPsr0);
    +            return call_user_func_array('array_merge', array_values($this->prefixesPsr0));
             }
     
             return array();
    
5a569d4e3dda

Prevent phar upload in file upload validation

https://github.com/getkirby-v2/panelBastian AllgeierDec 1, 2020via ghsa
1 file changed · +9 9
  • app/src/panel/models/page/uploader.php+9 9 modified
    @@ -1,4 +1,4 @@
    -<?php 
    +<?php
     
     namespace Kirby\Panel\Models\Page;
     
    @@ -27,7 +27,7 @@ public function __construct($page, $file = null) {
         if($this->file) {
           $this->replace();
         } else {
    -      $this->upload();      
    +      $this->upload();
         }
     
       }
    @@ -55,7 +55,7 @@ public function upload() {
         // create the initial meta file
         // without triggering the update hook
         try {
    -      $file->createMeta(false);      
    +      $file->createMeta(false);
         } catch(Exception $e) {
           // don't react on meta errors
           // the meta file can still be generated later
    @@ -64,13 +64,13 @@ public function upload() {
         // make sure that the file is being marked as updated
         touch($file->root());
     
    -    kirby()->trigger($event, $file);          
    +    kirby()->trigger($event, $file);
     
       }
     
       public function replace() {
     
    -    $file   = $this->file;    
    +    $file   = $this->file;
         $upload = new Upload($file->root(), array(
           'overwrite' => true,
           'accept' => function($upload) use($file) {
    @@ -135,7 +135,7 @@ public function move($upload, $event) {
       public function checkUpload($file) {
     
         $filesettings        = $this->blueprint->files();
    -    $forbiddenExtensions = array('php', 'html', 'htm', 'exe', kirby()->option('content.file.extension', 'txt'));
    +    $forbiddenExtensions = array('php', 'phar', 'html', 'htm', 'exe', kirby()->option('content.file.extension', 'txt'));
         $forbiddenMimes      = array_merge(f::$mimes['php'], array('text/html', 'application/x-msdownload'));
         $extension           = strtolower($file->extension());
     
    @@ -150,7 +150,7 @@ public function checkUpload($file) {
         }
     
         // especially block any connection that contains php
    -    if(str::contains($extension, 'php')) {
    +    if(str::contains($extension, 'php') || str::contains($extension, 'phar')) {
           throw new Exception(l('files.add.error.extension.forbidden'));
         }
     
    @@ -187,8 +187,8 @@ public function checkUpload($file) {
         // Files blueprint option 'height'
         if($file->type() == 'image' and $filesettings->height() and $file->height() > $filesettings->height()) {
           throw new Exception('Page only allows image height of ' . $filesettings->height().'px');
    -    } 
    +    }
     
       }
     
    -}
    \ No newline at end of file
    +}
    

Vulnerability mechanics

Generated by null/stub on May 9, 2026. Inputs: CWE entries + fix-commit diffs from this CVE's patches. Citations validated against bundle.

References

8

News mentions

0

No linked articles in our index yet.