[spip-dev] S écurité et syndication

Bonjour,

Un message posté il y a quelques jours déjà par erreur sur la liste spip au
lieu de spip-dev n'a pas eut de réponse et m'intrigue.

Quelqu'un a t il une réponse à cela:

Je n'utilise pas franchement spip mais j'en ai une version pour tester
upgradée par un autre utilsateur en 1.4.

Or lors d'un debuggage de mon générateur de RSS (externe à spip), une faute
de code m'a fait laisser un " (guillemet) dans chacun des champs
/rss/channel/item/link
de telle sorte qu'il contenait
<link>http://une_url/blabla.html";</link>
or cela a fait planter la syndication de spip qui ne pouvait alors se faire
et a sortie des tombereaux d'erreur MySQL.

Intrigué, je suis allé voir le code source de spip pour trouver dans le
fichier ecrire/inc_sites.php3 la partie suivante (dans la fonction
syndic_a_jour() ):

<...>
} for($i = 0 ; $i < count($item) ; $i++){
} ereg("<title>(.*)</title>",$item[$i],$match);
} $le_titre=addslashes($match[1]);
} $match="";
} ereg("<link>(.*)</link>",$item[$i],$match);
} $le_lien=$match[1];
} $match="";
} ereg("<date>(.*)</date>",$item[$i],$match);
} $la_date=$match[1];
} $match="";
} ereg("<author>(.*)</author>",$item[$i],$match);
} $les_auteurs=addslashes($match[1]);
} $match="";
} ereg("<description[^>]*>([^<]*)</description>",$item[$i],$match);
} $la_description=addslashes($match[1]);
}
} $match="";
} if (strlen($la_date) < 4) $la_date=date("Y-m-j H:i:00");
}
} $query_deja="SELECT * FROM spip_syndic_articles WHERE

url=\"$le_lien\" AND

id_syndic=$now_id_syndic";
} $result_deja=spip_query($query_deja);
} if (mysql_num_rows($result_deja)==0){
<...>

Il s'avère que les lignes
} ereg("<link>(.*)</link>",$item[$i],$match);
} $le_lien=$match[1];
puis
} $query_deja="SELECT * FROM spip_syndic_articles WHERE

url=\"$le_lien\" AND

Ca a été corrigé. Cf.
http://listes.rezo.net/archives/spip/2002-09/msg01060.html

Merci !

@ Philippe Auriol <philippe.auriol@wanadoo.fr> :

Un message posté il y a quelques jours déjà par erreur sur la liste spip au
lieu de spip-dev n'a pas eut de réponse et m'intrigue.

-- Fil

C'est un problème plus global. Il faut faire une passe de sécurité pour
nettoyer ce genre de choses.

Il est clair qu'actuellement spip fonctionne, mais n'est pas du tout
sécurisé (sur les ", bien sûr, mais aussi sur les chemins, fichiers,
etc.)

C'est vrai que j'avais dit que j'allais le faire ... un peu débordé.

Bien sûr ! Je pensais à faire de la pmaintenance pro active, et surtout
à s'assurer de al gestion correcte de toutes les variables succeptibles
d'être modifiées par un utilisateur quelconque.

Ainsi, passer un code "malicieux" dans une URL, un bout de jaja ou
n'importe quoi d'autre.

Pas mal de choses sont interdites, mais je doute que cela soit
systématique. Il faut prendre 3/4 jours à temps plein pour auditer
l'intégralité du code de SPIP et chercher toutes les failles
potentielles. ET je sais qu'il y en a... relativement visibles. Pour le
moment, ne sont corrigées que les bugs, oublis, et le développement
relativement propre fait le reste.

Par exemeple, un "id" mysql ne se passe pas entre "", sinon tu bousilles
l'indexation.
Une varaible qui contient un nom de fichier (et encore plus sur un
filesystem accessible en lecture/ecriture) ne doit pas contenir de ../
ou de '/ ...'
Toutes les variables qui passent par la moulinette mysql doivent être
testées, pour éviter de passer du code (et avec le coup de l'id', il y a
un peu de tests à faire).

Etc...