<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Le blog de John Jean &#187; locale inclusion</title>
	<atom:link href="http://www.john-jean.com/blog/tag/locale-inclusion/feed" rel="self" type="application/rss+xml" />
	<link>http://www.john-jean.com/blog</link>
	<description>Actualité de sécurité informatique</description>
	<lastBuildDate>Wed, 19 May 2010 09:19:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0</generator>
		<item>
		<title>Denial of service PHP sur toutes les versions inférieures à 5.3.1</title>
		<link>http://www.john-jean.com/blog/securite-informatique/denial-of-service-php-sur-toutes-les-versions-inferieures-a-5-3-1-301</link>
		<comments>http://www.john-jean.com/blog/securite-informatique/denial-of-service-php-sur-toutes-les-versions-inferieures-a-5-3-1-301#comments</comments>
		<pubDate>Mon, 23 Nov 2009 08:46:36 +0000</pubDate>
		<dc:creator>John JEAN</dc:creator>
				<category><![CDATA[Sécurité informatique]]></category>
		<category><![CDATA[acunetix]]></category>
		<category><![CDATA[denial of service]]></category>
		<category><![CDATA[dos]]></category>
		<category><![CDATA[execution de code]]></category>
		<category><![CDATA[exploit]]></category>
		<category><![CDATA[faille]]></category>
		<category><![CDATA[faille php]]></category>
		<category><![CDATA[fichiers temporaires]]></category>
		<category><![CDATA[locale inclusion]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://www.john-jean.com/blog/securite-informatique/denial-of-service-php-sur-toutes-les-versions-inferieures-a-5-3-1-301</guid>
		<description><![CDATA[Un advisory concernant les releases PHP antérieures à la version 5.3.1 a été publié ce vendredi. En effet, la 5.3.1 contient un patch pour un DoS ayant été reporté le 27 Octobre 2009. Le problème concerne le support de la RFC 1867 dans PHP (Formulaire d&#8217;upload HTML). &#160; &#160; Concept Lorsque l&#8217;on envoie une requête [...]]]></description>
			<content:encoded><![CDATA[<p><img alt="logo php" align="left" src="http://www.john-jean.com/blog/wp-content/uploads/2009/11/logo_php.gif" width="165" height="124" />Un advisory concernant les releases PHP antérieures à la version 5.3.1 a été publié ce vendredi. En effet, la 5.3.1 contient un patch pour un DoS ayant été reporté le 27 Octobre 2009. Le problème concerne le support de la <a href="http://www.ietf.org/rfc/rfc1867.txt" target="_blank">RFC 1867</a> dans PHP (Formulaire d&#8217;upload HTML).</p>
<p><span id="more-301"></span>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p><strong>Concept</strong></p>
<p>Lorsque l&#8217;on envoie une requête POST à un script PHP avec le content-type &laquo;&nbsp;multipart/form-data&nbsp;&raquo; et que l&#8217;on inclut une liste de fichiers dans cette requête, PHP crée un fichier temporaire pour chaque fichier de la requête. PHP crée ces fichiers sans même regarder si le script supporte l&#8217;upload de fichiers. Après l&#8217;exécution du script, les fichiers temporaires sont normalement effacés.</p>
<p>Le problème vient donc du fait que si vous incluez un très grand nombre de fichiers dans la requête, PHP a besoin de créer ces fichiers avant l&#8217;exécution du script et donc la suppression qui devrait en découler.</p>
<p>Le denial of service apparait lorsque l&#8217;on crée bons nombres de requêtes (ca rappelle vaguement la <a title="faille wordpress" href="http://www.john-jean.com/blog/securite-informatique/wordpress-exhaustion-exploit-dans-toutes-les-versions-de-wordpress-254" target="_blank">faille wordpress</a>, et la plupart des <a href="http://fr.wikipedia.org/wiki/Attaque_par_d%C3%A9ni_de_service" target="_blank">DoS</a> bien entendu), et que chaque requête contient beaucoup de fichiers à traiter (+15000).</p>
<p>Lorsque vous envoyez cette requête au serveur web, il s&#8217;écroule et cesse de répondre car il doit processer un énorme nombre de fichiers (création / suppression) dans un très court délai.</p>
<p>N&#8217;importe quel site tournant sous PHP et où l&#8217;upload de fichier est activé (configuration par défaut) est vulnérable. Il n&#8217;est pas nécessaire d&#8217;avoir un formulaire d&#8217;upload pour exécuter l&#8217;exploit. Cette faille est donc critique. J&#8217;ai d&#8217;ailleurs lu dans mes RSS d&#8217;hier qu&#8217;<a href="http://www.ovh.com" target="_blank">OVH</a> organisait une patch party cette nuit, je suppose que c&#8217;est pour protéger ses mutualisés de cette faille.</p>
<p>PHP intègre deux paramètres de configuration qui ont attrait à l&#8217;upload:<br />
<code><br />
upload_max_filesize<br />
post_max_size<br /></code><br />
Cependant, ces deux paramètres ne sont pas suffisants pour enrayer ce DoS.</p>
<p>&nbsp;</p>
<p><strong>Notions d&#8217;enrayement</strong></p>
<p>Trois workarounds sont proposés concernant cette faille:</p>
<ul>
<li><span style="TEXT-DECORATION: underline">Désactiver l&#8217;upload de fichier<br /></span>Si vous n&#8217;avez pas besoin d&#8217;uploader des fichiers sur votre dédié, vous pouvez donc désactiver cette fonctionnalité.<br />
file_uploads = Off dans le php.ini</li>
</ul>
<p>&nbsp;</p>
<ul>
<li><span style="TEXT-DECORATION: underline">Installer PHP 5.3.1<br /></span>Si vous ne pouvez pas désactiver l&#8217;upload de fichiers, alors il convient d&#8217;upgrader PHP à la version 5.3.1.
<p>Cette nouvelle version intègre un patch pour la faille:<br />
En effet; max_file_uploads a été ajouté et permet de définir le nombre maximum de fichiers à processer à la fois (limité à 20 par défaut) afin d&#8217;enrayer les possibilités de DoS par trop grand nombre de fichiers temporaires.</li>
</ul>
<p>&nbsp;</p>
<ul>
<li><span style="TEXT-DECORATION: underline">Installer Suhosin PHP Extension /!\<br /></span>L&#8217;extension Suhosin possède une option nommée &laquo;&nbsp;suhosin.upload.max_uploads&nbsp;&raquo;. Cette option définit le nombre maximum de fichiers qui peuvent être uploadés par requête, définit par défaut à 25.<br />
/!\Suhoshin PHP extension ne doit pas être confondu avec Suhosin patch qui ne protège pas de cette attaque mais est assez largement déployé sur les serveurs de productions.</li>
</ul>
<p>&nbsp;</p>
<p>&nbsp;</p>
<p>
<strong>Tests dans des environnements de production</strong></p>
<ul>
<li style="LIST-STYLE-TYPE: none"></li>
<li><span style="TEXT-DECORATION: underline">PHP on Linux (Ubuntu 8.10) / PHP Version 5.2.6-2ubuntu4.3</span></li>
</ul>
<p>
<code><br />
Timeline:<br />
14:50 – started the attack<br />
14:51 : web server is no longer responsive.<br />
load average: 102.02, 30.68, 10.68<br />
14:52 : web server is not responsive.<br />
load average: 129.95, 49.29, 18.05<br />
14:52 – attack is aborted<br />
14:53 – web server is not responsive.<br />
load average: 143.58, 67.90, 26.41<br />
14:54 – web server is not responsive.<br />
load average: 149.60, 89.58, 37.93<br />
16:05 – web server is not responsive.<br />
load average: 151.64, 120.91, 60.94<br /></code></p>
<p>Vérification du nombre de fichiers temporaires crée par l&#8217;auteur:<br />
<code><br />
$ls -la /tmp/php* | wc -l<br />
-bash: /bin/ls: Argument list too long<br />
0<br /></code><br />
Création d&#8217;un fichier pour compter le nombre de fichiers crées:<br />
<code><br />
$php count_files_from_dir.php /tmp/php*<br />
2.419.649<br /></code><br />
Donc une heure après, le serveur ne répond toujours pas et 2.419.649 fichiers temporaires ont été crées.</p>
<p>&nbsp;</p>
<p>Si l&#8217;on redémarre le serveur, ces fichiers ne sont pas effacés.</p>
<ul>
<li style="LIST-STYLE-TYPE: none"></li>
<li><span style="TEXT-DECORATION: underline">PHP on FreeBSD 7.2 / PHP Version 5.2.9</span></li>
</ul>
<p>
<code><br />
Timeline:<br />
14:00 – attack is started.<br />
14:01 – web server is no longer responsive (Chrome message: Error 101 (net::ERR_CONNECTION_RESET): Unknown error.))<br />
load average: 87:22, 22.61, 9.9<br />
14:02 – attack is aborted.<br />
14:06 – web server is no longer responsive.<br />
load averages: 45.42, 42.35, 22.59<br />
14:11 – web server is not responsive.<br />
load averages: 26.77, 35.78, 23.49<br />
The system is slowed down to a crawl.<br />
Basically you cannot even write a command in a remote PUTTY session.<br />
14:17 – web server is not responsive.<br />
The console is continuously displaying kernel error messages like:<br />
swap_pager_getswapspace(2): failed<br />
swap_pager_getswapspace(16): failed<br />
swap_pager_getswapspace(3): failed<br />
…<br />
pid 61248 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61251 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61146 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61103 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61103 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61063 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
pid 61101 (httpd), uid 80 inumber 5 on /var: out of inodes<br />
…<br />
14:23 – web server is responsive.<br />
load averages: 0.79, 29.10, 37.13</code> </p>
<p>&nbsp;</p>
<p>Même chose lorsque l&#8217;auteur tente de compter les fichiers temporaires:<br />
<code><br />
$ls -la /var/tmp/php* | wc -l<br />
-bash: /bin/ls: Argument list too long<br />
0<br />
$ls -la /var/tmp/php<br />
Display all 117490 possibilities? (y or n)<br /></code><br />
Donc nous avons 117490 fichiers temporaires sur le serveur.</p>
<ul>
<li style="LIST-STYLE-TYPE: none"></li>
<li><span style="TEXT-DECORATION: underline">PHP on Windows: XAMPP / XAMPP for Windows setup filename: xampp-win32-1.7.2.exe / PHP Version 5.3.0</span></li>
</ul>
<p>
<code><br />
Timeline:<br />
12:30 – started the attack<br />
12:30 + few seconds: CPU usage =&gt; 100%<br /></code></p>
<p>En quelques secondes, le serveur ne répond plus, 65535 fichiers temporaires sont crés et aucun autre ne peut être crée.</p>
<p>&nbsp;</p>
<p>Sur XAMPP pour Windows, PHP crée les fichiers temporaires dans C:\xampp\tmp (si votre installation est dans C:\xampp\)<br />
Les fichiers sont appelés phpXXXX.tmp (Où X’s charset est ‘a’-&#8217;z’, ‘A’-&#8217;Z’, ‘0&#8242;-’9&#8242;).<br />
Exemple: php1A00.tmp<br />
<code><br />
12:31 – attack is aborted<br />
12:39 – CPU usage is still 100%, web server is not responsive.<br />
13:08 – CPU usage is still 100%, web server is responsive.<br />
14:08 – CPU usage is 97%<br />
14:34 – CPU usage is 97%<br /></code><br />
Deux heures plus tard l&#8217;utilisation du CPU n&#8217;est pas revenue à la normale. Cependant le serveur web répond à nouveau. Après un redémarrage du serveur, l&#8217;utilisation du CPU redevient normale. Cependant les 65535 fichiers temporaires ne sont pas effacés.</p>
<ul>
<li style="LIST-STYLE-TYPE: none"></li>
<li><span style="TEXT-DECORATION: underline">PHP on OpenBSD 4.6 / PHP Version 5.2.10</span></li>
</ul>
<p>
<code><br />
Timeline:<br />
12:00 – started the attack<br />
12:00 + few seconds: CPU usage =&gt; 100%<br />
12:01 – attack is aborted<br />
12:01 – web server is no longer responsive.<br />
load averages: 120.42, 50.35, 20.59<br />
12:04 – web server is no longer responsive.<br />
load averages: 147.17, 80.74, 36.46<br />
The system is slowed down to a crawl.<br />
12:06 – web server is responsive.<br />
load averages: 122.59, 96.03, 48.31<br /></code></p>
<p>A ce point le serveur web est ralenti mais continue à servir les pages<br />
<code><br />
12:07 – web server is responsive.<br />
load averages: 63.67, 85.01, 47.26<br />
12:10 – web server is responsive.<br />
load averages: 6.56, 52.75, 40.03<br />
12:12 – web server is responsive.<br />
load averages: 0.55, 16.36, 26.50<br /></code><br />
Le système est revenu à la normale.</p>
<p>&nbsp;</p>
<p>OpenBSD gère très bien ce type d&#8217;attaque, les effets n&#8217;ont durés que quelques minutes.</p>
<p>Pourquoi cela ? Grace à Suhosin PHP extension. OpenBSD a cette extension activée par défaut.</p>
<p>&nbsp;</p>
<p><strong>Exploitation</strong></p>
<p>Dans certains cas, cette attaque peut se transformer une inclusion locale et donc en exécution de code distant. La plupart des OS n&#8217;effacent pas les fichiers temporaires crée, même après redémarrage du serveur web. De fait un grand nombre de fichiers temporaires sont laissés dans le répertoire temporaire (habituellement /tmp sur les systèmes unix). On peut donc tenter de deviner le nom de l&#8217;un de ces fichiers et de l&#8217;inclure.</p>
<p>Pour que cela fonctionne, tous les fichiers uploadés doivent contenir le code php suivant: &lt;?php eval($_REQUEST[x]); ?&gt;.</p>
<p>Sur les système tournant sous Windows, seulement quatre caractères sont utilisés pour générer les fichiers temporaires (phpXXXX.tmp). Une fois que le serveur répond à nouveau, il y a 65 535 fichiers dans le repertoire temporaire. Il est donc possible de deviner facilement le nom de l&#8217;un de ces fichiers et de l&#8217;inclure.</p>
<p>Sur unix, 6 caractères sont utilisés pour gérer les fichiers temporaires, il est donc impossible de deviner le nom de ceux-ci. Ou alors, cela prendra beaucoup de temps. L&#8217;auteur a tenté cette méthode sur un serveur ayant généré 800 000 fichiers temporaires. Après cinq minutes de tentative, il a réussi à deviner le nom d&#8217;un fichier et à exécuter du PHP.</p>
<p>Le script python permettant de générer l&#8217;attaque n&#8217;a pas été publié. Enfin, pas par l&#8217;auteur en tout cas. Cela se comprend aisément, du fait des conditions réunis: PHP largement déployé, pas besoin de formulaire d&#8217;upload, upload activé par défaut, seulement la dernière version corrige la faille, extension Suhosin non déployée par défaut sauf sur OpenBSD, de quoi faire tomber 70% des serveurs de la planète.</p>
<p>Mettez rapidement à jour vos serveurs. Un script doit déjà assez largement être distribué.</p>
<p>&nbsp;</p>
<p><strong>Références</strong></p>
<p>L&#8217;équipe d&#8217;<a href="http://www.acunetix.com" target="_blank">Acunetix</a> essentiellement connue pour son <a href="http://www.acunetix.com/vulnerability-scanner/" target="_blank">scanner de failles web</a>; devenu d&#8217;ailleurs entre temps un scanner de port, un soft d&#8217;exploitation d&#8217;injection SQL, un forgeur de packet HTTP et j&#8217;en passe; a averti l&#8217;équipe PHP le 27 octobre. L&#8217;auteur de cette découverte est <strong>bogdan</strong> de l&#8217;équipe Acunetix<strong>.</strong> On notera d&#8217;ailleurs avec intérêt qu&#8217;Acunetix n&#8217;a pas sorti l&#8217;adviso trois jours après avoir contacté le vendor; suivez mon regard :-)</p>
<p>&nbsp;</p>
<p><strong>Correction rapide</strong></p>
<p>On vient de patcher quelques serveurs, la version 5.3.1 a pas été poussée dans les dépots officiels, on a donc installé suhosin qui lui y est:<br />
apt-get install php5-suhosin<br />
(<a href="http://packages.debian.org/lenny/php5-suhosin">http://packages.debian.org/lenny/php5-suhosin</a>)</p>
<p>La configuration se passe dans /etc/php5/apache2/conf.d</p>
<p>
suhosin.upload.max_uploads<br />
Type: Integer<br />
Default: 25<br />
Defines the maximum number of files that may be uploaded with one request.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.john-jean.com/blog/securite-informatique/denial-of-service-php-sur-toutes-les-versions-inferieures-a-5-3-1-301/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>
