Annonce

  •  » Installation
  •  » Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

#1 2016-05-04 20:25:03

hpsam
Membre
Gap
2005-06-28
111

Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

Bonjour

Je viens de migrer 3 sites de 2.6 vers 2.8.1 et sur l'un des 3 j'ai droit à un PHP FATAL quand je vais sur "Utilisateurs > Notifications" :
Fatal error: Uncaught exception 'Exception' with message 'There is no suitable CSPRNG installed on your system' in /home/ww/s1/include/random_compat/random.php:185
Stack trace:
#0 /home/ww/s1/include/functions_session.inc.php(71): random_bytes(26)
#1 /home/ww/s1/admin/include/functions_notification_by_mail.inc.php(53): generate_key(16)
#2 /home/ww/s1/admin/notification_by_mail.php(157): find_available_check_key()
#3 /home/ww/s1/admin/notification_by_mail.php(506): insert_new_data_user_mail_notification()
#4 /home/ww/s1/admin.php(301): include('/home/ww...')
#5 {main} thrown in /home/ww/s1/include/random_compat/random.php on line 185

Les 3 sites sont sur le même serveur, et l'un des 2 autres utilise le même utilisateur Linux avec les mêmes droits et configurations système.

J'ai désactivé mes templates personnalisés, cela ne change rien.

La différence au niveau utilisateur, c'est que sur ce site je n'ai aucun groupe d'utilisateurs contenant des utilisateurs.

Version de Piwigo: 2.8.1
Version de PHP: 5.4
Version de MySQL: 5.5

Dernière modification par hpsam (2016-05-04 20:32:50)

Hors ligne

#2 2016-05-04 21:02:31

hpsam
Membre
Gap
2005-06-28
111

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

J'ai jeté un coup d'oeil au fichier include/random_compat/random.php :

- Linux
- L'extension libsodium n'est installé pour aucun des sites,
- open_basedir non vide et ne contenant pas /dev, /dev/ ou /dev/random pour tous les sites,
- PHP supérieur à 5.3.7 et non compris entre 5.6.9 et 5.6.13,
- 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.

Mise à jour le 08/05/2016 à 19h15 pour clarifier le cas

Dernière modification par hpsam (2016-05-08 19:14:07)

Hors ligne

#3 2016-05-05 11:35:15

plg
Équipe Piwigo
Nantes, France, Europe
2002-04-05
12522

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

Bonjour hpsam,

C'est précisément la raison de la sortie hier de la 2.8.1, cette question de clef aléatoire. On utilise un nouvel algo, sensé améliorer le côté "aléatoire" (si l'aléatoire ne l'est pas vraiment, cela peut être exploité par des gens mal intentionnés).

Je vais te contacter en privé pour essayer de résoudre ça.


Historiquement, premier utilisateur connu de Piwigo ;-)

Hors ligne

#4 2016-05-07 13:20:58

Laurent77
Invité

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

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

#5 2016-05-07 15:36:06

hpsam
Membre
Gap
2005-06-28
111

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

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.

@+

Hors ligne

#6 2016-05-07 16:38:48

Laurent77
Invité

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

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+

#7 2016-05-07 21:09:24

hpsam
Membre
Gap
2005-06-28
111

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

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 :

Code:

if (
            !function_exists('random_bytes')
            &&
            PHP_VERSION_ID >= 50307
            &&
            extension_loaded('mcrypt')
            &&
            (DIRECTORY_SEPARATOR !== '/' || $RandomCompatUrandom)
        ) {

devient (ajout de # sur 2 lignes) :

Code:

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

@+

Dernière modification par hpsam (2016-05-07 21:12:48)

Hors ligne

#8 2016-05-07 21:33:10

Laurent77
Invité

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

Merci hpsam !

J'ai commenté les 2 lignes et ça a fonctionné nickel, j'ai pu envoyer mes notifs !

Merci pour ton aide

A+

#9 2016-05-08 14:10:13

flop25
Équipe Piwigo
2006-07-06
6544

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

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

Hors ligne

#10 2016-05-08 19:10:47

hpsam
Membre
Gap
2005-06-28
111

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

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.

Hors ligne

#11 2016-05-08 20:42:38

flop25
Équipe Piwigo
2006-07-06
6544

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

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é

Dernière modification par flop25 (2016-05-08 20:43:10)

Hors ligne

#12 2016-05-09 18:14:10

plg
Équipe Piwigo
Nantes, France, Europe
2002-04-05
12522

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

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...


Historiquement, premier utilisateur connu de Piwigo ;-)

Hors ligne

#13 2016-05-09 18:15:59

plg
Équipe Piwigo
Nantes, France, Europe
2002-04-05
12522

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

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...


Historiquement, premier utilisateur connu de Piwigo ;-)

Hors ligne


Notice: Undefined offset: 5 in /var/www/fr.piwigo.org/forum/include/parser.php on line 551

#14 2016-05-09 19:11:57

plg
Équipe Piwigo
Nantes, France, Europe
2002-04-05
12522

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

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
    );
}

Historiquement, premier utilisateur connu de Piwigo ;-)

Hors ligne

#15 2016-05-09 19:31:38

hpsam
Membre
Gap
2005-06-28
111

Re: Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

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 :

Code:

        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 :

Code:

        /**
         * 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;

Hors ligne

  •  » Installation
  •  » Migration 2.6 => 2.8.1 PHP Fatal sur Notifications

Pied de page des forums

Propulsé par FluxBB

github twitter newsletter Faire un don Piwigo.org © 2002-2022 · Contact