Hardening consulting

J'ai toujours eu en tête cette fonctionnalité de passfd disponible sous Linux mais je n'avais jamais eu l'occasion de vraiment m'en servir. Au gré de tests d'architecture, j'ai pu expérimenté ça, et je trouve que ça ouvre plein de perspectives, je vous parle de tout ça.


Socket pair

Rien de bien compliqué avec socketpair ça permet en un appel système d'avoir 2 sockets inter-connectées: quand on envoie des octets sur une socket ou peut les lire sur l'autre:

#include <sys/socket.h>

int socketpair(int domain, int type, int protocol, int sv[2]);

Ça reste quand même plus pratique que les appels systèmes pipe ou pipe2, qui fournissent un file descriptor pour lire et un autre pour écrire.

Lire la suite…

La version 0.10 d'accendino ne devrait pas tarder à sortir, mais en attendant, j'ai quelques requêtes pour essayer ogon, comment l'installer, le configurer, etc.

C'est tout simple pour ça soit on suit les instructions fournies dans le répertoire doc d'ogon. Soit on utilise Accendino pour faire la majorité du boulot et on finit "à la main", toutes manipulations qui demande une intervention humaine pour la configuration.


Utiliser accendino

Sur une Ubuntu 24.04 fraichement installée, on commence par s'installer accendino dans un venv qu'on appellera _venv:

$ sudo apt install git python3-venv
$ git clone https://github.com/forgiare/accendino.git
...
$ cd accendino
$ python3 -m venv _venv
...
$ source _venv/bin/activate
(_venv) $ pip install .
... 

Lire la suite…

Premier billet de 2026, je vous souhaite tous mes meilleurs vœux pour cette nouvelle année.

Dans ce billet, je vais parler d'un vieux projet que je trouve très intéressant et qui n'a pas perdu une ride depuis ses plus de 10 ans d'existence: qfreerdp_platform. J'ai fait quelques amélioration intéressantes sur ce projet récemment, et je vais donc en parler un peu.


Fonctionnement interne de Qt

Le framework Qt fonctionne avec une abstraction de la plateforme sur laquelle il tourne: en gros on a des classes indépendantes qui implémentent les widgets, le scripting QML, le rendu, etc. Mais toute la partie qui doit vraiment interagir avec le système, comme par exemple envoyer du contenu à la carte graphique ou bien collecter les signaux des périphériques d'entrée (clavier, souris ou touchscreen), est implémentée par des QPA (Qt Platform Abstraction). Par exemple, quand on lance une application Qt sous Linux, il va y avoir un système d'heuristique qui va soit charger le QPA pour X11 (xcb) ou bien le QPA wayland.

J'en parlais déjà en 2013 dans ce billet, une chose intéressante est qu'on peut forcer le QPA qui va être utilisé par une application, celà se fait en passant le paramètre -platform <nom du qpa> lors de l'appel du programme Qt (c'est pour ça qu'il faut passer les paramètres de ligne de commande à la QApplication, c'est pour que Qt puisse sélectionner les arguments qui lui sont destinés). La chose vraiment surprenante est que le programme Qt sans recompilation peut tourner à la fois sous X11 et Wayland, ou bien sur un QPA qu'on lui dit d'utiliser...

Lire la suite…

Ces derniers temps, j'ai pas mal exploré des sujets de FreeRDP avec remote credential guard, Kerberos et NLA, je fais donc un petit billet sur comment kerberossiser sa partie serveur de FreeRDP.


NLA, SPNego et Kerberos

Toute la kerberosserie commence avec le NLA: si on se connecte sur un serveur RDP avec mstsc et que la configuration est à peu près standard.

Lire la suite…

Il y a quelques temps j'ai travaillé sur la partie Kerberos de remote credential guards, et suite à des rapports de compatibilité avec du windows 11 et des controlleurs de domaine avec des versions récentes, je me suis un peu intéressé à la partie NTLM.


Remote credential guards

L'idée derrière remote credential guards, c'est qu'on se connecte à une machine distante, le mot de passe n'est pas envoyé à cette machine, mais qu'on a quand même du SSO. Et donc en théorie, même si on se connecte à une machine compromise, on ne se fait pas voler son mot de passe.

Lire la suite…

Encore beaucoup d'améliorations sur Accendino, et on a cette version 0.5.10 qui est en cours de stabilisation avec cette alpha 1.

FFmpeg fait partie de ces logiciels qui sont horribles à construire de manière automatique sous windows (juste derrière OpenSSL), et un des buts recherchés pour cette version c'était de pouvoir construire FreeRDP avec le support d'FFmpeg sous windows avec la chaine de compilation de Visual Studio et tout ça de manière automatique. Pas de bidouilles à faire à la main pour que ça fonctionne, on tape

$ accendino --targets=freerdp3 freerdp.accendino

ça checkout, ça compile et c'est prêt.


Les nouveautés dans la version 0.5.10 alpha 1

Support d'Msys2

Première étape pour compiler FFmpeg avec Visual Studio: il y a besoin de passer des commandes sous msys2, et donc cette version amène le support d'installation des packages dans cet environnement. Si on met en dépendance de packages 'msys2/yasm', accendino installera les packages correspondants dans l'environnement msys2.

Petit extrait du fichier accendino de FFmpeg:

...

ffmpegPkgs = {
    'Darwin': ['nasm'],
    'Windows': ['choco/nasm|path/nasm', 'msys2/make', 'msys2/yasm', 'msys2/diffutils'],
}

...

Ce support n'a pas été très compliqué à coder car c'est pacman qui est utilisé

Lire la suite…

J'ai fais quelque petites mises à jour sur mon script Accendino, jusqu'à en faire un petit programme à part entière avec des fonctionnalités intéressantes. Cette version 0.5.9 vient ajouter plein de choses sympatiques par rapport à la version précédente. Avec le temps, je vois plus Accendino comme un programme permettant de construire un logiciel complexe à partir de plusieurs sources logicielles, et sur plusieurs plate-formes. Pour l'instant mon cas d'école est FreeRDP, j'essaye d'avoir des fichiers accendino qui permettent de construire FreeRDP à partir de zéro sur le plus de plate-formes possibles (linux, mac, windows, mingw, ...)


Historique

Originellement accendino n'était qu'un petit script permettant de jouer les instructions d'installation d'Ogon. Il était néanmoins un peu plus complexe car on pouvait spécifier les emplacements git à descendre. Par exemple, pour utiliser les repos de Forgiare à la place des repos officiels d'Ogon. Avec la version 0.5.0, j'ai pas mal étendu ses fonctionnalités:

  • la possibilité d'inclure des fichiers accendino pour réutiliser des définitions existantes;
  • les sources des programmes ont été beaucoup étendues et ne viennent plus nécessairement de git. On peut avoir des sources locales, ou bien de git. Beaucoup d'options git sont désormais accessibles;

    Lire la suite…

Une petite astuce que j'ai découvert il y a quelque temps: l'outil massif de valgrind. Il permet d'adresser des cas où on a un programme qui mange trop de mémoire inutilement, mais comme il fait correctement le ménage à la fin, on ne voit rien avec les outils de leak standard (valgrind ou asan)


Massif

C'est là qu'intervient l'outil massif de valgrind ainsi que l'outil de visualization massif-visualizer. Cet outil va permettre de régulièrement faire des snapshots des allocations mémoires, et de voir les callstacks des endroits de nos programme qui font ces allocations.

Lire la suite…

Dans (le futur) FreeRDP 3.0, il y a le support pour le smartcard logon, sur lequel j'ai pas mal travaillé, voyons un petit peu ce qu'il en est.


Support smartcard

On commence par vérifier qu'on voit bien la smartcard, dans mon cas il s'agit d'un yubikey(TM):

$ opensc-tool -l
# Detected readers (pcsc)
Nr.  Card  Features  Name
0    Yes             Yubico YubiKey OTP+FIDO+CCID 00 00

Lire la suite…

Intéressons nous un peu plus au protocole RDPUDP qui va transporter les données RDP au dessus d'UDP. Pour commencer, on se souviendra que seules les données de canaux virtuels (virtual channels) peuvent être transportées au dessus d'UDP, donc ça ne concerne pas les ordres graphiques anciens (donc si vous comptiez sur UDP pour accélérer des bitmapUpdates c'est perdu), par contre ça fonctionnera avec un rendu egfx. De même la migration de TCP à UDP se fait au travers du canal dynamique, donc le drdynvc est obligatoire. Ce mécanisme permet aussi aux canaux statiques d'être migrés vers UDP en mettant le flag TRANSPORTTYPE_UDP_PREFERRED dans le paquet gcc de multi-transport channel data.

Lire la suite…