TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

54
TYPO3 et la Sécurité de l’information 29.06.2011 Julien BOURDIN <[email protected]>

Transcript of TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Page 1: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

TYPO3 et la Sécurité de l’information

29.06.2011

Julien BOURDIN <[email protected]>

Page 2: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Julien BourdinArchitecte PHP / Développeur TYPO3KLEE GROUP

Profil : Architecte, chef de projetCertifié TYPO3 Integrator

Page 3: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Introduction

Page 4: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Objectif de la présentationCette présentation a pour but de présenter un large

ensemble de problèmes à prendre en compte dans un

projet TYPO3.

La présentation précisera en premier ce qui rentre dans le

périmètre du terme « sécurité » et les premières

conséquences.

Ensuite, la présentation passera en revu un certain

nombre des attaques possibles contre une application

web en expliquant comment elles procèdent et surtout

comment s’en prémunir

Page 5: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

SommaireLe concept de sécurité

Les failles humaines et les piratages sociaux

Les failles évidentes

La stratégie pour limiter la portée des intrusions

Les Deny Of Services (DOS)

Le spam côté serveur

L’injection SQL

L’injection de script (XSS)

Le Cross Site Request Forgery (CSRF)

Page 6: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Le concept de sécurité

Page 7: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

La sécurité est une gestion des risques.

Page 8: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Les différents risquesIntégrité des

données

Confidentialité

des données

Disponibilité des

services

Responsabilité

des personnes

Page 9: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Les différents risquesIntégrité des

données

Confidentialité

des données

Disponibilité des

services

Responsabilité

des personnes

=> Transactions, Détection des

incohérences, Sauvegarde

=> Authentification, Droits d’accès,

Détection d’intrusion

=> Redondance, Récupération après

incident, DOS, Supervision

=> Usage indu, Traçabilité,

Maintenance

Page 10: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

La gestion des risques

Lister les évènements qui peuvent survenir

Estimer la probabilité de les voir arriver

Estimer le coût lorsqu’un évènement se produit

Estimer le coût pour réduire la chance que l’évènement

en question se produise

Page 11: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Le coût du risqueProbabilité du risque que multiplie le coût de l’évènement :

Pe x C/e

A comparer avec le coût pour réduire le risque et au coût

des autres risques.

ConséquencesTout risque identifié n’est pas un risque à corriger, on

compare le coût de chacun des risques

Tout comme il existe de la sur-qualité, il existe des abus

de sécuritéIl n’est pas possible de réduire à 0 l’ensemble des risques !

Page 12: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

La sécurité est une chaîne

Chaque composant et chaque acteur apporte des risques

Sur un type de menace donné, l’application à la sécurité

de son maillon le plus faible

La solution la plus efficace pour réduire le risque n’est

pas nécessairement une solution techniqueInutile de mettre une porte blindée si les murs sont en

papier

Inutile d’avoir une serrure 5 points si on laisse les clefs sous

le paillasson

Inutile d’avoir un SSO complexe si votre mot de passe est

« 1234 » ou « password »

Page 13: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

La sécurité est un investissement

Pour les responsables de l’application

Pour les utilisateurs

Pour les développeurs

Les bonnes pratiques, une fois acquises, permettent un niveau de sécurité correcte à moindre coût.

Page 14: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Les failles humaines et les piratages sociaux

Page 15: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

L’être humain est la première faille de sécurité

Tout collaborateur n’est pas aussi bienveillant qu’on le

souhaiterait :

la majorité des sabotages sont le fait de collaborateurs

dans les entreprises

Les relations hiérarchiques sont plus fortes que les règles

de sécurité :

une secrétaire donne à son patron le mot de passe par

téléphone s’il lui demande.

La vigilance n’est pas une culture

On ne vérifie pas l’identité de la personne qui arrose les

plantes

On prête son compte à son collègue pour ses congés

On aime pas les contraintes pesantes !

Page 16: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Il est important de former et d’informerCe qui est vécu comme une contrainte est souvent

contourné

Ce qui semble anodin n’est pas source d’attentionIl faut donc responsabiliser

Les utilisateurs

Les décideurs

Les concepteurs

Les développeurs

Les exploitants

Page 17: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Gestion des comptes

Un compte utilisateur doit être attaché à une unique

personne

L’accès doit être restreint par des mots de passe non

triviaux

Interdiction d’utiliser le login ou un mot de passe par

défaut !

Interdiction d’utiliser le prénom de sa fille ou son

année de naissance !

Les droits doivent appartenir à des groupes

Les droits données sont ceux nécessaires et suffisant

pour les tâches confiées

La délégation se fait en donnant des droits au compte du

responsable par délégation

Un mot de passe ne doit jamais être transmis, encore

moins pas courriel

Page 18: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Les failles évidentes

Page 19: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Essayez donc /typo3/install avec joh316 !

Page 20: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Les évidences qu’on oublie quand même

Changer les mots de passe par défaut (admin/password

et joh316)

Mettez à jour TYPO3, ses extensions, ainsi que les

logiciels support (LAMP)

Supprimer les dossiers et fichiers inutiles

(MISC, .bak, .sql)

Désactivez l'opions "indexes" d'APACHE

Limitez l'accès au BE aux personnes pertinentes par une

technique forte (LAN ou VPN)

Choisissez vos extensions (en évitant les

"alpha/expérimental" de 2006)

Page 21: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Limiter la portée des intrusions

Page 22: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Une brèche ne doit pas emporter tout le système !

Page 23: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Pour limiter la portée d’une intrusion dans TYPO3

Limitez les comptes admin le plus possible (1 pour vous,

1 pour le client)

Activez l'envoi de mail avertissant de la connexion d’un

compte admin

Les droits d’écriture sur les fichiers ne sont pas donnés à

APACHE en dehors de typo3temp et quelques

répertoires bien choisis (idéalement les livraisons sont

faites avec un compte distinct)

Ne laissez pas en production d'extension donnant accès à

la base de données ou au système de fichiers (quixplorer,

phpmyadmin, terminal virtuel, etc...)

Interdisez la livraison d’extension en production depuis le

BE (option dans l'install tool + droit sur le repertoire

typo3conf/ext)

Page 24: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Surveillez les indicateurs de votre site

Vérifiez dans les logs si des URL inconnues existent (avec

Awstats par exemple)

Cherchez si des variations de bande passante/nombre de

hit apparaissent

Vérifiez que l’espace disque, la mémoire occupée ou la

charge CPU ne changent pas façon inattendue

Réagissez en cas de doute !

Page 25: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Les déni de services

Page 26: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.
Page 27: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Qu’est-ce que le déni de service ?Une attaque en déni de service vise à rendre impossible

le bon fonctionnement d’un service en saturant un

composant de l’architecture rendant ces services.

Il peut donc s’agir de saturer de requête la plateforme

mais cela peut aussi prendre des tours plus particuliers

Saturation de la base de données

Appel répété sur le moteur de recherche ou sur certaines pages

vulnérables

Ajout de scripts infinis dans un contenu

L’objet peut être simplement le déni de service mais cela

peut aussi avoir comme but de faire disparaitre le serveur

pour usurper ensuite son identité (spoofing)

Page 28: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Se protéger contre le déni de service : attaque frontaleDimensionnez votre plateforme pour un traffique de

pointe pertinent

Activez les caches de TYPO3 et interdisez l’utilisation de

« no_cache » dans l’URL (typo3/install)

Mettez un reverse proxy avec du cache

Limitez les pools de connexions MySQL et les processus

Apache et mettez un timeout sur le reverse-proxy (Il faut

pouvoir délester en retournant un message d’erreur)

Supervisez et alertez en cas de montée en charge non

anticipée

Page 29: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Se protéger contre le déni de service : écrituresLimitez les possibilités d’écriture sur le serveur : pas de

dépôt de fichiers non régulés ni d’écriture en base

N'écrivez pas en base de données depuis un accès

anonyme sauf avec protection anti-robot (livre d'or,

commentaire, etc...)

Supervisez l'espace sur file system et dans la BDD : alerte

lors de franchissement de seuils !

Page 30: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Se protéger contre le déni de service : le cHashLe cache de TYPO3 est en base de données ! Une URL

n’est mise en cache que si elle répond à un certain

nombre de critère dont la validité des paramètres soumis.

Sont acceptées par défaut les variables « id » et « type »

Sont acceptées sans signature les variables déclarées

dans config.linkVars (TSsetup) A limiter par une plage de

valeur config.linkVars=L(0-4)

Les autres variables ne sont valables que si elles ont été

signées par la génération d’une URL depuis TYPO3. La

signature, le cHash, est le résultat d’un MD5 des données

concaténées et d’une clef privée du serveur

Page 31: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Se protéger contre le déni de service : le cHashEx : http://monsite.com/index.php?

id=2&L=3&tx_ttnews[tt_news]=23&cHash=a7024cb

7

Générez vos URL à l’aide des méthodes de l’API TYPO3 :

TYPOLINK ou tslib_pibase->pi_linkTP_keepPIvars

Générez une clef unique après l’installation de TYPO3

(install TOOLS)

Forcez vos plugin à prendre en compte la validité des

hachage :

var $pi_checkCHash = TRUE; dans class

tx_monplugin_pi1 extends tslib_pibase

Page 32: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Le spam côté serveur

Page 33: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Votre serveur peut devenir une source de spam !

Page 34: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Un serveur capable d’envoyer des mails doit être maîtriséLe risque est de voir un écran exploité par un robot pour

diffuser largement des publicités

Un écran pouvant provoquer l’envoi d’un mail doit

respecter au moins une des règles ci-dessous :

Le courriel est destiné à une unique boite à lettre

(contact)

Le formulaire ne peut être soumis qu’après un test

identifiant un humain plutôt qu’un robot

Le courriel aura un contenu fixe, dépendant de

paramètre non modifiable sur l’écran

Les courriels ne peuvent être envoyés que sur un

domaine interne (intranet)

La quantité de mail envoyés par l’application doit être

supervisée

Vous risquez, en cas de souci, de voir votre serveur

d’envoi de courriel dans les listes noires

Page 35: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

L’injection SQL

Page 36: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.
Page 37: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

L’injection SQLUne injection SQL est l’utilisation d’instruction du langage

SQL au sein d’un paramètre sensé ne contenir que de la

donnée.

Elle est le plus couramment utilisée sur les champs d’un

formulaire front-office mais peut également se faire par

l’URL.

Page 38: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Exemple : la connexion par login et mot de passeSELECT * FROM USERS WHERE LOGIN = '$_GET['login']' AND

PASSWORD = '$_GET['password']';Il lui suffit donc de saisir Monlogin';# pour que la requête

devienne :

SELECT * FROM USERS WHERE LOGIN = 'Monlogin';#' AND

PASSWORD = '';La bonne méthode consiste à considérer la saisie comme

des caractères non susceptibles de déclencher des

commandes MySQL (voir mysql_real_escape_string)

SELECT * FROM USERS WHERE LOGIN = 'Monlogin\'; \#'

AND PASSWORD = '';

Note : en aucun cas, la requête présentée est la bonne façon de gérer l’authentification !

Page 39: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Se prémunir de l’injection SQLNe donner à l’utilisateur SQL que le minimum de droit

nécessaire (pas de DROP, TRUNCATE,…)

Ne pas stocker en base de mot de passe lisibles

(fe_users !)

Avoir des sauvegardes régulières de nos bases

Toujours vérifier la nature des données insérées dans les

requêtes

Si possible, préférer les requêtes préparées (prepared

statement) qui n’attendent que de la données pour leurs

paramètres (disponibles depuis TYPO3 4.5 LTS)

Page 40: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Se prémunir de l’injection SQL dans TYPO3Utiliser l’API

$GLOBALS['TYPO3_DB']->exec_SELECTquery()

$GLOBALS['TYPO3_DB']->exec_SELECTgetRows()

$GLOBALS['TYPO3_DB']->exec_INSERTquery()

$GLOBALS['TYPO3_DB']->exec_UPDATEquery()

$GLOBALS['TYPO3_DB']->exec_DELETEquery()

Lire la documentation de chaque méthode pour vérifier

l’usage de fullQuoteStr()

Optional additional WHERE clauses put in the end of the

query. NOTICE: You must escape values in this argument

with $this->fullQuoteStr() yourself!

Page 41: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Se prémunir de l’injection SQL dans TYPO3foreach ($this->piVars as $key => $value) {

$value = $GLOBALS['TYPO3_DB']-

>fullQuoteStr($value,'fe_users');

switch ($key) {

case 'nom':

if(strlen($value) > 2)$cond_array[]="fe_users.name LIKE

'$value%'";

break;

...

default:

break;

Page 42: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Se prémunir de l’injection SQL dans TYPO3 : 4.5 LTS$statement = $GLOBALS['TYPO3_DB']->prepare_SELECTquery('*',

'pages', 'pid = :pid');

for ($i = 1; $i < 10; $i++) {

$statement->execute(array(':pid' => $i));

while (($row = $statement->fetch()) !== FALSE) {

// Do something with your $row

}

$statement->free();

}

Page 43: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.
Page 44: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

L’injection de script (XSS)

Page 45: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Le Cross Site ScriptingLe principe de cette stratégie d’attaque est de profiter de

l’affichage de données envoyées par l’utilisateur pour

inclure des éléments de HTML ou de script non prévu

Le moyen d’en faire une agression est d’inclure du script

qui va soumettre à l’extérieur la saisie de données

confidentielles

Pour arriver à créer ce contexte, il faut fournir par un

moyen ou un autre, une URL portant ces données. Ce

sera typiquement par l’envoi de mails malicieux ou par

une mise en ligne d’un lien sur un autre site

Page 46: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Le Cross Site Scripting : cas concretUn moteur de recherche propose un champ de saisie et

passe les données sous la forme :

http://www.monsite.fr/index.php?wsearch=mot_recherche

Les résultats sont présentés avec un rappel « votre

recherche : mot_recherche »

Si on remplace dans l’URL par wsearch=<script

type="text/javascript">…</script>

On obtient une page dans laquelle, selon le traitement,

on a éventuellement un script inclus et interprété là où

l’on croyait avoir un simple mot

Page 47: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Le Cross Site Scripting : vérifier le type de vos sorties !Normalement, une donnée utilisateur est d’un type

simple : nombre, texte, choix dans un menu déroulant,…

Ce ne sont pas des typages techniques ! Une chaine de

caractère et un texte simple ne sont pas la même chose

Le cas simple : prendre la donnée à afficher et s’assurer

que tous les caractères ne sont pas intérprétés en HTML :

htmlspecialchars

Les cas complexes : autorisations de certaines balises par

une analyse spécifique

Page 48: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Le Cross Site Scripting : le RTESi vous devez autoriser des saisies contenu du HTML,

passez par le RTE de TYPO3

Le RTE se positionne sur le Front-End comme sur le Back-

End

La liste des balises autorisées est paramétrable en

TYPOSCRIPT

L’affichage des contenus associés est validée soit par un

rendu TYPOSCRIPT parseFunc_RTE

soit par une méthode de l’API

tslib_pibase->pi_RTEcssText($variable)

Page 49: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Bonne pratique général : la programmation par contratChaque méthode définit le format de ses entrées et de

ses sorties

Les variables sont vérifiées par des assertions qui, en cas

de non respect, stoppent l’exécution

function mafonction($a,$b,…){

assertion(type1,$a); assertion(type2,$b);

$retour = corpsdemethode();

assertion(typesortie,$retour);

return $retour;

}

Page 50: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

Le Cross Site Request Forgery (CSRF)

Page 51: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Le Cross Site Request Forgery La plupart des outils utilisent, avec raison, des URL

explicite:

http://www.monsite.fr/index.php?

action=supprimer&id=35

Ces URL sont donc prévisibles même pour un utilisateur

n’ayant pas le droit d’exécuter celle-ci

Une personne va donc tenter de faire jouer cette URL à

une personne ayant les droits à son insu

En proposant le lien dans le href d’une balise image

sur une page susceptible d’être consultée

En proposant un javascript de la même façon

Page 52: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Le Cross Site Request Forgery L’agression est difficile à détecter : c’est une personne

ayant les droits qui fait les actions

La faiblesse est accru par les contexte de type SSO : la

personne peut ne pas encore s’être authentifié à

l’application et faire toutefois l’action

L’attaque est d’autant plus facile à mener que les URL

d’écriture passent leur paramètre en GET (possibilité

d’utiliser des liens simple)

Page 53: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.

T3UNI 2011

TYPO3 et la Sécurité de l’information

29.06.2011

Le Cross Site Request Forgery : s’en prémunir Il faut ajouter un élément non prévisible dans les URL

Il faut que les URL ne soient pas rejouable

Exemple de solution : ajouter une date et le cHash de

TYPO3

http://www.monsite.fr/index.php?

txmonextension[action]=supprimer&txmonextension[id]=

35

&txmonextension[date]=timestamp&cHash=jgs37829DE

Page 54: TYPO3 et la Sécurité de linformation 29.06.2011 Julien BOURDIN.