Sécurité de CAS

réf : http://blog.bousquie.fr/home/cas-et-le-phishing

sécurité de CAS

contexte : CAS 3.3.5-2 installé à partir de la cas-toolbox ESUP


Ce document vise à décrire quelques points d'amélioration de la sécurité de CAS
  1. comment déployer et améliorer les filtres de CAS ?
  2. comment supprimer la redirection sur le logout ?
  3. comment empêcher l'encapsulation ou la proxification du formulaire de login ?

1. Comment déployer et améliorer les filtres de CAS ?

Le but est d'éviter qu'un attaquant n'invite un de nos utilisateurs à venir sur un lien du genre https://cas.univ.fr/cas/login?service=http://pirate.org

Ce type de lien permet au pirate d'inspirer d'abord confiance à l'utilisateur avant de le rediriger vers un site corrompu que l'utilisateur considèrera comme étant de confiance. CAS permet normalement d'activer des filtres décrivant les services autorisés. Cependant la version livrée dans la toolbox esup présente un petit bug si l'on utilise des caractères génériques pour filtrer sur le domaine *.univ.fr.

Un attaquant peut en effet contourner le filtre avec une URL de la forme https://cas.univ.fr/cas/login?service=http://pirate.org?www.univ.fr. (cf bug : https://issues.jasig.org/browse/CAS-1071)

Pour ceci, on télécharge une nouvelle classe java : https://issues.jasig.org/secure/attachment/12540/RegRegisteredServiceImpl.java.

On dépose ce source dans le custom, après avoir créé les répertoires ad hoc, c'est à dire custom/org/jasig/cas/services et custom/webpages/lib .

Puis on modifie le fichier deployerConfigContext.xml situé dans custom/webpages/WEB-INF/.

On y enrichit le bean serviceRegistryDao comme ceci :
    <bean id="serviceRegistryDao" class="org.jasig.cas.services.InMemoryServiceRegistryDaoImpl">
        <property name="registeredServices">
            <list>
 
                <bean class="org.jasig.cas.services.RegRegisteredServiceImpl"
                                        p:id="0"
                                        p:name="Domaine univ.fr"
                                        p:description="Domaine univ.fr"
                                        p:serviceId="^https?://[^/?#]*\.univ\.fr(:[\d]+)?/.*"
                                        p:enabled="true"
                                        p:ssoEnabled="true"
                                        p:anonymousAccess="false"
                                        p:allowedToProxy="true" >
                                        <property name="allowedAttributes" value="uid,mail" />
                                </bean>
                <bean class="org.jasig.cas.services.RegRegisteredServiceImpl"
                                        p:id="1"
                                        p:name="Domaine google.com"
                                        p:description="Domaine google.com pour les Google Apps"
                                        p:serviceId="^https?://[^/?#]*\.google\.com(:[\d]+)?/.*"
                                        p:enabled="true"
                                        p:ssoEnabled="true"
                                        p:anonymousAccess="false"
                                        p:allowedToProxy="true" >
                                        <property name="allowedAttributes" value="uid,mail" />
                                </bean>
            </list>
        </property>
    </bean>

Comme d'habitude, pour déployer proprement cette modification :

cd ~/cas-toolbox-3.3.5-2

/etc/init.d/tomcat stop

ant init

ant deploy

/etc/init.d/tomcat start

Merci à Julien Marchal de l'Université de Lorraine pour cette résolution.


2. Comment supprimer la redirection sur le logout ?

Le but est d'éviter qu'un attaquant utilise le formulaire de logout, qui n'est pas filtré, pour amener un utilisateur sur un site pirate avec une redirection de la forme :

https://cas.univ.fr/login?service=https://cas.univ.fr/logout?service=http://pirate.org

Pour ceci, on édite le fichier cas-servlet.xml situé dans custom/webpages/WEB-INF et on modifie la valeur par défaut (true) p:followServiceRedirects du bean logoutController à la valeur false.

<bean id="logoutController" class="org.jasig.cas.web.LogoutController"
        p:centralAuthenticationService-ref="centralAuthenticationService"
        p:logoutView="casLogoutView"
        p:warnCookieGenerator-ref="warnCookieGenerator"
        p:ticketGrantingTicketCookieGenerator-ref="ticketGrantingTicketCookieGenerator"
        p:followServiceRedirects="false"/>

Merci à Frédéric Soulier de l'Université de Toulouse 1 Capitole pour cette information.


3 .Comment empêcher l'encapsulation ou la proxification du formulaire de login ?

Le but est d'empêcher que le formulaire CAS soit affiché dans une frame/iframe ou soit affiché sous un autre domaine que celui de l'établissement.

Il faut ajouter dans la zone <head>...</head> de custom/webpages/WEB-INF/view/jsp/default/ui/includes/top.jsp un peu de code javascript :

           <script type="text/javascript">
                login1 = "https://cas.univ.fr/cas/login";
                logout1 = "https://cas.univ.fr/cas/logout";
                url = self.location.href;
                if (self!=top ||
                        (url.substr(0,login1.length)!=login1
                        && url.substr(0,logout1.length)!=logout1 ))
                                {top.location.href="http://warning.univ.fr/cas/?pirate="+url;};
           </script>


Le browser est redirigé vers http://warning.univ.fr/cas/?pirate=valeur du referer. Cette page indique alors à l'utilisateur qu'il vient de d'aller sur un site, soit qui en encapsulait CAS, soit qui proxifiait CAS (valeur du referer est alors différent de l'URL de login ou de logout du CAS officiel).
Comments