Dot.Blog

C#, XAML, Xamarin, UWP/Android/iOS

Xamarin.Forms : Sécuriser vos écrans

On fait de belles applis, on verrouille tout, identification user, cryptographie, cryptage des données stockées, mais il reste une faille…Saurez-vous la trouver ? .. pour les curieux c’est par là…

Numérique et sécurité

Les applications mobiles sont devenues notre pain quotidien; C'est l'outil nécessaire, voire indispensable, pour développer notre vie numérique et les derniers événements de la crise sanitaire l’ont démontré avec force notamment via la quasi obligation d’exercer en télétravail, ce qui implique une présence numérique avancée (de l’ordinateur et ses périphériques à la fibre optique, sa box, en passant bien entendu par les smartphones et autres tablettes). Nous faisons tout à travers les applis: nous gérons nos comptes bancaires, nous écoutons de la musique, nous regardons des films, nous lisons l'actualité, nous partageons sur les réseaux sociaux et nous travaillons aussi !

Nous savons que nous utilisons chaque application pour les commodités qu’elle offre, mais chaque fois que nous en installons une, sommes-nous conscients des autorisations que nous allons lui accorder ? Autrement dit, connaissons-nous le niveau de sécurité d'une application ?

J'imagine qu’en dehors des développeurs la réponse de chacun est un NON retentissant, et c'est même une évidence car nous le savons bien le confort et la sécurité sont des notions antagonistes : plus l'un est grand, moins l'autre l’est et vice versa.

Confidentialité par défaut

Le concept de confidentialité par défaut signifie qu'une application, un logiciel ou un système, dès sa création, doit prendre des mesures pour protéger les informations des utilisateurs, telles que la sécurité des données. Et ce, par définition, sans qu’aucun réglage particulier ne soit à faire par l’utilisateur. Il doit être protégé par défaut, trop éventuellement, mais c’est lui qui ira alors modifier les réglages pour les adapter en pleine conscience (on l’espère) à ses besoins.

Pour cela, il existe déjà des méthodologies qui passent en revue le code des applications et qui donnent des directives de sécurité, notamment le chiffrement des données, les protocoles SSL-TLS, les tests de vulnérabilité, les audits, les mécanismes d'authentification, le stockage, etc.

Cachez ces choses que seul moi peut voir…

Certaines applications se sont améliorées en ce qui concerne la sécurité offerte aux utilisateurs, comme PayPal, WhatsApp et bien sûr, toutes les applications bancaires (en général). Si nous prêtons attention à l’une de leur fonction de sécurisation nous pouvons voir qu'elles offrent toutes (ou presque) une fonction pour protéger les informations privées ou confidentielles lorsque l’App passe en arrière-plan.

Mais comment le font-elles? la réponse est vraiment simple, alors voyons comment nous pouvons le faire dans nos applications Xamarin.Forms !

Le principe

Le principe de ces Apps consiste à cacher ce qui est affiché par l’App lorsqu’elle passe en arrière plan, on vient de le dire (bravo à ceux qui suivent Smile), Mais quel intérêt ?

Si vous avez prêté attention au mécanisme de changement d’App en cours de travail, sur Android comme sous iOS, vous avez remarqué que vous pouvez balayer toutes les Apps actives pour choisir sur laquelle revenir. L’effet visuel est légèrement différent sur les deux OS mais au final on a bien un défilement d’images qui sont des captures du dernier écran affiché par chaque application.

C’est très pratique ! En effet si toutes ces captures étaient grisées ou autre comment l’utilisateur pourrait-il faire son choix rapidement et repérer l’App qu’il souhaite rouvrir ? Une liste faite des noms des Apps serait tout aussi fonctionnelle et ne poserait pas de problème mais le monde du numérique est désormais sous la dictature du “beau”; et ces galeries d’images d’Apps sont autrement plus belles qu’une liste de noms (surtout que cela s’accompagne de force animations et autres effets spéciaux dont la fluidité même est un élément vendeur).

Mais ce procédé est une faille de sécurité en soi…

Une photo, une série de mots de passe, etc, toute information sensible ou confidentielle qui était affichée par l’App se retrouve “prise en photo” et présentée dans cette galerie des Apps en cours. Un œil malintentionné ou simplement curieux qui traînerait par dessus votre épaule pourrait très bien capter quelques données que vous ne souhaitez pas partager avec lui… L’échange WhatsApp que vous eu avec une personne, le solde de votre compte bancaire, des mots de passe…

Une balance est alors à faire entre ergonomie (la présentation de captures écran des Apps en cours) et la sécurité (cacher les captures).

Le juste milieu comme en tout n’existe pas vraiment, c’est une zone grise, fluctuante selon les avis et les sensibilités de chacun. Il n’est donc pas question de supprimer totalement la galerie des Apps actives ou de rendre toutes les captures illisibles, cela n’aurait aucun sens. Toutefois il existe des applications où il semble préférable de gâcher un peu l’esthétique pour plus de sécurité. Mais la sécurité est une sale  bête. Tout le monde veut plus de sécurité (sanitaire, sociale, physique…) et c’est légitime mais cette “sécurité” est un dieu facétieux qui réclame toujours en échange une obole de taille, un sacrifice !

A chaque progrès sécuritaire, quel que soit le domaine, c’est un peu de liberté individuelle qui s’envole nous le savons très bien. L’application de l’Etat Stop-Covid sera un bide pour cette raison, elle arrive trop tard (après la phase de panique qui fait accepter ce qui n’est pas acceptable) et reste trop floue quant aux données qu’elle conserve, sous quelle forme, etc. Et même “bien expliqué” se sentir tracé dans tous ses déplacements, tous ses contacts avec autrui rend nerveux même les plus insensibles à ces questions de liberté individuelle… Pour la même raison et bien qu’un geek qui ne s’en cache pas et qui possède plus de caméras, de sondes, d’ordinateurs au mètre carré que le commun des mortels vous ne trouverez jamais chez moi ni d’Alexia Amazon ni de Google Home. C’est installer le Télécran de 1984, tout le temps allumé, diffusant à la fois les messages du pouvoir et espionnant chaque foyer. J’adore la citation qui dit que 1984 n’était pas censée être un manuel d’utilisation… Il l’est devenu pourtant.

Mais revenons à nos moutons (électriques mais qui ne rêvent pas encore, enfin pour quelques temps encore).

Donc pour certaines Apps nous allons devoir sacrifier quelque chose pour gagner en sécurité. C’est le prix à payer, l’obole faite au dieu Sécurité. Ici cela consistera à gâcher un peu l’esthétique de la galerie des Apps actives en rendant illisible l’écran de l’App qu’on voudra protéger. C’est un moindre coût.

Comment le faire avec les Xamarin.Forms ?

Il y a deux approches, l’une est purement programmatique, en détectant la mise en arrière-plan et tentant de cacher tout ce qu’il y a à l’écran le plus vite possible. Un rectangle blanc couvrant toute la surface, avec un Z-Order très haut, qu’on rend visible à ce moment précis pourrait faire l’affaire. Mais hélas quand on est prévenu de la mise en arrière-plan l’App n’a plus beaucoup de temps pour agir, les OS ne sont pas très friendly quand il s’agit de stopper ou d’endormir une App.

La seconde approche est d���utiliser des fonctions système qui permettent d’obtenir le résultat escompté.

Je préfère toujours proposer des solutions 100% Xamarin.Forms, car presque tout peut se résoudre dans le code partagé si on a un peu d’astuce. Mais là il faut le reconnaître la solution de l’OS reste certainement la plus fiable.

Sous Android comme sous iOS il s’agira donc d’appeler des fonctions système. Et le meilleur endroit pour le faire (en C# tout de même !) reste les Apps natives de la solution.

Sous Android

C’est bien entendu dans MainActivity.cs que cela se passera de la façon la plus simple possible en overridant deux méthodes :

protected override void OnResume()
         {
             Window.ClearFlags(WindowManagerFlags.Secure);
             base.OnResume();
         }
         protected override void OnPause()
         {
             Window.SetFlags(WindowManagerFlags.Secure, WindowManagerFlags.Secure);
             base.OnPause();
         }

Si notre App se présente comme suit :

image


Lorsque nous appuierons sur le carré (ou son équivalent) l’affichage ressemblera à quelque chose de ce genre :

image

Comme on le constate plus aucune information n’est montrée, la “capture écran” de notre App (en premier plan ici) est totalement vide. Le texte n’est plus visible alors même que la calculatrice qui se trouve derrière continue d’afficher son dernier contenu.

Sous iOS

La recette est la même, les ingrédients changent un peu toutefois.

Ici aussi il faudra attaquer le fichier principal qui s’appelle AppDelegate.cs sous iOS. Ici aussi il faudra overrider des méthodes mais elles ne portent pas le même nom et comme souvent en plus le code sera plus lourd :

using UIKit;
using Foundation;
using System.Linq;

namespace AppTest.iOS
{
[Register("AppDelegate")]
public partial class AppDelegate : global::Xamarin.Forms.Platform.iOS.FormsApplicationDelegate
{
public override void OnResignActivation(UIApplication application)
{
var blurEffect = UIBlurEffect.FromStyle(UIBlurEffectStyle.ExtraDark);
var blurEffectView = new UIVisualEffectView(blurEffect)
{
Frame = application.KeyWindow.Subviews.First().Bounds,
AutoresizingMask = UIViewAutoresizing.FlexibleDimensions,Tag = 12
};

application.KeyWindow.Subviews.Last().AddSubview(blurEffectView);
base.OnResignActivation(application);
}

public override void OnActivated(UIApplication uiApplication)
{
var sub = uiApplication.KeyWindow?.Subviews.Last();
if (sub == null) return;
foreach (var vv in sub.Subviews)
{
if (vv.Tag == 12)vv.RemoveFromSuperview();
}

base.OnActivated(uiApplication);
}

public override bool FinishedLaunching(UIApplication app, NSDictionary options)
{
global::Xamarin.Forms.Forms.Init();
LoadApplication(new App());
return base.FinishedLaunching(app, options);
}

}

}

Conclusion

Ici il faut choisir entre sécurité et esthétique, dans la vie de tous les jours l’offrande à faire au dieu Sécurité a généralement un prix plus élevé, pour notre App le cas de conscience est de moindre intensité. Et la sécurité offerte ici est essentielle pour de nombreuses Apps.

Est-il pour autant souhaitable de généraliser le procédé ? Après tout même une App de dessin peux avoir un affichage qu’on souhaite masquer.

Certainement pas mais plutôt que de rendre systématique cette option sécuritaire, sauf dans quelques Apps (gestion de mots de passe par exemple) il semble en revanche intéressant de proposer son activation dans toutes les Apps, à la volonté de l’utilisateur.

La recette serait ainsi sécurité par défaut pour toute App sensible par nature, sécurité en option pour les autres car nous ne pouvons prévoir ce qui sera considéré comme un “affichage sensible” par l’utilisateur, même d’une calculatrice ou d’un programme de dessin…

Bref, la sécurité c’est une affaire sérieuse dans tous les cas, son dosage est l’enjeu même qui distingue le totalitarisme d’une société libre c’est dire si on dépasse le cadre d’un blog de développement, mais il faut bien faire attention que nos choix de développeurs participent à façonner un monde futur qui basculera d’un côté ou de l’autre… (je ne voudrais pas avoir travaillé sur Alexia ou Google Home par exemple).

Stay Tuned !

blog comments powered by Disqus