<?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>OCTO talks ! &#187; sécurité</title>
	<atom:link href="http://blog.octo.com/tag/securite/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.octo.com</link>
	<description>Le blog d&#039;OCTO Technology, cabinet d&#039;architectes en systèmes d&#039;information</description>
	<lastBuildDate>Fri, 03 Feb 2012 13:46:10 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>GWT et sécurité, se prémunir des CSRF</title>
		<link>http://blog.octo.com/gwt-et-securite-se-premunir-des-csrf/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=gwt-et-securite-se-premunir-des-csrf</link>
		<comments>http://blog.octo.com/gwt-et-securite-se-premunir-des-csrf/#comments</comments>
		<pubDate>Fri, 09 Dec 2011 12:53:45 +0000</pubDate>
		<dc:creator>Mathieu Lorber</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[CSRF]]></category>
		<category><![CDATA[GWT]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[RIA]]></category>
		<category><![CDATA[sécurité]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=27763</guid>
		<description><![CDATA[Préambule Les applications Web enrichies, utilisant JavaScript pour mettre à jour tout ou partie d’une page web, sont officiellement nées en 2005 avec l’apparition du terme Ajax, et sont aujourd’hui communes. De ce concept sont ensuite nées les applications JavaScript « Single Page Interface », modèle dans lequel rentre l’application typique GWT. Le framework propose [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/initiation-a-la-securite-des-web-services/' rel='bookmark' title='Initiation à la sécurité des Web Services'>Initiation à la sécurité des Web Services</a></li>
<li><a href='http://blog.octo.com/securite-des-services-web-1ere-partie/' rel='bookmark' title='Sécurité des services web – 1ère partie'>Sécurité des services web – 1ère partie</a></li>
<li><a href='http://blog.octo.com/html5-offline-et-securite/' rel='bookmark' title='HTML5, offline et sécurité'>HTML5, offline et sécurité</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fgwt-et-securite-se-premunir-des-csrf%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22GWT%20et%20s%C3%A9curit%C3%A9%2C%20se%20pr%C3%A9munir%20des%20CSRF%22%20%7D);"></div>
<h2>Préambule</h2>
<p>Les applications Web enrichies, utilisant JavaScript pour mettre à jour tout ou partie d’une page web, sont officiellement nées en 2005 avec l’apparition du terme Ajax, et sont aujourd’hui communes. De ce concept sont ensuite nées les applications JavaScript « Single Page Interface », modèle dans lequel rentre l’application typique GWT. Le framework propose aujourd’hui un modèle de programmation au juste milieu entre les paradigmes du développement RDA (pour <a title="Rich Desktop Application sur Wikipedia" href="http://fr.wikipedia.org/wiki/Rich_Desktop_Application" target="_blank">Rich Desktop Application</a>) et du développement Web. Après compilation, une application GWT devient une application JavaScript tout à fait standard du point du vue du browser.</p>
<p>Les applications Ajax n’introduisent pas de <em>nouvelles</em> failles de sécurité. Techniquement, les risques et les techniques d’exploitation sont les mêmes. Si certaines failles sont affaiblies par le modèle, d’autres ont vu leur terrain de jeu évoluer.</p>
<p>Le but de cet article et d&#8217;un autre à venir est de rappeler les failles de sécurité qui concernent tout particulièrement la portion JavaScript – et donc GWT – de nos applications Web, puis de présenter les réponses qu’il convient de mettre en œuvre dans une application GWT pour contrecarrer les éventuelles attaques.</p>
<p><span id="more-27763"></span></p>
<p>En point de départ, nous nous appuierons sur l’<a title="Site officiel de l'OWASP" href="https://www.owasp.org/" target="_blank">OWASP</a> &amp; son <a title="OWASP Top 10 2010 des failles des applications Web" href="https://www.owasp.org/index.php/Top_10_2010" target="_blank">top ten 2010</a> des failles de sécurité des applications Web :</p>
<ol>
<li><a title="Top 10 2010-A1" href="https://www.owasp.org/index.php/Top_10_2010-A1" target="_blank">Injection</a></li>
<li><a title="Top 10 2010-A2" href="https://www.owasp.org/index.php/Top_10_2010-A2" target="_blank">Cross-Site Scripting (XSS)</a></li>
<li><a title="Top 10 2010-A3" href="https://www.owasp.org/index.php/Top_10_2010-A3" target="_blank">Broken Authentication and Session Management</a></li>
<li><a title="Top 10 2010-A4" href="https://www.owasp.org/index.php/Top_10_2010-A4" target="_blank">Insecure Direct Object References</a></li>
<li><a title="Top 10 2010-A5" href="https://www.owasp.org/index.php/Top_10_2010-A5" target="_blank">Cross-Site Request Forgery (CSRF)</a></li>
<li><a title="Top 10 2010-A6" href="https://www.owasp.org/index.php/Top_10_2010-A6" target="_blank">Security Misconfiguration</a></li>
<li><a title="Top 10 2010-A7" href="https://www.owasp.org/index.php/Top_10_2010-A7" target="_blank">Insecure Cryptographic Storage</a></li>
<li><a title="Top 10 2010-A8" href="https://www.owasp.org/index.php/Top_10_2010-A8" target="_blank">Failure to Restrict URL Access</a></li>
<li><a title="Top 10 2010-A9" href="https://www.owasp.org/index.php/Top_10_2010-A9" target="_blank">Insufficient Transport Layer Protection</a></li>
<li><a title="Top 10 2010-A10" href="https://www.owasp.org/index.php/Top_10_2010-A10" target="_blank">Unvalidated Redirects and Forwards</a></li>
</ol>
<p>Deux de ces failles potentielles nous concernent tout particulièrement dans une couche Ajax : les failles XSS [2] et CSRF [5]. Elles auront dans ce contexte la particularité sympathique de rendre l&#8217;application vulnérable quelles que soient les protections mises en place uniquement côté serveur. Leur compréhension et la connaissance des mécanismes de protection par le développeur sont donc essentielles. Dans ce premier article, nous nous focaliserons sur les attaques de type CSRF.</p>
<p>A l&#8217;écriture de ces lignes, la version courante de GWT est la 2.4.</p>
<h2>CSRF : Cross Site Request Forgery</h2>
<p><em>Traduire avec élégance par &laquo;&nbsp;falsification de requête inter-site&nbsp;&raquo;.</em></p>
<p>Une attaque CSRF consiste à utiliser les autorisations qu’a un utilisateur sur un site donné contre son gré. Il s’agit de construire sur un domaine sous le contrôle de l’attaquant une requête vers le site attaqué ; la requête sera soumise par le browser de l’utilisateur victime, et exécutée avec les droits de ce dernier. Si le cookie permet de s’assurer que la requête provient du browser du bon utilisateur, il ne permet pas de vérifier que l’appel provient du bon site&#8230;</p>
<h3>La same origin policy</h3>
<p>Petit rappel des règles du jeu. Tout browser se doit de restreindre les capacités de JavaScript à la same origin policy. Cette règle rend impossible un appel asynchrone via XMLHttpRequest sur un autre domaine. Toute manipulation du DOM est aussi restreinte : une iframe ayant pour source une page sur un autre domaine ne sera ni lisible ni pilotable par un script de la page parente.</p>
<p>Il s’agit bien d’empêcher la lecture d’une requête provenant d’un autre domaine : initier la requête est possible (et heureusement), pas <em>traiter</em> son résultat. C’est sur cet état de fait que s’appuient les attaques CSRF.</p>
<h3>Une attaque CSRF typique : c’est l’histoire d’un steak</h3>
<p>Plantons le décor. Ghislain est boucher, sur son site <em>myboucher.com</em>, il vend des bavettes. Georges, qui possède une brasserie, est son premier client. Richard est boucher lui aussi, mais jalouse Ghislain. A ses heures perdues, il lit des articles underground de l’internet mondial. Et agit secrètement sur <em>iamthevilain.com</em>.</p>
<p>Voici l&#8217;histoire de son attaque contre le site de Ghislain. Georges est sa première victime.</p>
<p><a href="http://blog.octo.com/wp-content/uploads/2011/12/csrf-big.jpg" rel="lightbox"><img title="CSRF" src="http://blog.octo.com/wp-content/uploads/2011/11/csrf.jpg" alt="Le scénario d'une attaque CSRF" width="600" height="292" /></a></p>
<ol>
<li>Georges se connecte sur <em>myboucher.com</em>. Il s’authentifie : login/mot de passe, qui ne seront pas divulgués dans cet article. Son browser reçoit alors un cookie de session ; ce dernier sera systématiquement envoyé par toute requête sur myboucher.com</li>
<li>Ce qu’il a fait sur <em>myboucher.com</em> précisément ne nous regarde pas, mais il ne s&#8217;est pas déconnecté. Plus tard, du fait d&#8217;un mail d&#8217;origine inconnue, il atterri sur la page <em>http://iamthevilain.com/hack-myboucher.action</em> . Sur cette page se trouve un formulaire qui correspond très précisément à celui qui est existe sur <em>myboucher.com</em> pour supprimer l&#8217;intégralité des informations du compte de l&#8217;utilisateur courant. Les champs sont identiques, et l&#8217;attribut HTML <em>action</em> du formulaire pointe sur la page correspondant à la suppression sur <em>myboucher.com</em>. Le formulaire est placé dans une frame invisible.</li>
<li>Un code JavaScript soumet automatiquement le formulaire, en JavaScript, sans que Georges ne fasse quoi que ce soit. Une requête POST parfaitement valide, ordonnant une suppression de compte est alors soumise à <em>myboucher.com</em>, avec le cookie qui authentifie Georges. Notre brasseur n’a plus de compte, et du fait de la frame, il ne s’est aperçu de rien.<br />
Ghislain perd bon nombre de ses comptes utilisateurs, sans pouvoir fournir à ces derniers la moindre explication.</li>
</ol>
<p>Il est à noter que l’attaque CSRF n’a de sens que sur des utilisateurs connectés avec des droits spécifiques (dans 99,72% des cas). D&#8217;ailleurs, elle est d’autant plus dévastatrice que la victime a de droits sur le site. L’ensemble des protections est basé sur le fait que la victime potentielle dispose d’une session sur le serveur.</p>
<h3>CSRF &amp; HTTP</h3>
<p>Dans le scenario ci-dessus, j’ai volontairement pris l’exemple d’une action nécessitant une requête POST. L’attaque CSRF la plus basique se base sur une requête GET. En effet, pour faire une requête GET sur un autre domaine sans que l’utilisateur ne puisse s’en apercevoir, il suffit d’utiliser une frame, une image… C&#8217;est possible dans un simple mail !</p>
<p>Sauf qu&#8217;une telle attaque CSRF ne devrait pas avoir de sens : une action d’<em>écriture</em> ne devrait jamais être faite via une requête GET. Une requête GET doit toujours pouvoir être exécutée sans mettre en question l’intégrité de vos données. C’est un des principes de HTTP (cf. la <a title="RFC HTTP au sujet des requêtes GET" href="http://tools.ietf.org/html/rfc2616#section-9.1.1" target="_blank">RFC</a>), sur lequel est basée la conception des moteurs de recherche, des browsers, etc… Par exemple, un browser aura le droit de précharger les ressources trouvées en lien sur une page : imaginez les dégâts d’un simple lien &laquo;&nbsp;supprimer mon compte&nbsp;&raquo;. Derrière ce lien devrait en fait se cacher un formulaire HTML et une requête POST. Pour cette raison, ce sont uniquement les requêtes POST que nous voudrons protéger.</p>
<h3>Utiliser le referer ? Non</h3>
<p>Dans la définition d&#8217;HTTP se trouve un champ de header destiné à contenir l&#8217;URL de la page qui a initié la requête pour le browser, il s&#8217;agit du referer. C&#8217;est ce champ qui permet par exemple aux outils de statistiques de dire d&#8217;où vient un visiteur. On pourrait dès lors vouloir s&#8217;appuyer sur ce champ pour se prémunir des CSRF. Lors d&#8217;une soumission de formulaire depuis un site étranger, le referer devrait <em>normalement</em> contenir l&#8217;url de la page dans laquelle se trouvait le formulaire initial. C&#8217;est ce &laquo;&nbsp;<em>normalement</em>&nbsp;&raquo; qui nous arrêtera là. Dans la pratique, le referer ne sera pas toujours alimenté, de plus, certaines versions d&#8217;Internet Explorer et du player Flash contiennent des failles permettant la construction d&#8217;attaque CSRF avec manipulation des headers.</p>
<h3>Les techniques de protection.</h3>
<p>Dans une application WEB standard, les requêtes POST sont soumises par les formulaires, et la protection aux CSRF passe par l’utilisation d’un jeton. Ce dernier est généré de façon non prédictive côté serveur, et conservé dans la session utilisateur (ou directement construit à partir de l’identifiant de session, typiquement un hash). Il est donc associé à une session donnée. Lors de la construction d&#8217;un formulaire dans une page HTML, toujours côté serveur, il est injecté dans un champ caché (<em>&lt;input type=&nbsp;&raquo;hidden&nbsp;&raquo; &#8230; /&gt;</em>). Sa présence est vérifiée à la soumission du formulaire. Du fait de la same origin policy, il est impossible à l&#8217;attaquant potentiel de récupérer un jeton. Il ne peut dès lors plus construire un formulaire contenant un jeton valide pour une quelconque session existante.</p>
<p>Les applications Ajax utilisent l&#8217;objet XMLHttpRequest pour faire des appels HTTP sans recharger la page web, et traiter le résultat de façon asynchrone. Si elles ne sont pas faites de la même façon, il s&#8217;agit des mêmes requêtes POST que celles des formulaires. La technique de protection sera la même, et il faudra utiliser un jeton conservé en session. XMLHttpRequest permettant la manipulation des headers HTTP, cette capacité sera souvent utilisée pour glisser le jeton dans un header dédié et ne pas polluer le corps de requête.</p>
<p>La plupart des frameworks web classique récents (Rails, Django, Symfony, ASP.NET MVC, ou encore Seam dans le monde Java, dont les frameworks sont plus globalement de mauvais élèves) proposent une solution de jeton intégrée aux formulaires, plus ou moins transparente pour le développeur. A contrario, les frameworks JavaScript, s’ils simplifient généralement les opérations de requêtes asynchrones, n’apportent pas de solution prémâchée. « Normal », puisque cette intégration passe aussi par l’implémentation côté serveur. A noter le cas de Rails, qui intègre nativement une protection pour la partie Javascript : le token est fourni via une balise dans le HTML, et l&#8217;objet JavaScript XMLHttpRequest est enrichi par le framework pour que le token soit systématiquement glissé dans les headers HTTP. Comme pour un formulaire standard, l&#8217;ensemble est totalement transparent pour le développeur !</p>
<p>GWT dans cet environnement a un côté vicieux. Le développeur GWT écrit bien souvent des requêtes RPC, et &laquo;&nbsp;ignore&nbsp;&raquo; le fait que ces requêtes sont techniquement des requêtes POST tout à fait standards, utilisant l&#8217;objet XMLHttpRequest. On pourra d&#8217;ailleurs faire un rapide aparté sur les applications basée sur Flash, et donc Flex, qui utilisent les mêmes requêtes, sans que les frameworks communément utilisés ne poussent de solution intégrée.</p>
<h3>Que faire avec GWT ?</h3>
<h4>GWT-RPC</h4>
<p>Il convient tout d’abord de souligner que GWT propose nativement une première ligne de défense en RPC. Le nom d&#8217;un des fichiers chargés par le bootstrap interne GWT (pour être plus précis, le nom de la permutation correspondante dans le mécanisme de <a title="Deferred Binding" href="http://code.google.com/webtoolkit/doc/latest/DevGuideCodingBasics.html#DevGuideDeferredBinding" target="_blank">Deferred Binding</a> du compilateur) est systématiquement envoyé dans un header HTTP dédié lors de toute requête RPC (qui est encore une fois une requête faite via XMLHttpRequest). En son absence ou cas de valeur inattendue, la servlet lance une <em>SecurityException</em> ; le traitement s&#8217;arrête là. Ce simple ajout du header complique la tâche au potentiel attaquant. En effet, l&#8217;attaque CSRF par requête POST passe par la soumission d&#8217;un formulaire, le XMLHttpRequest cross-domain est interdit. Or l&#8217;ajout d&#8217;un header HTTP n&#8217;est pas possible dans un formulaire HTML.</p>
<p>Cependant, comme nous l&#8217;avons vu lors de l&#8217;élimination du referer dans notre stratégie de sécurisation, des configurations permettront cet ajout. Il ne suffit donc pas pour une protection exhaustive.</p>
<p>Depuis sa version 2.3, le framework propose un mécanisme plus complet. C’est un hash MD5 de l’identifiant de session qui est envoyé avec les requêtes RPC, sa présence est automatiquement contrôlée par le service GWT. L&#8217;interface d&#8217;un service protégé et son implémentation hériteront respectivement d&#8217;une interface et d&#8217;une classe spécifique. Enfin, une servlet sera dédiée à la récupération du jeton. La mise en place exacte d&#8217;un service RPC jouissant de ce mécanisme passe par les opérations suivantes :</p>
<h5>Définition de l&#8217;interface du service</h5>
<pre class="brush:java">// à noter que les développeurs GWT ont préféré l'appellation XSRF - plus rare - à CSRF
public interface SecuredService extends XsrfProtectedService {
	void doSomethingReallyImportant();
}</pre>
<h5>Implémentation du service</h5>
<pre class="brush:java">public class SecuredServiceImpl extends XsrfProtectedServiceServlet implements SecuredService{

    @Override
    public void doSomethingReallyImportant() {
        yeahNowWeAreReallyGonnaDoIt();
    }

    // [...]

}</pre>
<h5>Déclaration de la servlet délivrant le jeton (token)</h5>
<p>Dans le web.xml :</p>
<pre class="brush:xml">&lt;context-param&gt;
	&lt;param-name&gt;gwt.xsrf.session_cookie_name&lt;/param-name&gt;
	&lt;param-value&gt;JSESSIONID&lt;/param-value&gt;
&lt;/context-param&gt;&lt;servlet&gt;
	&lt;servlet-name&gt;XsrfTokenServiceServlet&lt;/servlet-name&gt;
	&lt;servlet-class&gt;com.google.gwt.user.server.rpc.XsrfTokenServiceServlet&lt;/servlet-class&gt;
&lt;/servlet&gt;
&lt;servlet-mapping&gt;
	&lt;servlet-name&gt;XsrfTokenServiceServlet&lt;/servlet-name&gt;
	&lt;url-pattern&gt;/xsrfTokenService&lt;/url-pattern&gt;
&lt;/servlet-mapping&gt;</pre>
<h5>Définition du nom du cookie à utiliser</h5>
<p>Le nom du cookie à utiliser est aussi déclaré dans le web.xml. Au besoin il serait possible de créer un cookie dédié à cela, indépendamment de la session.</p>
<pre class="brush:xml">&lt;context-param&gt;
	&lt;param-name&gt;gwt.xsrf.session_cookie_name&lt;/param-name&gt;
	&lt;param-value&gt;session-id&lt;/param-value&gt;
&lt;/context-param&gt;</pre>
<h5>Utilisation du service sécurisé</h5>
<p>L&#8217;utilisation du mécanisme se fait en deux phases dans le code GWT. Il faut d&#8217;abord récupérer et stocker quelque part le jeton.</p>
<pre class="brush:java">private XsrfToken xsrfToken;

public void fetchXsrfToken() {
	XsrfTokenServiceAsync xsrfTokenService = GWT.create(XsrfTokenService.class);
		// ces interfaces sont fournies par le SDK avec la servlet

	((ServiceDefTarget) xsrfTokenService).setServiceEntryPoint("xsrfTokenService"); // défini
	xsrfTokenService.getNewXsrfToken(new AsyncCallback() {
		public void onSuccess(XsrfToken result) {
			xsrfToken = result;
		}

		public void onFailure(Throwable caught) {
			// une RpcTokenException peut notamment être levée si le cookie
			// est inexistant ou vide

			// [...]
		}
	});
}</pre>
<p>Il doit ensuite être injecté aux instances de services d&#8217;appel asynchrone.</p>
<pre class="brush:java">SecuredServiceAsync securedService = GWT.create(SecuredService.class);
((HasRpcToken) securedService).setRpcToken(xsrfToken);
securedService.doSomethingReallyImportant(new AsyncCallback() {
	@Override
	public void onFailure(Throwable caught) {
		// [...]
	}

	@Override
	public void onSuccess(Void result) {
		// [...]
	}
});</pre>
<p>Tous les détails sont documentés dans la Javadoc de la servlet XsrfTokenServiceServlet.</p>
<h4>L’utiliser, ou pas ?</h4>
<p>Cette même Javadoc commence par l&#8217;avertissement suivant :</p>
<blockquote><p><em>EXPERIMENTAL and subject to change. Do not use this in production code</em></p></blockquote>
<p>Il est fort probable que les développeurs de GWT souhaitent l’intégrer de façon plus transparente, plus élégante et plus propre au framework. On pourrait entre autres générer le hash MD5 du cookie côté GWT.</p>
<p>Que faire en attendant ? Notre préconisation est de préférer l’utilisation de ces classes « expérimentales » si vous souhaitez vous défendre contre ce type d&#8217;attaque. Une implémentation de votre cru fera le job, mais vous n&#8217;y gagnerez rien. Si une version future de GWT propose une solution mieux intégrée, nul doute que le refactoring sera mineur&#8230;</p>
<p>Si jamais, pour une raison ou une autre (je pense notamment au refactoring d&#8217;une application existante), la récupération asynchrone du jeton vous pose problème, l&#8217;objet <a title="Javadoc Dictionary" href="http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/i18n/client/Dictionary.html" target="_blank">Dictionary</a> permet de récupérer une variable définie dans la page HTML hôte de l&#8217;application GWT. Il suffit alors de délivrer cette page via une servlet (ou autre si vous avez déjà&#8230;) et d&#8217;y injecter le jeton.</p>
<h3>RequestBuilder et RequestFactory</h3>
<p>Un petit avantage des applications Ajax pour lutter contre les CSRF est, encore une fois, que l&#8217;objet XMLHttpRequest permet la manipulation des headers HTTP. Utiliser le header pour y glisser un champ dédié à notre jeton sera plus pratique qu’une variable dans le corps de la requête – qui restera dédié à la donnée.</p>
<p>RequestBuilder est le pendant de XMLHttpRequest du monde JavaScript, c&#8217;est la classe qui permet de faire des requête GET ou POST &laquo;&nbsp;à la main&nbsp;&raquo;. Par rapport au XMLHttpRequest initial, RequestBuilder n&#8217;est qu&#8217;une façade qui reprend une syntaxe plus proche de ce que l&#8217;on trouvera dans le monde Java, mais uniquement côté client. De ce fait, elle permet l&#8217;utilisation de GWT avec des stacks autres que Java côté serveur.</p>
<p>RequestFactory est l&#8217;API proposée avec la version 2.1 de GWT en alternative à RPC. Son principal atout aujourd&#8217;hui : elle manipule des DTO outillés, de telle façon qu&#8217;une opération save(myDto) ne fera transiter dans la requête HTTP que les champs effectivement modifiés de l&#8217;objet.</p>
<p>Contrairement à RPC le framework ne gère seul le jeton ni pour RequestBuilder ni pour RequestFactory. L&#8217;opération préconisée sera d&#8217;utiliser un champ de header pour RequestBuilder, afin de ne pas polluer le corps de la requête. Dans le cas de RequestFactory, la séparation headers/corps de requête est en fait moins substantielle, du fait de la forme déjà spécifique du corps de requête. L&#8217;exemple donné passe cependant par un header.</p>
<p>Notre préconisation sera d&#8217;utiliser au maximum l&#8217;outillage existant pour RPC, il tient la route et cela semble une bonne stratégie en cas de positionnement futur du framework pour la sécurisation des RequestBuilder et RequestFactory (bien sûr, si vous utilisez RequestBuilder avec autre chose que Java côté serveur, cette remarque n&#8217;est pas à prendre en compte).</p>
<h4>Pour RequestBuilder</h4>
<h5>Côté client</h5>
<p>Comme en RPC, il conviendra tout d&#8217;abord de récupérer le token (pour cela, voir le code fourni pour le mécanisme RPC), puis d&#8217;injecter le header :</p>
<pre class="brush:java">RequestBuilder requestBuilder = new RequestBuilder(RequestBuilder.POST, "");
requestBuilder.setHeader("X-XSRF-Cookie", xsrfToken.getToken());
requestBuilder.sendRequest(null, new RequestCallback() {
	@Override
	public void onResponseReceived(Request request, Response response) {
		// [...]
	}

	@Override
	public void onError(Request request, Throwable exception) {
		// [...]
	}
});</pre>
<p>Dans le cas d&#8217;un serveur non-Java, deux solutions : générer le MD5 en utilisant un script JS trouvé sur le net (les principaux frameworks n&#8217;en proposent pas, mais voir par exemple <a title="MD5 en JavaScript" href="http://actuel.fr.selfhtml.org/articles/javascript/md5/index.htm" target="_blank">ici</a>), ou procéder au hashage côté serveur et le redescendre côté client (comme avec RPC, en asynchrone ou via l&#8217;objet <a title="Javadoc Dictionary" href="http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/i18n/client/Dictionary.html" target="_blank">Dictionary</a> et la page HTML hôte).</p>
<h5>Côté serveur</h5>
<p>Voici un exemple avec une simple servlet Java. La validation est grandement reprise du code utilisé pour RPC, et exploite les même classes utilitaires fournies par GWT :</p>
<pre class="brush:java">public class SecuredServlet extends HttpServlet {

	@Override
	protected void service(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		validateXsrfToken(request);
		super.service(request, response);
	}

	protected void validateXsrfToken(HttpServletRequest request) throws RpcTokenException {
		// RpcTokenException est propre à GWT

		String xsrfToken = request.getHeader("XSRF-Token");
			// le header que nous avons injecté
		if (xsrfToken == null) {
			throw new RpcTokenException("XSRF token missing");
		}

		Cookie sessionCookie = Util.getCookie(request, "session-id", false);
			// com.google.gwt.user.server.Util est une classe utilitaire interne GWT
		if (sessionCookie == null || sessionCookie.getValue() == null || sessionCookie.getValue().length() == 0) {
			throw new RpcTokenException("Session cookie is missing or empty! " + "Unable to verify XSRF cookie");
		}
		String expectedToken = Utility.toHexString(Utility.getMd5Digest(sessionCookie.getValue().getBytes()));
			// de com.google.gwt.util.tools.Utility ...

		if (!expectedToken.equals(xsrfToken)) {
			throw new RpcTokenException("Invalid XSRF token");
		}
	}

	// [...]

}</pre>
<h4>Pour RequestFactory</h4>
<h5>Côté client</h5>
<p>Etendre DefaultRequestTransport pour injecter le header :</p>
<pre class="brush:java">public class SecuredRequestTransport extends DefaultRequestTransport {

	protected XsrfToken xsrfToken;

	public SecuredRequestTransport(XsrfToken xsrfToken) {
		this.xsrfToken = xsrfToken;
	}

	@Override
	protected void configureRequestBuilder(RequestBuilder builder) {
		super.configureRequestBuilder(builder);
		builder.setHeader("XSRF-Token", xsrfToken.getToken());
	}
}</pre>
<p>A noter qu&#8217;on aurait pu aussi enrichir le corps de requête, comme dit plus haut.</p>
<p>Utiliser ensuite une instance de notre SecuredRequestTransport au lieu de DefaultRequestTransport avec nos RequestFactory :</p>
<pre class="brush:java">EventBus eventBus = new SimpleEventBus();
SecuredRequestTransport securedRequestTransport = new SecuredRequestTransport(xsrfToken);
MyRequestFactory myRequestFactory = GWT.create(MyRequestFactory.class);
myRequestFactory.initialize(eventBus, securedRequestTransport);</pre>
<h5>Côté serveur</h5>
<p>Côté serveur, il sera nécessaire de créer une classe héritant de RequestFactoryServlet. Le code est strictement le même que l&#8217;exemple donné pour RequestBuilder, le validateXsrfToken() peut être appelé dans un <em>doPost()</em> enrichi (au lieu de <em>service()</em>).</p>
<pre class="brush:java">public class SecuredRequestFactoryServlet extends RequestFactoryServlet {

	@Override
	protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		validateXsrfToken(request);
		super.doPost(request, response);
	}

	// ce code est strictement le même que pour la SecuredServlet plus haut
	protected void validateXsrfToken(HttpServletRequest request) throws RpcTokenException {
		// RpcTokenException est propre à GWT

		String xsrfToken = request.getHeader("XSRF-Token");
			// le header que nous avons injecté
		if (xsrfToken == null) {
			throw new RpcTokenException("XSRF token missing");
		}

		Cookie sessionCookie = Util.getCookie(request, "session-id", false);
			// com.google.gwt.user.server.Util est une classe utilitaire interne GWT
		if (sessionCookie == null || sessionCookie.getValue() == null || sessionCookie.getValue().length() == 0) {
			throw new RpcTokenException("Session cookie is missing or empty! " + "Unable to verify XSRF cookie");
		}
		String expectedToken = Utility.toHexString(Utility.getMd5Digest(sessionCookie.getValue().getBytes()));
			// de com.google.gwt.util.tools.Utility ...

		if (!expectedToken.equals(xsrfToken)) {
			throw new RpcTokenException("Invalid XSRF token");
		}
	}

	// [...]

}</pre>
<p>Dans le web.xml, déclarer cette servlet au lieu de RequestFactoryServlet.</p>
<h3>Conclusion</h3>
<p>Les CSRF rentrent dans la catégorie des failles qui doivent être connues du développeur qui manipule un framework de présentation quel qu&#8217;il soit. Étonnamment, nombre de frameworks font preuve de peu de maturité dans l&#8217;intégration de solutions pour s&#8217;en prémunir.</p>
<p>GWT permet de mettre en place des solutions relativement facile à maintenir et à surveiller. Les failles sont peut-être plus complexes à appréhender, mais sont aussi plus faciles à isoler avec une application riche qu&#8217;avec une application web standard. De même, une application GWT existante à sécuriser devrait aisément se refactorer.</p>
<p>Certains frameworks, notamment Rails, résilient la session en cas de jeton attendu non détecté, ce qui peut constituer une sécurité supplémentaire. La RpcTokenException de GWT pourrait par ailleurs nous permettre de prévenir l&#8217;utilisateur d&#8217;une probable tentative d&#8217;attaque, via une alerte JavaScript <a title="GWT Window.alert()" href="http://google-web-toolkit.googlecode.com/svn/javadoc/latest/com/google/gwt/user/client/Window.html#alert%28java.lang.String%29" target="_blank">Window.alert()</a>, afin de sortir d&#8217;une éventuelle frame cachée.</p>
<p>En cas de besoin, dans une démarche de qualité, on pourra chercher à l&#8217;aide d&#8217;un outil comme Sonar des traces de non respects de la marche à suivre. Par exemple en vérifiant que nos interfaces de service RPC héritent de XsrfProtectedService et non plus de RemoteService. Ou encore en créant une classe SecuredRequestBuilder dont le constructeur exige le jeton, et vérifier que la RequestBuilder standard n&#8217;est plus utilisée.</p>
<p>Un prochain article abordera les failles XSS, les solutions proposées par le framework pour s&#8217;en prémunir, et traitera rapidement des autres points top 10 OWASP dans le contexte d&#8217;une application GWT.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=27763" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/initiation-a-la-securite-des-web-services/' rel='bookmark' title='Initiation à la sécurité des Web Services'>Initiation à la sécurité des Web Services</a></li>
<li><a href='http://blog.octo.com/securite-des-services-web-1ere-partie/' rel='bookmark' title='Sécurité des services web – 1ère partie'>Sécurité des services web – 1ère partie</a></li>
<li><a href='http://blog.octo.com/html5-offline-et-securite/' rel='bookmark' title='HTML5, offline et sécurité'>HTML5, offline et sécurité</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/gwt-et-securite-se-premunir-des-csrf/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Initiation à la sécurité des Web Services</title>
		<link>http://blog.octo.com/initiation-a-la-securite-des-web-services/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=initiation-a-la-securite-des-web-services</link>
		<comments>http://blog.octo.com/initiation-a-la-securite-des-web-services/#comments</comments>
		<pubDate>Tue, 31 May 2011 06:42:55 +0000</pubDate>
		<dc:creator>Mikael Robert</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[soap]]></category>
		<category><![CDATA[web-services]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=22840</guid>
		<description><![CDATA[Avec l&#8217;expansion des services en lignes via le cloud ou tout simplement l&#8217;interconnexion des SI, le besoin d&#8217;exposer des services vers l&#8217;extérieur est croissant. Les WebServices sont une solution maintenant éprouvée depuis longtemps pour répondre à ce besoin. Que l&#8217;on utilise SOAP ou REST un problème se pose toujours : comment faire pour sécuriser l&#8217;accès [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/securite-des-services-web-1ere-partie/' rel='bookmark' title='Sécurité des services web – 1ère partie'>Sécurité des services web – 1ère partie</a></li>
<li><a href='http://blog.octo.com/html5-offline-et-securite/' rel='bookmark' title='HTML5, offline et sécurité'>HTML5, offline et sécurité</a></li>
<li><a href='http://blog.octo.com/gwt-et-securite-se-premunir-des-csrf/' rel='bookmark' title='GWT et sécurité, se prémunir des CSRF'>GWT et sécurité, se prémunir des CSRF</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Finitiation-a-la-securite-des-web-services%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Initiation%20%C3%A0%20la%20s%C3%A9curit%C3%A9%20des%20Web%20Services%22%20%7D);"></div>
<p>Avec l&#8217;expansion des services en lignes via le cloud ou tout simplement l&#8217;interconnexion des SI, le besoin d&#8217;exposer des services vers l&#8217;extérieur est croissant. Les <strong>WebServices</strong> sont une solution maintenant éprouvée depuis longtemps pour répondre à ce besoin.</p>
<p>Que l&#8217;on utilise <strong>SOAP</strong> ou <strong>REST</strong> un problème se pose toujours : comment faire pour sécuriser l&#8217;accès à mon SI alors que j&#8217;en ouvre une porte en exposant mon métier ?<br />
Souvent utilisés au sein même d&#8217;un SI pour gérer des problématiques d&#8217;intégration ou d&#8217;hétérogénéité des technologies, les Web Services sont aussi de plus en plus souvent exposés sur le web ou à des partenaires.</p>
<p>Lorsque c&#8217;est possible, on voit souvent la mise en place d&#8217;un canal sécurisé type VPN entre les différents acteurs. Toutefois cela n&#8217;est pas toujours possible et cet article a pour but de vous présenter des notions de base liées à la sécurité des web services.</p>
<p>Ayant réalisé des missions, pour OCTO, aussi bien d&#8217;architecture que de développement autour ce sujet je vais tenter, via une série d&#8217;articles, de vous initier à ce domaine.<br />
La majorité des WebServices de nos clients étant en SOAP je me concentrerais beaucoup plus sur ces derniers.<br />
Cet article se voulant une initiation je ne suis pas rentré dans des détails très techniques, il a uniquement pour but d&#8217;attirer l&#8217;attention sur la vulnérabilité des protocoles de Web Services.</p>
<p><span id="more-22840"></span></p>
<h1>Identifier le besoin et les risques</h1>
<p>Lorsqu&#8217;on traite de sécurité il faut toujours commencer par se poser quelques questions</p>
<ol>
<li>Mes données sont elles sensibles?</li>
<li>Quel est le risque et quelles sont les conséquences pour mon SI si ces données sont capturées ou utilisés à mauvais escient ?</li>
<li>Quelle est la probabilité que quelqu&#8217;un attaque mon service ?</li>
</ol>
<p>Sans rentrer dans les détails de l&#8217;analyse de risque qui sort du périmètre de cet article, il est important d&#8217;avoir une bonne idée de la réponse à ces questions pour ensuite être capable de déterminer le niveau de sécurité nécessaire.</p>
<h1>Valider les données</h1>
<p>Une des failles de sécurité qu&#8217;on croise le plus dans les applications concerne les points d&#8217;entrée des données. Que ce soit un formulaire sur une page web ou un web service, tout point d&#8217;entrée de donnée vers votre application est potentiellement une faille de sécurité.<br />
Il est donc essentiel et critique de valider tout ce que les utilisateurs de votre application pourront envoyer à celle-ci.<br />
En effet un WebService est aussi vulnérable qu&#8217;un formulaire à l&#8217;injection SQL (passage de morceaux de requêtes SQL à un champ de donnée pour les faire interpréter par le serveur) et à d&#8217;autres exploit du même acabit. Pour plus de détails je vous invite à consulter <a href="https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project">cette page de l&#8217;OWASP</a>.<br />
De plus, la majorité des WebService utilisant SOAP et donc du XML sont vulnérables à toutes les failles induites par XML.</p>
<p>La validation des données entrées est donc critique pour éviter de nombreuses failles. Pour cela il existe de nombreux moyens.<br />
Première étape, utiliser un WSDL particulièrement stricte sur le typage des données et sur la taille des champs vous protégera déjà de nombreux problèmes.<br />
De la même manière je ne peux rentrer dans les détails sans trop m&#8217;étendre, mais la mise en place de DTD, voir mieux de XSD, est un très bon levier.<br />
En effet l&#8217;adresse d&#8217;un DTD étant indiquée dans le XML, un utilisateur mal attentionné pourra la modifier dans le message qu&#8217;il vous envoi, pour changer la méthode de validation des données par celle de son choix (beaucoup plus permissive).  Dans le cas d&#8217;un XSD seul le serveur sait quel XSD utiliser pour valider le contenu.<br />
Pour les champs spécifiques (adresse email, url&#8230;) utiliser des expressions régulières stricte pour valider est une bonne pratique.<br />
Enfin, réfléchissez toujours bien à l&#8217;impact des données que l&#8217;utilisateur peut vous envoyer et donc manipuler.</p>
<p>Avant de vous présenter quelques failles induites par les WebServices SOAP, je tiens à rappeler qu&#8217;il est très facile pour un utilisateur mal intentionné de forger des messages SOAP avec des outils tels que soapUI. A la base conçu pour tester les WebServices cet outil s&#8217;avère formidable pour les attaquer en forgeant des messages.</p>
<h2>SOAP &amp; XML</h2>
<h2>Quelques attaques de type DoS (Denial of Service)</h2>
<h3>Buffer Overflow</h3>
<p>SOAP a le gros avantage d&#8217;être un protocole très souple, ce qui est une qualité indéniable mais aussi un gros défaut en terme de sécurité.<br />
La souplesse de SOAP réside essentiellement dans la possibilité d&#8217;encapsuler à peu près ce que l&#8217;on veut (tant que c&#8217;est un XML valide) dans un message SOAP.<br />
Premier problème : aucune contrainte de <strong>taille</strong>.<br />
Ce type d&#8217;attaque est généralement couvert par le framework de WebService que vous utilisez (sauf si celui-ci est vraiment obsolète).<br />
Néanmoins un utilisateur mal intentionné qui souhaite réalise un DoS (Denial Of Service) sur votre application pourra s&#8217;amuser à essayer d&#8217;envoyer un message énorme à vos WebService pour tenter de faire planter le parseur XML qui va démarshaller le message SOAP.<br />
C&#8217;est bien entendu les parseurs de type DOM qui chargent tout le message XML en mémoire avant de l&#8217;interpréter qui sont vulnérable à ce type de problèmes.<br />
Ce type d&#8217;attaque amène à un problème de type BufferOverflow qui induit souvent au plantage complet de l&#8217;application.</p>
<p>Il est donc crucial de vérifier la taille des messages reçus avant de tenter de les interpréter.</p>
<h3>Récursion infinie</h3>
<p>Il s&#8217;agit ici d&#8217;envoyer un XML récursif au web service. Si le parseur est de type XPath il va partir en boucle infinie.<br />
Exemple :<br />
<code></p>

<div class="wp_codebox"><table><tr id="p228403"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p22840code3"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;credit<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;credit<span style="color: #000000; font-weight: bold;">&gt;</span></span><span style="color: #000000; font-weight: bold;">&lt;credit<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>….</pre></td></tr></table></div>

<p></code></p>
<h2>D&#8217;autres attaques &#8230;</h2>
<h3>XML Injection</h3>
<p>L’idée ici est plutôt d’outrepasser les validateurs de données pour détourner l’usage prévu du Web Service.</p>
<p>Un exemple bien parlant :<br />
<code></p>

<div class="wp_codebox"><table><tr id="p228404"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p22840code4"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;transaction<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;total<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>4000.00<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;total<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;credit_card_number<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>123456789<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/credit_card_number<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;total<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>6.66<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/total<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;credit_card_number<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>123456789 <span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/credit_card_number<span style="color: #000000; font-weight: bold;">&gt;</span></span></span> 
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;expiration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>17112010<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/expiration<span style="color: #000000; font-weight: bold;">&gt;</span></span></span>
<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/transaction<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></td></tr></table></div>

<p></code></p>
<p>En répétant la balise total, l’attaquant tente de changer les valeurs démarshallées par le Web Service pour ainsi payer 6,66 au lieu de 4000 euros. Cet exemple est volontairement simpliste mais, croyez moi, je suis déjà tombé sur des cas ou cela fonctionne.</p>
<h3>XPath Injection</h3>
<p>L’idée ici est d’attaquer les parseurs de type <strong>XPath</strong>. En effet si vos requêtes XPath se basent sur les entrées utilisateurs le parseur risque d’interpréter des choses <strong>non prévus</strong> :</p>
<p>Exemple :<br />
<em>//users/custid[123]</em> va aller récupérer l’utilisateurs ayant pour ID 123, ici l’utilisateur bienveillant à bien mis son Id donc tout va bien.</p>
<p><em>//users/custid[./age &gt; 1]</em> va aller récupérer tous les utilisateurs dont l’âge est supérieur à 1, ici l’utilisateur malveillant à tenté de mettre un bout de XPath en paramètre et le résultat est assez facile à deviner :)</p>
<p>L&#8217;index de requête étant passé en paramètre cela autorise l&#8217;utilisateur à utiliser un identifiant client différent du sien. Il est ainsi libre de récupérer les données de tous les utilisateurs de l&#8217;application.</p>
<h2>Failles XML &amp; SOAP : comment s’en prémunir</h2>
<p>Globalement la réponse est très simple : ne réinventez pas la roue.<br />
D’une part pour tout ce qui touche au parsing XML utilisez des frameworks éprouvés et testés par les communautés Open Source par exemple. En réécrivant un parseur XML vous prenez le risque de ne pas penser à tous les types d’attaques présentés précédemment et bien entendus à tous ceux qui ne sont pas exposés ici.<br />
Les frameworks existants sont testés par de nombreux utilisateurs, dont certain très avertis vont remonter ce type de problèmes qui seront très vite corrigés.<br />
Il en va de même pour votre framework de WebService. Utilisez un framework éprouvé et ne réinventer pas la roue en branchant votre parseur XML maison à une socket en écoute sur le port 80. Je caricature mais parfois on croise des choses terrifiantes … Et bien entendu <b>validez tout ce que votre application recevra via des messages SOAP</b>.</p>
<p>Enfin mettez à jour vos frameworks. Les mises à jours de ceux ci (même mineures) incluent souvent des correctifs au failles de sécurités mises en évidences.<br />
Bref à retenir : utilisez des frameworks de parsing XML et de Web Services modernes et éprouvés par la communauté.</p>
<h1>Côté réseau et hardware : HTTP, HTTPS, VPN, filtrage IP, filtrage hardware</h1>
<p>Une question qui m’est souvent remontée est :  quelle type de transport utiliser pour exposer mes Web Services ?</p>
<p>Déjà je tiens à briser un a priori souvent entendu : exposer vos services sur le web en <strong>HTTPS ne vous prémunit pas de tous les risques</strong>.<br />
Au mieux vous vous protéger des attaques du type man in the middle (et donc qu’un utilisateur intercepte vos messages), mais toutes les autres attaques restent possible.<br />
Il est néanmoins important de savoir que SSL peut, comme un VPN, assurer l&#8217;authentification de l&#8217;utilisateur si le serveur est correctement configuré.<br />
Cependant, par défaut les canaux cryptés n’ont qu’un seul intérêt : garantir la confidentialité de l’échange. C’est à dire qu’un utilisateur en écoute sur vos échanges ne pourra pas les intercepter (confidentialité de l&#8217;échange).<br />
C’est donc très important mais très souvent insuffisant.<br />
Il est toutefois possible de mettre en place une authentification HTTP Basic ou WS Basic devant un WebService via une configuration spécifique du serveur. Néanmoins ces méthodes d&#8217;authentification sont peu fiable car le mot de passe circule en clair il est donc interceptable.  Donc ces types d&#8217;authentification restent tout à fait valables si elles sont utilisées sur un canal crypté.</p>
<p>Les tunnels de type VPN  sont déjà un cran au dessus car ils assurent l’authentification de l&#8217;appelant (souvent grâce à un certificat) via l’accès VPN. Cela vous protège aussi des écoutes malveillantes car les tunnels VPN sont cryptés. Cela vous apporte, en plus, une limitation sur les utilisateurs qui se connectent à vos services car seuls ceux que vous autorisez explicitement peuvent utiliser le canal VPN. Le canal VPN est donc une très bonne solution mais pas toujours applicable.</p>
<p>Le filtrage d’IP est une protection intéressante pour limiter les appelants de vos services, néanmoins il est relativement facile de masquer son adresse IP par une autre (<a href="http://fr.wikipedia.org/wiki/Spoofing">spoofing</a> d’adresse IP). C’est donc un levier de sécurité intéressant mais insuffisant à lui tout seul.<br />
La mise en place de signature numérique sur les messages permet alors de valider la non répudiation de ceux-ci.</p>
<p>A noter qu&#8217;il existe aussi des solutions matérielles type <i>Datapower</i> pour gérer la sécurité de vos services selon les possibilités et la configuration du matériel choisi. Ces solutions sont particulièrement efficaces mais très couteuses. Dans un degrés de risque élevé elles sont toutefois justifiées.  Ces solutions ont aussi l&#8217;avantage d&#8217;être particulièrement efficace pour accélérer la gestion du SSL,  gérer l&#8217;authentification et les autorisations ainsi que la validation des données des flux. </p>
<h1>GDIA : Gestion des identités et des accès.</h1>
<p>On en revient finalement toujours au même, lorsque des données et services sont sensibles il est donc nécessaire de les protéger par deux mécanismes classiques : <strong>l’authentification et l’autorisation</strong>.<br />
Néanmoins ce n’est pas toujours évident à mettre en place sur un Web Service, on ne peut pas simplement mettre un formulaire devant comme sur un site web.</p>
<p>SOAP dans sa souplesse, découpe ses messages en deux parties : un <strong>header</strong> et un <strong>body</strong>.<br />
Le <strong>body</strong> est normalement prévu pour ne contenir que des <strong>notions orientées métier</strong>. Le <strong>header</strong> quand à lui est là pour recevoir toutes les <strong>notions techniques</strong> nécessaires au web service.<br />
C’est donc lui que nous allons utiliser pour contenir les informations d’authentification et d’autorisation.<br />
Les protocoles de sécurité de Web Service tel que <strong>WS Sécurity</strong> et ses consorts se basent tous sur ce header soap.</p>
<p>De manière un peu généraliste, une bonne pratique est de mettre en place un web service d’authentification. Celui lui ne sera pas filtré car il faut bien qu’il soit appelable la première fois. Il fournira des données de sécurité  (comme un jeton unique à durée de vie limitée par exemple) à l’utilisateur qui se sera authentifié via une webmethod prévue à cet effet. L’utilisateur devra ensuite fournir (dans les header soap pour ne pas mélanger les notions techniques et métiers dans le message) son login et son mot de passe ou mieux, ce jeton de sécurité pour chaque appel à vos services métiers.<br />
Côté WebService, un intercepteur devra valider ces données avant de permettre ou rejeter l’appel au service métier.<br />
Cette bonne pratique est de manière très macroscopique le fonctionnement proposé par des protocoles tels que WS Security.</p>
<p>Concernant les mécanismes de gestion des autorisations, nous ne nous étendrons pas sur le sujet car cela peut être soit très simple (read/write ou user/admin) soit très complexe et nécessiter un article complet rien que sur le sujet. On peut toutefois facilement imaginer un intercepteur branché après l&#8217;authentification pour vérifier les droits de l&#8217;appelant.<br />
Il est bon aussi de savoir qu&#8217;un protocole comme OAuth est tout à fait adapté pour gérer les autorisations d&#8217;accès à un WebService, d&#8217;autant qu&#8217;il est fortement compatible avec les services de type Rest qui sont orientés ressources.</p>
<h1>Conclusion</h1>
<p>Pour conclure il ne faut jamais oublier qu’un <strong>WebService</strong> est une <strong>porte d’entrée</strong> vers votre application. Le sécuriser est donc important.<br />
La majorité des <strong>failles</strong> présentés dans cet article à titre informatif sont <strong>couvertes par les frameworks de WebService</strong> modernes (Pour java : CXF, Métro, JBossWS &#8230;.).<br />
Néanmoins il est important de <strong>s’assurer de l’identité et des droits de l’appelant</strong> avant de le laisser appeler vos méthodes métiers.<br />
Enfin le <b>cryptage</b> du canal d’échange, quelque soit le moyen, est un très bon levier de sécurité mais comme nous l’avons vu il ne mitige qu&#8217;une partie des risques.<br />
La mise en place de <b>signature numérique </b> est aussi un élément aujourd&#8217;hui très fiable pour valider la non répudiation de vos messages.<br />
Dans bien des cas, comme dit en introduction, une basic authentification HTTP sur un canal HTTPS s&#8217;avèrera suffisant et plus justifié que la mise en place d&#8217;outils évolués et relativement complexes à mettre en place tels que WS Security. Il faut donc bien mesurer le besoin et le confronter au risque avant de décider quel niveau de sécurité engager.<br />
Toutefois n&#8217;oubliez pas que la notion la plus importante est toujours la <b>validation des données</b> envoyés par vos utilisateurs !</p>
<p>Dans un prochain article je vous présenterais les notions apportées par des protocoles de sécurité de web services tels que WS Security, XML Signature ou XML Encryption.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=22840" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/securite-des-services-web-1ere-partie/' rel='bookmark' title='Sécurité des services web – 1ère partie'>Sécurité des services web – 1ère partie</a></li>
<li><a href='http://blog.octo.com/html5-offline-et-securite/' rel='bookmark' title='HTML5, offline et sécurité'>HTML5, offline et sécurité</a></li>
<li><a href='http://blog.octo.com/gwt-et-securite-se-premunir-des-csrf/' rel='bookmark' title='GWT et sécurité, se prémunir des CSRF'>GWT et sécurité, se prémunir des CSRF</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/initiation-a-la-securite-des-web-services/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sécuriser une application Flex BlazeDS avec le SSO d’Active Directory</title>
		<link>http://blog.octo.com/securiser-une-application-flex-blazeds-avec-le-sso-d%e2%80%99active-directory/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=securiser-une-application-flex-blazeds-avec-le-sso-d%25e2%2580%2599active-directory</link>
		<comments>http://blog.octo.com/securiser-une-application-flex-blazeds-avec-le-sso-d%e2%80%99active-directory/#comments</comments>
		<pubDate>Thu, 13 Jan 2011 10:31:06 +0000</pubDate>
		<dc:creator>David Hatanian</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[active directory]]></category>
		<category><![CDATA[Flex]]></category>
		<category><![CDATA[Java]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[spring]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=19114</guid>
		<description><![CDATA[Votre RSSI vous demande d’intégrer vos applications Flex/BlazeDS à Active Directory ? Vous pourriez le faire via le protocole LDAP, mais pourquoi ne pas offrir plus de confort à vos utilisateurs en leur évitant de taper une énième fois leur mot de passe ? Faites-vous aimer de vos utilisateurs en intégrant votre application au SSO natif d’Active Directory !
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/quand-spring-sinvite-dans-une-application-flex/' rel='bookmark' title='Quand Spring s&#8217;invite dans une application Flex &#8230;'>Quand Spring s&#8217;invite dans une application Flex &#8230;</a></li>
<li><a href='http://blog.octo.com/securisation-a-double-referentiel-avec-jboss/' rel='bookmark' title='Sécurisation à double référentiel avec JBOSS'>Sécurisation à double référentiel avec JBOSS</a></li>
<li><a href='http://blog.octo.com/flex-vs-silverlight/' rel='bookmark' title='Flex vs Silverlight'>Flex vs Silverlight</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fsecuriser-une-application-flex-blazeds-avec-le-sso-d%2525e2%252580%252599active-directory%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22S%C3%A9curiser%20une%20application%20Flex%20BlazeDS%20avec%20le%20SSO%20d%E2%80%99Active%20Directory%22%20%7D);"></div>
<p style="text-align: justify;">Votre RSSI vous demande d’intégrer vos applications Flex/BlazeDS à Active Directory ? Vous pourriez le faire via le protocole LDAP, mais pourquoi ne pas offrir plus de confort à vos utilisateurs en leur évitant de taper une énième fois leur mot de passe ? Faites-vous aimer de vos utilisateurs en intégrant votre application au SSO natif d’Active Directory !</p>
<p><span id="more-19114"></span></p>
<p style="text-align: justify;">Intéressons-nous à une application web disposant d’une partie client codée en Flex, qui communique avec les services métier par le biais d’un canal BlazeDS. Avant de pouvoir utiliser ces services par le biais de l’interface Flex, les utilisateurs doivent s’authentifier avec leur compte Active Directory. Cet article expose la manière de rendre l’authentification transparente en tirant profit du protocole de SSO Kerberos intégré à Active Directory.</p>
<p style="text-align: justify;">L’idéal serait de laisser BlazeDS se débrouiller seul avec Kerberos, malheureusement hors de la sempiternelle combinaison login/mot de passe, le mécanisme d’authentification de BlazeDS est totalement perdu. Mais comme un canal BlazeDS, ça reste un web-service Java, profitons des capacités de ce dernier ! Entre alors Spring Security.</p>
<p style="text-align: justify;">Le framework Spring Security fournit aux applications Java un panel de manières de gérer l’authentification. Depuis sa version 3, la configuration du framework en xml est devenue assez simple. Et, joie, Spring Security supporte Kerberos par le biais d’un module récent. Tous les composants de notre architecture sont maintenant identifiés, reste à les faire communiquer.</p>
<h1>Architecture</h1>
<p style="text-align: justify;">Le diagramme suivant résumé les interactions entre les différents modules applicatifs qui permettent à l’extension Kerberos de Spring Security pour protéger le canal BlazeDS en SSO.</p>
<p style="text-align: center;"><a href="http://blog.octo.com/wp-content/uploads/2011/01/archi12.png"><img class="aligncenter size-full wp-image-19120" title="archi1" src="http://blog.octo.com/wp-content/uploads/2011/01/archi12.png" alt="" width="597" height="307" /></a></p>
<h1>Kerberos et Active Directory</h1>
<p style="text-align: justify;">Publié par le MIT dans les années 80, le protocole Kerberos est le mode d’authentification par défaut sous Active Directory depuis Windows 2000. Il remplace le protocole NTLM qui n’est plus recommandé par Microsoft.</p>
<p style="text-align: justify;">Le fonctionnement de Kerberos est basé sur des échanges de tickets avec un contrôleur de domaine. Le schéma suivant représente l’enchaînement d’opérations mis en œuvre lorsqu’un poste client tente d’accéder à un service protégé par Kerberos :</p>
<p style="text-align: justify;"><a href="http://blog.octo.com/wp-content/uploads/2011/01/kerberos1.png"><img class="aligncenter size-full wp-image-19121" title="kerberos" src="http://blog.octo.com/wp-content/uploads/2011/01/kerberos1.png" alt="" width="494" height="307" /></a></p>
<p style="text-align: left;">
<ul>
<li>(1) L’utilisateur ouvre sa session Windows en s’authentifiant avec son mot de passe Active Directory.</li>
<li>(2) Le poste de travail récupère alors auprès du contrôleur de domaine un ticket dit TGT (Ticket Granting Ticket).</li>
<li>(3) Lorsque l’utilisateur veut accéder à un service qui requiert une authentification Kerberos, Windows demande au contrôleur de domaine de lui fournir un ST (Service Ticket) pour le service précisé. Le ST est chiffré, et seul le service possède la clé de déchiffrement.</li>
<li>(4)Le contrôleur de domaine remet au poste client un Service Ticket, valable uniquement pour le service spécifié.</li>
<li>(5)Le poste client peut alors s’authentifier auprès du service, sans demander son mot de passe à l’utilisateur.</li>
</ul>
<p style="text-align: left;">
<p style="text-align: justify;">Pour identifier le service demandé et générer le Service Ticket adéquat, le contrôleur de domaine identifie les services par leur Service Principal Name (SPN). Chaque service est enregistré comme un compte utilisateur Active Directory. A partir de ces comptes, le contrôleur de domaine génère au préalable à toute authentification la clé qui permettra au service de valider les Service Tickets envoyés par les clients, et l’associe à un SPN donné en paramètre de l’outil ktpass qui génère les clés.  Dans le cas d’un service web, notre SPN est de la forme HTTP/serveur-app.octo.com@DOMAINE-AD.</p>
<p style="text-align: justify;">Le service accédé dans notre architecture sera bien entendu la partie serveur de notre application Flex. Voyons comment intégrer cette dernière au système d’authentification Kerberos.</p>
<h1 style="text-align: left;">Configuration de BlazeDS</h1>
<p style="text-align: left;">Spring Security s’intègre à BlazeDS grâce au projet Spring-Flex, malheureusement ce support se limite actuellement aux authentifications de type utilisateur/mot de passe. Impossible donc de profiter des facilités de Spring-Flex pour l’authentification par SSO. La solution alternative que nous avons mise en place est détaillée ci-dessous.</p>
<p style="text-align: left;">Nous utilisons les filtres Spring Security sur les URLs pour protéger deux types de ressources :</p>
<ul style="text-align: left;">
<li>Les ressources statiques de l’application (html, css, …), et notamment le fichier .swf qui forme la partie cliente de l’application</li>
<li>L’endpoint BlazeDS (le côté serveur du canal BlazeDS)</li>
</ul>
<p style="text-align: left;">Le fichier de configuration de Spring Security se présente alors comme suit :</p>
<pre class="brush:xml" style="text-align: left;">&lt;sec:http entry-point-ref="spnegoEntryPoint" auto-config="false"&gt;

  &lt;sec:intercept-url pattern="/**" access="IS_ AUTHENTICATED_FULLY"  /&gt;

  &lt;sec:custom-filter ref="spnegoAuthenticationProcessingFilter" position="BASIC_AUTH_FILTER" /&gt;

&lt;/sec:http&gt;
</pre>
<p style="text-align: left;">La ligne <em>intercept-url</em> exige que l’utilisateur soit authentifié. La ligne <em>custom-filter</em> précise que l’authentification se fera par le protocole SPNego (voir ci-dessous).</p>
<p style="text-align: left;">Lors de l’accès du navigateur à une de ces URLs, Spring Security déclenche l’authentification et déclenche des échanges suivant le protocole SPNego. SPNego est un protocole qui permet de négocier le mode d’authentification utilisé (par exemple NTLM ou Kerberos) en fonction des capacités communes au client et au serveur. La négociation se matérialise par une réponse HTTP (code 401) de la part du serveur d’application, qui contient les headers SPNego précisant que le serveur supporte Kerberos.</p>
<p style="text-align: left;"><a href="http://blog.octo.com/wp-content/uploads/2011/01/archi21.png"><img class="aligncenter size-full wp-image-19122" title="archi2" src="http://blog.octo.com/wp-content/uploads/2011/01/archi21.png" alt="" width="604" height="360" /></a></p>
<p style="text-align: left;">Une fois que le navigateur et le serveur se sont accordés sur l’utilisation du protocole Kerberos, le navigateur utilise l’API Windows pour demander au contrôleur de domaine un Service Ticket pour le serveur d’applications. Le ticket est ensuite validé par l’extension Kerberos de Spring Security en utilisant la clé de service créée précédemment par le contrôleur de domaine.</p>
<p style="text-align: left;">Si le ticket est validé, l’utilisateur est authentifié et  les mécanismes d’habilitation (Rôles, ACLs) de Spring Security entrent en jeu pour autoriser ou refuser l’accès à une ressource donnée. Les habilitations sont totalement indépendantes de Kerberos.</p>
<p style="text-align: left;">Petite surprise offerte BlazeDS : l’utilisation d’un channel HTTPs avec BlazeDS (<em>SecureAMFEndpoint</em>) impose d’utiliser un mécanisme de login matérialisé côté serveur par une classe LoginCommand. Nous avons donc implémenté notre propre LoginCommand (<em>PreAuthLoginCommand</em>) qui&#8230; n’effectue aucune vérification, l’authentification ayant déjà été effectuée par Spring Security/Kerberos.</p>
<pre class="brush:java" style="text-align: left;">public class PreAuthLoginCommand implements LoginCommand, LoginCommandExt {

  public Principal doAuthentication(String username, Object credentials) {
    //On n’effectue aucune verification !
    logger.info("doAuthentication " + username + ", returning a PreAuthPrincipal");
    return new PreAuthPrincipal(username);
  }

  public boolean doAuthorization(Principal principal, List arg1) {
    logger.info("doAuthorization " + principal + ", returning true");
    return true;
  }
…
}
</pre>
<h1 style="text-align: left;">Pour aller plus loin</h1>
<p style="text-align: left;">Cet article passe sous silence la configuration du poste client. Elle est très simple et se résume en deux points :</p>
<ul style="text-align: left;">
<li>Utiliser un navigateur compatible avec SPNego et Kerberos (Internet Explorer, Firefox et Chrome le sont)</li>
<li>Indiquer au navigateur que votre application est un site de confiance, et qu’à ce titre il est autorisé à lui transmettre des tickets Kerberos. Cette configuration peut être déployée sur un parc de machines en utilisant les stratégies de groupe (GPO) d’Active Directory</li>
</ul>
<p style="text-align: left;">Pour plus de détails, voyez la section « Références » ci-dessous.</p>
<p style="text-align: left;">Une idée pour terminer et peaufiner la sécurité de votre application : offrez à vos utilisateurs la possibilité de se dé-logger de la session Kerberos et repasser à une authentification par mot de passe, pour permettre à un autre utilisateur que le détenteur du compte Active Directory de s’authentifier.</p>
<h1 style="text-align: left;">Références</h1>
<ul style="text-align: left;">
<li>La documentation de l’intégration Spring-Security/BlazeDS, qui ne fonctionne que pour une authentification de type utilisateur/mot de passe :<br />
<a href="http://static.springsource.org/spring-flex/docs/1.5.x/reference/html/#security">http://static.springsource.org/spring-flex/docs/1.5.x/reference/html/#security</a></li>
<li>The Spring Security Kerberos extension:<br />
<a href="http://static.springsource.org/spring-security/site/extensions/krb/index.html">http://static.springsource.org/spring-security/site/extensions/krb/index.html</a></li>
<li>The extension&#8217;s manual (including Internet Explorer configuration) :<br />
<a href="http://blog.springsource.com/2009/09/28/spring-security-kerberos/">http://blog.springsource.com/2009/09/28/spring-security-kerberos/</a></li>
<li>A guide to enable Kerberos in Firefox :<br />
<a href="http://grolmsnet.de/kerbtut/firefox.html">http://grolmsnet.de/kerbtut/firefox.html</a></li>
<li>A guide to enable Kerberos in Chrome :<br />
<a href="https://sites.google.com/a/chromium.org/dev/developers/design-documents/http-authentication">https://sites.google.com/a/chromium.org/dev/developers/design-documents/http-authentication</a></li>
</ul>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=19114" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/quand-spring-sinvite-dans-une-application-flex/' rel='bookmark' title='Quand Spring s&#8217;invite dans une application Flex &#8230;'>Quand Spring s&#8217;invite dans une application Flex &#8230;</a></li>
<li><a href='http://blog.octo.com/securisation-a-double-referentiel-avec-jboss/' rel='bookmark' title='Sécurisation à double référentiel avec JBOSS'>Sécurisation à double référentiel avec JBOSS</a></li>
<li><a href='http://blog.octo.com/flex-vs-silverlight/' rel='bookmark' title='Flex vs Silverlight'>Flex vs Silverlight</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/securiser-une-application-flex-blazeds-avec-le-sso-d%e2%80%99active-directory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment sauver vos données, 3/3</title>
		<link>http://blog.octo.com/comment-sauver-vos-donnees-33/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=comment-sauver-vos-donnees-33</link>
		<comments>http://blog.octo.com/comment-sauver-vos-donnees-33/#comments</comments>
		<pubDate>Fri, 10 Dec 2010 07:04:45 +0000</pubDate>
		<dc:creator>Gabriel Guillon</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sauvegarde]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[tech inside]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=14376</guid>
		<description><![CDATA[La dernière fois nous avons vu comment réparer, sous certaines conditions, la FAT de votre partition. Dans cette dernière partie nous allons voir quoi faire lors d&#8217;un crash physique de disque dur. Comme pour les articles précédents, c&#8217;est en anglais. Suggestion d'articles : Comment sauver vos données, 1/3 Comment sauver vos données, 2/3 Ranger sa [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/comment-sauver-vos-donnees-13/' rel='bookmark' title='Comment sauver vos données, 1/3'>Comment sauver vos données, 1/3</a></li>
<li><a href='http://blog.octo.com/comment-sauver-vos-donnees-23/' rel='bookmark' title='Comment sauver vos données, 2/3'>Comment sauver vos données, 2/3</a></li>
<li><a href='http://blog.octo.com/ranger-sa-chambre-ou-larchivage-de-donnees/' rel='bookmark' title='Ranger sa chambre, ou l&#8217;archivage de données'>Ranger sa chambre, ou l&#8217;archivage de données</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fcomment-sauver-vos-donnees-33%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Comment%20sauver%20vos%20donn%C3%A9es%2C%203%2F3%22%20%7D);"></div>
<p><a href="?p=14374">La dernière fois</a> nous avons vu comment réparer, sous certaines conditions, la FAT de votre partition.</p>
<p>Dans cette dernière partie nous allons voir quoi faire lors d&#8217;un crash physique de disque dur. Comme pour les articles précédents, <a href="?p=14380">c&#8217;est en anglais</a>.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=14376" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/comment-sauver-vos-donnees-13/' rel='bookmark' title='Comment sauver vos données, 1/3'>Comment sauver vos données, 1/3</a></li>
<li><a href='http://blog.octo.com/comment-sauver-vos-donnees-23/' rel='bookmark' title='Comment sauver vos données, 2/3'>Comment sauver vos données, 2/3</a></li>
<li><a href='http://blog.octo.com/ranger-sa-chambre-ou-larchivage-de-donnees/' rel='bookmark' title='Ranger sa chambre, ou l&#8217;archivage de données'>Ranger sa chambre, ou l&#8217;archivage de données</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/comment-sauver-vos-donnees-33/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment sauver vos données, 2/3</title>
		<link>http://blog.octo.com/comment-sauver-vos-donnees-23/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=comment-sauver-vos-donnees-23</link>
		<comments>http://blog.octo.com/comment-sauver-vos-donnees-23/#comments</comments>
		<pubDate>Fri, 03 Dec 2010 07:04:15 +0000</pubDate>
		<dc:creator>Gabriel Guillon</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sauvegarde]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[tech inside]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=14374</guid>
		<description><![CDATA[Nous avons vu la dernière fois comment sauver grâce à testdisk une partition malencontreusement effacée. Nous allons voir dans cet article comment récupérer, sous certaines conditions, la table d&#8217;allocation de fichier de votre partition. Comme précédemment, l&#8217;article est en anglais ici. Suggestion d'articles : Comment sauver vos données, 3/3 Comment sauver vos données, 1/3 Consistent [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/comment-sauver-vos-donnees-33/' rel='bookmark' title='Comment sauver vos données, 3/3'>Comment sauver vos données, 3/3</a></li>
<li><a href='http://blog.octo.com/comment-sauver-vos-donnees-13/' rel='bookmark' title='Comment sauver vos données, 1/3'>Comment sauver vos données, 1/3</a></li>
<li><a href='http://blog.octo.com/consistent-hashing-ou-l%e2%80%99art-de-distribuer-les-donnees/' rel='bookmark' title='Consistent Hashing ou l’art de distribuer les données'>Consistent Hashing ou l’art de distribuer les données</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fcomment-sauver-vos-donnees-23%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Comment%20sauver%20vos%20donn%C3%A9es%2C%202%2F3%22%20%7D);"></div>
<p>Nous avons vu <a href="?p=12457">la dernière fois</a> comment sauver grâce à <a href="http://www.cgsecurity.org/wiki/TestDisk">testdisk</a> une partition malencontreusement effacée.</p>
<p>Nous allons voir dans cet article comment récupérer, sous certaines conditions, la table d&#8217;allocation de fichier de votre partition.</p>
<p>Comme précédemment, l&#8217;article est en anglais <a href="?p=14378">ici</a>.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=14374" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/comment-sauver-vos-donnees-33/' rel='bookmark' title='Comment sauver vos données, 3/3'>Comment sauver vos données, 3/3</a></li>
<li><a href='http://blog.octo.com/comment-sauver-vos-donnees-13/' rel='bookmark' title='Comment sauver vos données, 1/3'>Comment sauver vos données, 1/3</a></li>
<li><a href='http://blog.octo.com/consistent-hashing-ou-l%e2%80%99art-de-distribuer-les-donnees/' rel='bookmark' title='Consistent Hashing ou l’art de distribuer les données'>Consistent Hashing ou l’art de distribuer les données</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/comment-sauver-vos-donnees-23/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Comment sauver vos données, 1/3</title>
		<link>http://blog.octo.com/comment-sauver-vos-donnees-13/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=comment-sauver-vos-donnees-13</link>
		<comments>http://blog.octo.com/comment-sauver-vos-donnees-13/#comments</comments>
		<pubDate>Fri, 26 Nov 2010 07:04:07 +0000</pubDate>
		<dc:creator>Gabriel Guillon</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[sauvegarde]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[tech inside]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=12457</guid>
		<description><![CDATA[Cette série de 3 articles, basée sur une histoire vraie, va vous conter comment sauver (les données de) votre disque dur quand celui-ci vous annonce sa décision de ne plus fonctionner, soit de part sa vieillesse, soit par erreurs de votre part. Vous retrouverez les protagonistes suivant : Dans le rôle des méchants : sfdisk, [...]]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fcomment-sauver-vos-donnees-13%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Comment%20sauver%20vos%20donn%C3%A9es%2C%201%2F3%22%20%7D);"></div>
<p>Cette série de 3 articles, basée sur une histoire vraie, va vous conter comment sauver (les données de) votre disque dur quand celui-ci vous annonce sa décision de ne plus fonctionner, soit de part sa vieillesse, soit par erreur<strong>s</strong> de votre part.</p>
<p>Vous retrouverez les protagonistes suivant :</p>
<ul>
<li>Dans le rôle des méchants : sfdisk, pvcreate et la fainéantise</li>
<li>Dans le rôle des gentils : <strong>testdisk</strong>, <strong>photorec</strong>,<strong> dd, ddrescue</strong> et la matière grise.</li>
</ul>
<p><a href="?p=12459">En avant pour le premier</a>, en anglais, qui traite de la suppression de partitions.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=12457" width="1" height="1" style="display: none;" />]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/comment-sauver-vos-donnees-13/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Petit-déjeuner &#171;&#160;Infocentre de sécurité&#160;&#187; le 16 novembre</title>
		<link>http://blog.octo.com/petit-dejeuner-infocentre-de-securite-le-16-novembre/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=petit-dejeuner-infocentre-de-securite-le-16-novembre</link>
		<comments>http://blog.octo.com/petit-dejeuner-infocentre-de-securite-le-16-novembre/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 11:39:56 +0000</pubDate>
		<dc:creator>Nelly Grellier</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[sécurité]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=16642</guid>
		<description><![CDATA[Souriez, vous êtes filmé &#8230; OCTO organise le mardi 16 novembre à 9h un petit-déjeuner gratuit de formation sur le sujet &#171;&#160;Infocentre de sécurité&#160;&#187; avec le témoignage de Natixis. Pour vous inscrire il vous suffit de consulter notre site internet. &#171;&#160;Qui a accès à quoi ?&#160;&#187;, &#171;&#160;Est-ce qu&#8217;untel a accès à l&#8217;application de vente ?&#160;&#187;, [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/petit-dejeuner-comment-batir-votre-cloud-15-novembre/' rel='bookmark' title='Petit-déjeuner : Comment bâtir votre Cloud ? 15 novembre'>Petit-déjeuner : Comment bâtir votre Cloud ? 15 novembre</a></li>
<li><a href='http://blog.octo.com/octo-organise-un-petit-dejeuner-sur-lagilite-jeudi-12-novembre/' rel='bookmark' title='OCTO organise un petit-déjeuner sur l&#8217;agilité, jeudi 12 novembre'>OCTO organise un petit-déjeuner sur l&#8217;agilité, jeudi 12 novembre</a></li>
<li><a href='http://blog.octo.com/octo-organise-un-petit-dejeuner-gestion-des-identites-le-27-janvier-temoignage-d-air-liquide/' rel='bookmark' title='OCTO organise un petit-déjeuner Gestion des Identités le 27 janvier &#8211; Témoignage d&#8217;Air Liquide'>OCTO organise un petit-déjeuner Gestion des Identités le 27 janvier &#8211; Témoignage d&#8217;Air Liquide</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fpetit-dejeuner-infocentre-de-securite-le-16-novembre%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Petit-d%C3%A9jeuner%20%5C%22Infocentre%20de%20s%C3%A9curit%C3%A9%5C%22%20le%2016%20novembre%22%20%7D);"></div>
<div id="_mcePaste"><strong>Souriez, vous êtes filmé &#8230;</strong></div>
<div><strong><br />
</strong></div>
<div>OCTO organise le mardi <strong>16 novembre à 9h</strong> un petit-déjeuner gratuit de formation sur le sujet &laquo;&nbsp;<strong>Infocentre de sécurité</strong>&nbsp;&raquo; avec le témoignage de Natixis.</div>
<div>Pour vous inscrire il vous suffit de consulter <a href="http://www.octo.com/Infocentre-de-securite.40/Evenements" target="_blank">notre site internet</a>.</div>
<div style="margin-top: 20px;"><span id="more-16642"></span></div>
<div style="margin-top: 20px;">&laquo;&nbsp;Qui a accès à quoi ?&nbsp;&raquo;, &laquo;&nbsp;Est-ce qu&#8217;untel a accès à l&#8217;application de vente ?&nbsp;&raquo;, &laquo;&nbsp;Combien avons-nous de comptes d&#8217;accès réseau morts / inutilisés ?&nbsp;&raquo; sont des questions auxquelles les traces de sécurité peuvent répondre. Pour ce faire, il est nécessaire de les collecter, les normaliser et les corréler aux référentiels RH, de demandes d&#8217;accès&#8230;</div>
<div id="_mcePaste">Techniquement, cela consiste à construire un <strong>infocentre</strong> détenant ces traces de sécurité, à dérouler des<strong> règles de contrôle </strong>et à en présenter les résultats en termes d&#8217;indicateurs de suivi de respect des règles et de listes de cas à régulariser.</div>
<div style="margin-top: 20px;">Durant cet atelier, nous allons nous focaliser sur ce <strong>contrôle</strong> a posteriori des <strong>accès et des autorisations</strong> aux applications du SI, contrôle qui demande à être industrialisé afin d&#8217;avoir la bonne réactivité.</div>
<div id="_mcePaste">Pour répondre aux exigences de ce type de contrôle, nous verrons comment nous avons défini au fur et à mesure les règles et les tableaux de suivi selon une démarche PDCA d&#8217;amélioration continue (pratique du lean management). Cette démarche est au coeur de la mise en oeuvre d&#8217;un Schéma de Management de la Sécurité de l&#8217;Information (norme ISO 27001).</div>
<div style="margin-top: 20px;">Via un<strong> retour d&#8217;expérience</strong> issu du monde de la <strong>Banque de Financement et d&#8217;Investissement </strong>(Natixis), nous tenterons de répondre aussi à vos interrogations :</div>
<div id="_mcePaste">
<ul>
<li><em>Quelles sont les typologies de contrôle ? A quoi ressemblent les tableaux de bord de suivi ?</em></li>
<li><em>Quel est le périmètre adressé des données de sécurité : données d&#8217;authentification, données d&#8217;autorisations, données de personnalisation&#8230;?</em></li>
<li><em>Comment démarre-t-on un tel projet ? Il y a-t-il des pré-requis ?</em></li>
<li><em>Comment le met-on en oeuvre ? Avec quels outils ?</em></li>
<li><em>Et après ?</em></li>
</ul>
</div>
<div>Rejoignez les<strong> experts et clients</strong> d&#8217;OCTO Technology pour ce petit-déjeuner.</div>
<div style="margin-top: 20px;">Ce séminaire s&#8217;adresse aux :</div>
<div id="_mcePaste">
<ul>
<li><em>RSSI, RSI</em></li>
<li><em>DSI (Etudes &amp; Production)</em></li>
<li><em>Responsables Habilitations (MOA, cellule transverse&#8230;)</em></li>
<li><em>Architectes Sécurité</em></li>
<li><em>Architectes Production</em></li>
<li><em>Chefs de projet Sécurité</em></li>
</ul>
<p><em><br />
</em></p>
</div>
<p style="text-align: center; margin-bottom: 20px;"><a href="http://www.octo.com/Infocentre-de-securite.40/Evenements" target="_blank">Je m&#8217;inscris au petit-déjeuner OCTO : infocentre de Sécurité</a></p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=16642" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/petit-dejeuner-comment-batir-votre-cloud-15-novembre/' rel='bookmark' title='Petit-déjeuner : Comment bâtir votre Cloud ? 15 novembre'>Petit-déjeuner : Comment bâtir votre Cloud ? 15 novembre</a></li>
<li><a href='http://blog.octo.com/octo-organise-un-petit-dejeuner-sur-lagilite-jeudi-12-novembre/' rel='bookmark' title='OCTO organise un petit-déjeuner sur l&#8217;agilité, jeudi 12 novembre'>OCTO organise un petit-déjeuner sur l&#8217;agilité, jeudi 12 novembre</a></li>
<li><a href='http://blog.octo.com/octo-organise-un-petit-dejeuner-gestion-des-identites-le-27-janvier-temoignage-d-air-liquide/' rel='bookmark' title='OCTO organise un petit-déjeuner Gestion des Identités le 27 janvier &#8211; Témoignage d&#8217;Air Liquide'>OCTO organise un petit-déjeuner Gestion des Identités le 27 janvier &#8211; Témoignage d&#8217;Air Liquide</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/petit-dejeuner-infocentre-de-securite-le-16-novembre/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HTML5, offline et sécurité</title>
		<link>http://blog.octo.com/html5-offline-et-securite/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=html5-offline-et-securite</link>
		<comments>http://blog.octo.com/html5-offline-et-securite/#comments</comments>
		<pubDate>Tue, 14 Sep 2010 14:40:44 +0000</pubDate>
		<dc:creator>François Petitit</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[développements]]></category>
		<category><![CDATA[Gears]]></category>
		<category><![CDATA[HTML 5]]></category>
		<category><![CDATA[HTML5]]></category>
		<category><![CDATA[sécurité]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=13220</guid>
		<description><![CDATA[Un article récent publié sur InfoQ abordait la sécurité de HTML5 dans sa globalité, et notamment sur des attaques concernant les nouvelles fonctionnalités de navigation hors-ligne de HTML5. Quelles sont donc ces fonctionnalités et qu&#8217;en est-il vraiment des risques associés? Rappel historique La seule possibilité pour une application web HTML/JavaScript de stocker des données dans [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/html5-la-promesse-dun-browser-qui-devient-vm/' rel='bookmark' title='HTML5 : la promesse d&#8217;un browser qui devient VM'>HTML5 : la promesse d&#8217;un browser qui devient VM</a></li>
<li><a href='http://blog.octo.com/tous-les-navigateurs-acceptent-html5-et-css3/' rel='bookmark' title='Tous les navigateurs acceptent HTML5 et CSS3'>Tous les navigateurs acceptent HTML5 et CSS3</a></li>
<li><a href='http://blog.octo.com/applications-natives-ou-web-html5-pour-mon-mobile/' rel='bookmark' title='Applications natives ou web HTML5 pour mon mobile ?'>Applications natives ou web HTML5 pour mon mobile ?</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fhtml5-offline-et-securite%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22HTML5%2C%20offline%20et%20s%C3%A9curit%C3%A9%22%20%7D);"></div>
<p>Un <a href="http://www.infoq.com/news/2010/08/html5-secure-enough">article récent publié sur InfoQ</a> abordait la sécurité de <a href="http://blog.octo.com/applications-natives-ou-web-html5-pour-mon-mobile/">HTML5</a> dans sa globalité, et notamment sur des attaques concernant les nouvelles <a href="http://dev.w3.org/html5/spec/offline.html#appcache">fonctionnalités de navigation hors-ligne de HTML5</a>.
<p />
Quelles sont donc ces fonctionnalités et qu&#8217;en est-il vraiment des risques associés?
<p />
<span id="more-13220"></span></p>
<h3><strong>Rappel historique</strong></h3>
<p>La seule possibilité pour une application web HTML/JavaScript de stocker des données dans un navigateur était jusqu&#8217;à récemment de les stocker dans un <a href="http://fr.wikipedia.org/wiki/Cookie_%28informatique%29">cookie</a>. Limités en taille (la <a href="http://tools.ietf.org/html/rfc2965">spécification</a> exige seulement des navigateurs qu&#8217;ils puissent gérer 4096 octets par cookie!), parfois refusés par les navigateurs et nettoyés régulièrement, et assimilés à des logiciels espions par les antivirus, leur fiabilité restait très limitée.<br />
D&#8217;autres technologies à base de plugins, comme Adobe Flash, utilisaient des procédés propriétaires ne répondant pas aux normes du W3C (les &laquo;&nbsp;<a href="http://en.wikipedia.org/wiki/HTTP_cookie#Adobe_Flash_Local_Shared_Objects">super cookies</a>&laquo;&nbsp;) et très critiquées pour leur opacité (manque de contrôle pour l&#8217;utilisateur pour savoir quelles informations sont stockées ou les supprimer). En 2007, Google a sorti <strong><a href="http://gears.google.com/">Google Gears</a></strong> qui a permis de stocker des données dans le navigateur sous la forme d&#8217;une base de  données relationnelle et de disposer en local d&#8217;un cache de ressources (cf. les <a href="http://blog.octo.com/et-si-vous-rendiez-vos-applications-web-offline-part-1/">articles publiés par Olivier Mallassi</a> sur le blog OCTO).</p>
<p>Cette nouveauté a permis le développement de véritables <strong>applications web</strong> stockant un nombre conséquent de données en local, permettant un <strong>fonctionnement déconnecté</strong> de l&#8217;application et une <strong>meilleure réactivité</strong> en évitant d&#8217;inutiles aller-retours avec le serveur. L&#8217;exemple le plus marquant étant naturellement le client mail de Google, Gmail, qui innovait en plus avec le &laquo;&nbsp;flaky mode&nbsp;&raquo; où l&#8217;utilisateur naviguait en permance en local, utilisant les ressources stockées dans son navigateur, et où l&#8217;application mettait à jour ces données quand une connexion à Internet était disponible. Cependant, Google Gears restait un produit de Google, et son implémentation sur les navigateurs n&#8217;était pas garantie.</p>
<p>Le groupe de travail sur HTML5, auquel contribue fortement Google, a alors déclaré vouloir<strong> inclure dans la spécification HTML5 des normes de stockage local</strong> s&#8217;inspirant de Google Gears. En parallèle, début 2009, Google a d&#8217;ailleurs arrêté le développement de Google Gears, au profit de l&#8217;implémentation de la norme HTML5.</p>
<p>Cette normalisation contraint déjà les navigateurs web à implémenter ces mécanismes, entraînant à coup sûr une <strong>démocratisation</strong> de leur utilisation par les applications web.
<p />
<h3>Quels sont les risques liés au stockage local?</h3>
<p>Parmi les sites précurseurs dans l&#8217;utilisation de stockage local se trouvent les <strong>webmails</strong>. Les données stockées  dans  le navigateur sont donc les courriers électroniques de l&#8217;utilisateur, qui sont des données très critiques par-rapport au respect de la vie privée, sans parler des cas où certains mails contiendraient des données plus sensibles, comme un numéro de compte bancaire&#8230;<br />
Il convient donc impérativement de <strong>s&#8217;assurer qu&#8217;aucun tiers ne puisse accéder à ces données</strong>.
<p />
<h3><strong>Quels sont les mécanismes de stockage local?</strong></h3>
<p>HTML5 prévoit deux systèmes de <strong>stockage de données</strong> en local : </p>
<ul>
<li>le <strong>Web Storage</strong>, comprenant <em>local storage</em>, toujours accessible à l&#8217;application et permettant par exemple à des onglets différents de partager des données, et le <em>session storage</em>, accessible uniquement à une fenêtre donnée. Les données sont stockées sous la forme de clés/valeurs,</li>
<li>la <strong>Web SQL Database</strong> fournissant cette fois une base de données relationnelle, implémentée par les navigateurs avec SQLite. Signalons au passage que le choix de SQLite a été fait par les éditeurs de navigateurs au détriment de la proposition initiale de &laquo;&nbsp;Indexed DB&nbsp;&raquo; proposée par le W3C. </li>
</ul>
<p>Un autre système de stockage local est fourni sous la forme de <strong><a href="http://dev.w3.org/html5/spec/offline.html#appcache">caches</a></strong> permettant cette fois-ci de <strong>stocker des ressources</strong> (images, fichiers JavaScript, etc.) et non plus des données.</p>
<p>Dans leurs spécifications respectives, le W3C aborde la sécurité, et décrit les mêmes problématiques pour les deux.
<p />
<h3>Quels risques et quelles protections?</h3>
<p />
<strong>La seule protection spécifiée par le W3C concerne l&#8217;origine des sites</strong> : des données stockées par un site A ne doivent pas être visibles pour un site B, en se basant sur  l&#8217;hôte du site et le port. Cela empêche par exemple une iframe inclus dans un site, typiquement un encart publicitaire, d&#8217;avoir accès aux données stockées localement par ce site.</p>
<p>Ce systèmes ne protège pas de certaines attaques, d&#8217;ailleurs décrites dans la spécification :</p>
<p>- les <strong>attaques par  <a href="http://fr.wikipedia.org/wiki/Usurpation_d%27adresse_IP">usurpation de DNS</a></strong>, qui consistent à usurper une adresse IP d&#8217;un serveur pour envoyer des paquets à sa place. Ce risque sera toutefois mitigé en utilisant SSL, et concerne le web dans sa globalité.</p>
<p>- le <strong>partage de nom d&#8217;hôte</strong> entre plusieurs sites : si le site d&#8217;adresse <em>http://www.mon-site.com/site1</em> stocke des données, un autre site d&#8217;adresse <em>http://www.mon-site.com/site2</em> y aura accès sans resctriction. Le risque étant faible de se faire attaquer par ce biais, car on a déjà fait confiance au premier site.</p>
<p>On remarquera que les <strong>attaques par <em>XSS</em> (<a href="http://fr.wikipedia.org/wiki/Cross-site_scripting">cross site scripting</a>)</strong> ne sont pas mentionnées et constituent pourtant un risque important, bien mis en valeur par l&#8217;<a href="http://www.owasp.org/index.php/Cross-site_Scripting_%28XSS%29">OWASP</a>. On pourra le mitiger avec notamment un <a href="http://www.owasp.org/index.php/Reviewing_Code_for_Cross-site_scripting">contrôle du code</a> côté serveur et une validation des données passées dans les formulaires.</p>
<p>La spécification ne prévoit pas d&#8217;autre mécanisme de sécurité.</p>
<p>Un point très important n&#8217;est pas abordé dans la spécification et pourrait pourtant s&#8217;avérer crucial : <strong>la spécification ne prévoit que les données stockées en base locale soient cryptées, elles sont toujours stockées en clair</strong>.<br />
Ce point a été soulevé par <a href="http://www.nczonline.net/about/">Nicholas C. Zakas</a> (un des référents mondiaux sur le langage JavaScript notamment, qui contribue à HTML5). Il a même proposé une proposition très détaillée d&#8217;évolution de la spécification vers un <strong>cryptage des données</strong>, décrite dans ce <a href="http://www.nczonline.net/blog/2010/04/13/towards-more-secure-client-side-data-storage/">billet.</a><br />
Dans ce système, un serveur d&#8217;application web aurait la responsabilité de chiffrer les données sur le client, avec une clé de cryptage gérée par l&#8217;application. Concrètement, une application web devrait exécuter la méthode Javascript suivante pour ouvrir la connexion en base de données :<br />
<code lang="javascript"><br />
window.openSecureStorage("mystorage", window.AES_128, key, function(storage){<br />
   //use storage object<br />
});<br />
</code><br />
L&#8217;application web choisirait donc l&#8217;algorithme de cryptage et la clef. Ainsi, <strong>même si un attaquant parvenait à récupérer des données, il ne pourrait les exploiter</strong>. On remarquera d&#8217;ailleurs que sans cryptage, toute personne ayant acccès physiquement au poste client pourra lire toutes ces données&#8230;
<p />
Bien que sa proposition soit assez complète et détaillée, il n&#8217;y a pas encore eu de suite à ma connaissance de la part d&#8217;autres acteurs du web.
<p />
<p>On peut tout de même se rassurer concernant les postes publiques (cyber cafés, etc.). En effet, les données sont stockées dans le navigateur dans un profil créé pour l&#8217;utilisateur, qui est normalement effacé lorsqu&#8217;il quitte le poste et que le compte est ré-initialisé, ce qui doit être l&#8217;usage pour ce type de poste. L&#8217;utilisateur devant tout de même s&#8217;en assurer, ce qui est loin d&#8217;être évident pour un utilisateur non initié. Il est ici plus question d&#8217;<strong>éducation des utilisateurs</strong> que de technologie.</p>
<p>Enfin, les caches peuvent quant à eux être attaqués par <strong><a href="http://www.owasp.org/index.php/Cache_Poisoning">&laquo;&nbsp;Cache poisoning&nbsp;&raquo;</a></strong>. L&#8217;objectif de l&#8217;attaquant est alors d&#8217;injecter dans le cache du navigateur un fichier JavaScript en remplacement d&#8217;un fichier fourni par le serveur &laquo;&nbsp;sain&nbsp;&raquo;, et dont le script malicieux serait exécuté par le client. Ce risque est à prendre en compte particulièrement dans les réseaux wifi ouverts comme on en trouve par exemple dans des restaurants, mais si ces attaques sont difficiles à détecter et à contrer, le risque s&#8217;avère relativement faible d&#8217;après les conditions requises pour permettre l&#8217;attaque, <a href="http://www.owasp.org/index.php/Cache_Poisoning">citées par l&#8217;OWASP</a>.</p>
<h2>Conclusion</h2>
<p />
<p>Malgré cette énumération de risques, qui plus est incomplète, il convient d&#8217;insister sur le fait qu&#8217;ils ne sont pas spécifiques à HTML5 mais au contraire inhérents au web depuis ses débuts.<br />
La nouveauté avec HTML5 est qu&#8217;il offre la possibilité de faire des application plus riches, stockant plus de données localement.<br />
Cela doit simplement inciter les concepteurs et développeurs d&#8217;applications web à une certaine vigilance concernant la sécurité des données locales, mais ne vous y méprenez pas, HTML5 constitue bien dès aujourd&#8217;hui une formidable opportunité pour vos applications web!</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=13220" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/html5-la-promesse-dun-browser-qui-devient-vm/' rel='bookmark' title='HTML5 : la promesse d&#8217;un browser qui devient VM'>HTML5 : la promesse d&#8217;un browser qui devient VM</a></li>
<li><a href='http://blog.octo.com/tous-les-navigateurs-acceptent-html5-et-css3/' rel='bookmark' title='Tous les navigateurs acceptent HTML5 et CSS3'>Tous les navigateurs acceptent HTML5 et CSS3</a></li>
<li><a href='http://blog.octo.com/applications-natives-ou-web-html5-pour-mon-mobile/' rel='bookmark' title='Applications natives ou web HTML5 pour mon mobile ?'>Applications natives ou web HTML5 pour mon mobile ?</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/html5-offline-et-securite/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Obfusquez-vous ?</title>
		<link>http://blog.octo.com/obfusquez-vous/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=obfusquez-vous</link>
		<comments>http://blog.octo.com/obfusquez-vous/#comments</comments>
		<pubDate>Mon, 12 Oct 2009 16:04:31 +0000</pubDate>
		<dc:creator>Eric Berenguier</dc:creator>
				<category><![CDATA[Architecture et technologies]]></category>
		<category><![CDATA[sécurité]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=6049</guid>
		<description><![CDATA[Les architectures d&#8217;exécution &#171;&#160;modernes&#160;&#187; comme Java et .Net ont apporté des gains indéniables comme la standardisation de l&#8217;infrastructure, portabilité, sécurité, performances dans certains cas, l&#8217;outillage pour les développeurs &#8230; Dans ces environnements, on peut obtenir facilement le code source de l&#8217;application à partir d&#8217;une application packagée (JAR/WAR/EAR ou EXE/DLL). Il suffit d&#8217;utiliser un &#171;&#160;décompilateur&#160;&#187;, par [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/obfusquez-vous-saison-2/' rel='bookmark' title='« Obfusquez-vous ? » Saison 2'>« Obfusquez-vous ? » Saison 2</a></li>
<li><a href='http://blog.octo.com/et-si-vous-rendiez-vos-applications-web-offline-part-3/' rel='bookmark' title='Et si vous rendiez vos applications Web Offline [Part #3]'>Et si vous rendiez vos applications Web Offline [Part #3]</a></li>
<li><a href='http://blog.octo.com/et-si-vous-rendiez-vos-applications-web-offline-part-2/' rel='bookmark' title='Et si vous rendiez vos applications Web Offline [Part #2]'>Et si vous rendiez vos applications Web Offline [Part #2]</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fobfusquez-vous%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Obfusquez-vous%20%3F%22%20%7D);"></div>
<p>Les architectures d&#8217;exécution &laquo;&nbsp;modernes&nbsp;&raquo; comme Java et .Net ont apporté des gains indéniables comme la standardisation de l&#8217;infrastructure, portabilité, sécurité, performances dans certains cas, l&#8217;outillage pour les développeurs &#8230;</p>
<p>Dans ces environnements, on peut obtenir facilement le code source de l&#8217;application à partir d&#8217;une application packagée (JAR/WAR/EAR ou EXE/DLL). Il suffit d&#8217;utiliser un <strong>&laquo;&nbsp;décompilateur&nbsp;&raquo;</strong>, par exemple jad, JD ou Jode dans le monde Java, et .Net Reflector pour .Net. Il n&#8217;existe pas de solution équivalente dans le cas de code natif (par exemple produit par un compilateur C/C++).</p>
<p><span id="more-6049"></span></p>
<p>Dans certains cas, cela n&#8217;est pas souhaitable :</p>
<ul>
<li> Si mon application contient des algorithmes qui constituent un avantage concurrentiel pour ma société et que le code est facilement accessible (par exemple si l&#8217;application est distribuée sous forme de client lourd). On peut citer par exemple les algorithmes de pricing dans le domaine de la finance ;</li>
<li>Un utilisateur qui a accès à l&#8217;application peut la modifier pour contourner un mécanisme de contrôle de licence ou contourner des mécanismes de contrôle d&#8217;accès implémentés dans le code client.</li>
</ul>
<p>Ces exemples s&#8217;appuient sur des solutions qui sont rarement choisies en cible pour les nouvelles applications (client lourd, contrôle d&#8217;accès sur le client &#8230;), mais beaucoup d&#8217;applications &laquo;&nbsp;legacy&nbsp;&raquo; sont bâties sur ces principes et modifier l&#8217;architecture d’une application existante peut se révéler très coûteux voire irréalisable à court-terme.</p>
<p>Les outils d&#8217;<strong>obfuscation</strong> (anglicisme, en français je n’ai trouvé que « obscurcissement » ou « offuscation » qui ne correspondent pas vraiment) proposent de remédier à ce problème. Ils modifient le code compilé (byte code Java,IL ou Intermediate Language en .Net) afin de le rendre incompréhensible. Certains produits annoncent même être capables de bloquer le fonctionnement des décompilateurs.<br />
On peut donc se poser la question de l&#8217;efficacité de tels outils. Je vais essayer d&#8217;apporter des éléments de réponse au travers 2 articles :</p>
<ul>
<li> Ce premier article « Obfusquez vous ? » expliquera leur fonctionnement des outils d&#8217;obfuscation au travers d&#8217;exemples concrets ;</li>
<li>Le deuxième article « Protégez vous ! », plus à destination des chefs de projet et architectes, permettra de s’écarter du code et prendre le recul nécessaire et proposera des bonnes pratiques, des éléments de démarche et des solutions alternatives lorsqu&#8217;on souhaite protéger son code.</li>
</ul>
<p>Voici donc les exemples de code :<br />
<img class="size-full wp-image-6057 aligncenter" title="explicitcode_petit" src="http://blog.octo.com/wp-content/uploads/2009/09/explicitcode_petit.jpg" alt="Manager Advisory - Explicit Code" width="128" height="89" /><br />
<strong>Premier exemple : obfuscation basique</strong><br />
Ce premier exemple présente un mécanisme simple et implémenté par tous les outils du marché. Il consiste à renommer tous les symboles (noms de classes, méthodes, packages &#8230;). Les informations de &laquo;&nbsp;debug&nbsp;&raquo; (numéros de lignes, noms de variables locales &#8230;) sont aussi supprimées pour limiter les informations disponibles sur le code original.<br />
Voici le code original de notre exemple :</p>

<div class="wp_codebox"><table><tr id="p60499"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="code" id="p6049code9"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.octo.pokermanager.core</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.File</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.FileInputStream</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.FileOutputStream</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.IOException</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.ObjectInputStream</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.ObjectOutputStream</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.HashMap</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Map</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.octo.pokermanager.client.model.Tournament</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">com.octo.pokermanager.exception.InitializeException</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> TournamentPersisterSerialisableImpl <span style="color: #000000; font-weight: bold;">implements</span> TournamentPersister <span style="color: #009900;">&#123;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> Map<span style="color: #339933;">&lt;</span> <span style="color: #003399;">String</span> , Tournament <span style="color: #339933;">&gt;</span> tournaments <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">static</span> <span style="color: #000000; font-weight: bold;">final</span> <span style="color: #003399;">String</span> DB_FILE_NAME <span style="color: #339933;">=</span> <span style="color: #0000ff;">&quot;persist.db&quot;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #666666; font-style: italic;">/*
	 * @see
	 * com.octo.pokermanager.server.TournamentPersister#save(com.octo.pokermanager
	 * .client.model.Tournament)
	 */</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> save<span style="color: #009900;">&#40;</span>Tournament tournament<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #009900;">&#40;</span>tournament.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">IllegalArgumentException</span><span style="color: #009900;">&#40;</span>
					<span style="color: #0000ff;">&quot;Tournament name should not be null [tournament:&quot;</span>
							<span style="color: #339933;">+</span> tournament <span style="color: #339933;">+</span> <span style="color: #0000ff;">&quot;]&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
&nbsp;
		tournaments.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>tournament.<span style="color: #006633;">getName</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, tournament<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">try</span> <span style="color: #009900;">&#123;</span>
			persistInFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span> <span style="color: #000000; font-weight: bold;">catch</span> <span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> e<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #666666; font-style: italic;">//TODO : do something</span>
			e.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
	<span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> persistInFile<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #003399;">FileOutputStream</span> underlyingStream <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileOutputStream</span><span style="color: #009900;">&#40;</span>DB_FILE_NAME<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #003399;">ObjectOutputStream</span> serializer <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ObjectOutputStream</span><span style="color: #009900;">&#40;</span>underlyingStream<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		serializer.<span style="color: #006633;">writeObject</span><span style="color: #009900;">&#40;</span>tournaments<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		serializer.<span style="color: #006633;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		underlyingStream.<span style="color: #006633;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		serializer.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		underlyingStream.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">// ...</span></pre></td></tr></table></div>

<p>Et voici le code récupéré après passage d&#8217;un obfuscateur et décompilation :</p>

<div class="wp_codebox"><table><tr id="p604910"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code" id="p6049code10"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">a.a.a.b</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">a</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">a.a.a.a.a.i</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">a.a.a.d.a</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.*</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.HashMap</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.Map</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> c
    <span style="color: #000000; font-weight: bold;">implements</span> a.<span style="color: #006633;">a</span>.<span style="color: #006633;">a</span>.<span style="color: #006633;">b</span>.<span style="color: #006633;">a</span>
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #003399;">Map</span> a<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> a<span style="color: #009900;">&#40;</span>i j<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #000000; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>j.<span style="color: #006633;">M</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #009900;">&#41;</span>
            <span style="color: #000000; font-weight: bold;">throw</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">IllegalArgumentException</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #000000; font-weight: bold;">new</span> StringBuilder<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>a.<span style="color: #006633;">a</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;nTLHPZP_<span style="color: #000099; font-weight: bold;">\\</span>O<span style="color: #000099; font-weight: bold;">\0</span>21TWVP<span style="color: #000099; font-weight: bold;">\0</span>32YSFOB_<span style="color: #000099; font-weight: bold;">\r</span>TMO<span style="color: #000099; font-weight: bold;">\0</span>01XC<span style="color: #000099; font-weight: bold;">\0</span>33KOvW9ajThH|Z|_xOo&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>j<span style="color: #009900;">&#41;</span>.<span style="color: #006633;">append</span><span style="color: #009900;">&#40;</span>a.<span style="color: #006633;">a</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\b</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #006633;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        a.<span style="color: #006633;">put</span><span style="color: #009900;">&#40;</span>j.<span style="color: #006633;">M</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>, j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000000; font-weight: bold;">try</span>
        <span style="color: #009900;">&#123;</span>
            B<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #000000; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">IOException</span> ioexception<span style="color: #009900;">&#41;</span>
        <span style="color: #009900;">&#123;</span>
            ioexception.<span style="color: #006633;">printStackTrace</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #000000; font-weight: bold;">private</span> <span style="color: #000066; font-weight: bold;">void</span> B<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>
        <span style="color: #000000; font-weight: bold;">throws</span> <span style="color: #003399;">IOException</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">FileOutputStream</span> fileoutputstream <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">FileOutputStream</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;persist.db&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #003399;">ObjectOutputStream</span> objectoutputstream <span style="color: #339933;">=</span> <span style="color: #000000; font-weight: bold;">new</span> <span style="color: #003399;">ObjectOutputStream</span><span style="color: #009900;">&#40;</span>fileoutputstream<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        objectoutputstream.<span style="color: #006633;">writeObject</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        objectoutputstream.<span style="color: #006633;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        fileoutputstream.<span style="color: #006633;">flush</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        objectoutputstream.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        fileoutputstream.<span style="color: #006633;">close</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #666666; font-style: italic;">// ...</span></pre></td></tr></table></div>

<p>On remarque sur cet exemple qu&#8217;un même nom de symbole a été utilisé plusieurs fois pour réduire encore la lisibilité du code.</p>
<p>On peut aussi remarquer que les chaînes de caractères ont été chiffrés (cf. ligne 18) par la fonction de « string obfuscation » proposée par certains produits. Son objectif est de masquer des informations présentes dans le code comme des mots de passe ou autre information sensible. Le lecteur attentif aura remarqué que le code permettant de déchiffrer ces informations se trouve quelque part en clair dans l’application packagée et qu’il est facile de le retrouver.</p>
<p><strong>Deuxième exemple : obfuscation &laquo;&nbsp;avancée&nbsp;&raquo;</strong><br />
Le dernier mécanisme étudié ici est le &laquo;&nbsp;control-flow obfuscation&nbsp;&raquo; (obfuscation des structures de contrôle). En Java et .Net, les structures de contrôles du langage (if, for, while, exceptions &#8230;) se traduisent en byte code par des branchements simples (l&#8217;équivalent d&#8217;un &laquo;&nbsp;goto&nbsp;&raquo; pour ceux qui s&#8217;en souviennent). Il est possible d&#8217;écrire du byte code correct qui ne correspond à aucune structure de contrôle du langage de haut niveau,</p>
<p>Un obfuscateur va donc modifier légèrement une classe de manière à ne pas modifier son comportement, mais à faire échouer un décompilateur, ce qui se traduit en général par un résultat faux du décompilateur (code qui ne compile pas, ou qui n’est pas équivalent au code original), ou même faire planter le décompilateur.</p>
<p>L&#8217;impact  du « control flow obfuscation » est très variable selon les produits.</p>
<p>Voici le code original :</p>

<div class="wp_codebox"><table><tr id="p604911"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
</pre></td><td class="code" id="p6049code11"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">com.octo.pokermanager.client.model</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.Serializable</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.List</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> RandomPlayerSelector <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">Serializable</span>, PlaceSelector <span style="color: #009900;">&#123;</span>
	<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> reorderPlayers<span style="color: #009900;">&#40;</span>List<span style="color: #339933;">&lt;</span> Players <span style="color: #339933;">&gt;</span> players<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		Player tmp <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
		<span style="color: #000066; font-weight: bold;">int</span> nbPerm <span style="color: #339933;">=</span> players.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #009900;">&#40;</span>nbPerm<span style="color: #339933;">&gt;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#41;</span> <span style="color: #003399;">Math</span>.<span style="color: #006633;">round</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Math</span>.<span style="color: #006633;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>players.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">-</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">int</span> j <span style="color: #339933;">=</span> nbPerm<span style="color: #339933;">---</span><span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
			tmp <span style="color: #339933;">=</span> players.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>i<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			players.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span>i, players.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>j<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
			players.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span>j, tmp<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Et le code obfusqué décompilé :</p>

<div class="wp_codebox"><table><tr id="p604912"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
</pre></td><td class="code" id="p6049code12"><pre class="java" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">package</span> <span style="color: #006699;">a.a.a.a.a</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.io.Serializable</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">import</span> <span style="color: #006699;">java.util.List</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000000; font-weight: bold;">class</span> k
    <span style="color: #000000; font-weight: bold;">implements</span> <span style="color: #003399;">Serializable</span>, d
<span style="color: #009900;">&#123;</span>
    <span style="color: #000000; font-weight: bold;">public</span> <span style="color: #000066; font-weight: bold;">void</span> a<span style="color: #009900;">&#40;</span><span style="color: #003399;">List</span> list<span style="color: #009900;">&#41;</span>
    <span style="color: #009900;">&#123;</span>
        <span style="color: #003399;">Object</span> obj <span style="color: #339933;">=</span> <span style="color: #000066; font-weight: bold;">null</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> i <span style="color: #339933;">=</span> list.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
_L3<span style="color: #339933;">:</span>
        JVM INSTR ifle <span style="color: #cc66cc;">83</span><span style="color: #339933;">;</span>
           <span style="color: #000000; font-weight: bold;">goto</span> _L1 _L2
_L1<span style="color: #339933;">:</span>
        <span style="color: #000066; font-weight: bold;">int</span> j <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">int</span><span style="color: #009900;">&#41;</span><span style="color: #003399;">Math</span>.<span style="color: #006633;">round</span><span style="color: #009900;">&#40;</span><span style="color: #003399;">Math</span>.<span style="color: #006633;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">*</span> <span style="color: #009900;">&#40;</span><span style="color: #000066; font-weight: bold;">double</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#40;</span>list.<span style="color: #006633;">size</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #000066; font-weight: bold;">int</span> i1 <span style="color: #339933;">=</span> i<span style="color: #339933;">--</span> <span style="color: #339933;">-</span> <span style="color: #cc66cc;">1</span><span style="color: #339933;">;</span>
        l l1 <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span>l<span style="color: #009900;">&#41;</span>list.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>j<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        list.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span>j, list.<span style="color: #006633;">get</span><span style="color: #009900;">&#40;</span>i1<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        list.<span style="color: #006633;">set</span><span style="color: #009900;">&#40;</span>i1, l1<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        i<span style="color: #339933;">;</span>
          <span style="color: #000000; font-weight: bold;">goto</span> _L3
_L2<span style="color: #339933;">:</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>Le décompilateur n&#8217;a donc pas su produire du code recompilable.</p>
<p><strong>Conclusion</strong><br />
Cette description n&#8217;est pas exhaustive, il existe d&#8217;autres mécanismes comme par exemple :</p>
<ul>
<li>l&#8217;injection de code mort (code non appelé, ou n&#8217;ayant pas d&#8217;impact sur le fonctionnement du code) dans le corps des méthodes pour réduire la lisibilité ;</li>
<li>le remplacement de code par du code équivalent fonctionnellement (par exemple avec de l&#8217;&nbsp;&raquo;inlining&nbsp;&raquo; de méthodes, ajouts de tests toujours vrais, etc &#8230;);</li>
<li>le chiffrement des fichiers jar ou assembly (il ne s&#8217;agit pas d&#8217;obfuscation à proprement parler).</li>
</ul>
<p>On peut donc se demander si ces outils sont réellement efficaces ? S&#8217;il existe des moyens de contournement ? D&#8217;autres méthodes plus efficaces sont-t-elles à privilégier ?</p>
<p>Mon prochain article essaiera de répondre à ces questions et abordera en particulier les points suivants :</p>
<ul>
<li>Quelles sont les limitations des obfuscateurs ?</li>
<li>Quelles sont les bonnes pratiques pour réussir la mise en œuvre d’un outil d&#8217;obfuscation ?</li>
<li>Les outils d&#8217;obfuscation se présentent comme des « moulinettes » qui protègent automatiquement le code et les coûts de licence de ces produits sont en général raisonnables, donc à première vue le coût de mise en oeuvre ne semble pas important. Mais y-a-t-il des coûts cachés ? Quel est l&#8217;impact sur le processus projet ?</li>
<li>Existe-t-il des solutions alternatives ?</li>
</ul>
<p>En attendant, n&#8217;hésitez pas à réagir sur ces exemples et sur l&#8217;obfuscation en général.</p>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=6049" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/obfusquez-vous-saison-2/' rel='bookmark' title='« Obfusquez-vous ? » Saison 2'>« Obfusquez-vous ? » Saison 2</a></li>
<li><a href='http://blog.octo.com/et-si-vous-rendiez-vos-applications-web-offline-part-3/' rel='bookmark' title='Et si vous rendiez vos applications Web Offline [Part #3]'>Et si vous rendiez vos applications Web Offline [Part #3]</a></li>
<li><a href='http://blog.octo.com/et-si-vous-rendiez-vos-applications-web-offline-part-2/' rel='bookmark' title='Et si vous rendiez vos applications Web Offline [Part #2]'>Et si vous rendiez vos applications Web Offline [Part #2]</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/obfusquez-vous/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Retours de la Mobile Payment expo 2009</title>
		<link>http://blog.octo.com/retours-de-la-mobile-payment-expo-2009/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=retours-de-la-mobile-payment-expo-2009</link>
		<comments>http://blog.octo.com/retours-de-la-mobile-payment-expo-2009/#comments</comments>
		<pubDate>Mon, 20 Jul 2009 06:00:30 +0000</pubDate>
		<dc:creator>Anis Ferchichi</dc:creator>
				<category><![CDATA[Actualité]]></category>
		<category><![CDATA[banque mobile]]></category>
		<category><![CDATA[Mobile payment]]></category>
		<category><![CDATA[NFC]]></category>
		<category><![CDATA[rémittance]]></category>
		<category><![CDATA[sécurité]]></category>

		<guid isPermaLink="false">http://blog.octo.com/?p=3760</guid>
		<description><![CDATA[La Mobile Payment Expo 09 s&#8217;est déroulée à Paris les 17 et 18 Juin 2009. C&#8217;était une occasion de découvrir une nouvelle activité regroupant différents acteurs : les banquiers, les opérateurs téléphoniques et les fournisseurs de service (software et hardware). L&#8217;expansion rapide de la banque mobile La banque mobile peut être définie comme étant la possibilité [...]
Suggestion d'articles :<ol>
<li><a href='http://blog.octo.com/octo-au-salon-mobile-it-expo-les-18-19-20-octobre-paris-porte-de-versailles/' rel='bookmark' title='OCTO au salon Mobile IT expo les 18-19-20 octobre &#8211; Paris Porte de Versailles'>OCTO au salon Mobile IT expo les 18-19-20 octobre &#8211; Paris Porte de Versailles</a></li>
<li><a href='http://blog.octo.com/retours-sur-le-javacampparis-ii/' rel='bookmark' title='Retours sur le JavaCampParis II'>Retours sur le JavaCampParis II</a></li>
<li><a href='http://blog.octo.com/octo-au-salon-cloud-it-expo-2011-mercredi-19/' rel='bookmark' title='OCTO au salon Cloud &amp; IT Expo 2011, mercredi 19'>OCTO au salon Cloud &#038; IT Expo 2011, mercredi 19</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[
<div class="topsy_widget_data topsy_theme_blue" style="float: right;margin-left: 0.75em; background: url(data:,%7B%20%22url%22%3A%20%22http%253A%252F%252Fblog.octo.com%252Fretours-de-la-mobile-payment-expo-2009%252F%22%2C%20%22style%22%3A%20%22small%22%2C%20%22title%22%3A%20%22Retours%20de%20la%20Mobile%20Payment%20expo%202009%22%20%7D);"></div>
<p>La <a href="http://mobilepaymentexpo.com/" target="_blank">Mobile Payment Expo 09</a> s&#8217;est déroulée à Paris les 17 et 18 Juin 2009. C&#8217;était une occasion de découvrir une nouvelle activité regroupant différents acteurs : les banquiers, les opérateurs téléphoniques et les fournisseurs de service (software et hardware).</p>
<p><span id="more-3760"></span></p>
<h2>L&#8217;expansion rapide de la banque mobile</h2>
<p>La banque mobile peut être définie comme étant la possibilité de réaliser des opérations bancaires via un téléphone mobile. Ces activités bancaires sont principalement :</p>
<ul>
<li>Le &laquo;&nbsp;mobile payment&nbsp;&raquo; pour les paiements et les achats via le téléphone mobile.</li>
<li>La remittance (1) nationale et internationale pour les transferts d&#8217;argent.</li>
</ul>
<p>Ces opérations sont classiques et peuvent être réalisés par internet. Cependant, l&#8217;innovation concerne la mise à disposition de celles-ci pour des personnes non bancarisées et également offrir de nouveaux services :</p>
<ul>
<li>Charges en urgence des cartes prépayées.</li>
<li>Offrir la possibilité de souscrire des contrats (assurance, garantie&#8230;) directement à partir de son téléphone portable en utilisant l&#8217;appareil photo intégré pour envoyer une photo de l&#8217;annonce ou du contrat à sa banque.</li>
<li>Le crédit mutuel a même mis en place un coffre fort bancaire pour les papiers officiels simplement pris en photo avec le téléphone mobile.</li>
</ul>
<p>Le crédit mutuel s&#8217;est clairement positionné sur ce nouveau marché. Un service pilote lancé en Février 2009 compte déjà 400 000 clients, IBM, de son coté, présente son expérience avec deux projets mondiaux réussis :</p>
<ul>
<li>Au japon, une banque a développé toute son activité sur un seul canal : le téléphone mobile avec le canal internet en backup. Par exemple, pour souscrire à un contrat et rejoindre leurs services, il suffit de prendre en photo les papiers officiels avec le téléphone mobile et de les envoyer par MMS pour que le contrat soit conclu.</li>
<li>Au Corée du sud, une carte à puce multi-services peut servir comme une carte SIM pour le téléphone mobile, une carte de crédit, un coffre fort de mots de passe et même comme clé pour le véhicule. Cette carte permet de réaliser de vraies transactions bancaires. La Corée du sud compte déjà 30 millions d&#8217;utilisateurs de cette carte.</li>
</ul>
<p>Gemalto (un fournisseur de solutions technologiques pour la banque mobile) résume le marché de la banque mobile en deux segments : les clients bancarisés et ceux qui ne le sont pas. Ces populations sont réparties sur trois zones de pays en voie de développement : Amérique latine (principalement la Colombie et le Mexique), l&#8217;Afrique (pays subsahariens) et l&#8217;Asie. Cependant des freins et des pistes d&#8217;amélioration existent et couvrent deux aspects :</p>
<ul>
<li>La sécurité : au travers de l&#8217;identification, le contrôle d&#8217;accès, la confidentialité des échanges, l&#8217;intégrité des données et la non répudiation.</li>
<li>L&#8217;usabilité des interfaces, l&#8217;ergonomie et qualité du service : ces points seront couverts avec une amélioration de la bande passante et un réseau de qualité.</li>
</ul>
<h2>Le transfert d&#8217;argent par Mobile en pleine croissance</h2>
<p>Les rapports estiment à 250 millions de dollars le montant des transferts mobiles mondiaux en 2008. Ce marché très prometteur a vu l&#8217;émergence de beaucoup de solutions :</p>
<ul>
<li>La plateforme « Flouss.com » : permet le transfert d&#8217;argent entre particuliers en utilisant  les cartes prépayées. La plateforme travaille en association avec MasterCard et Western Union et assure un transfert en temps réel.</li>
<li>VISA n&#8217;est pas resté en retrait sur ce segment du marché en développant des initiatives autour du paiement de proximité (la technologie NFC (2)), le transfert d&#8217;argent par mobile (entre particuliers et à destination de l&#8217;étranger) et également le paiement en ligne avec le mobile.</li>
<li>La caisse d&#8217;épargne est en train de développer des offres autour du NFC P2P et le transfert de l&#8217;argent mobile à l&#8217;international.</li>
</ul>
<p>Les fournisseurs de solutions ou de services sont aussi assez présents sur le marché. C&#8217;est le cas d&#8217;Eserv Global, un fournisseur de solution pour opérateur mobile, qui a mis sur le marché une solution de transfert d&#8217;argent de mobile à mobile certifié GSMA (3). Cette solution consiste à mettre à disposition des utilisateurs un ensemble d&#8217;APIs libres permettant l&#8217;accès à leur hub.</p>
<p>La « success strory » la plus connue est le transfert d&#8217;argent par mobile M-Pesa (service de Safaricom et de Vodafone) au Kenya avec 6,5 millions d&#8217;utilisateurs. Cette initiative vise à résoudre le problème local de banking avec un niveau de bancarisation très bas de la population mais paradoxalement un niveau de possession de téléphone portable assez élevé (exemple l&#8217;Afrique du sud, entre 8 et 12% de la population est bancarisée mais plus de 95% possèdent un téléphone mobile). Ces initiatives locales sont difficilement dissociables des projets internationaux de remittance car les flux entrants alimentent les systèmes locaux. D&#8217;où le besoin de création de corridors internationaux à destination surtout des pays en voie de développement.  Les couples émetteur &#8211; récipiendaire couvre une large palette de solutions possibles :</p>
<ul>
<li>Pour l&#8217;émetteur : cash, compte, téléphone mobile ou portefeuille électronique.</li>
<li>Pour le récipiendaire (4) : téléphone mobile, carte prépayée et DAB.  Le problème pour cette catégorie est le manque d&#8217;agence bancaire pour la gestion locale.</li>
</ul>
<p>Cet engouement pour le transfert mobile d&#8217;argent exige principalement la gestion de deux risques majeurs :</p>
<ul>
<li>Le blanchiment d&#8217;argent : Ce risque exige la supervision de toutes les transactions et la mise en place d&#8217;une réglementation pour encadrer toute l&#8217;activité.</li>
<li>La gestion de la sécurité des transactions et des données sur le téléphone mobile. Pour pallier à ce risque, les acteurs concernés travaillent sur la mise en place de solutions de sécurité forte (software et hardware) et des passerelles sécurisées.</li>
</ul>
<h2>Le rôle du mobile dans la sécurité des transactions sur internet</h2>
<p>Les transactions en ligne sont déjà nombreuses (paiement, achat, transfert d&#8217;argent&#8230;) mais sont appelées à augmenter significativement dans un futur proche avec l&#8217;apparition de nouveaux services (e-justice, vote&#8230;). De multiples solutions sont à disposition pour sécuriser ces transactions :</p>
<ul>
<li>Les mots de passe      statiques.</li>
<li>Les mots de passe      dynamiques : OTP (One Time Password).</li>
<li>Les certificats      électroniques : PKI (Public Key Infrastructure).</li>
</ul>
<p>D&#8217;un autre coté, les transactions frauduleuses se développent avec la croissance d&#8217;internet avec 2 grandes variantes:</p>
<ul>
<li>Les fraudes à la carte bancaire : en 2007, ces fraudes ont significativement augmenté pour devenir pratiquement équivalentes aux fraudes dans les commerces de proximité.</li>
<li>Le Phishing : afin      d&#8217;obtenir les renseignements personnels des internautes.</li>
</ul>
<p>Afin de remédier à ces menaces sur le téléphone mobile, de nombreuses solutions d&#8217;identification forte existent ou sont en cours de développement :</p>
<ul>
<li>Les solutions OTP      online :
<ul>
<li>OTP / SMS : c&#8217;est la       solution classique d&#8217;envoi de mot de passe dynamique par SMS.</li>
<li>OTP / USSD et OTP / SMS+ : pour       ces deux solutions, la demande est à l&#8217;initiative du mobile.</li>
<li>OTP / SVI : orienté       téléphone fixe.</li>
</ul>
</li>
<li>Les solutions OTP      offline :
<ul>
<li>Magasin d&#8217;OTP : le       magasin est stocké dans le mobile et consommé au fur et à mesure.</li>
<li>Génération d&#8217;OTP :       un device est utilisé pour générer des mots de passe dynamiques.</li>
</ul>
</li>
<li>Les solutions OTP sans ressaisie : pas de saisie manuelle, l&#8217;OTP est transcodé et renvoyé au serveur par le canal adapté
<ul>
<li>OTP Audio</li>
<li>OTP Visuel</li>
</ul>
</li>
<li>Les solutions PKI mobile :      une clé privée et un certificat sont stockés sur la carte SIM.</li>
</ul>
<p>Il existe également des solutions de signature électronique basée sur un certificat. Et on distingue:</p>
<ul>
<li>Une signature électronique      simple, stockée sur un média non sécurisé (exemple la signature pour les      impôts)</li>
<li>Une signature électronique sécurisée / qualifiée, stockée sur un média sécurisé (exemple la signature d&#8217;un contrat électronique). La carte SIM est considérée comme un média sécurisé.</li>
</ul>
<p>Les bénéfices de la signature électronique sont</p>
<ul>
<li>Gain de      productivité : dématérialisation des certificats.</li>
<li>Développement durable.</li>
<li>Accroissement des      ventes : contractualisation en temps réel.</li>
<li>Réduction des files      d&#8217;attente aux guichets par anticipation des signatures.</li>
</ul>
<p>La carte SIM associée au mobile est la meilleure solution pour répondre aux besoins actuels et futurs d&#8217;authentification et de signature électronique car le dispositif se distingue grâce à des caractéristiques clés : sécurisé, universel et interactif.</p>
<h2>La vraie nouveauté de NFC, c&#8217;est le mode P2P</h2>
<p>La technologie la plus aboutie est le NFC (Near Field Communication) qui est un mode de communication basé sur une technologie d&#8217;échanges de données en champ proche avec une courte portée (quelques centimètres). Il a été standardisé par plusieurs organismes : ISO, ECMA, ETSI et NFC Forum. Le NFC prend en charge trois types de fonctionnement :</p>
<ul>
<li>Emulation de cartes : le terminal mobile émule le fonctionnement d&#8217;une carte à puce sans-contact. Ce mode de fonctionnement requiert un élément sécurisé, la carte SIM dans le cas des téléphones portable. Ce mode est généralement utilisé pour les paiements et les contrôles d&#8217;accès.</li>
<li>Lecture de carte ou tags : ce mode permet la lecture des cartes ou des tags passifs sans contact ainsi que le réveil des applications (norme JSR 257).</li>
</ul>
<ul>
<li>P2P (pair-à-pair) : ce mode est le plus intéressant car il implémente un mode de communication symétrique (échange d&#8217;information entre les deux appareils). L&#8217;une ou l&#8217;autre partie peut initier la communication (poser des questions / réponses). Ce mode présente un débit assez intéressant : jusqu&#8217;à 424 kbps actuellement et prochainement 1Mbps avec les nouvelles spécifications. Le plus grand avantage de ce mode est qu&#8217;il ne requiert pas d&#8217;élément sécurisé (la sécurité est supportée par la couche applicative).</li>
</ul>
<p>Le NFC P2P est une technologie dérivée du RFID avec comme avantages : une plus grande taille des données en échange et 3 modes de fonctionnement différents. Cependant, le NFC P2P a une plus courte portée que le RFID. La comparaison par rapport au Bluetooth est tout aussi intéressante. Le NFC P2P présente un débit inférieur (jusqu&#8217;à 24 Mbps pour le Bluetooth) mais il ne nécessite pas d&#8217;échange de code pour le pairage contrairement au Bluetooth. Le NFC P2P est plus approprié pour les échanges courts alors que le Bluetooth est destiné aux échanges plus longs. En conclusion, NFC P2P et Bluetooth sont intrinsèquement différents mais peuvent être utilisés d&#8217;une façon complémentaire.  L&#8217;architecture de la technologie NFC est composée de :</p>
<ul>
<li>Un « Application      Processor » composé essentiellement d&#8217;un « midlet ».</li>
<li>Un « Secure Element », ce composant est généralement une carte SIM qui permet d&#8217;assurer la sécurité des communications. L&#8217;avantage du mode NFC P2P est de ne pas avoir besoin d&#8217;implémenter cette couche « Secure Element ».</li>
<li>Un « NFC      Controller » implémentant l&#8217;un des trois types de fonctionnement du      NFC (émulations de carte, lecture ou P2P)</li>
</ul>
<p>Les contraintes du NFC P2P sont :</p>
<ul>
<li>Il n&#8217;y a pas de sécurité dans le protocole NFC P2P, mais elle peut être assurée par la couche applicative. Un standard de sécurisation, le NFC-SEC, est en cours de finalisation par l&#8217;ECMA.</li>
<li>Le processeur (« midlet ») n&#8217;est pas un emplacement aussi sécurisé que la SIM. Cependant, toutes les données ne nécessitent pas une haute sécurité et le stockage local des données peut être crypté avec PIN et décrypté par un serveur sécurisé.</li>
<li>Le NFC P2P n&#8217;est pas encore complètement standardisé. La version finale va être publiée très prochainement, la Release Candidate a déjà été diffusé au NFC Forum par Digital Protocal et LLCP.</li>
<li>L&#8217;utilisation généralisée      de la technologie NFC P2P nécessite le déploiement de composants      « Full NFC ».</li>
</ul>
<p>Les exemples d&#8217;usage de cette technologie sont nombreux :</p>
<ul>
<li>Pairage et échange de      contenus multimédias (entre téléphones mobiles).</li>
<li>Les « Friends      Request » sur les réseaux sociaux.</li>
<li>NFC Ticketless : une      utilisation principale pour remplacer les billets de transport et les      cartes de fidélité.</li>
<li>NFC Purse : pour le      paiement et le transfert d&#8217;argent entre particuliers.</li>
</ul>
<p>En conclusion, la plus grande contrainte de l&#8217;utilisation du NFC P2P est le déploiement nécessitant un équipement spécifique. Egalement, cette architecture légère est destinée principalement aux applications ayant des besoins de sécurité faibles. Malgré ces deux inconvénients, la technologie du NFC P2P présente de nombreux cas d&#8217;usage intéressants et d&#8217;avenir.</p>
<h2>Autres applications du mobile payment</h2>
<h3><a></a>Mobile P2P, du paiement au prêt entre particuliers</h3>
<p>Dans ce contexte, mobile P2P (person-to-person) signifie l&#8217;envoi d&#8217;argent à partir du mobile d&#8217;une personne à une autre. Les cas d&#8217;usage de ce modèle sortent du modèle du paiement / achat mobile pour viser plutôt l&#8217;envoi d&#8217;argent dans une communauté (famille ou amis). Quelques exemples sont:</p>
<ul>
<li>Remboursement d&#8217;une dette      ou d&#8217;un prêt à un ami.</li>
<li>Usage communautaire du type collecte d&#8217;argent (pour un évènement). Ce type d&#8217;usage est communautaire. L&#8217;entreprise FriendsClear a implémenté sa solution en vue de répondre à ce besoin. PayPal s&#8217;intéresse aussi à ce type d&#8217;usage et son application pour iPhone devrait sortir d&#8217;ici l&#8217;été.</li>
<li>A une échelle plus grande, on trouve la solution de Babyloan orienté micro-crédit. Des particuliers choisissent les bénéficiaires du crédit et paient la totalité ou une partie du crédit demandé. Le remboursement du prêt sans intérêts se fait au bout de 6 ou 12 mois.</li>
</ul>
<h3>Du m-Commerce au marketing mobile</h3>
<p>Un autre contexte d&#8217;utilisation très proche de la banque et du commerce mobiles est le marketing mobile qui signifie l&#8217;envoi d&#8217;offres ciblées sur le mobile. Cette activité est poussée par un ROI plus rapide et une cible plus directe et non plus pour faire simplement de la publicité. Un exemple récent est la campagne lancée par Renault pour sa Twingo Nokia sur les téléphones mobiles qui a généré 130 essais automobiles. Le grand avantage de cette démarche est la réactivité du média mobile considéré comme un média « chaud ». D&#8217;un coté, les freins du le m-Commerce sont principalement que l&#8217;offre et la cible ne sont pas encore bien claires. D&#8217;un autre coté, Les leviers sont bien plus nombreux et concrets :</p>
<ul>
<li>Les forfaits data de moins      en moins chers et permettant un accès illimité à internet.</li>
<li>Des téléphones de plus en      plus évolués et aboutis.</li>
<li>Des applications mobiles      de plus en plus disponibles et ergonomiques surtout à destinations des      smarts mobiles.</li>
</ul>
<p>Un enjeu important du m-Commerce est la géolocalisation du client permettant l&#8217;envoi d&#8217;offres ciblées. Les contraintes techniques ont été résolues et des solutions viables sont disponibles pour n&#8217;importe quel terminal. Cependant, le consentement des clients d&#8217;être localisés et le souhait de ne pas être traqués restent des freins à la diffusion de cette approche à grande échelle.</p>
<h2>Conclusion</h2>
<p>L&#8217;offre de banque mobile regroupe deux acteurs venant de deux mondes différents : les banquiers et les opérateurs téléphoniques. Les premiers sont destinés par définition à gérer les transactions bancaires de tout genre, mais pour développer cette offre de mobilité ils ont besoin de bénéficier de l&#8217;étendu des réseaux et des connections téléphoniques mobiles. C&#8217;est pour cela que toutes les offres existantes regroupent une banque et un opérateur téléphonique. Historiquement, cette offre de banque mobile était destinée aux pays en voie de développement afin de répondre aux besoins des populations non bancarisés et la rareté des agences bancaires. Cependant, ces offres ont abouti à d&#8217;excellents résultats (surtout M-Pesa au Kenya) ce qui a fait naître l&#8217;idée d&#8217;étendre cette offre aux pays développés pour répondre à des aspects pratiques et de facilité de gestion bancaire avec le téléphone mobile. Les offres techniques et matérielles, la réglementation et les accords banquiers-opérateurs téléphoniques sont en cours de maturation ce qui présage l&#8217;explosion de ce marché et des projets associés dans un avenir proche.</p>
<address>(1) Envoie d&#8217;argent d&#8217;une personne à une autre.</address>
<address>(2) Near Field Communication.</address>
<address>(3) GSM Association.</address>
<address>(4) La personne qui reçoit l&#8217;argent.</address>

 <img src="http://blog.octo.com/wp-content/plugins/wordpress-feed-statistics/feed-statistics.php?view=1&post_id=3760" width="1" height="1" style="display: none;" /><p>Suggestion d'articles :</p><ol>
<li><a href='http://blog.octo.com/octo-au-salon-mobile-it-expo-les-18-19-20-octobre-paris-porte-de-versailles/' rel='bookmark' title='OCTO au salon Mobile IT expo les 18-19-20 octobre &#8211; Paris Porte de Versailles'>OCTO au salon Mobile IT expo les 18-19-20 octobre &#8211; Paris Porte de Versailles</a></li>
<li><a href='http://blog.octo.com/retours-sur-le-javacampparis-ii/' rel='bookmark' title='Retours sur le JavaCampParis II'>Retours sur le JavaCampParis II</a></li>
<li><a href='http://blog.octo.com/octo-au-salon-cloud-it-expo-2011-mercredi-19/' rel='bookmark' title='OCTO au salon Cloud &amp; IT Expo 2011, mercredi 19'>OCTO au salon Cloud &#038; IT Expo 2011, mercredi 19</a></li>
</ol></p>]]></content:encoded>
			<wfw:commentRss>http://blog.octo.com/retours-de-la-mobile-payment-expo-2009/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

