|
| 1 | +--TEST-- |
| 2 | +GH-9310: local_cert and local_pk do not respect open_basedir restriction |
| 3 | +--EXTENSIONS-- |
| 4 | +openssl |
| 5 | +--SKIPIF-- |
| 6 | +<?php |
| 7 | +if (!function_exists("proc_open")) die("skip no proc_open"); |
| 8 | +?> |
| 9 | +--FILE-- |
| 10 | +<?php |
| 11 | +include 'ServerClientTestCase.inc'; |
| 12 | + |
| 13 | +$baseDir = __DIR__ . '/gh9310'; |
| 14 | +@mkdir($baseDir); |
| 15 | +$baseDirCertFile = $baseDir . '/cert.crt'; |
| 16 | +$baseDirPkFile = $baseDir . '/private.key'; |
| 17 | +$certFile = __DIR__ . '/gh9310.crt'; |
| 18 | +$pkFile = __DIR__ . '/gh9310.key'; |
| 19 | + |
| 20 | +include 'CertificateGenerator.inc'; |
| 21 | +$certificateGenerator = new CertificateGenerator(); |
| 22 | +$certificateGenerator->saveNewCertAndKey('gh9310', $certFile, $pkFile); |
| 23 | + |
| 24 | +copy($certFile, $baseDirCertFile); |
| 25 | +copy($pkFile, $baseDirPkFile); |
| 26 | +copy(__DIR__ . '/sni_server_uk_cert.pem', $baseDir . '/sni_server_uk_cert.pem'); |
| 27 | + |
| 28 | + |
| 29 | +$serverCodeTemplate = <<<'CODE' |
| 30 | + ini_set('log_errors', 'On'); |
| 31 | + ini_set('open_basedir', __DIR__ . '/gh9310'); |
| 32 | + $serverUri = "ssl://127.0.0.1:64321"; |
| 33 | + $serverFlags = STREAM_SERVER_BIND | STREAM_SERVER_LISTEN; |
| 34 | + $serverCtx = stream_context_create(['ssl' => [ |
| 35 | + 'local_cert' => '%s', |
| 36 | + 'local_pk' => '%s', |
| 37 | + ]]); |
| 38 | +
|
| 39 | + $sock = stream_socket_server($serverUri, $errno, $errstr, $serverFlags, $serverCtx); |
| 40 | + phpt_notify(); |
| 41 | +
|
| 42 | + $link = stream_socket_accept($sock); |
| 43 | +CODE; |
| 44 | + |
| 45 | +$clientCode = <<<'CODE' |
| 46 | + $serverUri = "ssl://127.0.0.1:64321"; |
| 47 | + $clientFlags = STREAM_CLIENT_CONNECT; |
| 48 | +
|
| 49 | + $clientCtx = stream_context_create(['ssl' => [ |
| 50 | + 'verify_peer' => false, |
| 51 | + 'verify_peer_name' => false |
| 52 | + ]]); |
| 53 | +
|
| 54 | + phpt_wait(); |
| 55 | + @stream_socket_client($serverUri, $errno, $errstr, 2, $clientFlags, $clientCtx); |
| 56 | +CODE; |
| 57 | + |
| 58 | +$sniServerCodeV1 = <<<'CODE' |
| 59 | + ini_set('log_errors', 'On'); |
| 60 | + ini_set('open_basedir', __DIR__ . '/gh9310'); |
| 61 | + $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; |
| 62 | + $ctx = stream_context_create(['ssl' => [ |
| 63 | + 'SNI_server_certs' => [ |
| 64 | + "cs.php.net" => __DIR__ . "/sni_server_cs.pem", |
| 65 | + ] |
| 66 | + ]]); |
| 67 | +
|
| 68 | + $server = stream_socket_server('tls://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); |
| 69 | + phpt_notify(); |
| 70 | +
|
| 71 | + stream_socket_accept($server); |
| 72 | +CODE; |
| 73 | + |
| 74 | +$sniServerCodeV2 = <<<'CODE' |
| 75 | + ini_set('log_errors', 'On'); |
| 76 | + ini_set('open_basedir', __DIR__ . '/gh9310'); |
| 77 | + $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; |
| 78 | + $ctx = stream_context_create(['ssl' => [ |
| 79 | + 'SNI_server_certs' => [ |
| 80 | + "uk.php.net" => [ |
| 81 | + 'local_cert' => __DIR__ . '/gh9310/sni_server_uk_cert.pem', |
| 82 | + 'local_pk' => __DIR__ . '/sni_server_uk_key.pem', |
| 83 | + ] |
| 84 | + ] |
| 85 | + ]]); |
| 86 | +
|
| 87 | + $server = stream_socket_server('tls://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); |
| 88 | + phpt_notify(); |
| 89 | +
|
| 90 | + stream_socket_accept($server); |
| 91 | +CODE; |
| 92 | + |
| 93 | +$sniServerCodeV3 = <<<'CODE' |
| 94 | + ini_set('log_errors', 'On'); |
| 95 | + ini_set('open_basedir', __DIR__ . '/gh9310'); |
| 96 | + $flags = STREAM_SERVER_BIND|STREAM_SERVER_LISTEN; |
| 97 | + $ctx = stream_context_create(['ssl' => [ |
| 98 | + 'SNI_server_certs' => [ |
| 99 | + "us.php.net" => [ |
| 100 | + 'local_cert' => __DIR__ . '/sni_server_us_cert.pem', |
| 101 | + 'local_pk' => __DIR__ . '/sni_server_us_key.pem', |
| 102 | + ] |
| 103 | + ] |
| 104 | + ]]); |
| 105 | +
|
| 106 | + $server = stream_socket_server('tls://127.0.0.1:64321', $errno, $errstr, $flags, $ctx); |
| 107 | + phpt_notify(); |
| 108 | +
|
| 109 | + stream_socket_accept($server); |
| 110 | +CODE; |
| 111 | + |
| 112 | +$sniClientCodeTemplate = <<<'CODE' |
| 113 | + $flags = STREAM_CLIENT_CONNECT; |
| 114 | + $ctxArr = [ |
| 115 | + 'cafile' => __DIR__ . '/sni_server_ca.pem', |
| 116 | + ]; |
| 117 | +
|
| 118 | + phpt_wait(); |
| 119 | +
|
| 120 | + $ctxArr['peer_name'] = '%s'; |
| 121 | + $ctx = stream_context_create(['ssl' => $ctxArr]); |
| 122 | + @stream_socket_client("tls://127.0.0.1:64321", $errno, $errstr, 1, $flags, $ctx); |
| 123 | +CODE; |
| 124 | + |
| 125 | +$serverCode = sprintf($serverCodeTemplate, $baseDirCertFile . "\0test", $baseDirPkFile); |
| 126 | +ServerClientTestCase::getInstance()->run($clientCode, $serverCode); |
| 127 | + |
| 128 | +$serverCode = sprintf($serverCodeTemplate, $baseDirCertFile, $baseDirPkFile . "\0test"); |
| 129 | +ServerClientTestCase::getInstance()->run($clientCode, $serverCode); |
| 130 | + |
| 131 | +$serverCode = sprintf($serverCodeTemplate, $certFile, $pkFile); |
| 132 | +ServerClientTestCase::getInstance()->run($clientCode, $serverCode); |
| 133 | + |
| 134 | +$serverCode = sprintf($serverCodeTemplate, $baseDirCertFile, $pkFile); |
| 135 | +ServerClientTestCase::getInstance()->run($clientCode, $serverCode); |
| 136 | + |
| 137 | +$sniClientCode = sprintf($sniClientCodeTemplate, 'cs.php.net'); |
| 138 | +ServerClientTestCase::getInstance()->run($sniClientCode, $sniServerCodeV1); |
| 139 | + |
| 140 | +$sniClientCode = sprintf($sniClientCodeTemplate, 'uk.php.net'); |
| 141 | +ServerClientTestCase::getInstance()->run($sniClientCode, $sniServerCodeV2); |
| 142 | + |
| 143 | +$sniClientCode = sprintf($sniClientCodeTemplate, 'us.php.net'); |
| 144 | +ServerClientTestCase::getInstance()->run($sniClientCode, $sniServerCodeV3); |
| 145 | + |
| 146 | +?> |
| 147 | +--CLEAN-- |
| 148 | +<?php |
| 149 | +$baseDir = __DIR__ . '/gh9310'; |
| 150 | + |
| 151 | +@unlink(__DIR__ . '/gh9310.crt'); |
| 152 | +@unlink(__DIR__ . '/gh9310.key'); |
| 153 | +@unlink($baseDir . '/cert.crt'); |
| 154 | +@unlink($baseDir . '/private.key'); |
| 155 | +@unlink($baseDir . '/sni_server_uk_cert.pem'); |
| 156 | +@rmdir($baseDir); |
| 157 | +?> |
| 158 | +--EXPECTF-- |
| 159 | +PHP Warning: stream_socket_accept(): Path for local_cert in ssl stream context option must not contain any null bytes in %s |
| 160 | +PHP Warning: stream_socket_accept(): Unable to get real path of certificate file `%scert.crt' in %s |
| 161 | +PHP Warning: stream_socket_accept(): Failed to enable crypto in %s |
| 162 | +PHP Warning: stream_socket_accept(): Accept failed: %s |
| 163 | +PHP Warning: stream_socket_accept(): Path for local_pk in ssl stream context option must not contain any null bytes in %s |
| 164 | +PHP Warning: stream_socket_accept(): Unable to get real path of private key file `%sprivate.key' in %s |
| 165 | +PHP Warning: stream_socket_accept(): Failed to enable crypto in %s |
| 166 | +PHP Warning: stream_socket_accept(): Accept failed: %s |
| 167 | +PHP Warning: stream_socket_accept(): open_basedir restriction in effect. File(%sgh9310.crt) is not within the allowed path(s): (%sgh9310) in %s |
| 168 | +PHP Warning: stream_socket_accept(): Unable to get real path of certificate file `%sgh9310.crt' in %s |
| 169 | +PHP Warning: stream_socket_accept(): Failed to enable crypto in %s |
| 170 | +PHP Warning: stream_socket_accept(): Accept failed: %s |
| 171 | +PHP Warning: stream_socket_accept(): open_basedir restriction in effect. File(%sgh9310.key) is not within the allowed path(s): (%sgh9310) in %s |
| 172 | +PHP Warning: stream_socket_accept(): Unable to get real path of private key file `%sgh9310.key' in %s |
| 173 | +PHP Warning: stream_socket_accept(): Failed to enable crypto in %s |
| 174 | +PHP Warning: stream_socket_accept(): Accept failed: %s |
| 175 | +PHP Warning: stream_socket_accept(): open_basedir restriction in effect. File(%ssni_server_cs.pem) is not within the allowed path(s): (%sgh9310) in %s |
| 176 | +PHP Warning: stream_socket_accept(): Failed setting local cert chain file `%ssni_server_cs.pem'; file not found in %s |
| 177 | +PHP Warning: stream_socket_accept(): Failed to enable crypto in %s |
| 178 | +PHP Warning: stream_socket_accept(): Accept failed: %s |
| 179 | +PHP Warning: stream_socket_accept(): open_basedir restriction in effect. File(%ssni_server_uk_key.pem) is not within the allowed path(s): (%sgh9310) in %s |
| 180 | +PHP Warning: stream_socket_accept(): Failed setting local private key file `%ssni_server_uk_key.pem'; could not open file in %s |
| 181 | +PHP Warning: stream_socket_accept(): Failed to enable crypto in %s |
| 182 | +PHP Warning: stream_socket_accept(): Accept failed: %s |
| 183 | +PHP Warning: stream_socket_accept(): open_basedir restriction in effect. File(%ssni_server_us_cert.pem) is not within the allowed path(s): (%sgh9310) in %s |
| 184 | +PHP Warning: stream_socket_accept(): Failed setting local cert chain file `%ssni_server_us_cert.pem'; could not open file in %s |
| 185 | +PHP Warning: stream_socket_accept(): Failed to enable crypto in %s |
| 186 | +PHP Warning: stream_socket_accept(): Accept failed: %s |
0 commit comments