plg a écrit:
Bon alors, j'ai pas trop envie de toucher à random_compat (la lib que j'ai sélectionné pour générer de l'aléatoire) parce qu'il y a plus ou moins une raison pour chaque test/condition...
Ce que j'ai codé, c'est un fallback sur une autre lib, normalement moins contraignante (mais également moins "aléatoire").
Pour tester, il faut télécharger srand.php sur [Github] Secure-random-bytes-in-PHP file srand.php (clic droit "save as" sur le bouton "raw" en haut à droite). Copier le fichier srand.php dans le répertoire "include" de Piwigo.
Puis dans le fichier include/functions_session.inc.php, remplacer la fonction generate_key (ligne 63), par :Code:
function generate_key($size) { include_once(PHPWG_ROOT_PATH.'include/random_compat/random.php'); try { $bytes = random_bytes($size+10); } catch (Exception $ex) { include_once(PHPWG_ROOT_PATH.'include/srand.php'); $bytes = secure_random_bytes($size+10); } return substr( str_replace( array('+', '/'), '', base64_encode($bytes) ), 0, $size ); }
Merci pour cet patch ! Sur le sites hébergés par le Centre de Calcul du CNRS/IN2P3 j'avais le même souci et ton patch fonctionne !
srand fonctionne pour moi.
J'ai bien la page notification.php sans Fatal et en invité le hash du flux RSS est bien rafraichi.
@plg : Ton message est passé pendant que je réfléchissait et pondait ma réponse.
Je vais tester srand, qui passe dans l'ordre inverse : openssl, mcrypt, /dev/urandom
Attention : j'ai par erreur mis /dev/random dans mes messages précédent, mais c'est /dev/urandom
De ce que je viens de lire (mais tous ne sont pas d'accord) et qui confirme mon avis, open_basedir ne s'applique pas forcément à toutes les commandes PHP. Il bride ce que peu faire un script PHP par rapport aux paramètres passés dans le script à certaines commandes (fopen, fwrite...). Mais ce n'est pas parce que fopen est bridé que les fonctions de PHP et ses extensions le sont.
open_basedir n'affecte pas le code C de PHP et ses extentions. Si dans mcrypt il est codé une lecture en dure de /dev/urandom, seul les droits Linux attribués à l'utilisateur (et ses groupes) du processus PHP entreront en jeux.
Si /dev/urandom tout en étant dans l'open_basedir n'est pas lisible, mcrypt aura de grande chance d'être bloqué, mais l'absence dans l'open_basedir ne bloque pas forcément mcrypt.
Cela à donc un sens de faire appel à mcrypt quand l'open_basedir ne permet pas un accès direct à /dev/urandom.
En fait le test pour mcrypt devrait être :
if ( !function_exists('random_bytes') && PHP_VERSION_ID >= 50307 && extension_loaded('mcrypt') && (DIRECTORY_SEPARATOR !== '/' || ! $RandomCompatUrandomFailed) ) {
$RandomCompatUrandomFailed ne devant être vrai que si open_basedir contient /dev, /dev/ ou /dev/urandom et que /dev/urandom n'est pas lisible.
Idée plus complète de correction :
/** * Reading directly from /dev/urandom: */ if (DIRECTORY_SEPARATOR === '/') { // DIRECTORY_SEPARATOR === '/' on Unix-like OSes -- this is a fast // way to exclude Windows. $RandomCompatUrandom = true; // ADD 1 LINE --------------------------------------------------------------------- $RandomCompatUrandomFailed = false; $RandomCompat_basedir = ini_get('open_basedir'); if (!empty($RandomCompat_basedir)) { $RandomCompat_open_basedir = explode( PATH_SEPARATOR, strtolower($RandomCompat_basedir) ); $RandomCompatUrandom = (array() !== array_intersect( array('/dev', '/dev/', '/dev/urandom'), $RandomCompat_open_basedir )); $RandomCompat_open_basedir = null; } if ( !function_exists('random_bytes') && $RandomCompatUrandom && // REMOVE 1 LINE, ADD 1 LINE --------------------------------------------------------------------- // @is_readable('/dev/urandom') ($RandomCompatUrandomFailed = @is_readable('/dev/urandom') ) { // Error suppression on is_readable() in case of an open_basedir // or safe_mode failure. All we care about is whether or not we // can read it at this point. If the PHP environment is going to // panic over trying to see if the file can be read in the first // place, that is not helpful to us here. // See random_bytes_dev_urandom.php require_once $RandomCompatDIR.'/random_bytes_dev_urandom.php'; } // Unset variables after use $RandomCompat_basedir = null; } else { $RandomCompatUrandom = false; // ADD 1 LINE --------------------------------------------------------------------- $RandomCompatUrandomFailed = false; } /** * mcrypt_create_iv() */ if ( !function_exists('random_bytes') && PHP_VERSION_ID >= 50307 && extension_loaded('mcrypt') && // REMOVE 1 LINE, ADD 1 LINE --------------------------------------------------------------------- // (DIRECTORY_SEPARATOR !== '/' || $RandomCompatUrandom) (DIRECTORY_SEPARATOR !== '/' || ! $RandomCompatUrandomFailed) ) { // Prevent this code from hanging indefinitely on non-Windows; // see https://bugs.php.net/bug.php?id=69833 if ( DIRECTORY_SEPARATOR !== '/' || (PHP_VERSION_ID <= 50609 || PHP_VERSION_ID >= 50613) ) { // See random_bytes_mcrypt.php require_once $RandomCompatDIR.'/random_bytes_mcrypt.php'; } } $RandomCompatUrandom = null; // ADD 1 LINE --------------------------------------------------------------------- $RandomCompatUrandomFailed = null;
Bon alors, j'ai pas trop envie de toucher à random_compat (la lib que j'ai sélectionné pour générer de l'aléatoire) parce qu'il y a plus ou moins une raison pour chaque test/condition...
Ce que j'ai codé, c'est un fallback sur une autre lib, normalement moins contraignante (mais également moins "aléatoire").
Pour tester, il faut télécharger srand.php sur [Github] Secure-random-bytes-in-PHP file srand.php (clic droit "save as" sur le bouton "raw" en haut à droite). Copier le fichier srand.php dans le répertoire "include" de Piwigo.
Puis dans le fichier include/functions_session.inc.php, remplacer la fonction generate_key (ligne 63), par :
function generate_key($size) { include_once(PHPWG_ROOT_PATH.'include/random_compat/random.php'); try { $bytes = random_bytes($size+10); } catch (Exception $ex) { include_once(PHPWG_ROOT_PATH.'include/srand.php'); $bytes = secure_random_bytes($size+10); } return substr( str_replace( array('+', '/'), '', base64_encode($bytes) ), 0, $size ); }
A noter qu'entre la théorie et la pratique il y a des écarts importants parfois...
par exemple, je me suis mis dans une configuration proche de celle d'hpsam, donc avec un open_basedir sans /dev, donc pas possible de lire directement /dev/urandom. Ensuite j'ai viré le test comme suggéré par hpsam, et ça marche très bien...
J'apporte des infos mais pas une solution.
hpsam, le test que tu as commenté, il a été ajouté parce qu'apparemment si /dev/urandom n'est pas lisible, cela implique que mcrypt ne pourra pas non plus travailler car il se base dessus également.
Pour moi ça signifie donc que l'utilisation de mcrypt n'a aucun intérêt : on essaie d'utiliser mcrypt que si urandom ne marche pas, sauf que mcrypt a besoin que urandom marche. Le serpent se mord la queue...
Du coup, les utilisateurs ayant un open_basedir, sans /dev dedans, ils sont bien bloqués en théorie. Sauf flop25 qui défie les lois du code :-/
Je cherche...
ma config de manière plus complète
- Linux Debian Jessie
- L'extension libsodium n'est pas installé
- open_basedir non vide et ne contenant pas /dev, /dev/ ou /dev/random pour tous les sites D'ailleurs owncloud me le rabâche à chaque fois
- PHP 5.6.19-0+deb8u1
- Mcrypt 2.5.8 activé,
- L'extension com_dotnet n'est pas installé
Mais ton open_basedir contient-il quelque chose ?
J'ai compléter un peu plus loin en réponse à Laurent77
- Linux
- PHP supérieur à 5.3.7 et non compris entre 5.6.9 et 5.6.13
- open_basedir non vide et ne contenant pas /dev, /dev/ ou /dev/random
Je vais éditer le message pour grouper les infos.
hpsam a écrit:
J'ai jeté un coup d'oeil au fichier include/random_compat/random.php :
- L'extension libsodium n'est installé pour aucun des sites,
- /dev/urandom n'est dans l'open_basedir d'aucun des sites,
- Tous les sites ont la même conf PHP avec Mcrypt 2.5.8 activé,
- L'extension com_dotnet n'est installé pour aucun des sites.
je suis dans la même configuration mais pas de fatal error pour moi
Merci hpsam !
J'ai commenté les 2 lignes et ça a fonctionné nickel, j'ai pu envoyer mes notifs !
Merci pour ton aide
A+
Alors tu es dans le même cas que moi :
- Linux
- PHP supérieur à 5.3.7 et non compris entre 5.6.9 et 5.6.13
- open_basedir non vide et ne contenant pas /dev, /dev/ ou /dev/random
- mcrypt activé
Le script générant les nombres aléatoires, dans ce cas, saute le test de mcrypt (alors qu'il est présent) et ne trouve pas de solution pour générer le hash aléatoire pour les notifications.
J'ai filé les infos en échange direct à Pierrick @plg. J'ai une solution pour notre cas, mais je laisse le soin à la team PiWiGo de trouver une solution générique.
Solution qui a fonctionné pour moi, avec les prérequis en début de message, mais SANS AUCUNE GARANTIE pour les autres :
Dans le fichier include/random_compat/random.php commenter le test sur DIRECTORY_SEPARATOR et $RandomCompatUrandom :
if ( !function_exists('random_bytes') && PHP_VERSION_ID >= 50307 && extension_loaded('mcrypt') && (DIRECTORY_SEPARATOR !== '/' || $RandomCompatUrandom) ) {
devient (ajout de # sur 2 lignes) :
if ( !function_exists('random_bytes') && PHP_VERSION_ID >= 50307 && extension_loaded('mcrypt') # && # (DIRECTORY_SEPARATOR !== '/' || $RandomCompatUrandom) ) {
Une autre solution non testée, si tu as la main sur la configuration de l'open_basedir, est d'y ajouter /dev/random
@+
Slt
Merci pour ta réponse .
Alors pour openbasedir j'ai ça :
open_basedir /volume1/web/piwigo:/etc.defaults:/etc:/usr/syno/synoman:/var/services/tmp:/var/services/web:/var/services/homes:/volume1/photo
et pour mcrypt j'ai ça
Registered Stream Filters zlib.*, string.rot13, string.toupper, string.tolower, string.strip_tags, convert.*, consumed, dechunk, bzip2.*, convert.iconv.*, mcrypt.*, mdecrypt.*
Par contre, je n'y suis pour rien ;-)
merci pour ton aide !
A+
Slt,
Utilises-tu une configuration d'open_basedir pour ton site ?
As-tu l'extension PHP "mcrypt" d'installée ?
Tu peux trouver ces informations via le lien "Montrer les informations / Show info" sur la page d'accueil de l'administration de ta galerie. Dans les informations sur l'Environnement.
Cherches open_basedir et mcrypt dans ces informations.
@+
Bonjour
Même problème pour moi depuis la mise à jour 2.8 vers 2.8.1. Les notifications ne fonctionnent plus :
Fatal error: Uncaught exception 'Exception' with message 'There is no suitable CSPRNG installed on your system' in /volume1/web/piwigo/include/random_compat/random.php:185 Stack trace: #0 /volume1/web/piwigo/include/functions_session.inc.php(71): random_bytes(40) #1 /volume1/web/piwigo/include/functions_user.inc.php(1567): generate_key(30) #2 /volume1/web/piwigo/admin/notification_by_mail.php(295): create_user_auth_key('23', 'normal') #3 /volume1/web/piwigo/admin/notification_by_mail.php(568): do_action_send_mail_notification('send', Array, '') #4 /volume1/web/piwigo/admin.php(301): include('/volume1/web/pi...') #5 {main} thrown in /volume1/web/piwigo/include/random_compat/random.php on line 185
Installation :
Nas Synology DSM 6.0-7321 Update 6
PHP: 5.6.20 (Show info) [2016-05-07 13:19:46]
MySQL: 5.5.47-MariaDB [2016-05-07 13:19:46]
Graphics Library: GD bundled (2.1.0 compatible)
Laurent