Hardening consulting

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…

J'ai fais quelque modifications dans winPR pour corriger un bug dans les timers avec completion, et je suis tombé sur un soucis qui pourrait intéresser d'autres personnes que moi.

Ça concerne la gestion des EINTR, quand un appel système est interrompu par l'arrivée d'un signal, la réponse va être un -1 et errno positionné à EINTR. Par exemple quand on fait un select ou un read, la manière de se protéger de ce comportement, c'est de faire le code suivant:

#include <sys/select.h>
#include <errno.h>

void myFunction() {
    struct fd_set rset;
    int status, max_fd;

    ...


    do {
        ret = select(max_fd, &rset, NULL, NULL, NULL);
    } while (ret < 0 && errno == EINTR);
}

Bon et bien problème résolu, il suffit d'appliquer ce schéma à chaque fois qu'on a un appel système non ?

Le cas du poll

Lire la suite…

Celà fait quelques temps que je n'avais rien posté. Pour commencer, je vous souhaite une bonne année 2021, plein de belles choses, des projets et puis la santé évidement ! Espérons que la Covid nous laissera un peu tranquille cette année.

Comme je travaille sur le support du transport UDP dans FreeRDP, je fais une petite série de posts sur ce sujet. On va commencer par un aperçu rapide de comment ça marche et ce que ça implique, et je rentrerais sans doute plus dans les détails dans des post suivants.


Aperçu du transport UDP

Documentation et spécifications

Le support UDP dans RDP est détaillé dans plusieurs fichiers de spécifications:

  • MS-RDPBCGR : la spécification de base du RDP, on a quelques flags dans les paquets GCC, et la mise en place du multi-transport;
  • MS-RDPEMT : la spécification du multi-transport, qui permet d'annoncer et de mettre en place plusieurs transports à la fois;
  • MS-RDPEUDP : la spécification du transport UDP lui-même;
  • MS-RDPEUDP2 : la nouvelle mouture du protocole UDP;
  • MS_RDPEDYC : la spécification des channels dynamiques;

Lire la suite…

Un post après une longue période sans rien publier. Récemment j'ai fait beaucoup de choses autour d'ogon, et j'ai dû déployer à la chaine sur plusieurs machines pour des tests. Le guide de déploiement est bien, mais c'est long et répétitif, et puis sutout si c'est consignable dans un manuel d'installation, c'est que c'est automatisable par un script.


Accendino

J'ai donc créé pour ça ce petit logiciel accendino (briquet en italien) qui va nous permettre d'allumer un grand feu (ogon en russe).

Lire la suite…

Que les VMs windows sont lentes sous KVM ! Quand on travaille sur FreeRDP on est inévitablement obligé d'avoir des VMs sous windows pour tester que les vieilles features marchent encore, ou bien pour pouvoir essayer ces nouveautés fantastiques (oui j'aime les licornes).

Lire la suite…

Souvent en utilisant FreeRDP, on se retrouve à devoir augmenter le niveau des traces et à collecter un peu plus de logs que d'ordinaire. Et évidement la plupart du temps, ça ne tient pas dans l'historique du terminal, ou bien on veut que ça se fasse rapidement (l'affichage console peut vraiment ralentir FreeRDP). On peut aussi être sur une machine à distance, et vouloir récupérer tout ça via le réseau.


Comme à chaque fois que je veux utiliser les capacités de WLog (le système de logs de FreeRDP), je dois aller regarder le code source, je me suis dit qu'un petit billet sur le sujet serait l'occasion idéale de se souvenir de tout ça.

Lire la suite…

En travaillant sur topka, j'ai eu l'occasion d'utiliser twisted. Les tutoriaux de twisted sont bien fait, on a pleins d'exemples concrets, malgrés tout après avoir acquis un peu d'expérience avec le framework, j'ai eu envie d'écrire un petit article sur le sujet.

Note: cet article ne contient rien qui ne soit déjà dans la documentation de twisted

Utilisation des deferred

Quand on utilise twisted, il peut arriver qu'on se retrouve avec un résultat qui puisse être une valeur ou bien un Deferred. C'est le cas s'il est possible que le résultat soit disponible directement, ou bien qu'on doivent attendre. On peut avoir ce genre de code:

import twisted.internet.defer as defer

def myFunc():
    def treatRet():
        ...

    ret = functionThatProcess(...)
    if isinstance(ret, defer.Deferred):
        ret.addCallback(treatRet)
    else:
        ret = treatRet(ret)

    return ret

Lire la suite…